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

陀螺仪如何算欧拉角

[复制链接]
黑皮男 提问时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版