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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3572|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

Mahony AHRS姿態(tài)控制源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:225844 發(fā)表于 2018-4-5 18:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序如下:
  1. #define sampleFreq 512.0f
  2. #define twoKpDef   (2.0f*0.5f)
  3. #define twoKiDef   (2.0f*0.5f)
  4. volatile float twoKp=twoKpDef;
  5. volatile float twoKi=twoKiDef;
  6. volatile float q0=1.0f,q1=1.0f,q2=1.0f,q3=1.0f;
  7. volatile float integralFBx=0.0f,integralFBy=0.0f,integralFBz=0.0f;
  8. //---------------------------------------------------------------------------------------------------
  9. // Fast inverse square-root
  10. // See: http://en.wikipedia.org/wiki/Fast_inverse_square_root
  11. float invSqrt(float x) {
  12. float halfx = 0.5f * x;
  13. float y = x;
  14. long i = *(long*)&y;
  15. i = 0x5f3759df - (i>>1);
  16. y = *(float*)&i;
  17. y = y * (1.5f - (halfx * y * y));
  18. return y;
  19. }

  20. //---------------------------------------------------------------------------------------------------
  21. // IMU algorithm update

  22. void MahonyAHRSupdateIMU(float gx, float gy, float gz, float ax, float ay, float az) {

  23. float recipNorm;
  24. float halfvx, halfvy, halfvz;
  25. float halfex, halfey, halfez;
  26. float qa, qb, qc;

  27. // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)
  28. if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {


  29. // Normalise accelerometer measurement
  30. recipNorm = invSqrt(ax * ax + ay * ay + az * az);
  31. ax *= recipNorm;
  32. ay *= recipNorm;
  33. az *= recipNorm;        

  34. // Estimated direction of gravity and vector perpendicular to magnetic flux
  35. halfvx = q1 * q3 - q0 * q2;
  36. halfvy = q0 * q1 + q2 * q3;
  37. halfvz = q0 * q0 - 0.5f + q3 * q3;

  38. // Error is sum of cross product between estimated and measured direction of gravity
  39. halfex = (ay * halfvz - az * halfvy);
  40. halfey = (az * halfvx - ax * halfvz);
  41. halfez = (ax * halfvy - ay * halfvx);

  42. // Compute and apply integral feedback if enabled
  43. if(twoKi > 0.0f) {

  44. integralFBx += twoKi * halfex * (1.0f / sampleFreq);// integral error scaled by Ki
  45. integralFBy += twoKi * halfey * (1.0f / sampleFreq);
  46. integralFBz += twoKi * halfez * (1.0f / sampleFreq);
  47. gx += integralFBx;// apply integral feedback
  48. gy += integralFBy;
  49. gz += integralFBz;

  50. }
  51. else {

  52. integralFBx = 0.0f;// prevent integral windup
  53. integralFBy = 0.0f;
  54. integralFBz = 0.0f;

  55. }

  56. // Apply proportional feedback
  57. gx += twoKp * halfex;
  58. gy += twoKp * halfey;
  59. gz += twoKp * halfez;

  60. }

  61. // Integrate rate of change of quaternion
  62. gx *= (0.5f * (1.0f / sampleFreq));// pre-multiply common factors
  63. gy *= (0.5f * (1.0f / sampleFreq));
  64. gz *= (0.5f * (1.0f / sampleFreq));
  65. qa = q0;
  66. qb = q1;
  67. qc = q2;
  68. q0 += (-qb * gx - qc * gy - q3 * gz);
  69. q1 += (qa * gx + qc * gz - q3 * gy);
  70. q2 += (qa * gy - qb * gz + q3 * gx);
  71. q3 += (qa * gz + qb * gy - qc * gx);

  72. // Normalise quaternion
  73. recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
  74. q0 *= recipNorm;
  75. q1 *= recipNorm;
  76. q2 *= recipNorm;
  77. q3 *= recipNorm;

  78. }

  79. //---------------------------------------------------------------------------------------------------
  80. //
  81. typedef struct{
  82.                                 float roll;
  83.                                 float pitch;
  84.                                 float yaw;}T_float_angle;
  85. T_float_angle                 Att_Angle;        //×Ë쬽Ç
  86. /*gx,gy,gzíóÂYòÇ¡ax,ay,az¼óËù¶è¡¢¢*/
  87. void MahonyAHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz,T_float_angle *angle ) {  
  88.     float recipNorm;  
  89.     float q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3;   
  90.     float hx, hy, bx, bz;  
  91.     float halfvx, halfvy, halfvz, halfwx, halfwy, halfwz;  
  92.     float halfex, halfey, halfez;  
  93.     float qa, qb, qc;  

  94.     // Use IMU algorithm if magnetometer measurement invalid (avoids NaN in magnetometer normalisation)  
  95.     if((mx == 0.0f) && (my == 0.0f) && (mz == 0.0f)) {  
  96.         MahonyAHRSupdateIMU(gx, gy, gz, ax, ay, az);  
  97.         return;  
  98.     }  

  99.     // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)  
  100.     if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {  

  101.         // Normalise accelerometer measurement  
  102.         recipNorm = invSqrt(ax * ax + ay * ay + az * az);  
  103.         ax *= recipNorm;  
  104.         ay *= recipNorm;  
  105.         az *= recipNorm;      

  106.         // Normalise magnetometer measurement  
  107.         recipNorm = invSqrt(mx * mx + my * my + mz * mz);  
  108.         mx *= recipNorm;  
  109.         my *= recipNorm;  
  110.         mz *= recipNorm;     

  111.         // Auxiliary variables to avoid repeated arithmetic  
  112.         q0q0 = q0 * q0;  
  113.         q0q1 = q0 * q1;  
  114.         q0q2 = q0 * q2;  
  115.         q0q3 = q0 * q3;  
  116.         q1q1 = q1 * q1;  
  117.         q1q2 = q1 * q2;  
  118.         q1q3 = q1 * q3;  
  119.         q2q2 = q2 * q2;  
  120.         q2q3 = q2 * q3;  
  121.         q3q3 = q3 * q3;     

  122.         // Reference direction of Earth's magnetic field  
  123.         hx = 2.0f * (mx * (0.5f - q2q2 - q3q3) + my * (q1q2 - q0q3) + mz * (q1q3 + q0q2));  
  124.         hy = 2.0f * (mx * (q1q2 + q0q3) + my * (0.5f - q1q1 - q3q3) + mz * (q2q3 - q0q1));  
  125.         bx = sqrt(hx * hx + hy * hy);  
  126.         bz = 2.0f * (mx * (q1q3 - q0q2) + my * (q2q3 + q0q1) + mz * (0.5f - q1q1 - q2q2));  

  127.         // Estimated direction of gravity and magnetic field  
  128.         halfvx = q1q3 - q0q2;  
  129.         halfvy = q0q1 + q2q3;  
  130.         halfvz = q0q0 - 0.5f + q3q3;  
  131.         halfwx = bx * (0.5f - q2q2 - q3q3) + bz * (q1q3 - q0q2);  
  132.         halfwy = bx * (q1q2 - q0q3) + bz * (q0q1 + q2q3);  
  133.         halfwz = bx * (q0q2 + q1q3) + bz * (0.5f - q1q1 - q2q2);   

  134.         // Error is sum of cross product between estimated direction and measured direction of field vectors  
  135.         halfex = (ay * halfvz - az * halfvy) + (my * halfwz - mz * halfwy);  
  136.         halfey = (az * halfvx - ax * halfvz) + (mz * halfwx - mx * halfwz);  
  137.         halfez = (ax * halfvy - ay * halfvx) + (mx * halfwy - my * halfwx);  

  138.         // Compute and apply integral feedback if enabled  
  139.         if(twoKi > 0.0f) {  
  140.             integralFBx += twoKi * halfex * (1.0f / sampleFreq);    // integral error scaled by Ki  
  141.             integralFBy += twoKi * halfey * (1.0f / sampleFreq);  
  142.             integralFBz += twoKi * halfez * (1.0f / sampleFreq);  
  143.             gx += integralFBx;  // apply integral feedback  
  144.             gy += integralFBy;  
  145.             gz += integralFBz;  
  146.         }  
  147.         else {  
  148.             integralFBx = 0.0f; // prevent integral windup  
  149.             integralFBy = 0.0f;  
  150.             integralFBz = 0.0f;  
  151.         }  

  152.         // Apply proportional feedback  
  153.         gx += twoKp * halfex;  
  154.         gy += twoKp * halfey;  
  155.         gz += twoKp * halfez;  
  156.     }  

  157.     // Integrate rate of change of quaternion  
  158.     gx *= (0.5f * (1.0f / sampleFreq));     // pre-multiply common factors  
  159.     gy *= (0.5f * (1.0f / sampleFreq));  
  160.     gz *= (0.5f * (1.0f / sampleFreq));  
  161.     qa = q0;  
  162.     qb = q1;  
  163.     qc = q2;  
  164.     q0 += (-qb * gx - qc * gy - q3 * gz);  
  165.     q1 += (qa * gx + qc * gz - q3 * gy);  
  166.     q2 += (qa * gy - qb * gz + q3 * gx);  
  167.     q3 += (qa * gz + qb * gy - qc * gx);   

  168.     // Normalise quaternion  
  169.     recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);  
  170.     q0 *= recipNorm;  
  171.     q1 *= recipNorm;  
  172.     q2 *= recipNorm;  
  173.     q3 *= recipNorm;        
  174. }

