Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 3910|回復: 0
打印 上一主題 下一主題

實驗機器人"小強一號"製作過程4

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-5-19 13:46:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
實驗機器人「小強一號」製作過程(4)
作者:Mindroid 發佈時間:2008-05-16 06:45:29 來源:http://www.mindroid.com/

軟件結構

       小強一號結構非常簡單,傳感器只採用了個紅外距離傳感器作為機器人的「眼睛」,使用兩個電機進行運動,距離傳感器連

接在一個舵機上,作為「頭部」可以左右範圍的轉動。機器人的行為最簡單的就是巡航行為,巡航行為就是給電機電流,電機轉動

而已。那麼發生碰撞怎麼辦?在巡航行為中,不用考慮碰撞,否則又會變成複雜的判斷邏輯。為了避免碰撞,設計一個獨立的避免

碰撞的「逃離」行為。逃離行為從距離傳感器獲取障礙物距離信息,簡單的判斷前方是否有障礙,進行避讓。由於多個行為都可能

控制電機,所以需要一個仲裁器根據優先級來判斷到底執行那個邏輯部分輸出的控制指令。下面用圖來說明這種情況:



    如果需要增加其他更加複雜的智能,那麼只需要增加對應的行為單元就行了,不用修改已有的邏輯結構。每個行為單元只需要

處理自己關心的傳感器和需要控制的動作執行部分。這種方式的好處就是程序邏輯變得非常簡單,功能單元之間不會存在互相影響

的弊端。

       下面的代碼是「巡航」行為:

class BhCruis:public Behavior

{

public:

      

public:           

    BhCruis(const char* name):Behavior(name){

       };

       BhCruis();

       void Run();

       void Setup();



};



void BhCruis::Setup(){



}



void BhCruis::Run(){

    int bid = GetId();

    GO_speed_left[bid] = 255;

    GO_speed_right[bid] = 255;



    GT_beh_action[ACTION_TYPE_MOTOR][bid] = true;

}

    上面的代碼很簡單,就是讓兩個電機以同樣的速度暈裝,其他都不用考慮。對於某些行為,需要引入稍微複雜一些的處理,比

如發現障礙物,首先要停下來,然後判斷是應該往左還是往右,做出決定之後,再進行具體的動作。針對這種不能在一個時刻完成

,要經過幾個不同的狀態才能處理完成的行為,可以用狀態機來解決。下圖是「逃離」行為的狀態機:



    對於行為實現自己的狀態機,在行為實現的代碼內部實現,而不影響其他行為。這種結構可以讓每個行為子關心自己的實現方

式,從而最大的降低軟件複雜度,方便功能添加和修改。逃離行為狀態機實現原型代碼:





void BhEscape::Run(){

    int bid = GetId();



    // 狀態機實現

    switch(state){

        case 0: // 前方距離過小

            if(GI_distance[DISTANCE_FORWORD] < 30){

                GO_speed_left[bid] = 0;

                GO_speed_right[bid] = 0;



                GT_beh_action[ACTION_TYPE_MOTOR][bid] = true;



                timestart = millis();

                state++;   // 狀態變化

            }else{

                GT_beh_action[ACTION_TYPE_MOTOR][bid] = false;

            }

         

            break;

        case 1:  // 觀察左右距離

            if(millis() - timestart > 1000){

                GO_eyeAngle[bid] = 0;

                GT_beh_action[ACTION_TYPE_HEAD][bid] = true;

                timestart = millis();

                state++;

            }

        case 2:  // 觀察左右距離

            if(millis() - timestart > 1000){

                GO_eyeAngle[bid] = 180;

                GT_beh_action[ACTION_TYPE_HEAD][bid] = true;

                timestart = millis();

                state++;

            }

        case 3:  // 決定往哪邊轉彎

            if(millis() - timestart > 1000){            

                GO_eyeAngle[bid] = Angle_Center_90;

                GT_beh_action[ACTION_TYPE_HEAD][bid] = true;

               

                if(GI_distance[DISTANCE_LEFT_1] > GI_distance[DISTANCE_RIGHT_1]){

                    // 左轉

                    GO_speed_left[bid] = 0;

                    GO_speed_right[bid] = 255;

                }else{

                    //右轉

                    GO_speed_left[bid] = 255;

                    GO_speed_right[bid] = 0;

                }

                GT_beh_action[ACTION_TYPE_MOTOR][bid] = true;



                state = 0;

                Delay(2000);

            }

         

        default:

            break;

    }

}
     這種基於行為單元的實現方法比較類似生物的反射行為,完整的代碼在下載專區進行下載。完成了基本的代碼,下一部分需要

構建機器人的機構和測試了。

[ 本帖最後由 uucww 於 2008-5-19 18:27 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-11-24 02:14 , Processed in 0.129316 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表