<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> Arduino >> 瀏覽文章

        mpu-6050 加速度、陀螺儀傳感器的調試

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年05月03日   【字體:

         買了mpu-6050模塊一段時間了,一直沒有時間試,乘五一放假,總算是可以玩一下了。先找了一點簡介:

         
        ——————————
         
         MPU-6000為全球首例整合性6軸運動處理組件,相較于多組件方案,免除了組合陀螺儀與加速器時之軸間差的問題,減少了大量的包裝空間。MPU-6000整合了3軸陀螺儀、3軸加速器,并含可藉由第二個I2C端口連接其他廠牌之加速器、磁力傳感器、或其他傳感器的數位運動處理(DMP: Digital Motion Processor)硬件加速引擎,由主要I2C端口以單一數據流的形式,向應用端輸出完整的9軸融合演算技術 。
         
        MPU-6000的角速度全格感測范圍為±250、±500、±1000與±2000°/sec (dps),可準確追緃快速與慢速動作,并且,用戶可程式控制的加速器全格感測范圍為±2g、±4g±8g與±16g。產品傳輸可透過最高至400kHz的I2C或最高達20MHz的SPI。 
        MPU-6000可在不同電壓下工作,VDD供電電壓介為2.5V±5%、3.0V±5%或3.3V±5%,邏輯接口VVDIO供電為1.8V± 5%。MPU-6000的包裝尺寸4x4x0.9mm(QFN),在業界是革命性的尺寸。其他的特征包含內建的溫度感測器、包含在運作環境中僅有±1%變動的振蕩器。
         
        ——————————————
         
        總的來說,6050算是現在比較便宜好用的加速度陀螺儀芯片了,但是直接讀取時噪聲大,需要進行濾波。因此開始還找了一下卡爾曼濾波方面的資料,并且在網上發現了一種做好的6050+卡爾曼濾波集成的模塊,不貴,35-58元,從網站的圖片看效果很好,而且輸出改成了串口,連接比較簡單。剛看到有人對此提出質疑:,覺得其實就是用了一塊8位的stm8調用了6050自帶的dmp功能。模塊的采樣率100hz,后面說的dmp也可以做到。呵呵,誰對誰錯就不好說了,不過用這個模塊省了自己琢磨dmp了,懶人福音吧。用卡爾曼動態濾波算法,或者簡化版的濾波,這種方法用好了效果會非常好,有些參數可以根據實際應用進行調整,改進效果。另一種是利用MPU6050內部的姿態融合器DMP,直接輸出姿態角,優點是CPU參與少,但融合參數不可調整,調試困難(主要是可參考的資料很少)。
         
        連線:首先把6050和arduino連起來,6050模塊有8個插口,不用都用到,只需要把SCL和SDL連在A5和A4端就可以用了,有時需要中斷時,把INt和D2連接,如下圖。
         
         
        Jeff Jrowberg 的DMP庫(庫名 MPU6050 I2C device class, 6-axis MotionApps20.h;當然這個庫不是AVR的),這個庫,是作者通過“反向工程“得到的,不是官方的!
        如果你仔細讀Jeff Jrowberg的代碼,其實就是i2c操作,先設置6050寄存器,再在6050內存中寫入firmware,然后是config,最后是update,然后就可以直接讀出FIFO里的quarternion數據,當然還有gyro和accel數據!注意,陀螺儀數據是可以自動校正,只需要傳感器8秒保持不動即可,四元數處理后得到的角度數據是非常穩定的!自動校正功能是在DMP模式下才有的.
        MPU-6050內部的DMP運算,roll和pitch兩個參數,用了片內的加計(重力)對陀螺儀數據進行了校正,而yaw軸就沒有相應的校正參考,陀螺儀的輸出會漂移是很正常的,只能采用磁感傳感器校正(使用invensense的9軸DMP或自己校正)!很不莘,當你用5883時,請一定記得先將5883做8字校準,不然你的YAW軸不會得到能用的數據的!
        ——————
         
        9軸mpu-9150要貴一些,但是集成了地磁傳感器。也可以用別的磁場傳感器,后面可以試試。先說說直接讀取的數據吧。導入I2Cdev.h和mpu6050.h兩個庫函數,運行示例程序,可以得到三個軸的角速度和加速度。數據的波動比較大,見圖。ax-az是加速度,單位10E-3 g,gx-gz是角速度。未經濾波處理的數據是不能直接用的。而且如何從這6個參數得到模型的空間姿態,也是很麻煩的,后面摘抄了一段相關帖子,說的比較明白。
         
         
         
            Serial.print(ax/16.384); Serial.print(",");
         
            Serial.print(ay/16.384); Serial.print(",");
         
            Serial.print(az/16.384); Serial.print(",");
         
            Serial.print(gx/131); Serial.print(",");
         
            Serial.print(gy/131); Serial.print(",");
         
            Serial.println(gz/131);
         
        未經處理的數據:
         
        mpu-6050 加速度、陀螺儀傳感器的調試(1)
        dmp后得到的歐拉角:
        mpu-6050 加速度、陀螺儀傳感器的調試(1)
         
         
         
        MPU6050模塊是InvenSense公司推出的一款低成本的6軸傳感器模塊,包括三軸加速度,三軸角速度。其體積小巧,用途非常廣。做平衡小車,四軸飛行器,飛行鼠標等等,都是必不可少而且是最優的傳感器解決方案。本人根據自己的一些實際工作經驗和使用體會來談談MPU6050的相關問題吧,拋磚引玉,如有不當之處,歡迎大家批評指正。
         
        不論是做平衡還是四軸飛行器,關鍵的問題在于兩方面,一是模塊姿態的確定,通常需要用到積分運算與卡爾曼濾波算法,需要較強的數學功底與編程能力,二是穩定控制,方法比較單一,就是經典的PID控制算法,難點在于需要根據實際情況調整PID的參數,需要做實驗確定,不難,只是費時間。因此以下主要分析姿態確定問題。
         
        雖然6050模塊能夠輸出三軸加速度和三軸角速度的數據,但實際應用的時候,直接使用的確不是這些量,而是需要根據這些數據解算出三軸的角度數據。比如平衡小車,需要算出 
        模塊的俯仰角,然后控制算法根據角度大小控制小車輪子的移動。四軸飛行器需要根據俯仰角度、滾轉角度,和飛行指令來調節四個電機的轉速。
         
        從6軸的原始數據得到三軸的角度計算是一個比較復雜的運動學解算過程,有的童鞋可能會說,不就是三軸角速度積分不就行了嗎?這就是沒有實踐,想當然的說法。有三點需要注意的問題:
         
        1.三軸姿態的解算不能直接積分。因為三軸是有耦合的,只有在三軸角度為小角度的時候可以這么算,角度大了以后,比如60度了,這么算的誤差就很大。標準的做法是用四元數的方法做姿態解算,積分的方法可以用4階龍格-庫塔法,或者4階Gill法。詳情請參考:航空航天器運動的建模——飛行動力學的理論基礎 肖業倫著 北京航空航天大學出版社。
         
        2.積分運算的累積誤差。角速度積分運算是有累積誤差的,累積誤差在短時間內表現不明顯,只要零點漂移處理得好了,1分鐘以內的漂移都不大,但時間長了,就會有累積誤差,5分鐘就漂到不知道哪里去了。
         
        3.角速率零點漂移。所謂零點漂移就是模塊靜止的時候,我們認為正常的輸出應該是0,或者均值為0的數據,但是實際上6050的輸出不是,可能在2°/s或者其他,而且每次都不一樣,如果不校準,別說1分鐘了,10秒鐘誤差就有20度。
         
        根據上面的分析,似乎要獲得角度非常困難呀。又有些聰明的朋友會想,用角速率積分這么麻煩,我不怎么算好了,條條大路通羅馬,為啥非得用這個方法。6050不是能輸出加速度嗎?我用重力在3軸的分量的反正切值,作為滾轉角和俯仰角不久行了。
         
        用加速度計算的確也是一種方法,但使用加速度也有三方面的問題:
         
        1.無法在動態情況下使用,使用重力的來解算姿態的前提條件是模塊本身沒有加速度,因此模塊輸出的三軸加速度值,正好是重力在模塊本體坐標系下的分量,從而能夠求出俯仰和滾轉的姿態角度。一旦模塊運動起來,這種方法就傻了,因為模塊無法分辨出哪些是重力的分量,那些是模塊本身的加速度引起的。目前市面上很多傾角儀就是這種思路,但問題就是沒法在動態情況下使用,最簡單的測試方法就是把模塊水平放置桌面上,緩慢運動,發現X,Y軸的角度基本不變化,都在0度左右,一旦快速運動起來,X,Y軸就顯示有很大的角度了。而實際上模塊一直水平,沒有變化。
         
        2.精度差。6050模塊的加速度本身的精度不高,就算是在靜態情況下,角度測量的精度也只能到1°左右。
         
        3.三軸耦合問題。利用加速度求解姿態的時候,也會有三軸耦合的問題,因為姿態表示與坐標旋轉順序有關,這樣只有一種一個軸能用反正切值計算,另一個軸不能用反正切值計算。
         
        那么怎么才能得到高精度不漂移的三軸角度呢?陀螺儀精度高,但時間長了會有漂移,加速度動態精度差,但沒有長期漂移。能否綜合利用陀螺儀和加速度計的特點,優勢互補獲得準確的姿態角度呢?答案是肯定的,方法就是用卡爾曼濾波做數據融合。大致的思路是將模塊的姿態用四元素表示,作為系統的狀態量,模塊的姿態運動學方程作為濾波的狀態轉移方程,加速度信息作為濾波的觀察量信息,然后利用卡爾曼濾波的計算方法迭代計算更新,詳細的過程可以參考慣性導航方面的書籍。不過卡爾曼濾波算法比較復雜,需要用到矩陣運算等等,數學功底和編程基礎要求都較高,不是初學者能夠快速掌握的。而且MPU6050模塊是IIC接口輸出的,也給初學者帶來了不少障礙與困難。
         
        ————————————————————
         
        默認陀螺儀的量程是250度/s,可以設置到最高2000度/s。調用
            MPU6050 accelgyro;
            accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
            accelgyro.setFullScaleAccelRange(MPU6050_ACCEL_FS_8);
        參數為:
        #define MPU6050_GYRO_FS_250         0x00
        #define MPU6050_GYRO_FS_500         0x01
        #define MPU6050_GYRO_FS_1000        0x02
        #define MPU6050_GYRO_FS_2000        0x03
        #define MPU6050_ACCEL_FS_2          0x00
        #define MPU6050_ACCEL_FS_4          0x01
        #define MPU6050_ACCEL_FS_8          0x02
        #define MPU6050_ACCEL_FS_16         0x03
        這些定義可以在MPU6050.h和cpp文件中找到。
        相應地,測量數據到角速度之間轉換比例也要變,如:
            Serial.print(ax/4.096); Serial.print(",");
            Serial.print(ay/4.096); Serial.print(",");
            Serial.print(az/4.096); Serial.print(",");
            Serial.print(gx/16.4); Serial.print(",");
            Serial.print(gy/16.4); Serial.print(",");
            Serial.println(gz/16.4);
         
        ——————————————
        調用DMP:
         下載DMP的庫文件:https://github.com/jrowberg/i2cdevlib
        添加 MPU6050_6Axis_MotionApps20.h
        運行其自帶的例子MPU6050_DMP6,發現不能正確得到結果,數據是亂的,有一定規律,隔幾個數就出現一個FIFO溢出錯誤,說明問題出在FIFO讀取上。不是很明白,于是上網找結果,最后找到一句話“在arduino loop代碼最后mpu.resetFIFO();采樣數據就穩定了”解決了問題。但是有點治標不治本,等有空再看看庫函數學習學習。
        DMP后的結果可以是歐拉角(ypr)yaw(偏航),pitch(俯仰),roll(滾轉)角度,也可以是四元數等等。
         
        對于歐拉角表示:
        roll 是繞y軸旋轉的角度
        pitch 是繞x軸旋轉的角度
        yaw 是繞z軸旋轉的角度
        mpu-6050 <wbr>加速度、陀螺儀傳感器的調試(2) <wbr>dmp
        ——————————
        數據的穩定性:
          得到的數據的噪聲很小,pitch和roll的變動幅度在0.1度以內,而yew一直在漂移。和上一篇中的轉載一致。簡單做了一下記錄,可以看出漂移的量很大:
        21:50
        52.09,1.96,-2.01
        52.09,1.97,-2.00
         
        21:55
        50.56,1.97,-1.96
        50.56,1.97,-1.96
         
        22:05
        48.41,1.96,-1.96
        48.41,1.96,-1.96
         
        22:20
        44.52,1.96,-1.92
        44.52,1.96,-1.92
         
        22:30
        42.17,1.97,-1.95
        42.17,1.97,-1.95
         
        24:01
        19.12,1.97,-1.92
        19.12,1.97,-1.92
         
        因此必須校準。同時可以看出角度也是相對量,即和初始位置相關。
         
         
        ****MPU6050庫的安裝方法*************************johnsonzzd
        1. 下載arduino編譯器,目前版本為1.0.5。
        2. 下載MPU6050庫。進入“https://github.com/jrowberg/i2cdevlib”,點擊“zip”即可。
        3. 安裝。將上一步下載的“I2Cdev”、“MPU6050”兩個文件夾拷貝到“arduino-1.0.5\libraries”目錄下。
        運行arduino可以在例子中看到MPU6050。OK!
         
        ——————————————————————
        MPU6050數據處理實驗一
         
         
        關于dmp,我的實驗結果是數據非常穩定,應該沒有其它方法比這個更穩定了,數據可以直接拿來用不用任何濾波。數據也應該是最準確的了。當然穩定和準確是要付出時間代價的。默認輸出中斷頻率是100Hz,對頭文件的數組最后一位改為0可輸出200Hz(這是最快的了),對于一般的應用應該是最好的選擇,如果做隨動方面的設備,延遲非常明顯,不過可以用角速度積分來改善(我是昨天才想到的,這幾天有時間來驗證一下)。希望能成功吧。如果成功,那mpu6050的穩定精確和實時性就能達到隨動的要求了。
         
        ---------------------SuperAnt 
         
        平衡控制系統中最復雜的兩部分內容,一部分是濾波,另一部分是PID穩定控制。
        濾波是為了獲得對真實狀態的最佳估計,如姿態信息等,而PID控制是為了實現對狀態偏差的矯正。其中濾波通常是最復雜也是最難的部分。
        好的濾波算法可以獲得非常準確地系統狀態,提高精度,通常使用動態卡爾曼濾波算法,算法比較復雜,數學功底要求高,是技術活兒。PID控制看似復雜,其實非常簡單,運算量不大,關鍵是三個控制參數的調整,一般需要進行很多次試驗才能找到合適的參數,是個體力活兒。
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