[[2019a/Member]]

*課題2 [#m04645c9]
A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。
黒い線をトレースする。
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。

2コースあるうち私は下記のルートを担当した。

A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
#ref(2019a/Member/Tomi/Mission2/ロボティクス課題2コース.jpg,50%)

*全体像 [#q41b5df1]
#ref(2019a/Member/Tomi/Mission2/20190717_210754s.jpg,50%)
#ref(2019a/Member/Tomi/Mission2/20190717_210809s.jpg,50%)
動きやすさを重視するために全体の軽量化を試みた。
-タイヤ
初め四輪で行なったが、振り幅が大きくなってしまい誤差が大きくなってしまうため二輪に挑戦した。だが、アームを前に取り付けるため重心が偏ってしまい引きずって走るようになったので、初回から動きやすくなるように前のタイヤを小さいのに替え摩擦を小さくしたためだいぶ動きがスムーズになった。
#ref(2019a/Member/Tomi/Mission2/20190717_210905s.jpg,50%)
-アーム
ピンポン球を回収、シュートさせるために用いるアームは板を回転させることでピンポン球を動かすようにした。
#ref(2019a/Member/Tomi/Mission2/20190717_210839s.jpg,50%)

*プログラミング [#m0c30a60]
担当したコースの道順上、線の右側をトレースすることにした。
-マクロ
右折
 #define turn_right OnFwd(OUT_A);Off(OUT_C);
左折
 #define turn_left OnFwd(OUT_C);Off(OUT_A);
左旋回
 #define circling_left OnFwd(OUT_C);OnRev(OUT_A);
右旋回
 #define circling_right OnRev(OUT_C);OnFwd(OUT_A);
直進
 #define go_ahead OnFwd(OUT_AC);
-グローバル変数
 int t;
-サブルーチン
 sub follow_line1()
 {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
      ClearTimer(0);ClearTimer(1);
      while((FastTimer(0)<15)&&(FastTimer(1)<t)){
          if(SENSOR_2<41){
              circling_right;
          } else if(SENSOR_2<43){
              turn_right;ClearTimer(0);
          } else if(SENSOR_2<48){
              go_ahead;ClearTimer(0);
          } else if(SENSOR_2<50){
              turn_left;ClearTimer(0);
          } else if(SENSOR_2<55){
              circling_left;ClearTimer(0);
          }
      }
      Off(OUT_AC);
      PlaySound(SOUND_CLICK);
  }
  
  sub follow_line()
  {
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      ClearTimer(0);ClearTimer(1);
      while((FastTimer(0)<25)&&(FastTimer(1)<t)){
          if(SENSOR_2<41){
              circling_right;
          } else if(SENSOR_2<43){
              turn_right;ClearTimer(0);
          } else if(SENSOR_2<48){
              go_ahead;ClearTimer(0);
          } else if(SENSOR_2<50){
              turn_left;ClearTimer(0);
          } else if(SENSOR_2<55){
              circling_left;ClearTimer(0);
          } 
      }
      Off(OUT_AC);
  }
 
  sub cross_line()
  {
  go_ahead;Wait(30);Off(OUT_AC);
  }

また光センサーによる認識の数値は
#ref(2019a/Member/Tomi/Mission2/ロボティクス入門課題2光センサー値.jpg,50%)
とし、それぞれの値による動きは以下の通り。
41:右旋回
43:右折
48:直進
50:左折
55:左旋回
交差点の判断
黒線の左側の境界を使用する。光センターの感知する色が、真っ黒なら左旋回、それより少し白くなったら左回転、黒と白の中間(これを灰とする)なら直進、白よりの灰なら右回転、真っ白なら右旋回、となるようにプログラムを組む。そして、左旋回(真っ黒)の続く時間によって交差点の判別を行い、左旋回がある一定時間続いたら止まるようにする。

またwhileを使うことで、交差点まではトレースし続けることが出来る。

Timer(0)で、グローバル変数tを使って、左旋回(真っ黒)が続いた時間を測る。左旋回以外の四つの挙動にはClearTimer(0);を入れることで左旋回の時間だけを計測している。

実際に光センサーを使って値を測定し、プログラムにしたものが下のプログラムである。グローバル変数tはプログラム冒頭に、int t;で指定する。tを変えることで、交差点判別の時間をその都度変えることが出来る。

-実際の動き
 task main()
 {
      t=10000;follow_line();cross_line();//C
      t=10000;follow_line();Wait(100);cross_line();//D
       t=10000;follow_line();Wait(100);//E
      circling_right;Wait(30);Off(OUT_AC);
      t=10000;follow_line();Wait(100);//F
       t=10000;follow_line();Wait(100);//G
      circling_right;Wait(40);Off(OUT_AC);
      t=10000;follow_line1();Wait(100);cross_line();//H
       t=10000;follow_line1();Wait(100);cross_line();//I
      t=10000;follow_line1();Wait(100);//J
      t=10000;follow_line();Wait(100);//K
       go_ahead;Wait(30);Off(OUT_AC);
      t=300;follow_line();Wait(100);
      OnRev(OUT_B);Wait(20);Off(OUT_B);
      t=10000;follow_line();Wait(100);cross_line();//K
      t=10000;follow_line();//M
      OnFwd(OUT_B);Wait(20);Off(OUT_B);
  } 

*反省点 [#x989c1b4]
上の図のスタートからシュートまで一連の動きでできたのは5回に1回程度だった。タイヤを四輪から二輪にしたり、全体の軽量化をして改善を試みたができなかった。そこでプログラミングによる調整をした。グローバル変数を用いて交差点と円の区別をさせようとしたが、うまくできなかった。ピンポン球の回収・発射させる部分はつまる事なくできた。
次回はロボットにあったプログラミングは組みたい。

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