復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 激情国产 | 男女免费观看在线爽爽爽视频 | 中文av网站| 国产日韩一区二区 | 九色 在线 | 国产精品久久久久久亚洲调教 | 国产成人精品av | 色婷婷一区二区三区四区 | av一区二区三区四区 | 色婷婷久久久久swag精品 | 99精品免费视频 | 亚洲激情在线观看 | 一级毛片视频在线 | 久久精品天堂 | 久久国产综合 | 亚洲成人高清 | 欧美精三区欧美精三区 | 免费在线看黄视频 | 在线看91 | 久久久久久久久久久国产 | 国产日韩欧美电影 | 在线中文字幕国产 | 香蕉视频在线播放 | 国产日韩精品一区二区 | 国产在线一区二区三区 | 亚洲综合中文字幕在线观看 | 免费同性女女aaa免费网站 | 999久久久 | 久一久 | 精品一区二区三区电影 | 国产亚洲精品久久久久久豆腐 | 免费看黄色小视频 | 欧美一级欧美三级在线观看 | 欧美成人免费在线视频 | 一级视频在线免费观看 | 欧美激情一区二区三区 | 久久一区视频 | 亚洲精品福利在线 | 亚洲一区国产 | 亚洲国产成人精品一区二区 | 欧美日韩免费 |