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