你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

陀螺仪如何算欧拉角

[复制链接]
黑皮男 提问时间:2017-8-7 17:27 /
悬赏5ST金币未解决
现在有一个需求,手上只有一个陀螺仪,如何计算欧拉角,不考虑积分误差,无需使用其他传感器融合,数学没学好,不知怎么操作

收藏 2 评论5 发布时间:2017-8-7 17:27

举报

5个回答
黑皮男 回答时间:2017-8-7 17:37:35
陀螺仪直接积分出来的是欧拉角吗
黑皮男 回答时间:2017-8-7 18:20:07
万能的坛友啊,知道的告知一下
springvirus 回答时间:2018-4-8 14:29:20
可以参考很多四轴的开源代码

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

无薪税绵 回答时间:2018-4-9 12:47:32
  1. /*
  2. 1主函数在最后面
  3. 2作者:黑市,黑视,智涅
  4. 3四元数更新用的是一阶算法,还有二阶三阶甚至全阶,阶数越高精度越好,不过没多大必要。
  5.         一阶二阶这些简化算法就是用简单的值取代了一些三角函数而已
  6. 4详细书籍可以看《捷联式惯性导航原理》,袁信著。我以前看了这本书PDF版好久了,估计一半还没能吃透。
  7. 5关于利用加速度计来修正姿态,大家貌似都是做飞机的,飞机上的加速度计的情况跟我做的东西差别太大,
  8. 应该不能直接引用我那一套,大家还是引用网上例如权重法来进行修正吧!用罗盘修正姿态就更不用说了~
  9. */
  10. #define EulerAngle_Type float        //定义类型
  11. #define Quaternion_Type float
  12. #define Acc_Type int
  13. #define Gyro_Type int
  14. #define Euler_Martix_Type float

  15. struct EulerAngle                //欧拉角结构体
  16. {
  17.         EulerAngle_Type Roll, Pitch, Yaw;
  18. }
  19. struct Quaternion                //四元数结构体
  20. {
  21.         Quaternion_Type q0, q1, q2, q3;
  22. }
  23. struct Acc                //加速度值结构体
  24. {
  25.         Acc_Type x, y, z;
  26. }
  27. struct Gyro                //陀螺仪值结构体
  28. {
  29.         Gyro_Type x, y, z;
  30. }
  31. struct Euler_Martix                //欧拉(姿态)矩阵结构体
  32. {
  33.         Euler_Martix_Type T11,T12,T13,        T21,T22,T23,        T31,T32,T33;
  34. }

  35. Quaternion Normalize(Quaternion e)                //四元数归一化
  36. {
  37.         Quaternion_Type s = (Quaternion_Type)Math.Sqrt(e.q0 * e.q0 + e.q1 * e.q1 + e.q2 * e.q2 + e.q3 * e.q3);
  38.         e.q0 /= s;
  39.         e.q1 /= s;
  40.         e.q2 /= s;
  41.         e.q3 /= s;
  42.         return e;
  43. }

  44. Quaternion Multiply_L1(Acc lacc)                //一阶算法
  45. {
  46.         Quaternion Q_result;
  47.         Q_result.q0 = BQ.q0 - BQ.q1 * lacc.x / 2 - BQ.q2 * lacc.y / 2 - BQ.q3 * lacc.z / 2;
  48.         Q_result.q1 = BQ.q1 + BQ.q0 * lacc.x / 2 + BQ.q2 * lacc.z / 2 - BQ.q3 * lacc.y / 2;
  49.         Q_result.q2 = BQ.q2 + BQ.q0 * lacc.y / 2 - BQ.q1 * lacc.z / 2 + BQ.q3 * lacc.x / 2;
  50.         Q_result.q3 = BQ.q3 + BQ.q0 * lacc.z / 2 + BQ.q1 * lacc.y / 2 - BQ.q2 * lacc.x / 2;
  51.         Q_result = Quaternion_Normalize(Q_result);
  52.         return Q_result;
  53. }

  54. Euler_Martix Q_to_EM(Quaternion e)                //把四元数变换成欧拉角(姿态)矩阵T
  55. {
  56.         Euler_Martix result;
  57.         Euler_Martix_Type q00,q01,q02,q03,q11,q12,q13,q22,q23,q33;
  58.         q00=e.q0*e.q0;
  59.         q01=e.q0*e.q1;
  60.         q02=e.q0*e.q2;
  61.         q03=e.q0*e.q3;
  62.         q11=e.q1*e.q1;
  63.         q12=e.q1*e.q2;
  64.         q13=e.q1*e.q3;
  65.         q22=e.q2*e.q2;
  66.         q23=e.q2*e.q3;
  67.         q33=e.q3*e.q3;
  68.         result.T11=q00+q11-q22-q33;
  69.         result.T12=2*(q12+q03);
  70.         result.T13=2*(q13-q02);
  71.         result.T21=2*(q12-q03);
  72.         result.T22=q22-q33+q00-q11;
  73.         result.T23=2*(q23+q01);
  74.         result.T31=2*(q13+q02);
  75.         result.T32=2*(q23-q01);
  76.         result.T33=q33-q22-q11+q00;
  77.         return result;
  78. }

  79. Quaternion Ea_to_Qu(EulerAngle ea)                //把欧拉角变换成四元数      后来不用这个方法了,用矩阵那个了
  80. {
  81.         Quaternion result;

  82.         Quaternion_Type CosY = Math.Cos(ea.Yaw * .5);
  83.         Quaternion_Type SinY = Math.Sin(ea.Yaw * .5);       
  84.         Quaternion_Type CosP = Math.Cos(ea.Pitch * .5f);
  85.         Quaternion_Type SinP = Math.Sin(ea.Pitch * .5);
  86.         Quaternion_Type CosR = Math.Cos(ea.Roll * .5f);
  87.         Quaternion_Type SinR = Math.Sin(ea.Roll * .5f);
  88.        
  89.         result.q0 = CosY * CosP * CosR + SinY * SinP * SinR;
  90.         result.q1 = CosY * CosP * SinR - SinY * SinP * CosR;
  91.         result.q2 = CosY * SinP * CosR + SinY * CosP * SinR;
  92.         result.q3 = SinY * CosP * CosR - CosY * SinP * SinR;
  93.         return result;
  94. }

  95. Acc        coordinate_body_to_inertia(Euler_Martix EM,Acc lacc)                //将体坐标加速度变换到惯性坐标
  96. {
  97. //做飞机不需要,省略
  98. }

  99. EulerAngle EM_to_EU(Euler_Martix lem)        //从姿态矩阵中提取姿态角
  100. {
  101.         EulerAngle result;
  102.         result.Yaw = Math.Atan2(lem.T12, lem.T11);
  103.         result.Pitch = -Math.Asin(lem.T13);
  104.         result.Roll = Math.Atan2(lem.T23, lem.T33);
  105.         return result;
  106. }

  107. void main()
  108. {
  109.         Quaternion BQ;//定义姿态四元素
  110.         Euler_Martix BEM;//定义欧拉矩阵
  111.         EulerAngle BEA;//定义欧拉角
  112.        
  113.         BQ.q0=1;//初始化四元数
  114.         BQ.q1=BQ.q2=BQ.q3=0;//初始化四元数

  115.         char gx,gy,gz;//定义陀螺仪三个轴,用来装值
  116.        
  117.         while(1)//要不断更新,所以弄个循环,你要知道你的更新速率,才能转化下面的一些参数。
  118.                         //根据转动的不可交互性,更新速率越快越好,看书!
  119.         {
  120.                 gx=25;
  121.                 gy=14;
  122.                 gz=4;
  123.                 //以上为读取陀螺仪的三个值,我随便赋值作为例子哈
  124.                
  125.                 EulerAngle lea;//定义欧拉小转角,每次更新的小转角,下面就用到
  126.                
  127.                 lea.Yaw = ((float)gx / 62200 * Math.PI);
  128.                 lea.Pitch = ((float)gy / 62200 * Math.PI);
  129.                 lea.Roll = ((float)gz/ 62200 * Math.PI);
  130.                 //把陀螺仪的三个值转化为角度值(根据自己的采样率、精度等参数转化),不懂请请自行查资料搞懂
  131.                
  132.                 BQ = Multiply_L1(BQ, lea);//更新姿态四元素,由旧四元数和小转角更新得到新四元数
  133.                
  134.                 BEM = Q_to_EM(BQ);//将更新完的姿态四元素转成欧拉矩阵
  135.                 BEA = EM_to_EU(BEM);//从欧拉矩阵中提取欧拉角
  136.         }
  137. }

复制代码



以前收集的,不知道适合不。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

黑皮男 回答时间:2018-4-9 13:35:21
无薪税绵 发表于 2018-4-9 12:47
以前收集的,不知道适合不。

陀螺仪的数据是角速度,我是按照update imu的那个算法处理的,只不过没有加加速度和磁力计进行矫正
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版