啓航篇——四旋翼飛行器之入坑兩年心路歷程和畢設總結

    筆者今年大四畢業,由於之前參加比賽及準備考研,沒有時間總結這兩年來做四旋翼飛行器的心得體會。現在借畢業設計這個契機,想把這件事做了,算是兩年的收尾工作,也是個新的開始。

    先從介紹這兩年的經歷開始吧。開始正式入坑四旋翼是在2017年參加全國電子設計大賽,筆者當時是大二。選擇的題目是四旋翼。還記得當時是要完成一鍵起飛,四旋翼追蹤小車,一鍵下落等功能。想想那個時候選擇這個題目也是大膽,學校在這方面沒有一點基礎,純粹是我們學生自己興趣和老師想要開闢新的方向而已。可想而知,最後,我們當然是涼了。不過,借這個機會,也終於算是入了門。雖然在這之前,也玩過PIXHAWK這些國外商品級飛控,不過那純粹是玩飛行,並沒有接觸源代碼,也不知道開源飛控這個概念。

 

    這個階段姑且稱它爲入門階段吧,在這個時候最感謝的應該就是梁工了,在做第一代飛控的時候幫助我們很多,是將我們帶進四旋翼這個新領域的領路人。在他的幫助下,我們知道怎麼自己組一臺四旋翼,從自己做機架開始,自己畫板、自己焊板、自己調試、自己編程、自己手飛測試,在他的幫助下我們真的少走了很多彎路。在這個過程中,我們學會了工程化的代碼是怎麼寫的,知道了怎麼用定時器時分複用,四旋翼飛行器代碼整個框架是怎麼做的,PID參數調試大概要怎麼調,如何用示波器和串口調試。在調試中也遇到很多問題,也解決了很多問題。雖然,對於四旋翼核心的算法部分我們還是半知半解,但是在這個比賽中,我們收穫很多,結果不重要,過程纔是最重要的。

 

    一代飛控用的是STC8增強型51內核單片機,實現的功能是DIY遙控器姿態飛行,外加氣壓定高不成熟版(單極PID),還有實現上位機調參功能。一代做了大四軸和小四軸,小四軸硬件出了問題,LDO處理得不好,飛行不穩定。附下當時做的作品。

 

                               

 

 

 

 

     

接下來是大三至今,稱它爲入坑階段吧。經歷了電賽的蹂躪,我們明白完全靠自己用性能不強大的STC8單片機做出功能強大的飛控是不可行的。所以,我們瞄準了國內的幾個開源飛控,主要就是無名和匿名。這兩個飛控的硬件和軟件對我們的二代飛控設計幫助很大。爲了完成之前國賽未實現的功能,我們開始了二代飛控的製作。

 

      二代飛控用的是STM32F4芯片,在姿態自穩的基礎下,實現室內定點定高,用的是匿名的光流模塊,同時也實現了室外定高定點,用的是樂迪的M8NGPS。在此基礎下,飛行器通過OPENMV3攝像頭識別AprilTag標籤,得到標籤的ID號和相應X Y Z軸的位置。其效果爲:通過遙控器一鍵啓動,飛行器可自動飛行到手機APP指定的標籤位置並完成相應動作。在這個階段主要是對四旋翼的製作理解上了一個臺階,開始製作性能比較好的飛控,硬件也比較完善了,代碼框架也在形成。附下當時做的作品。

 

   

 

 

      好了,廢話不講太多,下面纔是正題,借畢業設計這個項目說下我對四旋翼的理解。畢業設計是在之前做的硬件平臺下總結了四旋翼的原理,主要做的是研究工作。

     首先先介紹系統原理。系統原理分爲運動原理,簡單來說就是怎麼才能夠飛起來。在這裏我就不對系統進行建模分析了,在論文上有簡單分析了下,但最終還是當四旋翼爲一個剛體。在這裏介紹一個網站,北航裏面做四旋翼的科研小組做的一個網站,https://www.flyeval.com/,在這個網站可以估計自己四旋翼的性能,也有性能估計和系統建模算法的介紹。

     回到正題,開始講運動原理。在我這個設計裏,單片機定時器外設輸出PWM信號給電調,電調控制電機旋轉產生升力,其實這樣就可以飛起來了。假設電機和機架是完全對稱且沒有任何誤差,就是一個線性系統,那麼從下面這個圖可以看到,對角線上的電機旋轉方向相同,主副對角線都會產生彼此方向相反的扭力,前面假設了四旋翼是線性系統,那麼電調輸出的電壓相同,扭力就會正好相互抵消,這樣就不會自轉,使電壓增大而使升力增大那麼就飛起來了。理論上,只有一對對角線的電機也是可以飛起來的。但是,飛行器會往一個方向旋轉。原理很簡單。好了,解釋完這個那麼四旋翼的運動就很簡單了,增加12電機的轉速,就產生俯仰運動,向前俯仰,增加14電機的轉速,就產生橫滾運動,向右橫滾,增加13電機的轉速,是產生偏航運動,順時針偏航。但是,我們知道四旋翼飛行器不可能是個線性系統,一定會產生偏差,所以我們需要用傳感器測得偏差,作爲系統的觀測量,然後通過飛控代碼的控制算法來實現控制。舉個簡單的例子,就是飛行器往左偏了一點,我就要讓算法讓飛行器往右偏一點。這個算法的過程其實是貫徹整個控制的,不單是姿態的控制,還有高度和水平位置的控制。在講解如何實現控制之前,先來介紹偏差也就是觀測量是怎麼得到的?爲什麼我們要融合傳感器的數據?

 

      在介紹如何得到融合後的觀測量之前,先介紹下一些知識。首先,我這個系統是個組合導航系統,是INSGPS兩個導航系統的組合。所謂INS,就是慣性導航系統,就是用加速度計、陀螺儀和磁力計這些慣性器件測得一個慣性數據來進行導航,它的優點是不需要從外部獲得信號,實時得到姿態信息,但是缺點是由於有積分這些運算會積累誤差,導航會隨時延而不精準。而GPS我們都很熟悉,GPS導航就是用GPS收到的經緯度信息處理後進行導航,其優點是長時間提供導航信息。組合導航就是把這兩個導航系統結合,可以長時間提供高精度的導航數據。

      要實現姿態飛行和定高定點,難點其實就在於這兩個系統的組合,即怎麼樣把XYZ軸上這幾個傳感器的偏移數據擬合在一起。這裏插一個小知識,機體座標系就是機體上測得的座標,而導航座標系是在地球磁場下的座標,是旋轉到了相應方向下的。加速度計得到的三軸數據其實是機體座標系下的三軸數據,需要在陀螺儀的幫助下,經過方向餘弦矩陣旋轉到導航座標系,經磁力計將機頭擺正,保證飛控知道機頭朝向哪。具體如何實現,我這邊沒有貼出公式,代碼中其實是用四元數的方法來實現,因爲這樣計算比起計算三角函數來的要快。具體如何實現在秦永元那本慣性導航的書裏有詳細的推導,在代碼中,姿態解算可以用梯度下降加二階畢卡解微分方程的方式來求解,這裏就不過多敘述了,具體也可看書。

 

     簡單來說,飛行器要實現姿態飛行,那麼就要姿態解算,實現了姿態飛行且飛穩以後,纔開始實現定高定點。定高定點對應的是導航座標系上的三個軸,XY軸上數據有加速度計、磁力計、陀螺儀和GPS,加速度計和陀螺儀的數據怎麼映射到導航座標系這個在慣性導航那本書也有,GPS的數據可以把經緯度信息通過球面投影的方法投影到大地,經過磁力計旋轉,跟加速度計數據進行擬合就可以得到XY軸上的融合過後的數據。同樣,Z軸上,氣壓計可以通過壓差法很簡單的得到高度信息,跟加速度計Z軸數據擬合後,就得到融合後的Z軸數據。

                         

                       這些圖是慣性器件,陀螺儀、加速度計、氣壓計,還有GPS

 

      融合使用的是三階互補濾波的方法。如下圖1,以加速度計Z軸爲例,假如我們沒有用互補濾波的方法,系統就是一個開環的系統,Z軸的加速度計兩次積分後得到位置信息。我們知道,純積分環節下的極點是0,這樣的系統是發散的,不可能穩定。那麼我們看下面的三階互補濾波的系統方框圖,所謂三階,就是這裏引入了三路的迴路反饋,分別是位置、速度和加速度,取適當的三個值,我們可以調到一個穩定的狀態。而這裏分別是三個三階互補的系統,分別是XYZ軸。(補:調的最佳參數可以近似看成在卡爾曼濾波器融合方法中求得的最優解)

 

 

     介紹完了數據融合,如何利用融合的數據進行控制,這個就是控制原理了。本設計用的控制器是串級PID控制器,假設已經實現了姿態飛行,現在調試定高功能,在這個單極PID的系統方框圖,輸入量是我們想要的高度,輸出PWM,驅動電機,由於四旋翼不是線性系統,那麼飛行器肯定會有偏差,當前高度減去期望高度就是偏差,偏差反饋回去跟輸入一起映射到PWM輸出,就形成一個閉環系統,調好這三個參數,可以達到穩定的狀態。我們可以通過MATLAB仿真調試,其實就是求使這個系統傳遞函數穩定的最優解。單極系統我們理解了,那麼串級系統也是很簡單的,就是將一個PID控制器的輸出作爲另外一個PID控制器的輸入,最終輸出控制量到被控對象,在裏面的PID控制器屬於內環,外面的控制器屬於外環,也就是外環的輸出作爲內環的輸入,最終內環輸出到被控對象。在串級系統中,內環的參數比外環要重要,調好內環參數,外環參數相對比較容易解決。

     以上就是系統的原理,下面是系統的軟件框圖,我採用的是定時器時分複用的方法,根據不同外設、不同算法、不同傳感器需要的更新時間,將其在不同時間線程中調用。這種方法在工業控制中是常規方法,沒有跑操作系統,這種方式能最大限度利用MCU的性能。

