首先例舉第一個例子,,我調(diào)的第一臺四軸飛行器,,十字型四軸飛行器,講下配置: 采用位置式PID控制,,位置式PID公式如下 PID的基本意義我在次就不作闡述了,我只講我的設(shè)計,,我以姿態(tài)角作為被控制對象,,所以 對于微分項D,我做了一點改變,標(biāo)準(zhǔn)PID的微分項D=kd*(e(k)-e(k-1)),,我在實踐過程中因為角度的微分就是角速度,,而陀螺儀可以直接測出角速度, 實現(xiàn)代碼如下 float pidUpdate(pidsuite* pid, const float measured,float expect,float gyro){ float output; static float lastoutput=0; pid->desired=expect; //獲取期望角度 pid->error = pid->desired - measured; //偏差:期望-測量值 pid->integ += pid->error * IMU_UPDATE_DT; //偏差積分 if (pid->integ > pid->iLimit) //作積分限制 { pid->integ = pid->iLimit; } else if (pid->integ < -pid->iLimit) { pid->integ = -pid->iLimit; } // pid->deriv = (pid->error - pid->prevError) / IMU_UPDATE_DT; //微分 應(yīng)該可用陀螺儀角速度代替 pid->deriv = -gyro; if(fabs(pid->error)>Piddeadband) //pid死區(qū) { pid->outP = pid->kp * pid->error; //方便獨立觀察 pid->outI = pid->ki * pid->integ; pid->outD = pid->kd * pid->deriv; output = (pid->kp * pid->error) + (pid->ki * pid->integ) + (pid->kd * pid->deriv); } else { output=lastoutput; } pid->prevError = pid->error; //更新前一次偏差 lastoutput=output; return output;}
我這么做的原因是因為,,如果使用傳統(tǒng)的D的形式,,在我快速打舵時會產(chǎn)生輸入的設(shè)定值變化頻繁且幅度較大,四軸飛行器會迅速回到新的期望點,,說白了就是非常靈活,,四軸回復(fù)很猛,也許造成系統(tǒng)的振蕩,,對PID參數(shù)要求較高,。如果用角速度代替的話,那怕你打舵非常快,,四軸會較平穩(wěn)的回到新位置,,運動較柔和。對于我這種操作菜鳥來說無疑后面一種會更合適,,所以我選擇了D=kd*Gyro的方式,。 PID控制器我大概就是這么實現(xiàn)的,下面講講我在調(diào)試過程中具體遇到的問題,。首先我將四軸固定在單軸平衡平臺上,,讓飛行器完成單軸平衡,主要觀察姿態(tài)角的 我先調(diào)一個軸的平衡再調(diào)另外一個軸,最后調(diào)YAW軸,。 在這里還應(yīng)注意一點,,當(dāng)P太小時,,四軸在很大傾斜的地方,在重力與P的作用下也會震蕩,,這種震蕩不是等幅的,,也不是對稱的,震蕩波谷的絕對值明顯要比波峰絕對值大而且距離0度會很遠(yuǎn),。這種情況要加以區(qū)分,。 我把P從0.2到0.8開始嘗試,找到一個適合的點,,即剛開是出現(xiàn)震蕩的P值最后我定為0.5,。注:此時還是有靜差。 P=0.5時四軸在他的穩(wěn)定位置震蕩比較小了,但是在外力干擾下很難在穩(wěn)定下來,,抗干擾能力較差,。然后我開始調(diào)D。 剛開始調(diào)D的時我就范了一個錯誤,。因為我改了D的標(biāo)準(zhǔn)型,而D應(yīng)該是抑制運動的,,但是陀螺儀輸出的數(shù)據(jù)符號導(dǎo)致我這里D變成了增加運動,,所以一開始無論我怎么調(diào)整D,都會激發(fā)震蕩。后來我在參數(shù)前加了個符號就好了,。在這里我提醒要始終注意D是阻尼力,,是其抑制震蕩也就是運動的作用的,它始終期望的是它所作用的對象沒有運動,,至于停在什么位置不是D所關(guān)心的,,那是P,I所關(guān)心的。所以直接用陀螺儀數(shù)據(jù)代替偏差的差得話就得注意下,。修正這個問題后加了D效果就比較明顯了,,四軸在外力的干擾先能明顯的有回復(fù)力且,能快速穩(wěn)定在平衡點了,,調(diào)D就是試,,當(dāng)然D大了也會產(chǎn)生震蕩,但是此時不加D時光P作用時的震蕩就很小,,很明顯就可以看出隨著D的增大,,震蕩減小又增大的過程。最后P=0.4,D=0.15,。 最后定好了P,D后我的四軸還是有靜差,,不能穩(wěn)定在期望的0點。網(wǎng)上有很多四軸只用PD,在這里我決定根據(jù)我的實際情況加入I,。調(diào)I的時候我先把積分限幅去掉,。然后從小往大加,當(dāng)調(diào)平衡時,,隨著油門的變大,,靜差應(yīng)該是越來小的。我將油門推到差不多快要將四軸推離地面的位置,,看I能不能消除靜差,。因為如果油門給小了,靜差較大,,調(diào)出來的I雖然能消除靜差但是I比較大,,在加油門時有可能也會產(chǎn)生超調(diào)震蕩。最后I要再能消除靜差又不產(chǎn)生震蕩,,個人認(rèn)為要近可能小,。最后加上合適的積分限幅。P:0.4,I:0.35,D:0.15,。 下面我講講我在調(diào)第二個X四軸過程中遇到的問題,。 調(diào)試方法還是先調(diào)平衡桿,如圖: 剛開始調(diào)X的時候我以為跟十字的差不多,,于是我只是簡單的把原有PID參數(shù)按照新的程序里面的PWM值域縮放了一下倍數(shù),,但是發(fā)現(xiàn)不行,PID完全沒有起作用,。 具體表現(xiàn)為四軸開機(jī)后直往一邊倒到底,。只好重新開始調(diào)。 當(dāng)我潛入困境時,,以為名叫螃蟹的網(wǎng)友幫助了我,。他告訴我定P要定在把手放開,開始震蕩,,只要左右晃二三次就達(dá)到大晃動幅度,,大晃動幅度大概是45度左右。定下這個P值后然后加入D,而且D有可能比P大,。在這個基礎(chǔ)上我又開始了調(diào)試,。 從頭來調(diào)P,這次我觀察到新現(xiàn)象。我把四軸稍微傾向一邊幾度,,比如說左邊,,當(dāng)P小時,啟動電機(jī)松手后,,四軸向左倒,,如果P大了,,四軸回向右倒。前者是補(bǔ)償不足,,后者是補(bǔ)償過度,。在這個兩個P值得區(qū)間就有我們要找的P,合適的P就是能在平衡位置掙扎左右晃幾下的值。此時我的P=3.0但是光靠P四軸還是站不住,,只能在平衡位置堅持個1,,2s。所以得加入D,嘗試D=1,2,3時沒什么明顯的效果只能觀察到起初的短時平衡跟穩(wěn)定了點,。D=10時可明顯觀察到平衡的時間跟長了,但還是會倒,。當(dāng)D=20,,可明顯觀察到四軸可以基本平衡了,但還是有有小幅震蕩,,一但有干擾還是不能很快恢復(fù)穩(wěn)定了,,D=30時四軸已經(jīng)開始比之前大的等幅震蕩了,而且當(dāng)有外力干擾時四軸也能抵抗住外力維持自身在平衡位置的震蕩狀態(tài),,說明D有起作用但是D大了,。在這種情況下還說明P還是給小了,回復(fù)力不足,。我把D定在25,,再開始調(diào)節(jié)P,把P加大。增強(qiáng)恢復(fù)力,。后面得的調(diào)節(jié)過程中我就是感覺,,P會產(chǎn)生一種震蕩A,這種A震蕩是會發(fā)散的,頻率較低,。D也會產(chǎn)生一種震蕩B,B是等幅的,,頻率較高的。然后P會抑制震蕩B,但會激發(fā)A,D會抑制震蕩A,但會激發(fā)B,。后面的調(diào)節(jié)參數(shù)就是要調(diào)好P后再調(diào)D,定好D再調(diào)節(jié)P,兩個參數(shù)互相扶持的趨近一個最佳點,,想單靠一個參數(shù)一次就接近理想值是辦不到的。當(dāng)然機(jī)體表現(xiàn)出的等幅震蕩時也不一定是D大了,,P不合適同樣也會產(chǎn)生此種情況,。還有調(diào)節(jié)參數(shù)時不要一味只加不減。當(dāng)我P=4,D=50時我就是將P往回減了點才取得了更好的效果,。最后離開平衡桿時P=3.5,D=50,。這次沒有靜差,所以沒有I項,。 最后來總結(jié)幾點: 然后貼上我認(rèn)為對我?guī)椭容^大的兩個PID資料,,一個講PID基本定義,,一個講PID參數(shù)整定 貼上兩個個調(diào)試的視頻: |
|