丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
DIY 正文
發(fā)私信給吳攀
發(fā)送

12

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

本文作者: 吳攀 2015-12-04 09:56
導語:這是一輛比賽用的機器小車,所以要精打細算。

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

編者注:本項目來自Instructables,作者為newtonis。這是一個用于比賽的循跡跟蹤小車項目,他是怎么在兼顧尺寸和速度性的同時滿足小車高性能的要求的呢?

循跡小車在創(chuàng)客圈里面并不是什么新鮮事,但普通的循跡小車要么比較大,要么則比較重,并不適合用來比賽。在我們當?shù)氐膭?chuàng)客圈子里面有一個循跡小車的比賽項目,要求上場的小車的尺寸不能超過12x20cm,那我們該怎樣來滿足這樣的需求呢?

本項目的主要開發(fā)過程分為三個部分:電子構建,結構設計和3D打印,程序配置和調試。下面我們就來完成它吧。

第一步:電機

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

在開發(fā)此項目的過程中,要切記的一點是我們是在開發(fā)一個比賽用的小車。此處我選用了Pololu提供的電機,他家的電機分為四種:低功率、中等功率、高功率和長壽命高功率,這四種電機的工作電壓都為6V,而且物理尺寸也基本相同。低功率的電機功耗較低,但是要知道我們這是為了比賽,所以應該選擇那兩種高功率的電機。其中長壽命高功率的電機的使用壽命更長,但是并不能承受高于6V的電壓。綜合考慮之后,我選擇了高功率的電機,它們能夠不中斷地連續(xù)使用好幾個小時,這已經足夠了。

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

接下來我們應該選擇多少的傳動比呢?通常電機的傳動比越高,電機的速度就越低,但是電機提供的扭矩卻更高,就能提供更高的加速度。對比較重的機器人來說這確實非常重要。我的建議是在30:1到10:1的傳動比之間做出選擇,最后我選擇的四個傳動比為10:1的電機,畢竟是為了比賽,我會盡量降低小車的質量,從而提供更高的速度。當然,你也可以選擇使用2個30:1的傳動比的電機,這樣為了獲得更高的速度,你需要為電機提供高于6V的電壓。

第二步:車輪

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

因為電機的速度是以每分鐘的轉速衡量的,所以在轉速固定的情況下,輪子直徑越大,理論上就跑得越快,但與此同時輪子也會越重。綜合考慮之后我選擇了直徑32毫米的窄邊車輪,其單個重量為3.2克。

第三步:電池

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

電池方面我推薦使用儲能密度大、可充電的LiPo電池。我使用的是850mAh 7.4V雙芯LiPo電池。

第四步:球腳輪

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

為了能讓小車的電機獲得足夠的反應時間,需要將小車的循跡探測器盡量前置,那么這就需要用到2個前置的球腳輪.當然這兩個球腳輪并不是必需的,如果你的小車的設計能夠在行進過程中維持平衡,或者只是采用后輪驅動的方式運動(將探測器安裝在車體前部),那么就不需要這兩個球腳輪。

注意兩只球腳輪的相對位置,不要讓其對小車的行進方向產生影響。

第五步:小車結構

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

為了在保證小車基本結構上盡量降低小車的質量,我選擇自己設計小車的結構件。點擊這里下載我用Google SketchUp設計的3D結構模型,然后用3D打印機打印出來即可。注意,打印之前需要導出適合3D打印機的STL文件。

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

第六步:探測器組件

這一步我需要搭建能夠用來探測地面標線的探測器設備。這里我用到了9個CNY70光電傳感器(5個或7個應該也可以),9個220Ω電阻和9個56kΩ下拉電阻。另外我還設計了一個簡易的PCB板用來承載我的電路結構。

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

這套探測器的原理很簡單,每個CNY70傳感器都會產生0-5V的電壓,其中0V左右表示探測到黑色,5V左右則是白色。CNY70提供了0-1024的精度范圍。

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

電路板上一共引出了11個接口,其中兩個分別是接地和5V電源,其它9個是傳感器的模擬輸出。電路本身并不復雜,復制以下電路9次即可。

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

第七步:主電路設計

探測器的電路不復雜,主電路卻相對較為復雜一點。這里我們沒有使用常見的Arduino,而是使用了PIC18F4550單片機,因為其體積更小,而且在某些比賽中是禁止使用Arduino的。

