本文轉自 Observer 大牛
我走的彎路千萬不要有人再走。 你在愁你的四軸飛行器怎樣調整pid都飛不起來嗎?那就一定不是pid的。我也苦苦調了三個星期,毫無進展,當發現了不是pid的問題并且改進了之后,我隨便給了兩個參數就飛起來了。下面給出我的經驗。 一個好的機構,應當由三部分構成:一個聽話的執行單元,一個精準的測量單元,一個聰明的控制單元。 1,執行單元。我的電機是直流無刷電機(新西達1000kv),用好盈30a電調控制,這種電調你只需給它一個1000-2000us(太大太小都不好)的脈沖信號就可以控制電機轉速,只需給一次,它就可以一直轉,改變的時候再給一次。比如我的起飛速度就是大約1600us的脈沖。需要注意的是,電調剛開始時需要給3s的低寬度脈沖用來給電調設置最低點。聽到滴滴兩聲之后就說明設置好了。 2,控制單元。控制單元不是第三個嗎?怎么放到第二個了。因為不說pid后面沒法說。 pid調節是控制論中十分經典的一種經典的控制方法,有時i可以不要,就比如說我的就沒有i。對于沒有學過控制論的人pid怎么理解呢?舉個例子,比如一個理想彈簧,你拽它一下,然后放開,它就會一直往復運動,p就是彈簧的彈性系數,p越大,彈簧的回復力就越大,抵抗拉的力也越強。在飛機上,當我們檢測到一邊傾斜,就給它一個和角度成正比的回復力,就是給電機轉速+p*pitch。但是如果只有p呢,就像彈簧一樣,一直晃啊晃。那么我們把彈簧放進水里,水的阻力會使彈簧一段時間之后挺止,并且水的阻力和彈簧運動速度成正比,這就是d的作用。在飛機上,當我們依靠陀螺儀偵測到飛機往一個方向旋轉時,我們就加上一個抑制這種轉動的力,即-d*w,w為角速度。i為假如我們的彈簧變形了,我們加上一個力使我們的彈簧恢復原來的形狀,我是手動調整了一下誤差,沒有通過d來調節。 3,測量單元。我的問題出現在測量單元,同時我也相信絕大部分的人的問題都出現在測量單元。我用的是陀螺儀是gy80,集成了adxl345加速度測量單元還有l3g420d角速度測量單元。加速度計雖然叫加速度,但是可以直接得到pitch和roll,即沿x和y方向的傾斜角,原理在這里不解釋。在沒有干擾的情況下反回的數據很完美。我以為能真實反應飛機目前的傾角然后進行調節,我竟然就天真的拿這個數據直接用了,并且調整pid參數三星期毫無進展。當沒有進展時,我開始思考是什么出了問題,我用processing打了一個示波器出來,將數據返回的繪制成波形顯示在電腦上,發現了問題:電機不開的時候數據很好,電機一開數據簡直沒法看,因為電機震動對加速度計的影響非常大,而我們的角度是考加速度測量的,返回的簡直是亂碼,三個星期以來原來就是調這堆亂碼! 定下心來,覺得進行濾波,對加速度計返回的傾角進行低通濾波,陀螺儀受震動影響很小,不需要濾波。低通濾波大家不需要知道,這也是被淘汰了的,原因是濾波之后數據雖然很好看,但是會造成極大的延遲,飛機都偏到另一邊了,還顯示偏在這一邊,這只適合在一些不需要太靈敏的地方。 下面介紹拯救我的一個簡單有效的算法,不需要用到卡爾曼濾波這樣高級的算法就足以讓它飛起來而且飛的很好,有人叫他數據融合算法,其實沒有這么玄。 陀螺儀受震動的影響很小,它返回的是角速度,角速度*時間就是積分,每次循環讀取一下當前的角速度再累加起來,比如第一次角速度20度/s,一個循環的周期是0.02s,譬如我的周期22ms。就是那么我們就知道轉了0.4度。第一次轉了2,第二次轉了3,第三次轉了-1,總共就轉了2+3-1=4。有人會問,這樣積分準確嗎?很準!我開始也覺得不靠譜,后來發現很靠譜。兩三面零點會產生三四度的偏差,不要緊,我們用準確的角度(加速度計返回的,加速度返回角度,有點繞)計來修正。 不加修正時,公式是這樣的 角度=角速度*周期時間+原來的角度 加上修正后 角度=95%*(角速度*周期時間+原來的角度)+5%*準確的角度 對于這兩個數據進行加權平均,這樣既有時時性,又能保證零點不漂移,好,很好! 之后,pid隨便給給就起來了,不信試試。
|