最後附下:硬件框圖

 

 

     最後是項目的總結。主要是項目之後該如何完善,在算法層面是,一個是濾波器,由於加速度計主要是高頻噪聲信號,所以要設計一個低通數字濾波器,我這個設計用的是二階巴特沃茨濾波器,在之後可以考慮用性能更好的濾波器,比如FIR濾波器。數據融合的方式可以採用卡爾曼濾波器融合,它的作用就是求得最優解,等效於前面三階互補濾波器自己設的最優參數。控制算法可以採用自適應控制ADRC,複雜的控制系統不可能用一套PID就解決所有問題,需要分段處理,自適應控制的算法就是用來解決這個問題的。

     前面所講都是簡單的原理,沒有細究,要是細化,幾天幾夜也講不完,裏面知識很多,我只能想到哪講到哪,自己水平也有限,畢竟不是控制專業,不過考研考的就是控制,希望在這方面能有所進步。

 

    學習四旋翼,首先得有電子基礎,簡單的焊接、測試要懂,動手能力要強,不要怕麻煩,做事情要嚴謹,不然很容易出事情的。有了基礎後,可以在別人的源碼上改框架,調參,加自己想要的功能,四旋翼的硬件其實很簡單,假如不考慮驅動部分的話,驅動部分用電調,自己畫PCB做飛控是很簡單的事

 

    多說幾句,入門四旋翼的話是個坑,肯定得花錢。不過可以自己用鋁管做機架,買二手電機,這樣會省錢很多。多逛貼吧,多看論壇大神的帖子,祝各位早日做出屬於自己的灰機。

最後,這裏預告下之後會做的一些事,也會分享到這個博客上來。

1.單片機的學習之STM32 和TI,會有一些在學習和工作中的分享。這裏有之前的一篇博客,類似這種https://blog.csdn.net/weixin_36773706/article/details/86934108

2.EmWIN的學習,之前移植了ST7789驅動的LCD,之後想做無人機數傳調試系統,GUI想用Emwin做,有空會推出開發流程。

3.RT-Thread的學習,大一做了一個物聯網的系統,比較LOW,之前瞭解了RT-Thread的系統,正好同學有潘多拉的板子,想要測試做幾個項目,可能開板。到時有空也會有開發流程。之前的項目博客:https://blog.csdn.net/weixin_36773706/article/details/78911023

4.VL53l1x TOF 模塊的開發,這個芯片有自帶的API函數,比舊版本芯片功能要強大,有想要做定高模塊的想法。

5. NORDIC 52832的開發工作最近有做,也有可能會推。

6.四旋翼一些融合方法的實現,比如卡爾曼,還有數據濾波的處理、ADRC的實現、觀測數據時延問題的解決,這些都是比較淺顯的瞭解,希望能夠深入學習之後分享心得。

其實還有一些想法,比如可能明年會自己。一套飛控系統,在CSDN平臺的技術分享就當前期的鍛鍊和準備咯。

祝各位飛控愛好者學習順利!

                                                 by --- 一個快畢業的菜鳥嵌入式工程師小丘

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章