5.6.3 舵機控制算法
在小車行駛途中,由于在直道和過彎時,攝像頭所采集到的圖像的有效行數是會變化的,在過彎時,采集到的圖像行數會減少,同時黑線的偏差值也會相應的變化,這樣便可利用有效行的大小來分段給定舵機的Kp值,再結合偏差細化Kp值。經過測試和調試得出以下分段控制:
按照有效行進行分段確定比例系數:
Effect_row≤12; Kp=7;
12<Effect_row≤18; Kp=6;
18<Effect_row≤25; Kp=6;
Effect_row>25&&左邊丟線數B_LZ>20||右邊丟線數B_LR>20; Kp=6;
Effect_row>25&&B_LZ≤20&&B_LR≤20; KP=5;
經過實際調試測量控制后,小車的轉向控制是非常準確。
5.6.2 電機控制算法
小車行駛途中,在不同的路況時,攝像頭所采集到的圖像的有效行數和偏差值是會變化的。在過彎時,采集到的圖像行數會減少,偏差會增大,這樣便可利用有效行和偏差的大小來控制速度。
控制的主要思想:將一幅圖像劃分成三段,計算每一段圖像中兩條黑線的累積偏差。對于直道來說累積偏差較小,有效行較多,對于彎道來說累積偏差較大,有效行較少。若前面兩段的累積偏差大,后一段的累積偏差小,即可判定是直道入彎,此時電機減速;若前面兩段的累積偏差較小,后一段的累積偏差較大,即可判定是開始由彎道進入直道,此時電機加速。在直道和彎道中主要通過彎道計數器和直道計數器來完成對電機的控制。若正在處理的一行如上一行的偏差大于一個設定的值(通過測試得到),彎道計數器加一,否則直道計數器加一,通過一幅圖像的中彎道計數器與直道計數器的值的相應大小即可判定是直道還是彎道,并設定相應的速度。
這種算法的優(yōu)點是對于小S彎,計算的累積偏差不大,即可判定為直道,此時可以以最優(yōu)的路徑沖過小S彎。
5.5.4 轉角控制 根據賽道的偏差來控制舵機的轉角,采用如下: - voidduoji(void){
- if(duandianflag==0){
-
-
- if(error>0)
- duty=DUOJICENTER+error*kp;
- else
-
- duty=DUOJICENTER+error*kp;
- error1=error;
-
- }else if(duandianflag==1){
- duty= DUOJICENTER+ZHUANMAX;
- }else if(duandianflag==2)
- duty= DUOJICENTER-ZHUANMAX;
- if(duty>DUOJICENTER+ZHUANMAX)
-
- duty=DUOJICENTER+ZHUANMAX;
- if(duty<DUOJICENTER-ZHUANMAX)
- duty=DUOJICENTER-ZHUANMAX;
-
-
- PWMDTY01=duty;
- }
- ////////////////////////////////////////////////////////////////////
復制代碼
斜率控制
判斷賽道類型,給出速度基準
5.3 舵機控制從采集回來的圖像中提取控制量來控制舵機的轉向,實現智能車的自動循跡。本系統采用虛擬黑線的偏移量e_steer和虛擬黑線的某段斜率K_buf對舵機進行控制,可稱為PD控制器。
其控制形式如下式所表示:
e_steer=(POINT/2-(int)mid_image[1])*KD2_2;
K_buf=((int)(mid_image[1])-(int)(mid_image[hang_en]))*(KS2-2)/hang_en;
式中的POINT為攝像頭采集的列數,mid_imag數組時根據兩條黑線虛擬出來的中間線,KD2_2和KS2_2是結合小車行駛的情況整定的參數。
由于車模是個隨動系統,我們的小車的前瞻是70cm,而真正用到的只用我們指定的17行。在攝像頭70cm前瞻內覆蓋的黑線超過17行,特別是前方的彎特別急的時候,在攝像頭前瞻視角范圍內覆蓋的黑線會特別少。根據這個特點,可設置一個有效前瞻量hang_en作為對前方的彎的平緩程度的反應。
這樣,從一場的黑線位置數據中,系統提取了有效行hang_en、e_steer、K_buf 3個量來對舵機進行控制。在實際情況中,K_buf可以很靈活,因為前方黑線的斜率可以取不同段得到,可以根據實際要求得到不同段的斜率值.如速度快時可以適當的取距車較遠處的黑線斜率,以實現超前控制。在智能車調試參數的時候.對這3個量的理解很是重要,具體來說,hang_en表征車模的有效前瞻, 即看得有多遠,對于智能車在道路上行駛,看得遠說明黑線都在前方,看不遠說明智能車前方的黑線已經偏左或者偏右,而這個量的大小正好可以表征彎的平緩與急切。另外,看得遠則攝像頭采集的黑線多,系統信息量大,那么怎么處理這些大量的信息為我們所用就變得很關鍵,如看得70cm都能看見.說明小車必然在長直道上,不然也是小S彎,稍作處理就可以過濾掉小S彎了,讓小車像都是在直道上跑;看得很近說明彎已經很急,這時候,只要能夠判斷出彎往那邊拐就可以給舵機一個極值急拐。e_steer表征在某一個特定視野下.小車與黑線偏離的程度,這個量可以讓智能車在某個特定視野下決定給舵機多大的轉角。K_buf則在有效前瞻遠的時候尤為關鍵,因為它可以預判前方的彎,從而超前的轉彎。 5.4 速度控制 電機控制方面我們才用的是增量式PID。行駛過程中給定的速度主要要六種,這六個速度值對應舵機賽道的不同半徑的彎道,也就是說在半徑小的圓彎,速度不能太大,因此賦予小的速度值,而半徑大的圓彎則要賦予較高的速度值。這樣在小車行駛過程中既保證了小車的穩(wěn)定性,也提高了速度。具體實現程序如下所示: - if(Steer_PWM>1125) //右彎
- {
- if(Steer_PWM>1215)
- {speed_goal=speed_strategy.very_slow;}
- else if(Steer_PWM>1185)
- {speed_goal=speed_strategy.slow;}
- else if(Steer_PWM>1155)
- {speed_goal=speed_strategy.medium;}
- else
- {speed_goal=speed_strategy.high;}
- }
- else if(Steer_PWM<1095) //左彎
- {
- if(Steer_PWM<1005)
- { speed_goal=speed_strategy.very_slow;}
- else if(Steer_PWM<1035)
- { speed_goal=speed_strategy.slow;}
- else if(Steer_PWM<1065)
- { speed_goal=speed_strategy.medium;}
- else
- {speed_goal=speed_strategy.high;}
- }
- else{if(Judgment_straight(hang_en))speed_goal=speed_strategy.very_high;}
復制代碼 其中的速度值可由撥碼開關控制其大小。我們采用的是四位撥碼開關,理論上可以設定十六種速度值,但是為了控制的方便,我們只使用了八個值,其中兩個設置為開環(huán),防止比賽時測速突然失靈。其它六中則為對應的速度結構體,具體對應的不同半徑的速度值存放在一個結構體變量speed_strategy中,速度的選取可視賽場的情況而定。為了加快系統的響應,使用PID控制器來提高響應速度.具體的實現如下代碼: ek=(int)speed_goal-(int)speed; out=(int)(ek*Kp)-(ek_1*Ki)+(ek_2*Kd); 其中ek為當前速度與期望值的偏差,ek_1為上一次的偏差,而ek_2為更早一次的偏差,Kp為比例系數,Ki為積分環(huán)節(jié)系數,Kd為微分環(huán)節(jié)系數,這三個參數經過大量的調試得來
////////////////////////////////////////
5.3.2 舵機轉向控制算法
經過上面的圖像處理方法,得到本場第一個有效行為istart,最后一個有效行iend。為了使智能車的路徑更優(yōu)化,需要把賽道分類。針對不同賽道選用不同的走線策略。由(istart,cent[istart])和(iend,cent[iend])兩點確定一直線y=a*i+b記為L。當有效行大于3行時,從istart+1開始到iend-1結束進行逐行處理。每行計算cent[ i]-a*i+b[ i]。如果掃描中發(fā)現有的行導航線在L左側,有的在L右側,因為只有S彎才會看到此現象,所以此時賽道為S彎,再根據bulb(bulb為一場中最大的cent[ i]-a*i+b[ i])的大小可確定是大S彎還是小S彎。如不是S彎,再根據iend的大小來判斷。iend大說明看到的圖像長,那轉彎處必定較遠,記為遠彎。相應的iend小則為近彎。如果有效行小于3行,再看istart是否為第0行。是則說明比較信息比較可靠,且彎很急記為急彎,否則信息不可靠記為不可靠信號。因為直道上不管以哪一行控制差別都不大,所以直到也可歸為遠彎。
得到了路徑識別的結果,再確定不同路徑的控制行。先按在直線上以每行作為控制行分別得到的轉角相等為標準,確定每行的轉角系數。這樣同樣大小的cent[ i]所對應的轉角隨著i增大而減小。如果路徑為小S彎,就以iend為控制行,以達到直走的效果。如果是大S彎,根據S玩的大小,分別以iend和ibulb控制行算得的轉角按一定權值求平均值作為最終轉角。如果是遠彎,如果以iend行的黑線中值來控制舵機會使智能車過彎太提前,容易從彎內側沖出賽道,為此要沿線走較合理,而ibulb正好是相當于直線與拐彎交界處,所以以ibulb為控制行。如果是近彎,以iend控制,會走內線,既不易沖出賽道又縮短路徑。
如果是急彎,以iend控制轉的最大。如果是不可靠信號,就以近處某一固定行控制,以達到循線走的效果。
為了更好的解決轉向的問題,我們采用分段轉角系數控制舵機。根據不同的路況信息來設定不同的轉角系數。因為在直道或小S上轉角系數太大,往往會導致舵機的抖動使得小車在直線上左右搖擺,所以如果小車行駛在直線上那么舵機的轉角系數應該比較小;如果小車舵機行駛灣道上,那么轉角系數應該同時變大否則很可能不能及時地過彎道。
5.3.3 直流電機的控制算法
根據路徑識別的情況,如果當前路徑為直道,則需要加速;若是彎道,則需要降速,而且根據不同的彎道速度也是有所區(qū)別,這個區(qū)別體現在速度設定上。我們根據iend、舵機轉角、bulb等多個變量的大小來確定速度設定的策略。
當iend等于最遠行時,說明彎道離得很遠,速度可以設為很高的值。這時需要根據bulb來確定遠處是彎道還是直道,bulb越大速度應該越小,bulb為0時速度為最高檔。當iend不等于最遠行時,速度需要降一個檔,再根據iend越大速度越高,舵機轉角越大,速度越低的原則,對速度做進一步微調。當iend小于4時,說明有沖出賽道的危險,速度再降一檔,再根據iend越大速度越高,舵機轉角越大,速度越低的原則,對速度做進一步微調。由于速度太低時,電機動力不足難以推動智能車前進。因此速度設定應該有個最低限幅值。當運算得到的速度設定小于該限幅值時,速度直接賦值為最低值。速度設定中用到的各參數都可用撥碼開關來改變,這在實際比賽中有較大的實際意義。
以上只是速度設定的算法,實際的車速還需要閉環(huán)控制,用PID算法來實現穩(wěn)定、準確、快速地跟隨速度設定。下面介紹速度的控制算法。
系統利用測速模塊反饋的當前速度值,和設定速度值來選擇不同的P參數來進行調節(jié),從而控制直流電機對當前路徑進行快速反應,利用I的作用使得消除靜差,加入D使得速度更加穩(wěn)定。
本系統采用的是數字PID 控制,通過每一控制周期讀入脈沖數來間接測得小車當前轉速vi_FeedBack,將vi_ FeedBack與模糊推理得到的小車期望速度vi_Ref比較,既而算得速度偏差error,再通過調用PID函數來獲得速度的控制。 考慮到CMOS方案的控制周期較長,假設按2.5m/s的平均速度計算,則一個控制周期小車大概可以跑過5cm,如果按這種周期用上述PID調節(jié)速度,則會導致加速減速均過長的后果,嚴重的影響小車的快速性和穩(wěn)定性。為了解決這個問題,可以在PID調速控制中適當加入Bang-Bang控制:根據error的大小,如果正大,則正轉給全額占空比;如果負大,則自由停車或給一個反轉的PWM,否則就采用PID來計算所需的占空比。
|