電路設計如下:

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

相關文件:

主電路的組件清單如下:

  • PIC18F4550單片機

  • 20MHz晶振

  • 3到6個LED(PCB上只使用了3個)

  • 3個220歐姆電阻(用于LED)

  • 2個10nF陶瓷電容

  • 2個18nF陶瓷電容

  • L293D或SN7544(電機驅動模塊)

  • 開關

  • 三個按鈕

  • 7805三端穩(wěn)壓器(為單片機提供5V電壓)

  • 線材等

接下來就是制作對應的PCB板。

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

然后將各個組件焊接到PCB上。

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

第八步:編程

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

接下來就要對我們機器人的大腦做文章了。這里我使用的是MPLAB XC8編譯器和Sublime Text作為開發(fā)環(huán)境。具體的安裝過程這里不提,這里提供了Sublime Text用來構建和運行XC8的命令行代碼,你需要用它來配置XC8的路徑和安裝PK2CMD。

rayito.c是我編寫的代碼,下一個步驟我會對其中一些代碼進行一些說明。

第九步:代碼解析

代碼的工作原理示意圖:

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

各個傳感器的工作模式示意圖:

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

傳感器的精度為0-1024,但事實上我們的測量基本上不可能達到兩邊的頂點(純黑和純全反射)。那么我們就可以對傳感器得到的數(shù)值進行定義,低于A值都定義為黑色,高于B值都定義為白色,則有0<=A<=B<=1024。

對傳感器的讀數(shù)進行調試和校準:

void initLED(){ ///初始化讀數(shù)變量,在程序啟動時調用一次

    int x;

    for (x = 0;x < 8;x++){

        amax[x] = 0; ///Amax是上面提到的B值

        amin[x] = 1024; ///Amin是上面提到的A值

    }

}

void CalRead(){ ///讀取校準數(shù)值

L_ROJO = T1000 < 500*6; ///紅色LED閃爍

    int x;

    for (x = 0;x < 7;x++){  //跟蹤傳感器

        /***注意: 使用T(x)是因為其在程序的第一部分就進行了定義,讓排成列的傳感器能夠以正確的順序排列。***/

        amax[x] = max(amax[x],T(x)); ///如果得到的值高于上一次值則替代

        amin[x] = min(amin[x],T(x)); ///如果得到的值低于上一個值則替代

    }

    ///不能使用T(7)加入第7個傳感器的數(shù)值,該傳感器不用于讀路線。. 

    ///我們用其來讀取某些賽道特定的曲線路徑標記。

    

    amax[7] = max(amax[7],J(7));  

    amin[7] = min(amin[7],J(7));

}

經過了此段之后,我們會得到7個由傳感器產生的數(shù)值,并將其存儲在C數(shù)列中,每一個傳感器都有amin (A)和amax (B)值。那么在程序進行標準取值時,我們將小于A的值都當成A,將大于B的值都當成B。中間值忽略。

///這是偽代碼,不能直接工作,只用于了解原理

///在實際代碼中,amax[x]是B而amin[x]是A

int w = W[x]; ///W[x] 取值0~1024

w = min(w,B); //如果w大于B,則w=B

w = max(w,A); //如果w小于A,則w= A

w -= A; ///讓w邏輯上取值在0到B-A

w *= 1024; ///w取值為(0到B-A)*1024

w /= (B-A); ///現(xiàn)在w取值為0 到1024

第十步:加權平均

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

這一部分算法是我們實現(xiàn)高性能的關鍵部分之一。在本算法中,用于取平均數(shù)的數(shù)字的價值越高,其對最終平均數(shù)的影響就越大。這樣我們的算法就不只是以下的算法那么簡單了:

if (S1 see black){

Left();

}else if (S2 see black){

Right();

}else{

Front();

}

為了真正造出一個高性能的機器小車,我們需要盡可能準確地確定路線的中心線。使用傳感器進行測量時,每一個程序循環(huán)中我們都可以得到5組不同的中心線位置,而我們需要通過加權平均的方式將這5個數(shù)值轉變成一個數(shù)值。

