v3.4實(shí)戰(zhàn):從原始數(shù)據(jù)到3D姿態(tài)顯示全解析)
簡(jiǎn)介這是一份基于正點(diǎn)原子精英板STM32F103ZET6的MPU6050六軸傳感器工程代碼配合匿名科創(chuàng)v4.34上位機(jī)實(shí)現(xiàn)姿態(tài)實(shí)時(shí)監(jiān)測(cè)與數(shù)據(jù)波形顯示。資源面向嵌入式開(kāi)發(fā)初學(xué)者、無(wú)人機(jī)飛控愛(ài)好者及大學(xué)生畢設(shè)場(chǎng)景解決MPU6050底層讀取、DMP姿態(tài)解算與上位機(jī)聯(lián)動(dòng)調(diào)試等常見(jiàn)問(wèn)題。壓縮包內(nèi)含175個(gè)文件以43個(gè)h頭文件、40個(gè)c源文件為主輔以24個(gè)d依賴文件、24個(gè)o目標(biāo)文件和23個(gè)crf編譯中間文件完整保留Keil工程結(jié)構(gòu)代碼注釋清晰便于對(duì)照學(xué)習(xí)。資源大小4.89MB已有739人學(xué)習(xí)下載。使用這份工程可快速在精英板上運(yùn)行MPU6050實(shí)驗(yàn)通過(guò)匿名上位機(jī)查看實(shí)時(shí)飛控狀態(tài)、姿態(tài)角波形與傳感器原始數(shù)據(jù)同時(shí)可參考代碼中的串口通信與數(shù)據(jù)協(xié)議解析方法來(lái)遷移到其他項(xiàng)目適合動(dòng)手實(shí)踐與二次開(kāi)發(fā)。 把v3.4匿名上位機(jī)MPU6050 精英.zip這個(gè)包下載下來(lái)那會(huì)兒我正被手里的平衡小車(chē)折騰得夠嗆——傳感器數(shù)據(jù)讀出來(lái)了但全是密密麻麻的十六進(jìn)制數(shù)組根本不知道姿態(tài)算得對(duì)不對(duì)。裝上匿名上位機(jī)、把MPU6050的數(shù)據(jù)喂進(jìn)去之后第一次在電腦上看到3D模型跟著板子實(shí)時(shí)翻轉(zhuǎn)那種感覺(jué)就像蒙眼走路突然睜開(kāi)了眼。這個(gè)組合至今都是姿態(tài)調(diào)試的黃金搭檔一頭是幾乎人手一塊的六軸傳感器另一頭是免費(fèi)夠用的串口調(diào)試神器一套下來(lái)幾十塊錢(qián)就能把慣性測(cè)量這件事看個(gè)通透。這篇就專門(mén)拆解這個(gè)打包里最核心的兩樣?xùn)|西——v3.4匿名上位機(jī)和MPU6050從硬件接線、底層協(xié)議到上位機(jī)配置把從傳感器原始數(shù)據(jù)到屏幕3D動(dòng)畫(huà)的完整鏈路捋一遍。無(wú)論是做四軸、平衡車(chē)、機(jī)械臂還是手勢(shì)控制這套組合都能幫你少走很多彎路。1. 這個(gè)組合能干什么上位機(jī)定位與傳感器選型邏輯1.1 匿名上位機(jī)從串口數(shù)據(jù)到可視化面板的轉(zhuǎn)換器匿名上位機(jī)的正式名字叫匿名上位機(jī)收發(fā)調(diào)試軟件開(kāi)發(fā)團(tuán)隊(duì)是匿名科創(chuàng)。它本質(zhì)上是一個(gè)串口調(diào)試助手但把數(shù)據(jù)可視化做到了極致支持波形曲線、3D姿態(tài)模型、地圖顯示、PID調(diào)參面板、虛擬示波器等等。對(duì)于做運(yùn)動(dòng)控制、姿態(tài)解算的人來(lái)說(shuō)它最大的價(jià)值是把看不見(jiàn)的傳感器數(shù)據(jù)變成看得見(jiàn)的圖形調(diào)試效率完全不是一個(gè)級(jí)別。我最早用的是v2.x版本當(dāng)時(shí)只有基礎(chǔ)波形功能。后來(lái)v3.4版本加入了ATK-MS53L1M激光測(cè)距、光流、GPS等模塊的支持界面也穩(wěn)定了不少很多教程、教學(xué)視頻用的就是這一版。它支持自定義協(xié)議幀也就是你可以按照它的通信協(xié)議把任意數(shù)據(jù)打包發(fā)過(guò)來(lái)它負(fù)責(zé)解析、顯示、保存。這一點(diǎn)很關(guān)鍵——它不綁定某一款單片機(jī)STM32、STM8、Arduino、51都能用只要你把數(shù)據(jù)按協(xié)議組裝好。1.2 為什么偏偏是MPU6050MPU6050是InvenSense出品的六軸慣性測(cè)量單元內(nèi)部集成了三軸MEMS加速度計(jì)和三軸MEMS陀螺儀還帶一個(gè)數(shù)字運(yùn)動(dòng)處理器DMPDigital Motion Processor。這顆芯片幾乎統(tǒng)治了入門(mén)級(jí)的姿態(tài)傳感市場(chǎng)原因很直白便宜、資料全、精度夠用。六軸的含義是三個(gè)加速度軸加三個(gè)陀螺儀軸。加速度計(jì)測(cè)量的是比力靜止時(shí)可以算出重力方向從而得到橫滾角和俯仰角陀螺儀測(cè)量的是角速度對(duì)角速度積分可以得到角度變化。但它們各自都有硬傷加速度計(jì)怕振動(dòng)、怕運(yùn)動(dòng)加速度干擾短期內(nèi)噪聲大陀螺儀有零漂長(zhǎng)期積分會(huì)飄走。所以實(shí)際使用中要用互補(bǔ)濾波或卡爾曼濾波把兩者融合或者直接用DMP輸出四元數(shù)。匿名上位機(jī)的3D姿態(tài)顯示功能正好可以直觀驗(yàn)證融合效果。補(bǔ)充一點(diǎn)網(wǎng)上經(jīng)常有人問(wèn)為什么不用MPU92509250多了磁力計(jì)能做航向參考但價(jià)格更高、假貨多。對(duì)于入門(mén)做姿態(tài)顯示、平衡車(chē)、四軸6050完全夠用。等真的把這套鏈路跑通了再升級(jí)也不遲。1.3 v3.4和v7版本怎么選現(xiàn)在匿名科創(chuàng)官網(wǎng)已經(jīng)更新到v7版本界面風(fēng)格大變?cè)黾恿司W(wǎng)絡(luò)透?jìng)鳌⒍鄼C(jī)通信等功能。但我個(gè)人建議新手還是先用v3.4一是界面簡(jiǎn)潔功能按鈕少不容易迷失二是網(wǎng)上絕大部分教程、例程都是基于v3.4寫(xiě)的碰到問(wèn)題搜索解決方案更方便三是它對(duì)低分辨率屏幕、老電腦更友好運(yùn)行輕量。v7更適合有一定基礎(chǔ)、需要多通道并行調(diào)試或者做可視化效果更好的項(xiàng)目。不過(guò)這兩個(gè)版本的上位機(jī)協(xié)議不兼容數(shù)據(jù)幀格式有差異所以用了v3.4就堅(jiān)持用v3.4的協(xié)議不要混搭。我最初就吃過(guò)這個(gè)虧用新版本上位機(jī)去接老協(xié)議的數(shù)據(jù)包結(jié)果解析全是亂的。2. 硬件連接與通信細(xì)節(jié)先把物理層搞對(duì)2.1 引腳定義與最小接線方案MPU6050模塊雖然各家做的PCB布局不一樣但核心引腳基本一致。標(biāo)準(zhǔn)的接口是八個(gè)引腳VCC、GND、SCL、SDA、XDA、XCL、ADO、INT。其中XDA和XCL是輔助I2C接口用于外接磁力計(jì)比如MPU9250模式下的AK8963在只用6050時(shí)可以不用接。ADO是地址選擇腳接GND時(shí)I2C地址是0x68接VCC時(shí)是0x69一般默認(rèn)接GND。INT是中斷輸出腳如果要用DMP的FIFO中斷這個(gè)腳必須接單片機(jī)的外部中斷引腳。跟STM32的接線我一般這么接VCC → 3.3V部分模塊板載穩(wěn)壓芯片也可以接5V但看具體模塊說(shuō)明GND → GNDSCL → PB6I2C1時(shí)鐘SDA → PB7I2C1數(shù)據(jù)INT → PA0外部中斷引腳用于DMP中斷用Arduino的話對(duì)應(yīng)關(guān)系是A5接SCL、A4接SDAINT接D2或D3。2.2 上拉電阻與供電的那些坑MPU6050的I2C接口是開(kāi)漏輸出必須有上拉電阻把線路拉高。絕大多數(shù)現(xiàn)成模塊上都已經(jīng)焊好了4.7k或10k的4.7kΩ上拉電阻直接接單片機(jī)IO口沒(méi)問(wèn)題。但如果用的是裸芯片或者自己畫(huà)板必須記得加上拉電阻否則SDA和SCL的電平上不去通信直接失敗。供電上要特別注意電壓?jiǎn)栴}。雖然很多模塊的板載穩(wěn)壓芯片如RT9193能把5V降成3.3V但如果你的模塊是純裸片沒(méi)有穩(wěn)壓接了5V就燒。保險(xiǎn)起見(jiàn)建議一律用3.3V供電。還有I2C線上的電平也要和單片機(jī)IO電平匹配STM32F103是3.3V邏輯接3.3V供電完全沒(méi)有問(wèn)題如果用51單片機(jī)最好查一下IO口是否耐5V再去接模塊。2.3 I2C時(shí)序從示波器角度看一次完整讀寫(xiě)I2C通信本身不復(fù)雜但理解時(shí)序?qū)ε挪閱?wèn)題很有幫助。一次典型的讀取操作是這樣的主機(jī)先發(fā)起始位然后發(fā)送7位設(shè)備地址加一位讀寫(xiě)標(biāo)志位讀操作時(shí)最低位是1接著發(fā)送寄存器地址再重發(fā)起始位和地址最后接收數(shù)據(jù)并發(fā)出停止位。寫(xiě)MPU6050的寄存器也一樣先發(fā)設(shè)備地址加寫(xiě)標(biāo)志最低位是0再發(fā)寄存器地址和待寫(xiě)入的數(shù)據(jù)最后停止。整個(gè)過(guò)程SCL為高電平時(shí)SDA不能變化數(shù)據(jù)必須在SCL低電平時(shí)變化這是I2C的基本規(guī)矩。如果上拉電阻阻值太大、總線電容太高波形邊沿會(huì)變緩?fù)ㄐ啪涂赡懿环€(wěn)定表現(xiàn)為十次里偶爾兩三次失敗。我第一次調(diào)式時(shí)用邏輯分析儀抓波形發(fā)現(xiàn)SDA線上的毛刺很多后來(lái)把連線縮短、用杜邦線換成雙絞的方式問(wèn)題明顯改善。所以如果你的數(shù)據(jù)偶爾會(huì)跳變先別懷疑代碼從物理連接上找原因。3. 數(shù)據(jù)解析與上位機(jī)協(xié)議的完整鏈路3.1 原始數(shù)據(jù)誰(shuí)來(lái)讀寄存器直讀vs DMP讀MPU6050有兩種主流方案。第一種是直接從寄存器讀加速度計(jì)和陀螺儀的原始值然后在單片機(jī)里做濾波和姿態(tài)融合。第二種是使用芯片內(nèi)部的DMP它通過(guò)I2C加載固件在芯片內(nèi)部完成姿態(tài)解算直接輸出四元數(shù)單片機(jī)只需要讀取DMP的FIFO數(shù)據(jù)再做格式轉(zhuǎn)換。早期用方案一多一些因?yàn)镈MP庫(kù)在部分單片機(jī)上移植有坑。但后來(lái)InvenSense官方庫(kù)和第三方移植都很成熟方案二反而更省事。DMP輸出的四元數(shù)經(jīng)過(guò)公式轉(zhuǎn)換得到歐拉角省去了自己寫(xiě)卡爾曼或者互補(bǔ)濾波的麻煩。不過(guò)DMP加載固件后功耗略有上升在低功耗場(chǎng)景下需要注意。對(duì)于初學(xué)調(diào)試上位機(jī)我建議先用寄存器直讀模式把原始加速度和角速度用匿名上位機(jī)顯示成波形。如果波形隨板子傾斜、轉(zhuǎn)動(dòng)而平滑變化說(shuō)明傳感器和通信鏈路沒(méi)問(wèn)題再上DMP輸出四元數(shù)接3D顯示。這樣分步走出了問(wèn)題好定位。3.2 匿名上位機(jī)v3.4通信幀格式拆解匿名上位機(jī)的協(xié)議基于一幀一幀的報(bào)文核心格式是幀頭加功能字加數(shù)據(jù)加校驗(yàn)。v3.4里最常用的命令幀是這樣的幀頭0xAA 0xAA兩個(gè)字節(jié)表示一幀開(kāi)始功能字1字節(jié)表明這幀數(shù)據(jù)的類型比如0x01是加速度計(jì)數(shù)據(jù)0x02是陀螺儀數(shù)據(jù)0x03是角度數(shù)據(jù)0x51是四元數(shù)數(shù)據(jù)數(shù)據(jù)長(zhǎng)度1字節(jié)表示后面有效數(shù)據(jù)的字節(jié)數(shù)數(shù)據(jù)按功能字規(guī)定的格式排列校驗(yàn)和1字節(jié)通常是數(shù)據(jù)累加和用于檢錯(cuò)常見(jiàn)的一種格式是AA AA 01 06 ax_high ax_low ay_high ay_low az_high az_low sum這是加速度計(jì)數(shù)據(jù)幀。其中ax、ay、az各占兩個(gè)字節(jié)高字節(jié)在前、低字節(jié)在后有符號(hào)數(shù)單位是mg或由量程決定。校驗(yàn)和是功能字、長(zhǎng)度、數(shù)據(jù)所有字節(jié)累加取低8位。這個(gè)協(xié)議格式很多人在網(wǎng)上能找到但我還是要強(qiáng)調(diào)不同版本之間略有差異尤其是3D顯示用的四元數(shù)幀v3.4和v7的數(shù)據(jù)排列順序都不一樣。用的時(shí)候以壓縮包里自帶的通信協(xié)議說(shuō)明文檔為準(zhǔn)別拿網(wǎng)上抄來(lái)的代碼盲目套。3.3 關(guān)鍵參數(shù)計(jì)算量程、靈敏度與縮放系數(shù)MPU6050的加速度計(jì)量程可以配置為±2g、±4g、±8g、±16g陀螺儀量程可以配置為±250、±500、±1000、±2000 dps。量程不同換算實(shí)際值的靈敏度系數(shù)也不同加速度計(jì)±2g16384 LSB/g加速度計(jì)±4g8192 LSB/g加速度計(jì)±8g4096 LSB/g加速度計(jì)±16g2048 LSB/g陀螺儀±250 dps131 LSB/(°/s)陀螺儀±500 dps65.5 LSB/(°/s)陀螺儀±1000 dps32.8 LSB/(°/s)陀螺儀±2000 dps16.4 LSB/(°/s)比如我配置加速度計(jì)量程為±2g讀到的原始值是3276換算成g就是3276除以16384約等于0.2g。發(fā)送到上位機(jī)時(shí)如果協(xié)議要求的是帶符號(hào)的原始值整型可以直接發(fā)原始值如果協(xié)議要求實(shí)際值就要先做浮點(diǎn)換算再轉(zhuǎn)換單位發(fā)出去。這個(gè)換算細(xì)節(jié)特別容易栽跟頭。我曾經(jīng)為了省事直接把原始值發(fā)給上位機(jī)配了錯(cuò)誤的縮放倍數(shù)3D模型的姿態(tài)角度全都偏大。后來(lái)仔細(xì)看協(xié)議說(shuō)明才發(fā)現(xiàn)需要把原始值除以靈敏度轉(zhuǎn)換為g再根據(jù)上位機(jī)的顯示幅值范圍乘以固定系數(shù)最終顯示才正確。4. 實(shí)操環(huán)節(jié)從STM32代碼到3D姿態(tài)顯示4.1 硬件環(huán)境與軟件準(zhǔn)備我實(shí)際操作時(shí)用的硬件是STM32F103C8T6最小系統(tǒng)板加上一個(gè)MPU6050模塊USB轉(zhuǎn)TTL串口模塊以及若干杜邦線。軟件方面IDE用Keil MDK5代碼是自己寫(xiě)的I2C驅(qū)動(dòng)加從官方DMP庫(kù)移植過(guò)來(lái)的姿態(tài)解算部分。上位機(jī)就是壓縮包里的匿名上位機(jī)v3.4。有人會(huì)問(wèn)能不能用軟件I2C模擬時(shí)序當(dāng)然可以。我的建議是如果只是調(diào)試上位機(jī)用軟件I2C更容易閱讀和理解——GPIO翻轉(zhuǎn)的代碼比硬件I2C的寄存器配置直觀得多排查問(wèn)題時(shí)也更方便。等移植到實(shí)際產(chǎn)品中再切換硬件I2C提升穩(wěn)定性。4.2 初始化MPU6050的關(guān)鍵步驟初始化順序很固定我整理了一個(gè)經(jīng)過(guò)測(cè)試的流程第一步復(fù)位芯片。向寄存器0x6BPWR_MGMT_1寫(xiě)入0x80讓芯片復(fù)位延時(shí)100ms。第二步喚醒芯片。再向0x6B寫(xiě)入0x00退出睡眠模式。這一步忘了寫(xiě)會(huì)導(dǎo)致讀取全部是零。第三步配置時(shí)鐘源。把0x6B的bit2置1選擇PLL的X軸陀螺作為時(shí)鐘源比默認(rèn)的內(nèi)部時(shí)鐘更穩(wěn)定。第四步配置量程。向寄存器0x1CACCEL_CONFIG寫(xiě)入0x00加速度計(jì)±2g向寄存器0x1BGYRO_CONFIG寫(xiě)入0x18陀螺儀±2000dps。這里的0x18對(duì)應(yīng)二進(jìn)制00011000bit4和bit3是量程位。第五步配置數(shù)字低通濾波器。向寄存器0x1ACONFIG寫(xiě)入0x03設(shè)置帶寬約44Hz對(duì)高頻噪聲有抑制作用。第六步讀取寄存器0x75檢查WHO_AM_I寄存器返回值應(yīng)該是0x68。如果讀不到或者值不對(duì)說(shuō)明I2C通信有問(wèn)題后面不用繼續(xù)了。4.3 發(fā)送數(shù)據(jù)幀的代碼與校驗(yàn)實(shí)現(xiàn)讓數(shù)據(jù)真正顯示到上位機(jī)發(fā)送函數(shù)是核心。以發(fā)送加速度計(jì)數(shù)據(jù)幀為例我的發(fā)送邏輯是這樣的void Send_Accel_Data(short ax, short ay, short az) { unsigned char buf[14]; unsigned char sum 0; unsigned char i; buf[0] 0xAA; // 幀頭1 buf[1] 0xAA; // 幀頭2 buf[2] 0x01; // 功能字加速度 buf[3] 6; // 數(shù)據(jù)長(zhǎng)度 buf[4] ax 8; // 高字節(jié) buf[5] ax 0xFF; // 低字節(jié) buf[6] ay 8; buf[7] ay 0xFF; buf[8] az 8; buf[9] az 0xFF; sum buf[2] buf[3] buf[4] buf[5] buf[6] buf[7] buf[8] buf[9]; buf[10] sum 0xFF; // 校驗(yàn)和 for(i 0; i 11; i) { UART_SendByte(buf[i]); } }校驗(yàn)和的計(jì)算范圍為功能字到最后一個(gè)有效數(shù)據(jù)字節(jié)不包括幀頭。這個(gè)細(xì)節(jié)我在不同平臺(tái)上都踩過(guò)坑有些第三方庫(kù)會(huì)把幀頭也加進(jìn)去導(dǎo)致收不到數(shù)據(jù)。另外發(fā)送頻率也很重要。上位機(jī)的波形顯示一般用10到50Hz刷新就足夠我習(xí)慣用定時(shí)器控制每20ms發(fā)送一組數(shù)據(jù)。太快了上位機(jī)處理不過(guò)來(lái)界面會(huì)卡太慢了曲線跳變明顯看起來(lái)不連貫。4.4 上位機(jī)配置從端口選擇到3D顯示拿到壓縮包解壓后直接運(yùn)行匿名上位機(jī).exe不需要安裝。第一次打開(kāi)先做三件事第一選擇串口號(hào)。在右上角下拉框里找到實(shí)際對(duì)應(yīng)的COM口可以在Windows設(shè)備管理器里查看USB轉(zhuǎn)串口設(shè)備分配的COM號(hào)波特率配置為115200數(shù)據(jù)位8、停止位1、無(wú)校驗(yàn)這個(gè)必須和下位機(jī)串口初始化一致。第二打開(kāi)串口。點(diǎn)擊右上角的打開(kāi)串口按鈕按鈕變成紅色說(shuō)明串口已經(jīng)打開(kāi)。第三切換到3D顯示界面。v3.4的主界面上方有多個(gè)選項(xiàng)卡其中3D顯示頁(yè)面會(huì)展示一個(gè)帶坐標(biāo)系的三維模型。當(dāng)收到有效的數(shù)據(jù)幀后模型會(huì)跟隨傳感器的姿態(tài)實(shí)時(shí)旋轉(zhuǎn)。如果收到的四元數(shù)幀則直接顯示融合后的姿態(tài)如果只收到加速度和陀螺儀原始數(shù)據(jù)則需要在上位機(jī)里啟用算法融合功能才能在3D模型上看到正確姿態(tài)。這一步是很多新手的困惑點(diǎn)明明發(fā)送數(shù)據(jù)了、波形也有但3D模型不動(dòng)。原因多半是在界面上的數(shù)據(jù)融合或顯示模式?jīng)]有選擇正確。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 數(shù)據(jù)全零、亂碼或讀不到WHO_AM_I這三種情況我都遇過(guò)排查路徑完全不同。數(shù)據(jù)全零一般是MPU6050沒(méi)退出睡眠模式檢查初始化代碼里PWR_MGMT_1寄存器配置。亂碼往往是波特率不匹配上位機(jī)和單片機(jī)設(shè)置的波特率不一致接收到的字節(jié)就錯(cuò)位了。讀WHO_AM_I失敗大概率是接線問(wèn)題——SCL和SDA接反、模塊沒(méi)供電、上拉電阻缺失或者是MCU的I2C引腳搞錯(cuò)。這種問(wèn)題先拿萬(wàn)能表量一下模塊VCC和GND之間有沒(méi)有3.3V電壓再看SCL/SDA有沒(méi)有被拉高。5.2 3D模型不動(dòng)或姿態(tài)角度跳變3D模型不動(dòng)除了上面說(shuō)的數(shù)據(jù)融合模式?jīng)]選對(duì)還有一種情況是發(fā)送的歐拉角范圍不對(duì)。上位機(jī)的模型對(duì)角度有范圍要求超出范圍可能不響應(yīng)。角度跳變則往往是數(shù)據(jù)濾波沒(méi)做好或量程配置錯(cuò)誤傳感器在靜止?fàn)顟B(tài)下輸出都不穩(wěn)定那就要先查硬件和濾波別急著怪上位機(jī)。我后來(lái)習(xí)慣在代碼里先做一個(gè)簡(jiǎn)單的滑動(dòng)平均濾波把加速度計(jì)的原始值過(guò)一遍再發(fā)送波形會(huì)平滑很多。如果要求更高可以上卡爾曼濾波但對(duì)調(diào)試場(chǎng)景來(lái)說(shuō)滑動(dòng)平均已經(jīng)足夠。5.3 波形刷新卡頓、數(shù)據(jù)傳輸不穩(wěn)定波形刷新卡頓先看發(fā)送頻率如果定時(shí)器產(chǎn)生中斷的速度太快串口可能來(lái)不及發(fā)送緩沖區(qū)溢出后數(shù)據(jù)就丟失了。把發(fā)送頻率降低到50Hz以內(nèi)上位機(jī)端一般都能跟上。數(shù)據(jù)傳輸不穩(wěn)定還有一個(gè)隱蔽原因電源紋波大。電機(jī)或者舵機(jī)轉(zhuǎn)動(dòng)時(shí)拉低系統(tǒng)電壓傳感器數(shù)據(jù)會(huì)瞬間跳變。解決辦法是在模塊旁邊加一個(gè)100uF電解電容和一個(gè)0.1uF陶瓷電容效果立竿見(jiàn)影。我實(shí)測(cè)過(guò)一個(gè)場(chǎng)景平衡車(chē)靜止時(shí)波形很干凈電機(jī)一轉(zhuǎn)波形就劇烈抖動(dòng)。排查后確認(rèn)是電源問(wèn)題而不是傳感器問(wèn)題。這個(gè)經(jīng)驗(yàn)讓我養(yǎng)成了習(xí)慣任何傳感器數(shù)據(jù)異常先檢查電源再做軟件層面的懷疑。另外如果你下載的是精英.zip這類打包版本里面通常會(huì)附帶一些教程文檔和參考例程。動(dòng)手之前先花十分鐘把這些文檔看完比反復(fù)試錯(cuò)省時(shí)間得多。壓縮包里的例程如果有編譯平臺(tái)跟你不一樣也別硬套把關(guān)鍵函數(shù)摳出來(lái)移植到自己工程里就好。根據(jù)個(gè)人經(jīng)驗(yàn)我調(diào)試這套組合的順序是先把MPU6050的原始加速度和角速度波形調(diào)通確認(rèn)數(shù)據(jù)方向正確、數(shù)值量級(jí)正確再考慮DMP或?yàn)V波算法最后才接3D顯示看姿態(tài)。這條鏈路每一步都有明確的驗(yàn)證標(biāo)準(zhǔn)出問(wèn)題時(shí)不需要盲目猜。如果你也在做跟姿態(tài)相關(guān)的項(xiàng)目從這套組合開(kāi)始絕對(duì)不會(huì)錯(cuò)——它可能是你用過(guò)最直觀的傳感器調(diào)試工具。本文還有配套的精品資源點(diǎn)擊獲取