目次
#contents



*課題について [#a47a085e]

詳細はこちら[[2019a/Mission3]]



*ロボットについて [#gb9d2e77]

**ピンポン玉を運ぶ [#u59512b4]

アームはL(L')のボールを直接つかむものとGHIJ(G'H'I'J')のボールをプラ容器ごとつかむものの2つとした.
アームはL(L')のボールを直接つかむものとGHIJのボールをプラ容器ごとつかむものの2つとした.

#ref(IMG_4076.jpeg)

#ref()
#ref(IMG_4072.jpg)

**線に沿っての移動 [#b3b16030]
センサを2つ前部に設置し,またその2つのセンサ同士の距離もできるだけ狭めることでより精密にフィールドの線を辿るようにした.

#ref(IMG_4075.jpg)




*プログラムについて [#edc022db]
**基本動作の定義 [#xf9a2829]
課題3において必要となる基本動作のプログラムを以下のように定義した.

**玉を運ぶ [#u59512b4]
設置された玉を拾い運ぶためにはフィールド上での移動を停止したところでアームを動かし,玉を掴み終えた時点で再び移動し始める必要がある.そのためタイヤを動かすNXTとアームを動かすNXTで連携させる必要がある.


**線に沿っての移動 [#b3b16030]

まず数値・ロボットの基本的な動きを以下のように定義する

    #define step1 38
    #define step2 45
    #define step3 53
    #define step4 60
    #define step5 68
    #define left0 OnFwd(OUT_A,60);OnRev(OUT_B,60);
    #define left1 OnFwd(OUT_A,60);Off(OUT_B);
    #define right0 OnFwd(OUT_B,60);OnRev(OUT_A,90);
    #define right1 OnFwd(OUT_B,60);Off(OUT_A);
    #define forward OnFwd(OUT_AB,60);
    #define back OnRev(OUT_AB,60);


    sub follow_line_left()
    {
       SetSensorLight(S1);
       SetSensorLight(S2);
  
       long t0=0,t1=0,st=1;

       while(t1-t0<st){
          if((SENSOR_1<step1)&&(SENSOR_2<step1)){
               t0=CurrentTick();
               forward;
               until((SENSOR_1<step3)&&(SENSOR_2<step3));
               t1=CurrentTick();
           }else if(SENSOR_1<step1){
               left0;
           }else if(SENSOR_1<step2){
               left1;
           }else if(SENSOR_1<step3){
               forward;     
           }else if(SENSOR_1<step4){
               right1;
           }else if(SENSOR_1<step5){
               right0;
           }
        }
        Off(OUT_AB);
        Wait(1000);
    }


    sub follow_line_right()
     {
       SetSensorLight(S1);
       SetSensorLight(S2);
  
       long t0=0,t1=0,st=1;

       while(t1-t0<st){
           if((SENSOR_1<step1)&&(SENSOR_2<step1)){
               t0=CurrentTick();
               forward;
               until((SENSOR_1<step3)&&(SENSOR_2<step3));
               t1=CurrentTick();
           }else if(SENSOR_2<step1){
               right0;
           }else if(SENSOR_2<step2){
               right1;
           }else if(SENSOR_2<step3){
               forward;     
           }else if(SENSOR_2<step4){
               left1;
           }else if(SENSOR_2<step5){
               left0;
            }
        }
        Off(OUT_AB);
        Wait(1000);
    }


sub follow_line_back()
{
   SetSensorLight(S1);
   SetSensorLight(S2);
        sub follow_line_back()
    {
       SetSensorLight(S1);
       SetSensorLight(S2);
  
   long t0=0,t1=0,st=1;

   while(t1-t0<st){
       if((SENSOR_1<step1)&&(SENSOR_2<step1)){
           t0=CurrentTick();
           back;
           until((SENSOR_1<step3)&&(SENSOR_2<step3));
           t1=CurrentTick();
       }else if(SENSOR_2<step1){
           right0;
       }else if(SENSOR_2<step2){
           right1;
       }else if(SENSOR_2<step3){
           back;     
       }else if(SENSOR_2<step4){
           left1;
       }else if(SENSOR_2<step5){
           left0;
       long t0=0,t1=0,st=1;
       while(t1-t0<st){
           if((SENSOR_1<step1)&&(SENSOR_2<step1)){
               t0=CurrentTick();
               back;
               until((SENSOR_1<step3)&&(SENSOR_2<step3));    
               t1=CurrentTick();
           }else if(SENSOR_2<step1){
               right0;
           }else if(SENSOR_2<step2){
               right1;
           }else if(SENSOR_2<step3){
               back;     
           }else if(SENSOR_2<step4){
               left1;
           }else if(SENSOR_2<step5){
               left0;
           }
        }
        Off(OUT_AB);
        Wait(1000);
    }
    Off(OUT_AB);
    Wait(1000);
}


sub start_right()
{
    right;
    Wait(100);
}
    sub start_right()
    {
        right;
        Wait(100);
    }

sub start_left()
{
    left;
    Wait(100);
}
    sub start_left()
    {
        left;
        Wait(100);
    }

sub across()
{   
   SetSensorLight(S1);
   SetSensorLight(S2);
    sub across()
    {   
       SetSensorLight(S1);
       SetSensorLight(S2);
  
   long t0=0,t1=0,st=1;

   while(t1-t0<st){
       if((SENSOR_1<step1)&&(SENSOR_2<step1)){
           t0=CurrentTick();
           forward;
           until((SENSOR_1<step3)&&(SENSOR_2<step3));
           t1=CurrentTick();
       }else if(SENSOR_1<step5){
           forward;
       long t0=0,t1=0,st=1;
       while(t1-t0<st){
           if((SENSOR_1<step1)&&(SENSOR_2<step1)){
               t0=CurrentTick();
               forward;
               until((SENSOR_1<step3)&&(SENSOR_2<step3));
               t1=CurrentTick();
           }else if(SENSOR_1<step5){
               forward;
            }
        }
        Off(OUT_AB);    
        Wait(1000);
    }
    Off(OUT_AB);
    Wait(1000);
}
   

ロボットがボールを掴み移動するにはロボットが停止したタイミングでアームを動かさなければならない.そのためタイヤを動かすNXTをマスター,アームを動かすNXTをスレーブとして互いにプログラムを終了したことを通信でやり取りできるようにする.



    sub send_msg1()
    {
        int msg;
        while(msg!=SIGNALOFF1){
            SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
            ReceiveRemoteNumber(MAILBOX1,true,msg);
             }
    } 

  sub line_left()    //線の左側を走行するプログラム    
  {  
     SetSensorLight(S3);//光センサを起動
     long t0=0,t1=0,tm=1;//交差点認識の為に時間を定義
     while(t1-t0<tm){    //交差点でない時は実行するプログラム
         if(SENSOR_3<step1){   //線中央にあるとき
             left0;t0=CurrentTick(); //左旋回し時間を計測
             until(SENSOR_3<step3);  //境界を認識するまで続ける
             t1=CurrentTick();       //旋回した時間を計測
         }else if(SENSOR_3<step2){  //線上に入ったとき
             left1;          //左折する
         }else if(SENSOR_3<step3){   //境界上にあるとき
             forward;            //直進する
         }else if(SENSOR_3<step4){  //線から外れたとき
             right1;          //右折する
         }else if(SENSOR_3<step5){  //完全に線から外れたとき
             right0;          //右折する
          }
     }                //交差点に入ったとき
     Off(OUT_AB);           //停止する(1秒間)
    Wait(1000);
  }  

  sub line_right()   //線の右側を走行するプログラム    
  {
     SetSensorLight(S3);//光センサを起動
     long t0=0,t1=0,tm=1;//交差点認識の為に時間を定義
     while(t1-t0<tm){    //交差点でない時は実行するプログラム
         if(SENSOR_3<step1){      //線中央にあるとき
             right0; t0=CurrentTick(); //右旋回し時間を計測
             until(SENSOR_3<step3);  //境界を認識するまで続ける
             t1=CurrentTick();     //旋回した時間を計測
         }else if(SENSOR_3<step2){     //線上にあるとき
             right1;           //右折する
         }else if(SENSOR_3<step3){     //境界上にあるとき
             forward;             //直進する
         }else if(SENSOR_3<step4){     //線から外れたとき
             left1;                    //左折する
         }else if(SENSOR_3<step5){     //完全に線から離れたとき
             left0;           //左旋回する
          }
     }                                 //交差点にある時
     Off(OUT_AB);            //停止する(1秒間)
     Wait(1000);
  }

**コースを走るプログラム [#c80fddce]


    #define step1 45
    #define step2 53
    #define step3 61
    #define step4 69
    #define step5 75
    #define left0 OnFwd(OUT_A,20);OnRev(OUT_B,20);
    #define left1 OnFwd(OUT_A,20);Off(OUT_B);
    #define right0 OnFwd(OUT_B,20);OnRev(OUT_A,20);
    #define right1 OnFwd(OUT_B,20);Off(OUT_A);
    #define forward OnFwd(OUT_AB,20);
    #define up OnRev(OUT_C,20);Wait(500);Off(OUT_C);
    #define down OnFwd(OUT_C,20);Wait(500);Off(OUT_C);
    sub line_left()
    {
       SetSensorLight(S3);
       long t0=0,t1=0,tm=15;
       while(t1-t0<tm){
           if(SENSOR_3<step1){
               t0=CurrentTick();
               left0;until(SENSOR_3<step3);
               t1=CurrentTick();
           }else if(SENSOR_3<step2){
               left1;
           }else if(SENSOR_3<step3){
               forward;     
           }else if(SENSOR_3<step4){
               right1;
           }else if(SENSOR_3<step5){
               right0;
           }
       }
       Off(OUT_AB);
       Wait(1000);
    }
    sub line_right()
    {
       SetSensorLight(S3);
       long t0=0,t1=0,tm=15;
       while(t1-t0<tm){
           if(SENSOR_3<step1){
              t0=CurrentTick();
               right0; until(SENSOR_3<step3);
               t1=CurrentTick();
           }else if(SENSOR_3<step2){
               right1;
           }else if(SENSOR_3<step3){
               forward;     
           }else if(SENSOR_3<step4){
           left1;
           }else if(SENSOR_3<step5){
               left0;
            }
       }
           Off(OUT_AB);
           Wait(1000);
        }
    task main()
    {
        long t=1000;   //交差点で停止後に進む時間をt=1秒とする
        forward;     //Aから出発
        Wait(1000); 
        line_left();      //MからKまで進みKで停止
        forward;          //交差点を直進
        Wait(t);
        line_left();   //KからLまで進みKで停止
        up;        //ピンポン玉を拾う
        left0;            //Lで回転し方向転換
        Wait(2000);
        line_right();   //LからKまで進みKで停止
        right0;      //Lで回転し方向転換
        Wait(t);
        line_right();   //KからJまで進みJで停止
        left1;            //Jで回転
        Wait(t);
        line_left();   //JからIまで進みIで停止
        repeat(2){
            forward;   //丁字路を直進
            Wait(t);
            line_left(); //コースを進む
        }         //IからH,HからGまで進みGで停止
        forward;      //丁字路を直進
        Wait(t);
        line_right();   //GからF,Eを通りDまで進みDで停止
        forward;     //交差点を直進
        line_right();   //DからCを通りBまで進みBで停止
        down;       //ピンポン玉を置く
        OnRev(OUT_AB,20); //後進
        Wait(500);
        OnFwd(OUT_AB,100); //勢いをつけてボールに接触,シュート
        Wait(t);
        Off(OUT_AB);//静止
    }



*まとめ [#b0ca178b]


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS