GD32F103+MPU9150四旋翼飛行器第一步:姿態融合算法

2021-01-10 電子產品世界

  前言:

本文引用地址:http://www.eepw.com.cn/article/272279.htm

  相比直升機來說,四旋翼乃至多旋翼飛行器的機械結構簡單,操控靈活,飛行穩定,體積也能做的更小,當然也能更大,它將直升機複雜的機械結構設計難度轉化到了電子電路和算法上面,因此四旋翼飛行器的設計更容易上手,更民眾化。

  四旋翼飛行器的軟體核心包括兩大部分:姿態融合算法和控制算法;硬體核心便是MCU和傳感器。

  先介紹下姿態融合算法,姿態融合說白了就是將3軸加速度、3軸角速度和3軸磁場強度融合成四元數,再將四元數轉化為歐拉角,最後將歐拉角最為控制量輸送到所有電機以達控制飛行器姿態的目的。歐拉角包括偏航角Yaw、俯仰角Pitch和滾動角Roll。我用的算法是Madgwick寫的AHRSUpdate和IMUUpdate,簡單有效,其中AHRSUpdate是融合了陀螺儀、加速度計和磁力計,而IMUUpdate只融合了陀螺儀和加速度計,就優缺點來說,IMUupdate算法只融合了加速度計和陀螺儀的數據,還需要使用互補濾波算法來融合磁力計以修正偏航角Yaw,不然飛行器會找不到北,但是這種互補濾波有個小問題,就是假如定義偏航角的範圍是0-360度,那麼當機頭大概從北偏西1度轉到北偏東364度時,機頭會經過0度(360度)這個點,那麼這時,yaw不會直接1-0-364這麼變化,而是會被逆向積分從 1-20-180-270-364這麼轉一圈,這是個不好的現象,實驗了半天也沒有解決,而AHRSupdate很好的解決了這個問題,不過由於AHRSupdate把磁力計的數據融合進了所有歐拉角,因此當傳感器受到外圍強磁場幹擾時,就會造成全方位失控,導致墜機,而使用IMUupdate算法,頂多飛行器會轉圈而已。

  傳感器我用的是invensense公司的MPU9150,MPU9150晶片集成了加速度計、陀螺儀和磁力計,並且內置硬體DMP用於姿態融合,不過不好用;MCU則用是Gigadevice公司的GD32F103系列,由於我也是剛接觸四旋翼飛行器,第一個目的當然是能夠平穩的飛起來,暫不考慮加入其他外圍設備。後續可能會考慮使用GD32F107或者GD32F2xx系列,可擴展攝像頭小玩一把航拍,當然更好的是GD32F4xx系列(期盼中),自帶浮點運算單元,由於我軟體太菜,算法中出現大量的浮點運算導致姿態更新頻率和控制頻率達不到很高。

  做四軸飛行器也是為了好玩,目前我只完成了第一步:姿態融合。接下來才是更重要的,選擇合適的機架、電調、電機、螺旋槳,寫PID控制代碼,系統整合以後還要調試各種參數,抗幹擾,抗震動,最後還要加各種應用器件。在此鼓勵一下自己,堅持就是勝利,慢慢磨洋工。

  我現在軟體實現的功能:算法用AHRSupdate、陀螺儀零偏校準、加速度計平滑濾波、磁力計平面校準,以後看情況可能會慢慢更新加速度計精確校準、磁力計橢球擬合校準、陀螺儀溫度補償等。

  第一部分:硬體

  1.傳感器:MPU9150(INVENSENSE公司的,單晶片內集成了加速度計、陀螺儀和磁力計,並且內置DMP用於姿態融合,不過只融合了加速度計和陀螺儀,沒有融合磁力計進去,具有自校準功能,價格比MPU6050貴很多,但是省PCB面積,省事,軸向重合度高。實際上就是把MPU6050和磁力計AK8975放在同一個晶片裡,程序還是使用MPU6050的驅動,缺點是會偶爾丟失數據,自帶的姿態融合算法的更新頻率不高);

  2.MCU:GD32F103CB(Gigadevice公司的,ARMcortex-M3內核,32位MCU,主頻最高108Mhz,48Pin,與ST同型號的32位MCU 直接兼容,性價比更高,外接8M晶振,也可使用內部8M晶振,晶振遠離傳感器,避免幹擾磁力計,不過當時考慮不周,這個晶片的timer太少了,以後會先採用GD32F103VCT6或者GD32F107VCT6);

  3.電源晶片:TLV70233DBVR(TI的LDO,輸入2-6V,輸出3.3V,只需要外接2個X7R無極性陶瓷電容,價格太高)

  4.串口:MAX3232(方便調試)

  5.USB供電,輸出電壓5V

  6.目前機架、電調、電池、電機和螺旋槳已買好,來張圖,比較大眾化:

  

 

  上圖:

  圖1:PCB的3D效果圖,測試版,先追求調通得出姿態角,後續改版會做大的調整:

  

 

  第二部分:軟體

  1.使用keil,uvision4.1.0,工具鏈:RealViewMDK-ARM Version4.12;

  2.驅動:官方的MPU6050驅動inv_mpu.c和inv_mpu_dmp_motion_driver.c;

  先看幾個圖,然後再說坐標軸的設定和算法部分。

  上圖:

  圖1:系統初始化,順序從上到下依次是:初始化MPU、設置需要使用哪些傳感器、設置陀螺儀測量範圍(我設的是正負500度/s)、設置加速度計測量範圍(我設的是正負4g)、配置fifo、設置採樣率、裝載DMP、設置陀螺儀軸向(比較重要)、使能DMP的一些玩意兒、設置DMP的FIFO、自校準陀螺儀和加速度計、開啟DMP、開始姿態融合,見下圖:

  

 

  圖2:由四元數求出的最終姿態角,其中Yaw為航向角,表示機頭偏離正北方多少度,範

  圍-180到+180;Pitch為俯仰角,表示機頭正方向與水平線的夾角,範圍-90到+90;Roll為翻滾角,表示機翼與水平線的夾角,範圍:-180到+180。下圖為機身水平,且機頭正北偏西37度左右的數據:

  

 

  圖3:下圖為機翼水平,機頭指向正北,且機頭向下25度的數據

  

 

  圖4:下圖為機頭指向正北,保持水平,且機翼的右翼向下傾斜23度的數據

  

 

  圖5:看下歐拉角的奇異點,在奇異點處一個轉動狀態對應無窮多組自由度值,當物體轉到這些奇異點附近,便沒法求解。圖中當Pitch為+90度時,機體的姿態便沒法控制,Roll的軸向發生了變化。如下圖:

  

 

  第三部分:如何確定自己的軸向

  首先,軸向的定義跟初始化四元數和最後結算的歐拉角有關,跟四元數更新算法無關,換句話說,不管你的軸向如何定義,姿態融合算法隨便用,但是初始化四元數的公式和最後結算歐拉角的公式要做適當的改變,這個後面算法中有說。加速度計也好,陀螺儀也好,磁力計也好,他們的軸向都要滿足右手定理,如下圖:

  

 

  再附上一段注釋用於解釋如何定義合理的軸向,以及如何正確旋轉傳感器的軸向,解釋這麼多其實就是說定義好的軸向要滿足右手定理,如下圖:

  

 

  下圖,旋轉前是[x y z],旋轉後就是[-y x z]:

  下圖是如何確定旋轉角度的正方向,用右手握住坐標軸,拇指指向軸向的正方向,四個指頭彎曲的方向就是旋轉角度的正方向,在初始化四元數時,計算出的歐拉角的正方向也要滿足這個條件:

  

 

  我的程序使用的軸向如下圖所示,未作任何改變:

  

 

  第四部分:算法

  第一步是校準,加速度計和陀螺儀我用的是MPU9150內部自校準,磁力計的校準採用如下方法:見附件-磁力計校準

  第二步是初始化四元數,常見的軸向定義是繞x軸旋轉是Roll,繞y軸旋轉是Pitch,繞z軸旋轉是Yaw,我的程序中也有這樣的定義,不過被我注釋掉了,這裡舉個另外一種軸向定義來對初始化四元數進行說明,方便比較,也是我目前正在用的軸定義。

  下面我們來定義繞x軸旋轉是Pitch,繞y軸旋轉是Roll,繞z軸旋轉是Yaw,軸向的正方向如上圖一樣,不變。

  先對加速度計和磁力計的數據進行處理,得到init_xx來供我們使用如下圖:

  

 

  然後通過公式計算出初始化的Roll、Pitch、Yaw,注意加負號保證旋轉角度的正方向,如下圖:

  

 

  其中Yaw的正方向未必對,可以自己去驗證下,具體參考公式見附件-ST電子羅盤計算Yaw

  然後由上面的歐拉角求出初始化四元數,這時要注意旋轉順序的不同,公式也不同,大部分旋轉順序是Z-Y-X,我的程序裡也用的這個順序,在這裡我們按Z-X-Y的順序來旋轉,並得出求四元數的公式以做比較,其旋轉矩陣:

  

 

  q=qyaw*qpitch*qroll=

  (cos(0.5*Yaw)+ksin(0.5*Yaw)) *(cos(0.5*Pitch)+isin(0.5* Pitch)) * (cos(0.5*Roll)+jsin(0.5* Roll))

  得出初始化四元數計算公式如下圖所示:

  其中i,j,k之間相乘的順序不能隨意變,在前的先計算,在後的後計算相乘的公式如下圖:

  

 

  至此初始化四元數完成。

  第三步就是使用AHRSUpdate算法了,用完以後再根據公式計算出歐拉角,此公式跟旋轉順序和旋轉使用的軸向有關,我們的旋轉順序是Z-X-Y,且繞Z是Yaw,繞X是Pitch,繞Y是Roll,推到過程如下圖:

  首先得出3個方向餘旋矩陣:

  下圖繞Z軸Yaw:

  

 

  下圖繞X軸pitch:

  

 

  下圖繞Y軸Roll:

  

 

  然後按照我們的Z-X-Y順序求得C=Croll * Cpitch * Cyaw,如下圖:

  

 

  將上圖的方向餘旋矩陣C與下圖的四元數姿態矩陣做對比,即可求出歐拉角,注意上圖的方向餘旋矩陣C是隨著我們對坐標軸的定義變化而變化的,而下圖的四元數姿態矩陣是固定的:

  

 

  最後一步就是求出歐拉角,公式如下圖:

  

 

  以下是靜止時,剛上電時的數據:

  

 

  以下是上電半個小時以後的數據:

  

 

  可以看出正常的靜止狀態下,數據的波動範圍是不超過1度的,也不會有漂移。具體效果還需要上機架飛起來以後再做調整。

  最後總結一下:

  我的代碼中,0°

  注意跑108Mhz時,需要修改延遲函數和串口函數,適當增加一下延遲函數的數值避免I2C通信失敗,修改串口函數是為了避免108Mhz下串口亂碼問題,具體修改方式參考論壇頂置帖子http://bbs.21ic.com/iclist-182-1.html。

  最後感謝所有幫助過我的人。

