本文的最主要目的在於拋磚引玉,阿莫論壇真的是非常好的一個論壇,沒有這個論壇,沒有那么多這個論壇上的前人無私的奉獻和熱烈的討論,我想我是怎么也無法入門四軸的控制的。只是論壇上已經很多年都沒有看到過新東西了,大家都把自己的成果悄悄藏了起來,於是這么多年了,在商業四軸已經泛濫的今天,論壇上依然還停留在給PID調參數這種初級階段,甚至就是這么簡單的東西人們盡然會把它抱得那么緊,生怕別人學會了,只是你沒有往出走一步真正的看下別人都做到哪一步了而已,我們不要做井底之蛙,大家團結起來共同進步才能帶動中國四軸飛控算法的進步,所以我決定把我的代碼以及相關的資料全都貢獻出來,源於奉獻,敢於奉獻,樂於奉獻。希望我這塊磚頭能真的為我們的四軸DIY事業添磚加瓦。
首先,我們要聲明,我這文章不是成功以后的炫耀,而是失敗之后的總結,為以后將要順着這條道路走下去的“戰士”們清理荊棘。我要扼殺掉那些認為自適應控制是“完全萬能”的人的美夢,我們這里已經實現了自適應的極點配置控制器,在線的辨識系統參數(從控制輸入到得出歐拉角)和控制器參數(使用閉環辨識的方法直接辨識得到),並且在單軸的情況下實現了非常好的控制效果(可以觀看視頻),然而在對兩個軸同時控制的時候,互相之間的相關性導致了我們的自適應始終不能穩定而失敗。但是我們並沒有因此喪失我們對此算法的樂觀態度,原因及相關的內容會在后面提及。
文章主要會分成三個部分,諸看客依舊可以直接挑選感興趣的內容觀看。
①對論壇發發牢騷
②對附件中的山貓飛控和自適應控制算法做介紹
③對所作工作的總結,歸納出主要的問題和注意事項
④致謝
第一部分:牢騷
真的非常慶幸有阿莫這樣的論壇,會有好多大牛來這里交流經驗,讓我等小輩可以從大神們的交流中提取到養分,慢慢成長。只是當時初來乍到,能看到的僅僅是四軸區被頂到前幾頁的那些帖子,雖說大家現在都是照着那幾篇文章在做,但是在咨詢了壇子里的一些大神后才發現,原來阿莫上四軸的鼎盛時期已經過去好幾年了,許多真正很牛的技術貼早就石沉大海,並沒有被頂起來,我沒有在阿莫上看到有版主管理版面的概念,更沮喪的是,沒有版面的置頂帖只有廣告的置頂帖,沒有總結帖,導致大神們的月經貼就這樣白白的沖進了下水道,再也找不到了,這里強烈建議論壇完善管理體制,請有存檔的大神整理總結帖,要想讓論壇繼續為中國無人機事業發光發熱就不能讓新手都“無從下手”。
第二個牢騷是發給那些只在論壇里吹噓自己的能力指責別人的不足卻始終不敢把自己的代碼和方法貢獻出來的人,當然特指如我這般還是學生、用着別人的東西卻還自欺欺人的認為自己做了多少工作不舍得拿出來分享的人。既然是學生,不愁吃穿,又不了解市場行情,自己做的東西能拿來賺錢么?既然不能,為什么不分享出來讓大家共同幫着你找出問題呢?就算是做失敗了又怎樣?失敗后的總結才是他人和自己最需要的,尤其當大家把你從困難中拉出來的時候,那時候才會明白“開源”這個詞背后蘊藏着到底多大的能量。
由於一些特殊的原因,接下來的幾個月時間我都會處於顛沛流離的狀態,沒有辦法完善的代碼了,但考慮到幾個月后如果我沒辦法再拿起我的四軸的話,未免有點太可惜了,於是就匆忙的把現有的工作掛了出來而不是等到算法徹底成型了再推出。
我個人非常期待我的飛控中有用的部分能用到大家的四軸中,只是在這里有一點自私的請求,雖然我自知自己的代碼特色並不明顯,但是如果真的有用並能用在您的四軸中的話,希望您也能開源您得代碼,打心底里希望大家能共同努力,把中國的四軸做大做強!
第二部分:飛控、直接法自校正極點配置控制器特點介紹
①硬件和一些不重要的東西:
450的糙機架,朗宇2212 980kv的電機 1045的槳 電調是好贏的四合一電調,STM32F103VET6主控傳感器為L3G4200+HMC5883L+ADXL345+BMP085杜邦線連接軟件I2C,有個小蜂鳴器,用電阻做了個簡單的電池電壓測量,富斯的9通遙控和接收機,一個網上買的性能很差的433MHz串口透傳模塊。
②操作系統:
為了能把控制算法寫到足夠大並能保證各軟件模塊間時序的准確性,我們使用了uCOSIII操作系統,這個相比uCOSII有了很大的改進,應該說在我們的STM32上使用非常合適,但是API和前代相比有了很大變化,很多東西需要重新寫。另外就是是我們的飛控可以同時使用庫函數和寄存器來設置(因為我是使用寄存器的,但是工程里帶了庫,怕人們困惑才特意加這句話)
③通信與手柄控制的特色:
我們使用MATLAB做的上位機與飛控通信,因為MATLAB對多線程的支持非常不好,串口通信也存在很多問題,所以我的飛控通信效率非常低,使用的是字符的傳輸,倒是很便於用串口助手觀查,最大的好處就是可以直接把飛控上截獲的數據拿到MATLAB上來分析,對我等學生來說也許很有用吧,嘿嘿。
另外一個特色是可以同時支持用游戲手柄的遙控和8通航模遙控器的遙控。飛控上可以讀取8通接收機的信號,使用的是外部中斷的方式,直接把接收機的線接到相應引腳上就行,不需要額外尋找PPM信號(比如我用的富斯接收機就沒有PPM信號),與其他控制(這里對比的是游戲搖桿和MATLAB給的控制信號)相比有最高的優先級,既航模遙控器鎖電機開關(自己設定的)關閉時會在飛控內屏蔽其他外部控制輸入。游戲搖桿當然就是普通的帶兩個搖桿的游戲手柄應該都是可以的,還是的使用我的MATLAB的上位機,也就是說如果您願意的話完全可以在MATLAB上位機上直接控制四軸(如果你不怕墜機的話),當然,因為我只有一個性能很差的433串口透傳模塊,雙向傳輸會犧牲一半以上的通信速度,要是想用后面提到的系統辨識一類對時序非常敏感的程序的話指定是不能用游戲搖桿了。
④可以進行在線的系統辨識,飛控中寫入了漸消記憶最小二乘系統辨識算法,可以辨識帶噪聲模型的ARMA模型,之前看到壇子里有人在討論用這種方法給四軸建模的,有了這個就方便了吧,嘿嘿~
⑤飛控中可以隨意改變控制和姿態解算的頻率,只需要改動頭文件中的定義即可,當然得考慮算法的復雜度和I2C的讀取速度。
⑥姿態解算:
使用的是壇子中 手二哥(俊)的梯度下降的姿態解算的方法,雖然公式略有不同(因為用的旋轉矩陣和性能函數不一樣)但效果是完全一樣的,做了一點小花招,減小了磁阻融合的比例,這樣在不要求偏航精度的情況下不經過矯正的磁阻也可以融合姿態了,並且基本不會對Pitch和Roll造成很大影響,只是偏航從起始到穩定需要一小段的時間。如此一來,算上系統啟動時自動算均值校正陀螺儀的零漂,需要手工校准的就只有加速度計了。有一個完全派不上用場的“抗震”融合,誠然,效果和壇子里無雪大神的抗震AHRS完全沒有可比性。算出了地理坐標系上飛機的空間加速度、速度,但是同樣如無雪大神說的,沒有經過調校的MEMS傳感器求出的IMU確實飄得沒法用,所以這里我並沒有在控制中使用這些數據,不過有興趣的可以嘗嘗鮮。
⑦封裝了常見的PID PD PI控制器,關鍵是這里面有兩個測試用的控制器,一個是開頭提到的直接法自校正極點配置控制器,另一個是我自己推導的直接法自校正積分型極點配置控制器,這兩個控制器主要是為了我等學生測試用的,目前還不能穩定的飛行,其中直接法自校正極點配置控制器可以實現單軸的穩定控制。
⑧一些必須放在這里說的問題:
首先是我做四軸並不是為了做一個能穩定飛行的玩具,也沒有項目要求要做這個東西,所以我並沒有以“把PID和姿態解算調到極致”為中心,而是以“方便測試盡可能多的控制算法”為中心。因此我的飛控存在如下問題:
控制頻率和姿態解算速率都很低,PID控制時用的是25Hz,在使用極點配置自校正控制時僅為10Hz,姿態解算一律用的50Hz,沒有讓陀螺更快的積分。這么做必然是不對的,只是當初設計時有三點考慮讓我不得不這么做:一是我的通信模塊很爛,在做離線系統辨識時承載不了高控制頻率帶來的龐大數據量。二是當初為了測試自己的控制算法對噪聲的敏感度故意在姿態結算上放了水,於是算法都做出來了但是參數基本都沒怎么調過。三是當初聽說103的計算能力不足,有考慮到自己是帶着uCOSIII在跑,怕運行復雜的自適應算法時運算性能不足,於是竟可能的給控制留了足夠的運算時間,但是目前加上自適應以后系統資源峰值占用率也沒到16%,所以可以放心的提高姿態解算的頻率並增加相應的濾波,畢竟對於PID來說(對於PID控制頻率為什么要夠高我后面會給出一些證明的,但也僅限於PID控制器了)高控制頻率時非常必要的。
接下來是自適應算法的一些問題,首先自適應算法使用確實需要一定的基礎(因為需要確定系統模型的范圍)但目前我寫的算法在MATLAB的仿真中具有非常理想的效果,但在實際應用中有4個問題導致目前的使用失敗:一是設計的控制器在實際系統中經常會出現不穩定極點,這點導致我設計的帶積分項的自適應控制在還沒有進入到自適應穩定的狀態就已經發散了。二是設計的控制器階次過高,這是我們選用不靠譜的10Hz的主要原因,因為在10Hz下我們可以做到能穩定的最低階次:3階,而在25Hz下就已經達到了6~7階,此時對系統參數已經過度敏感,在我們四軸中時變效果太強,控制器參數變動太大,難以收斂。三是最嚴重的問題,就是飛機存在起飛階段,該階段本身系統參數變化就很大,加上剛好是自適應開始的時候,控制器參數及由此導致的控制信號大幅超出量程,飛機瞬間就墜毀了,都來不及等到自適應收斂。四是多軸聯動時,一個通道的控制量會同時對另外兩個通道的輸出產生影響(角速度→四元數→旋轉矩陣→歐拉角),對高階控制系統影響尤為明顯,導致我們的控制算法無法在短時間內收斂造成墜機。
第三部分:
算法設計當中出現的一些關鍵問題的總結:
①控制頻率與系統模型間的關系:
說一些實驗現象,具體原因沒有深究:降低控制頻率,會增大辨識得到的離散系統的增益。在做PID控制時尤為明顯,我在不同控制頻率下用我的PID整定方法設計控制器,得到的參數在存在很大差別,但在將控制模型轉化為g0+g1Z^-1+g2Z^-2的形式后發現僅僅相差了一個增益K,控制器的零極點並沒有改變,仿真上差別不大,但會增大噪聲的增益,在使用高頻率控制時單純的PID方法能表現出比在低頻時更好的控制效果。
25Hz時的PID
10Hz時的PID
在控制頻率低於系統實際的純延遲時,離散系統會被采樣成逆不穩定系統(非最小相位系統)這個時候無論哪種方法都很難體現出控制效果了,尤其PID,即便如此,我所辨識的被控系統始終存在一個在負半軸但在單位圓內的零點,感覺它嚴重的影響了我各種控制算法的控制效果。
②關於確定極點配置控制器控制頻率為10Hz的一些考慮:
如前所述,由於我測量到系統從控制輸入到角度反饋輸出的延遲大約有0.2s(不知道大家的大四軸是不也是這樣的,還是單純的是我四軸的自身問題)使得控制器在高頻時階次過高,但在低頻時會變成逆不穩定系統,這是極點配置控制器不能控制的系統。所以最后折中到了10Hz,同時由於這時候理論延遲d=2,但是依然是逆不穩定的,我們額外為辨識系統多加了一階延遲,使d=3,這才保證我們設計的控制器在3階並保證逆穩定的條件。
③為減小自適應初期的抖動所作的一些嘗試:
在自適應初期會出現很恐怖的抖動,為了盡可能的減小這種抖動,我們使用了兩種方法,第一種是前面說的盡可能的降低階次,可以有效減小抖動,第二是用仿真得到的穩態的辨識參數作為初值,這兩條並用,在我們單軸的測試上達成了良好的控制效果,但是多軸時由於無法完成離線辨識所以我們一直都沒有得到飛機實際飛行中的系統模型,這條我們會在下一條中探討原因,先上一張使用自適應的高階控制器(后)與低階控制器(前)在有噪聲模型環境下控制效果和控制量輸出的仿真對比:
④為什么會使用直接法辨識控制器參數而不是在線辨識被控系統然后解丟番方程求解控制器:
這個是我們在設計自適應控制器之初最頭疼的問題,因為在有控制器的情況下辨識被控系統屬於閉環辨識的內容,而我們在實際使用中發現,縱使是給控制器疊加白噪聲進行閉環系統辨識,也沒能收斂到系統的實際參數上,這是導致我們沒有得到飛行中的四軸的系統參數的直接原因。在目前我瀏覽過的自適應控制的書中都提到閉環辨識的問題,但在設計算法的時候卻都不約而同的完全沒有考慮閉環辨識的問題……我們僅在北航的這本自適應控制的書中找到了這么一個能夠解決閉環辨識問題的自適應控制器(后面會附帶電子版及書上代碼),相關的內容可以在這本書中找到。
⑤為什么沒有使用最小方差控制器這類基於最優化的自適應控制器:
我們在試驗中發現對於我們的被控系統,使用最小方差控制器會讓控制輸入超出油門上限N倍,明顯不具備可行性因此而放棄。其他控制器如LQ控制器是我的目標,但時間關系我目前只能測試到這里。
⑥為什么我會說樂觀? :-]
因為我們是直接對角度進行的輸入輸出控制器設計,如果從角速度來進行設計的話,前面的這一大堆問題理論上都會迎刃而解,所以我們對該算法思路非常樂觀,也希望想像我一樣走角度直接做自適應控制的三思,多考慮從角速度模型進行辨識並控制。
以上是我整理的關於我在做四軸的自適應控制中的一些嘗試方案和記錄,接下來是致謝:
第四部分:致謝
文章中使用了很多壇子里大神們總結出來的算法和方案,姿態解算部分主要來自手二哥(俊)的幫助,還有無雪大神熱心的回答各種AHRS方面的問題,讓我深刻的體會到一個足夠優秀的AHRS算法對控制的重要性(當然我指的是無雪大神UKF卡爾曼而不是這里的梯度法)。感謝群里的紅桃K(zht一堆數字)大哥不停的貼論文拓展我們的視野,啊嘉大哥教我們航模的知識,黑條大哥殷切的鼓勵,飛拓大哥東林大群主等諸多大神的幫助,這里就不一一致謝了。
哦 對了 推銷一下東林大哥的AHRS&IMU算法討論QQ群199376386,以上大神均可在此群中瞻仰。
最后本人特別希望能與興趣在四軸控制算法上開拓創新的“戰士們”多交流,歡迎大家加東林大哥的群或加我QQ 八四六九三思六舅(河諧防廣告)
附件下載:
