[[2016a/Member]]
*目次 [#r34fc43a]
#contents

*自分たちのチームの作戦 [#q753873e]
僕たちのチームは運ぶだけのロボットと組み立てるだけのロボットをそれぞれさせた方が単純でやりやすいと考えた。また今回の課題で一番難しいのは、どの場所にコップがあるかをロボットが認識するのかということ、だということに至った。ロボットがコップを認識しなければいつどこで運ぶ、つかむをすれば良いのかが分からないからである。また両方のロボットがライントレースさせるために光センサーを使うのでコップを認識する方法が難しいのだ。その対策方が以下の二つである。

1 つかむ方のロボットにはタッチセンサーをつけてコップを持ってくるロボットがぶつかることで反応するようにした

2 問題なのは運ぶ方のロボットであるが、タッチセンサーをつけてもコップが軽すぎるため認識することができない。そこで「コップがあるところにロボットが進んで認識する」のではなく「ロボットが進んでいる先にコップを置くことで認識させる必要なくコップを運ぶ」という発想の転換をした。

*ロボットの説明 [#w4395a07]
1コップを運ぶロボット
#ref(2016a/Member/rise/Mission3/IMG_2230.JPG,40%,)
コップを運ぶロボットはライントレースさせるために光センサーをつけてあとはコップ一個を押していけるくらいの動かないアームをつけるというシンプルなものにした。

2コップを積むロボット
#ref(2016a/Member/rise/Mission3/IMG_2223.JPG,40%,)
#ref(2016a/Member/rise/Mission3/IMG_2227.JPG,40%,)
コップを積むロボットはもう一方のロボットが当たったのを認識するためにタッチセンサーをつけ、つかむ動作を行うようにアームをつけた。

*プログラム [#w9d1f1a1]
 以下が運ぶ方のプログラムである
 #define turn_right_SENKAI OnFwd(OUT_A); OnRev(OUT_C);   //旋回
 #define turn_right OnFwd(OUT_A); Off(OUT_C);            //片方のみ動かす
 #define turn_left_SENKAI OnFwd(OUT_C); OnRev(OUT_A);    //旋回
 #define turn_left OnFwd(OUT_C); Off(OUT_A);             //片方のみ動かす
 #define go_forward(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);
 #define cross_straight_R turn_left; Wait(50);
 #define cross_straight_L turn_right; Wait(50);
 #define cross_right turn_right; Wait(160);
 #define cross_left turn_left; Wait(160);

 #define Black 43     //これより小さかったら黒
 #define White 52     //これより大きかったら白
 #define STEP 1       //一回の判断の時間
 #define turn_time 400     //RからR or LからL (180°回転)
 #define turn_time_change 300      //RからL or LからR (90°ぐらい回転)

 #define closs_P 1    //closs Pを曲がる許可
 #define GO_cupC 2    //Cを取りに行け
 #define GO_cupD 3    //Dを取りに行け
 #define COME_cupC 4  //Cを持って来い
 #define COME_cupD 5  //Dを持って来い


 sub trace_line_for_cross_R()
 {
   ClearTimer(0);
   while (FastTimer(0) <  32) {
      if (SENSOR_2 <= Black) {            //黒
         turn_right_SENKAI;
      } else if (SENSOR_2 < Black +2) {   //黒に近いグレー
         turn_right;
      } else if (SENSOR_2 > White -2) {   //白に近いグレー
         turn_left;
         ClearTimer(0);
      } else if (SENSOR_2 >= White) {     //白
         turn_left_SENKAI;
         ClearTimer(0);
      } else {                            //グレー
      OnFwd(OUT_AC);
      ClearTimer(0);
      }
      Wait(STEP);
   }
   Off(OUT_AC);
   PlaySound(SOUND_FAST_UP);
   Wait(100);
 }

 sub trace_line_for_cross_L()
 {
   ClearTimer(0);
   while (FastTimer(0) <  32) {
      if (SENSOR_2 <= Black) {            //黒
         turn_left_SENKAI;
      } else if (SENSOR_2 < Black +2) {   //黒に近いグレー
         turn_left;
      } else if (SENSOR_2 > White -2) {   //白に近いグレー
         turn_right;
         ClearTimer(0);
      } else if (SENSOR_2 >= White) {     //白
         turn_right_SENKAI;
         ClearTimer(0);
      } else {                            //グレー
      OnFwd(OUT_AC);
      ClearTimer(0);
      }
      Wait(STEP);
   }
   Off(OUT_AC);
   PlaySound(SOUND_FAST_UP);
   Wait(100);
 }

 sub trace_line_to_start_R()
 {
   ClearTimer(0);
   while (FastTimer(0) < 50) {           //要調整
      if (SENSOR_2 <= Black) {            //黒
         turn_right_SENKAI;
      } else if (SENSOR_2 < Black +2) {   //黒に近いグレー
         turn_right;
      } else if (SENSOR_2 > White -2) {   //白に近いグレー
         turn_left;
      } else if (SENSOR_2 >= White) {     //白
         turn_left_SENKAI;
      } else {                            //グレー
      OnFwd(OUT_AC);
      }
      Wait(STEP);
   }
 }

 sub trace_line_to_start_L()
 {
   ClearTimer(0);
   while (FastTimer(0) < 50) {           //要調整
      if (SENSOR_2 <= Black) {            //黒
         turn_left_SENKAI;
      } else if (SENSOR_2 < Black +2) {   //黒に近いグレー
         turn_left;
      } else if (SENSOR_2 > White -2) {   //白に近いグレー
         turn_right;
      } else if (SENSOR_2 >= White) {     //白
         turn_right_SENKAI;
      } else {                            //グレー
      OnFwd(OUT_AC);
      }
      Wait(STEP);
   }
 }

 task main()
 {
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   ClearMessage();
   int cupC = 0;
   int cupD = 0;
   int n = 0;

   go_forward(50);
   repeat (2) {
      trace_line_for_cross_R();
      cross_straight_R;
   }
   trace_line_for_cross_R();
   cross_right;
   trace_line_for_cross_R();
   turn_right;
   Wait(turn_time_change);            //90°旋回(RからLへ)
   while(SENSOR_2 > White) {
      OnFwd(OUT_AC);
   }
   Off(OUT_AC);
   trace_line_for_cross_L();
   cross_left;
   trace_line_to_start_L();               //要確認
   turn_left;
   Wait(100);
   while(SENSOR_2 > White) {
      OnFwd(OUT_AC);
   }
   Off(OUT_AC);
 }

以下が積む方のロボットのプログラムである
 #define turn_right_SENKAI OnFwd(OUT_A); OnRev(OUT_C);   //旋回
 #define turn_right OnFwd(OUT_A); Off(OUT_C);            //片方のみ動かす
 #define turn_left_SENKAI OnFwd(OUT_C); OnRev(OUT_A);    //旋回
 #define turn_left OnFwd(OUT_C); Off(OUT_A);             //片方のみ動かす
 #define go_forward(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);

 #define Black 43     //これより小さかったら黒
 #define White 47     //これより大きかったら白
 #define STEP 1       //一回の判断の時間
 #define age_sage 350     //上げたり下げたりする時間

 #define closs_P 1    //closs Pを曲がる許可
 #define GO_cupC 2    //Cを取りに行け
 #define GO_cupD 3    //Dを取りに行け
 #define COME_cupC 4  //Cを持って来い
 #define COME_cupD 5  //Dを持って来い

 sub for_cross()
 {
   ClearTimer(0);
   while (FastTimer(0) <  60) {
      if (SENSOR_2 <= Black +2) {            //黒
         Off(OUT_AC);
      } else {
      OnFwd(OUT_AC);
      ClearTimer(0);
      }
      Wait(STEP);
   }
   Off(OUT_AC);
   PlaySound(SOUND_FAST_UP);
   Wait(100);
 }

 sub trace_line()
 { 
   while (true) {
      if (SENSOR_2 <= Black) {            //黒
         turn_right_SENKAI;
      } else if (SENSOR_2 < Black +2) {   //黒に近いグレー
         turn_right;
      } else if (SENSOR_2 > White -2) {   //白に近いグレー
         turn_left;
      } else if (SENSOR_2 >= White) {     //白
         turn_left_SENKAI;
      } else {                            //グレー
      OnFwd(OUT_AC);
      }
      Wait(STEP);
   }
 }

 sub crossP()                                       //合ってる??
 {
   ClearTimer(0);
   while (FastTimer(0) <  120 ) {
      if (Message() == closs_P) {
         PlaySound(SOUND_UP);
         OnFwd(OUT_AC);
      } else {
         Off(OUT_AC);
         ClearTimer(0);
      }
      Wait(STEP);
   }
 }

 sub tumutumu_C()
 {
   int cupC = 0;

   OnFwd(OUT_B);          //放す&下げる
   Wait(100);
   Off(OUT_B);
   while (cupC < 1) {
      if (SENSOR_1 == 1) {      //コップ触ってたら
         SendMessage(GO_cupD);      //Dに行ってこい(ただし交差点で待機)
         PlaySound(SOUND_CLICK);
         Wait(200);             //少し待機
         OnRev(OUT_B);          //掴む&上げる
         Wait(age_sage -100);             //これはやってみないと分からない。
         Off(OUT_B);
         turn_right;            //右向く
         Wait(200);             //これも適当
         Off(OUT_AC);
         OnFwd(OUT_B);          //放す&下げる
         Wait(age_sage);
         Off(OUT_B);
         while (SENSOR_2 > Black) {   //調整必要
            turn_left;
         }
         Off(OUT_AC); 
         SendMessage(COME_cupD);      //さあ持って来い
         PlaySound(SOUND_CLICK);
         cupC++;
      } else {                  //コップ触ってなかったら
      Off(OUT_AC);
      }
      Wait(STEP);
   }
   OnRev(OUT_B);
   Wait(100);
 }

 sub tumutumu_D()
 {
   int cupD = 0;

   OnFwd(OUT_B);          //放す&下げる
   Wait(100);
   Off(OUT_B);
   while (cupD < 1) {
      if (SENSOR_1 == 1) {      //コップ触ってたら
         SendMessage(GO_cupC);      //Cに行ってこい(ただし交差点で待機)
         PlaySound(SOUND_CLICK);
         Wait(200);             //少し待機
         OnRev(OUT_B);          //掴む&上げる
         Wait(age_sage -100);             //これはやってみないと分からない。
         Off(OUT_B);
         turn_right;            //右向く
         Wait(200);             //これも適当
         Off(OUT_AC);
         OnFwd(OUT_B);          //放す&下げる
         Wait(age_sage);
         Off(OUT_B);
         while (SENSOR_2 > Black) {   //調整必要
            turn_left;
         }
         Off(OUT_AC); 
         SendMessage(COME_cupC);      //さあ持って来い
         PlaySound(SOUND_CLICK);
         cupD++;
      } else {                  //コップ触ってなかったら
      Off(OUT_AC);
      }
      Wait(STEP);
   }
   OnRev(OUT_B);
   Wait(100);
 }

 task main()
 {
   SetSensor(SENSOR_1, SENSOR_TOUCH);
   SetSensor(SENSOR_2, SENSOR_LIGHT);
   ClearMessage();
   int n = 0;
   int cupC = 0;
   int cupD = 0;

   Wait(1000);
   OnFwd(OUT_AC);
   Wait(100);
   for_cross();
   OnRev(OUT_B);
   Wait(100);
   while (n < 1) {
      if (Message() == closs_P) {
         crossP();
         n++;
      } else {
         Off(OUT_AC);
      }
      Wait(STEP);
   }
   while (n < 2) {
      if (SENSOR_1 == 0) {
         trace_line();
      } else {
         Off(OUT_AC);
         n++;
      }
      Wait(STEP);
   }
   repeat (3) {                      //合ってるかなぁ?
      tumutumu_C();
      tumutumu_D();
   }
   turn_right;
   Wait(200);
   OnFwd(OUT_AC);
   Wait(400);
   Off(OUT_AC);
 }

*ロボコンの結果 [#p64b0985]
ロボコンがある前日にコップを積む方のロボットの足がつぶれてしまい実際のロボコンでは使い物にならなくなってしまった。なのでロボコン当日の目標は一個のコップをQ地点まで運ぶことだったがそれさえ出来ない結果になってしまった。
*今回の課題を終えての感想 [#hca34cb8]
今回の課題はロボコンでのみんなの結果からも分かる通りとても難しいものであった。練習ではある程度良く出来ていたものが本番で全然うまくいかなかったのが多数あった。これまでの課題から機械のプログラムというのはとても脆いものだということ、人間が簡単に出来ることでもロボットにさせるのはとても難しいのだと分かった。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS