久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11413|回復: 9
打印 上一主題 下一主題
收起左側

MPU6050四元數姿態更新方法的源程序公示版

  [復制鏈接]
跳轉到指定樓層
樓主
我找了很久終于找到了MPU6050芯片四元數姿態更新方法(公示版)c語言程序


單片機源程序如下:
  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. }
  138. ……………………

  139. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
四元數.zip (2.1 KB, 下載次數: 190)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:224700 發表于 2018-7-23 15:42 | 只看該作者
此代碼編寫還不算好,很多東西沒有注釋
回復

使用道具 舉報

板凳
ID:285352 發表于 2018-8-8 09:09 | 只看該作者
看著貌似不錯,下載下來看看
回復

使用道具 舉報

地板
ID:380389 發表于 2018-9-19 11:17 來自手機 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

5#
ID:427463 發表于 2018-11-15 23:49 | 只看該作者
下載看看,謝謝
回復

使用道具 舉報

6#
ID:44285 發表于 2018-11-18 09:53 | 只看該作者
厲害
回復

使用道具 舉報

7#
ID:244410 發表于 2019-3-6 18:23 | 只看該作者
代碼不全
回復

使用道具 舉報

8#
ID:683468 發表于 2020-1-8 11:27 | 只看該作者
好,真是太好了
回復

使用道具 舉報

9#
ID:825327 發表于 2020-11-22 10:58 來自手機 | 只看該作者
下載來看看
回復

使用道具 舉報

10#
ID:820278 發表于 2021-4-1 17:55 | 只看該作者
Good,注釋寫的也好
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情第一区 | 91综合网 | 国产在线永久免费 | 国产乱码精品1区2区3区 | 天天人人精品 | 久久久久黑人 | 日本a级大片 | 国产丝袜一区二区三区免费视频 | 久久国产视频一区 | 国产成人小视频 | 久久久久九九九女人毛片 | 性福视频在线观看 | 国产福利91精品 | 成人在线免费电影 | 国产黄色av电影 | 毛片一级网站 | 国产成人在线观看免费 | 97精品国产手机 | 国产精品精品 | 视频一区二区在线观看 | 狠狠入ady亚洲精品经典电影 | 欧美a级成人淫片免费看 | 久久久久久国产一区二区三区 | 精品一区国产 | 欧美黑人一区二区三区 | 精品久久久久久亚洲精品 | 久久精品在线播放 | 国产一区二区三区视频在线观看 | 中文字幕日韩欧美一区二区三区 | 99精品免费在线观看 | 日韩在线不卡视频 | 午夜电影福利 | 国产精品国产三级国产aⅴ浪潮 | 在线播放国产一区二区三区 | 91精品国产综合久久久亚洲 | 中文字幕一区在线观看视频 | 在线观看精品视频网站 | 午夜精品影院 | 午夜丰满寂寞少妇精品 | 色香婷婷 | 国产精品国产三级国产aⅴ中文 |