1. 程式人生 > >恩智浦(飛思卡爾)智慧車舵機和電機PID控制

恩智浦(飛思卡爾)智慧車舵機和電機PID控制

這篇文章主要是基於B車模這種單電機四輪車模來寫的,內容是講兩者PID之間的差異,以及兩者各自的主要控制引數,並不講它們的完整的PID程式要如何寫。
寫PID的時候,首先要理解電機控制與舵機控制的區別。很多人有一個誤區就是把電機和舵機當成同一個系統來控制,在調車的時候也是用同樣的方法來進行調車。我們首先來看兩個公式:
1、err = target - measure(偏差 = 設定值 - 實際值);
2、out(控制量) = P * err + I*err的累積 +D * (err - pre_err);
在舵機中,err就是攝像頭計算的中線與中線的偏差值,控制量則是舵機引腳的電壓值,也就是舵機打角角度大小。
在電機中,err是電機的設定速度與實際速度的差值,而我們的控制量則是電機輸入電壓的大小
比如都是單純的P(比例)控制,假設target(設定值)不變,measure(實際值)小於target的情況下,舵機的P輸出會使得err逐漸減小,並隨之時間的推移趨近於0,其實理論上單純的P控制是不會達到target的,但是現實中的系統是個連續的,而我們在程式上控制是一個差分系統,舵機就會在保持上一個時間的狀態直到下一個狀態的輸出,假設小車一開始是直線行駛,但中線在小車右側,那麼P輸出會讓舵機向右打角,越接近中線,舵機打角越小直到達到中心線,但我們會認為小車還是直線行駛嗎?是不是越接近中線小車轉彎角度越小呢?實際恰恰相反,單純的P控制會讓小車在達到中線時轉彎角度最大,因為小車的轉彎角度是由之前舵機打角一直積累下來的, 在這段時間內,舵機就會保持轉彎的狀態導致超過target,所以舵機的P控制會導致超調現象


而在電機中,情況則不同。在理想狀態下,不考慮電機死區的問題,電機的轉速是與電機的輸入功率接近線性關係,在單純的P控制的情況下,假設target(設定值)不變,measure(實際值)小於target的情況下,電機的P輸出會導致怎樣的變化呢?結果應該是一開始的err值是最大的,所以out值最大,電機轉速加快,導致err值變小,out值相應變小,電機轉速減慢,err值又變大,out值相應變大,電機轉速加快,電機一直這兩個過程中來回變化,如果在變化不大的情況下,在我們眼中看來,電機是基本沒有變化的,但measure值與target值相差甚遠,所以如果不是特別極端的情況下,電機的P控制是不會導致超調現象的

那在調車的過程中,我們要怎樣去調節引數呢?其實在上面的內容中,我們能知道舵機的P控制能夠去達到我們的設定值了,也就是說單純的P控制理論上是可以控制小車的運動了,即P是舵機最主要的引數,我們可以單純通過調節P來控制小車的轉彎了,但單純的P控制是不完美的,因為它會使得measure會在target上下浮動,要經過很長的時間才能達到target,這時候就引入了I值和D值了,D值比較容易理解,就是抑制誤差劇烈變化,能夠使得measure會比較平緩地接近target。而I值則是通過誤差的累積來控制輸出角度的大小。但賽道不僅僅是直道,有直角彎,也有小彎,還有S彎之類的,這些都是要通過情況分類和慢慢調引數才能得到一個最合適的值。所以一般調舵機的引數的時候一般都是先把I值和D值設為0,再通過調P值慢慢地使得小車能夠比較好地轉彎後,再引入I值和D值。
在調節電機的過程中,我當時對它的理解是電機的轉速主要是與誤差的累積是相關的,當電機沒有達到target時,控制量會持續增大,直到轉速等於target為止,即I是電機最主要的引數
。即我們可以單純控制I值來讓電機達到我們的target,在電機控制中,P值由於與err值相關聯,當measure一定時,當err逐漸變小時,P值的輸出量也會變小,也就是說,P值除了一開始促進電機的轉速外,其他時候都是抑制電機的轉速變化。所以一般我們在調電機的引數時,是先把P值和D值設為0,然後慢慢調I值直到找到一個合適的值,再引入P值和D值。