void Ponderado(){    sum = 0;

    division = 0;

    nove = 0;

    char center;

    for (x = 0;x <= 6;x++){

 

if(T(x)>amax[x]){

w=amax[x];

}else if(T(x) < amin[x]){

w=amin[x];

}else{

w=T(x);

}***/

 

w = ran(T(x),amin[x],amax[x]);

        w -= amin[x];

        w *= (ll)1000;

        w /= (amax[x]-amin[x]);

        if (w > TH){

            nove = 1;

        }

        if (x == 3){

            if (w > TH){ center = 1; }else{ center = 0; } ///We store here if the center sensor reads 0 or 1000

        }

        ///A is the weight

        ///B is the position

        if (x == 0 or x == 6){ continue; } ///We ignore the sensors 0 and 6

v = (1000) * (x-3);///This variable will be -2000,-1000,0,1000,2000 in each cycle

        sum += (w*v); 

        division += (w);

    }

   if (nove == 0){ ///if we don't see the line        POSICION = POSICION > 0 ? 200 : - 200; ///Now we set the value accordingly the last value set. if posicion is > to 0 then posicion equals 200, if not it equals -200

        

    }else{

        POSICION = (ll)(sum) / (ll)(division); ///We get the weighted average result

        POSICION /= 10; ///We change the scale from -2000,2000 to -200,200

    }

}

第十一步:路徑跟蹤

確定了中心線之后就需要控制電機對線進行跟蹤了。由于我們采用的電機并不具有直接轉向的功能,我們需要用到另一種轉向方式:速度差轉向——通過為小車的輪子設定不同的速度從而讓小車整體產生轉向效果??刂扑俣葎t用到了常用的脈沖寬度調制,這一部分整合到了小車的代碼中。此處我們需要用到一個函數(shù)MotorsSpeed(a,b),其將定義電機的速度,并將其設置到區(qū)間(-1000,1000)之間,包括前后速度。

void MotorsSpeed(int A,int B){

///If mode equals alfa then we invert the motors voltage

    MotorASpeed(MODE == ALFA ? A : B); 

    MotorBSpeed(MODE == BETA ? A : B);

}

void MotorASpeed(int S){

S = min(S,1000); 

S = max(S,-1000);

    

    ADIR = S > 0 ? 0 : 1;

    S = S > 0 ? S : 1000 + S; 

    

    CCP1CONbits.DC1B1 = S % 4;

    CCPR1L = S / 4;

}

void MotorBSpeed(int S){

    S = min(S,1000);

    S = max(S,-1000);

    

    BDIR = S > 0 ? 0 : 1;

    S = S > 0 ? S : 1000 + S;

    

    CCP2CONbits.DC2B = S % 4;

    CCPR2L = S / 4;

}

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

實現(xiàn)了對電機的速度控制,就可以實現(xiàn)轉向算法了。

void LineFollow(){

    double kp,kd,kr,speed;

///POSICION has the value of the center of the line previously calculated

    kp = KP[speedMode];

    kd = KD[speedMode];

    kr = KR[speedMode]; 

    DER = POSICION - LP; ///We calculate how much the line has moved from the last iteration

    PIDf = (POSICION* kp + DER * kd);

 

        if (PIDf > 0){

            MotorsSpeed(Mr(speed-PIDf,kr) , speed); ///Mr makes the value to multiply by KR if it is negative. You can delete it        

}else{

            MotorsSpeed(speed , Mr(speed+PIDf,kr) ); ///Mr makes the value to multiply by KR if it is negative. You can delete it

        }

    LP = POSICION;  ///We store the last line position

}

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?

第十二步:完成

部署好了算法也就大功告成了,接下來就該拿到賽場上比試比試。哦,看起來高手還是挺多的嘛……

2015-2016賽季全球創(chuàng)客馬拉松深圳大學站持續(xù)報名中!關注“硬創(chuàng)邦”(微信號:leiphone_bang),回復“深大”即可參與報名!而且,雷鋒網在未來三個月內選一個合適的時間,在北上深選擇一個地點,舉辦創(chuàng)馬“火星救援”專場!詳情可點擊此處了解。

此外還可加入全球創(chuàng)客馬拉松主群(群號:259592983),參與我們的互動討論~

高性能循跡跟蹤小車,怎么在比賽中擊敗對手?


雷峰網原創(chuàng)文章,未經授權禁止轉載。詳情見轉載須知。

分享:
相關文章

編輯

人類尚處于科技文明的黎明時代,如果你已經無法理解現(xiàn)在所發(fā)生的一切,請不要驚慌。
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
立即設置 以后再說