相關焦點

  • 組合導航系統在四旋翼無人機上的實現
    由於四旋翼無人機的結構簡單可靠,具有垂直起降、定點懸停、穩定低速飛行和在小空間內飛行的能力[1],所以受到廣泛的關注並在多個領域得到了廣泛的應用[2]。   在四旋翼無人機系統發展所面臨的關鍵技術中,導航系統是其重要的組成部分之一,它承擔著提供給飛行器位置、速度、姿態等參數狀態數據的任務。目前常用的導航方法有:慣性導航、衛星導航、視覺導航以及它們的組合導航等。
  • 詳解多旋翼飛行器上的傳感器技術(上)
    - YY碩的回答」這個問題下面發布了一篇科普多旋翼飛行器技術的回答,在知乎上至今獲得了889個贊同、近10萬次瀏覽,並且被幾十家媒體和公眾號轉發。2014年中正是多旋翼飛行器市場爆發前的風口,後來很多朋友告訴我說正是這篇文章吸引他們走入了多旋翼飛行器行業。兩年來,大疆精靈系列更新了兩代,飛控技術更新了兩代,智能導航技術從無到有,諸多新的軟體和硬體產品陸續發布。
  • 微型四旋翼製作1———(四旋翼的介紹以及發展)
    四旋翼,或許就是最好的解決辦法之一了。那正式開始製作四旋翼之前,首先還是得制定計劃,保證項目的實施以及四旋翼的成功製作。(字寫得實在是....太醜了,會改的,我保證)整個項目從頭學習並且完成相應的硬體搭建,功能調試等預計會在四個月左右,記錄下相關問題以及心得就大概五個月了,所以整個博客的記錄也將在五個月完成。
  • 四旋翼無人機的製作與調試
    如圖2-1所示,一臺簡單的四旋翼無人機主要包括機架、電機、飛控板、螺旋槳、電池和遙控器六部分。圖2-1 四旋翼飛行器四旋翼飛行器的旋翼結構如圖2-2所示。飛行時,以1號電機為機頭,3號電機為機尾,2號和4號電機分別位於機身的左、右側。
  • 四旋翼無人機和動作捕捉系統能碰撞出哪些火花?
    由題目可知要想完成題目最終要的是四旋翼要懸停準、飛的穩,故四旋翼的懸停至關重要。實際應用中,四旋翼所實現的功能也是建立在穩定懸停基礎上來實現其他功能的。然後高精度的點坐標根據預先創建的再四旋翼飛行器上的4個點所代表的剛體信息來解算飛行器的質心位置和位姿。位置誤差轉為姿態誤差。四旋翼飛行器最常見的控制方法是分層控制。最低級別的是控制螺旋槳的轉速。下一級別是飛行器的姿態控制,最高級別的是飛行器的航跡控制,控制框圖如圖8所示。
  • 無人飛行器機載穩定雲臺控制系統的設計
    ,應用互補濾波算法(Complementary Filtering, CF),從頻域的角度分別加入低通和高通濾波器,將兩傳感器的姿態信息加以融合,可去除幹擾,消除零位誤差,提高解算精度[5]。  從圖7可以看出,加速度計的實時數據由式(2)解算得到俯仰角預估值θ,經過低通環節增加的PI 控制器與陀螺儀的實時數據積分後得到的角度相融合,得到機載雲臺當前俯仰角 。同時, 作為負反饋,實時機載雲臺的姿態角。姿態更新算法流程見圖8所示。
  • 四旋翼無人機虛擬控制系統的設計
    無人飛行器(UAV)是由無線電遙控設備和獨立程序控制裝置操縱,或由機載計算機完全或間歇自主操縱的無人飛行器[1-3]。它們有良好的隱蔽性、強大的生命力、簡單的起飛與著陸、低成本和對傷亡的恐懼[4-7]。
  • 為什麼大型可載人四旋翼飛行器仍然不能取代直升機?該部件是關鍵
    從飛控邏輯上來講,四旋翼飛行器的控制率看起來似乎清晰明了,但是事實上,四旋翼飛行器只有在慣性導航系統和相應的加速度傳感器就位且正常工作的情況下才會穩定飛行。重點來了,四旋翼飛行器的四副旋翼裡面,只要有一副旋翼出現了故障,那麼它就將很難繼續穩定飛行(基本就摔了),從這個角度上來說,四旋翼飛行器的安全性並不出色。
  • 正點原子-戰艦V3第三十七章 MPU6050 六軸傳感器實驗
    本章我們將使用 STM32F1 來驅動 MPU6050,讀取其原始數據,並利用其自帶的 DMP 實現姿態解算,結合匿名四軸上位機軟體和 LCD 顯示,教大家如何使用這款功能強大的六軸傳感器。MPU6050 的特點包括:① 以數字形式輸出 6 軸或 9 軸(需外接磁傳感器)的旋轉矩陣、四元數(quaternion)、歐拉角格式(Euler Angle forma)的融合演算數據(需 DMP 支持)② 具有 131 LSBs/°/sec
  • RflySim平臺+多旋翼飛行器實踐教程,將如何成就業界未來?
    在RflySim平臺上,算法從開發到真機實驗通常包括四個階段,算法開發與軟體在環仿真(數字模型+控制算法)測試、控制算法自動代碼生成並部署到真實控制器硬體、硬體在環仿真(實時仿真器+控制器硬體)測試、真機部署(真實機架+控制器硬體)與飛行實驗。正是這樣循序漸進的開發與測試流程,保證了最終控制算法在真機上的快速實現。
  • 圖文:自動四旋翼在湍流中移動平臺上的動態著陸
    在移動平臺上自動降落對多旋翼飛行器提出了獨特的挑戰,包括需要精確定位平臺,快速軌跡規劃以及精確/魯棒控制。以前的工作研究了這個問題,但是大多數都沒有明確考慮風的幹擾,這通常會導致下降緩慢到平臺上。這項工作提出了一種完全自動化的基於視覺的系統,該系統通過緊密結合本地化,計劃和控制來解決這些限制,從而能夠在移動平臺上快速準確地著陸。
  • 多旋翼無人機的結構—新疆凱蘭無人機駕駛員培訓
    直到1956年,M.K.Adman設計的第一架真正的四旋翼飛行器Convertawings Modal「A」試飛取得巨大成功,這架飛機重達1噸,依靠兩個90馬力的發動機實現懸停和機動,對飛機的控制是通過改變主旋翼的推力來實現。然而,由於操作這架飛機的過於繁重,且飛機在速度、載重量、續航性等方面無法與傳統的飛行器競爭,人們對此失去了進一步的研究興趣,該研究被迫停止。
  • 多旋翼無人機的結構和原理
    1.結構形式  旋翼對稱分布在機體的前後、左右四個方向,四個旋翼處於同一高度平面,且四個旋翼的結構和半徑都相同,四個電機對稱的安裝在飛行器的支架端,支架中間空間安放飛行控制計算機和外部設備。結構形式如圖 1.1所示。
  • 四軸飛行器飛行原理與雙閉環PID控制
    1 四軸飛行器的結構與基本飛行原理四軸飛行器結構主要由主控板和呈十字交叉結構的4個電子調速器、電機、旋漿組成,電機由電子調速器控制,主控板主要負責解算當前飛行姿態、控制電調等功能。以十字飛行模式為例,l號旋翼為頭,1、3號旋翼逆時針旋轉,2、4號旋翼順時針旋轉,如圖1所示。
  • stm32f103c8t6封裝及最小系統原理圖
    打開APP stm32f103c8t6封裝及最小系統原理圖 發表於 2017-11-23 15:50:30   STM32F103C8T6是一款集成電路,芯體尺寸為32位,程序存儲器容量是64KB,需要電壓2V~3.6V,工作溫度為-40°C ~ 85°C。
  • MEMS陀螺儀需組合其他傳感器使用 歐拉角和四元數表述飛行姿態
    在此涉及的關鍵技術包括硬體(6軸組合傳感器)和軟體(濾波算法、姿態/導航算法等)兩部分。」/姿態穩定算法。」四軸無人機有四個獨立的輸入,即由四個獨立電機帶動的螺旋槳,同時機身具有六個自由度的變化,因此四軸無人機是一種典型的欠驅動系統。針對四軸無人機的控制算法,效果比較好的有線性二次型最優控制、反步控制、PID控制、滑模控制等。  王懿還解釋了MEMS陀螺儀是如何實現平衡控制的。
  • 【SDCC 2015現場】大疆Paul Yang:多旋翼飛行器的未來就是機器人的...
    Paul Yang首先介紹了大疆公司的產品線,有飛行控制器、蟬思機載平臺、精靈系列、經緯Matrice100等;後相繼從消費電子到行業應用介紹了開發平臺產品;另外他也談及了智能導航技術存在的幾個挑戰:智能導航技術、多傳感器測量數據的融合、路徑規劃、規劃和控制的結合。
  • 科普專題-無人機飛控姿態調參方法
    PX4中使用的P(外環)—PID(內環)型結構就是這麼設計出來的,關於姿態控制的控制律設計部分我們以後再講,會針對歐拉角和四元數兩種描述分別進行論述。 今天我們就來談談這個P—PID的內外環姿態控制器的參數應該怎麼調試。
  • MPU6050和STM32L152的微功耗三維無線滑鼠設計
    針對功耗問題,詳細介紹了符合滑鼠低功耗工作要求的STM32L152低功耗運行、睡眠模式配置,以及MPU6050加速度計單獨循環、單軸加速度計工作模式的配置,給出了加速度計標定及基於加速度計的姿態角計算方法,實現了滑鼠姿態的精確測量。
  • 解析多旋翼無人機飛行原理 在應用方面的優勢
    時至今日,很多飛機還在沿用旋翼設計,四旋翼無人機更是化作了航拍機,滿足了許多普通人關於天空的想像。比如四旋翼無人機,當飛機四個螺旋槳的升力之和等於飛機總重量時,飛機的升力與重力相平衡,飛機就可以懸停在空中了。小時候看漫畫,看到哆啦A夢和大雄頭戴竹蜻蜓自由的在空中翱翔,就特別想和他們一樣,可以飛翔在空中,俯瞰大地。但是如果現在真有人發明出一模一樣的竹蜻蜓,我肯定是不願意戴的。