機器人循線(xiàn)算法原理與實(shí)踐
[硬件基本構架]
對于機器人的循線(xiàn),為了獲得場(chǎng)地上白線(xiàn)(黑線(xiàn))的信息,硬件結構一般有如下幾種種類(lèi)。
1、紅外對管陣列。采取這種方式的機器人比較多,尤其在各種機器人競賽中,幾乎是標準配置。但是這種技術(shù)有一個(gè)致命的弱點(diǎn),就是對于場(chǎng)地光線(xiàn)的干擾特別敏感,而且也很難把紅色和白線(xiàn)區別開(kāi)來(lái),所以使用受到一定的限制。一般解決這類(lèi)問(wèn)題的方法是在紅外光上加載一個(gè)調制波,通過(guò)檢測這個(gè)調制波來(lái)消除場(chǎng)地光線(xiàn)的干擾,至于如何解決紅色和白色的區別問(wèn)題,那就幾乎是五花八門(mén)了。
2、光纖傳感器陣列。采用這種傳感器陣列的原因是,光纖非常細,在單位面積內可以安裝更多的傳感器,從而獲得更精確地場(chǎng)地信息。當然,錢(qián)也也花得更多。
3、線(xiàn)性CCD。這種硬件方法幾乎是一種對場(chǎng)地信息分辨率的BT追求,如果說(shuō)紅外對管陣列還是離散信息的話(huà),那么線(xiàn)性CCD就是線(xiàn)性的連續數據。當然驅動(dòng)它也不是一件容易的事情,對于單片機也有更高的速度要求。
4、視覺(jué)。廢話(huà)少說(shuō)——否則明天我都別想吃飯。
[基本原理]
所謂循線(xiàn),就是通過(guò)一定的傳感器探測地面色調迥異的兩種色彩從而獲得引導線(xiàn)位置,修正機器人運動(dòng)路徑的一種技術(shù)?!f(shuō)的太拗口了。不說(shuō)太多理論的東西,我們就從基于紅外對管陣列的循線(xiàn)技術(shù)來(lái)說(shuō)起。
假設,我們使用的是黑底白線(xiàn)的場(chǎng)地。紅外對管陣列由3個(gè)紅外對管1字擺開(kāi)組成。白線(xiàn)的寬度略小于或等于紅外對管陣列的寬度
1、數據的采集。
對于機器人來(lái)說(shuō),通過(guò)傳感器感知周?chē)挛锏男畔?,利用這些信息并不作太多智能上的計算而直接通過(guò)一定的轉換,指導機器人的運動(dòng)——這種形式在人工智能學(xué)上叫做機器人的“反應范式”。所以,我們要想讓我們的機器人能夠尋著(zhù)我們給定的軌跡線(xiàn)運動(dòng),第一步就必須讓他感知到軌跡線(xiàn)的存在。一般的做法就是通過(guò)AD采樣,獲得紅外對管(傳感器)反饋回來(lái)的電壓信息。然而,這樣獲得的電壓值信息是無(wú)法直接指導運動(dòng)的,必須把他們轉化為二值的(也就是二進(jìn)制信息,1表示線(xiàn)存在,0表示線(xiàn)不存在)信息,然后通過(guò)處理每一個(gè)管子反饋回來(lái)的二值信息獲得白線(xiàn)的位置信息。
>>技術(shù)點(diǎn)AAD信號的閥值化。(你可以參考其它的算法,獲得比較詳盡的技術(shù),我這里只是舉例一二)
所謂閥值化,就是通過(guò)一定的范圍把握,從而把線(xiàn)性的數據轉化為離散數據的一種變換。簡(jiǎn)單的說(shuō),就是通過(guò)分段函數的方法,將數據分類(lèi)。在我們這個(gè)應用中,就是想方設法使AD采集回來(lái)的電壓值變化為一個(gè)恰恰能夠準確表示白線(xiàn)位置信息的二進(jìn)制信息,1代表白線(xiàn)存在,0代表白線(xiàn)不存在。由于白色和黑色在電壓差異上非常之巨大,所以可以簡(jiǎn)單的通過(guò)一個(gè)標志線(xiàn)來(lái)區分它們,當電壓值高于這個(gè)標志線(xiàn)了,就把他標志為1,否則就標志為0,算法描述為:
if(AdValue[i]>MarkLing)
{
LineInfor[i]=1;
}
else
{
LineInfor[i]=0;
}
這樣做非常簡(jiǎn)單,適合于比較標準的場(chǎng)地,然而對于那些模糊了的場(chǎng)地或者是非標準場(chǎng)地,雖然人的肉眼能夠看出來(lái),但是對于機器人來(lái)說(shuō),可能看到的就是花白的一片或者是黑色的夜幕。當標志線(xiàn)值過(guò)高時(shí),機器人能看到的只是那些特別明顯的白線(xiàn),其他則是黑色的夜幕,很容易丟失軌跡線(xiàn);當標志線(xiàn)值過(guò)低時(shí),機器人眼中就是白茫茫的一片毛刺??偠灾?,對場(chǎng)地的適應性非常差。解決方法是,通過(guò)設定兩個(gè)標志線(xiàn)來(lái)標定軌跡線(xiàn)信息,當AD值高于某一值時(shí),標志1;當AD值低于另外某一值時(shí),則標定0。算法描述為:
if(AdValue[i]>High_MarkLine)
{
LineInfor[i]=1;
}
elseif(AdValue[i]Low_MarkLine)
{
LineInfor[i]=0;
}
else
{
LineInfor[i]=NoInfor;
}
>>技術(shù)點(diǎn)B動(dòng)態(tài)預值。(你可以參考其它的算法,獲得比較詳盡的技術(shù),我這里只是舉例一二)
當然,這種算法在簡(jiǎn)單的機器人循線(xiàn)中不是很常用。比較常見(jiàn),適應性強的方法是,首先從AD值中找到一個(gè)中間值作為MarkLine,(或者可以從AD值中找那些比較接近最大值和最小值之差的0.618倍的數值),然后再使用第一種方法標記,這樣的算法叫做動(dòng)態(tài)預值。如果把這種算法應用于第二種當然也不多啦。
2、數據的簡(jiǎn)單加工——第一個(gè)循線(xiàn)程序。
到目前為止,我們已經(jīng)把AD的值的數組轉變?yōu)榱艘粋€(gè)表示白線(xiàn)位置的二進(jìn)制位的數組——我們不妨直接把他用一個(gè)字節表示哈。那么,這個(gè)字節的狀態(tài)就表示了當前白線(xiàn)的位置信息。再假設,我們已經(jīng)寫(xiě)好了幾個(gè)函數用來(lái)分別控制小車(chē)的左右運動(dòng)。那么我們就可以通過(guò)以下的簡(jiǎn)單方式來(lái)實(shí)現循線(xiàn)了。
//用字節的高三位表示三個(gè)管子檢測到的白線(xiàn)信息。
switch(LineInforByte)
{
case0b11100000://全部在白線(xiàn)上
Motor_Left_GoFront(FullSpeed);
Motor_Right_GoFront(FullSpeed);
break;
case0b01100000://明顯車(chē)子向左偏了哈
Motor_Left_GoFront(FullSpeed);
Motor_Right_GoFront(NormalSpeed);
break;
case0b00100000:
Motor_Left_GoFront(FullSpeed);
Motor_Right_GoFront(LowSpeed);
break;
……
//其他情況仿照上面自己寫(xiě)了哈。
default:
Motor_Left_GoFront(StopNow);
Motor_Right_GoFront(StopNow);
break
}
呵呵,這樣就完成了一個(gè)循線(xiàn)小車(chē)的程序了哈。簡(jiǎn)單吧。
順便說(shuō)明一下下,Motor_Left_GoFront()函數是一個(gè)控制電機PWM輸出的函數。
FullSpeedNormalSpeedLowSpeedStopNowStopFree是一些控制PWM的宏定義,你可以修改這些宏定義的值來(lái)實(shí)現以上的功能。我想,你看了這個(gè)程序應該已經(jīng)對循線(xiàn)的基本原理了然于胸了吧。哈哈哈哈哈哈哈哈。
3、數據的高級加工——復雜地面情況的模糊識別算法。
以上的算法的確可以應付規范場(chǎng)地下的情況了,但是由于其類(lèi)似查表式的數據處理方式,一旦出現真值表中沒(méi)有的情況——哪怕是很明顯的直線(xiàn)存在——機器人都沒(méi)有辦法處理了。典型的就是在地上有大塊的白色斑點(diǎn),導致機器人對白線(xiàn)視而不見(jiàn)。
解決以上問(wèn)題的方法還要從人眼識別白線(xiàn)的原理上說(shuō)起。在破壞嚴重的場(chǎng)地上,人類(lèi)的眼睛仍然可以識別出原先的白線(xiàn),這是為什么呢?通過(guò)重心。人類(lèi)的眼睛通過(guò)捕捉白線(xiàn)的重心確立白線(xiàn)的大體軌跡,從而辨認出白線(xiàn)的位置。從概率的角度上說(shuō),在破壞嚴重的場(chǎng)地上,出現在白線(xiàn)兩邊的淺色干擾的概率是一樣的,即使不同,由于白線(xiàn)本身的存在,其重心至少是不會(huì )偏離白線(xiàn)很遠的,所以,只要簡(jiǎn)單的獲得地面淺色標志的重心,就可以大體確立白線(xiàn)的所在。我們可以利用物理學(xué)上質(zhì)心的算法獲得這一信息。忘了說(shuō)一點(diǎn),要想機器人增強對環(huán)境的適應力,就需要增加傳感器的數目。我們不妨用8個(gè)紅外管作為傳感器。這樣通過(guò)處理后獲得的場(chǎng)地信息就整整1個(gè)字節了。假設1個(gè)光電管的1擁有1單位的重量,八個(gè)光電管的坐標分別為-7-5-3-11357,其間距都是2個(gè)單位,通過(guò)置信公式很容易計算出質(zhì)心的坐標,通過(guò)這個(gè)坐標和0的絕對值,就可以知道當前機器人偏離白線(xiàn)的多少,而這個(gè)偏離值則可以通過(guò)簡(jiǎn)單的比例直接指導運動(dòng)函數。典型實(shí)例如下:
/********************************************************
*函數說(shuō)明:電機動(dòng)作調速函數*
*說(shuō)明:該函數放在定時(shí)器或者主循環(huán)里面用于產(chǎn)生軟PWM*
********************************************************/
voidSpeedPWM(charPWMLine)
{
charPWMLine_L=PWMLine;
charPWMLine_R=PWMLine;
staticcharPWMCount_L=0;
staticcharPWMCount_R=0;
charTemp=0;
if(FollowLineEnable==True)
{
Temp=(char)fabs((float)CG_X);
if(AdcValueFlag==0)
{
Temp=0;
}
else
{
if(CG_X0)
{
if((Temp4)=PWMLine_R)
{
PWMLine_R-=((Temp5)+Temp2);
}
else
{
PWMLine_R=0;
}
}
else
{
if((Temp4)=PWMLine_L)
{
PWMLine_L-=(Temp5);
}
else
{
PWMLine_L=0;
}
}
}
}
PWMCount_L++;
PWMCount_R++;
if(PWMCount_L>Fastest)
{
PWMCount_L=Stop;
}
if(PWMCount_R>Fastest)
{
PWMCount_R=Stop;
}
if(PWMCount_LPWMLine_L)
{
switch(GoDirection)
{
caseFront:
Motor_Left_GoFront;
break;
caseBack:
Motor_Left_GoBack;
break;
caseLeft:
Motor_Left_GoFront;
break;
caseRight:
Motor_Left_GoBack;
break;
caseStop:
Motor_Left_Stop_Free;
break;
}
}
else
{
Motor_Left_Stop_Free;
}
if(PWMCount_RPWMLine_R)
{
switch(GoDirection)
{
caseFront:
Motor_Right_GoFront;
break;
caseBack:
Motor_Right_GoBack;
break;
caseLeft:
Motor_Right_GoBack;
break;
caseRight:
Motor_Right_GoFront;
break;
caseStop:
Motor_Right_Stop_Free;
break;
}
}
else
{
Motor_Right_Stop_Free;
}
}
/********************************************************
*函數說(shuō)明:獲取偏離軌跡線(xiàn)的數值*
*輸入:表明尋線(xiàn)狀態(tài)的字節*
*[說(shuō)明]*
*通過(guò)類(lèi)質(zhì)心算法獲取當前機器人偏離軌跡線(xiàn)的量*
*-表示偏左+表示偏右*
********************************************************/
signedcharGetCG_X(unsignedcharAdcValues)
{
signedchara=0;
signedcharTemp=0;
signedcharTotals=0;
for(a=0;a8;a++)
{
if((AdcValuesa)>>7)
{
Temp+=((-7)+(a1));
Totals++;
}
}
if(Totals==0)
{
return0;
}
return(Temp/Totals);
}
函數調用GetCG_X函數,用來(lái)獲取CG_X,CG_X直接在PWM輸出函數里面指導機器人的運動(dòng)。
以上方法的好處是,提供了一個(gè)比例調節循線(xiàn)動(dòng)作的可能。支持多傳感器的情況,尤其適合線(xiàn)性CCD類(lèi)的線(xiàn)性數據的處理。為機器人提供了一個(gè)相對完整的視覺(jué),不可能出現無(wú)法識別的情況,而且,這種情況可以使機器人在不加修改程序的情況下直接在在白線(xiàn)循線(xiàn)和黑線(xiàn)循線(xiàn)狀態(tài)下切換。
評論