日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

mpu-6050 加速度、陀螺儀傳感器的調(diào)試

 quasiceo 2015-08-08


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

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

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多