[[2016a/Member]]

*ロボット本体 [#d75cb20a]
#ref(2016a/Member/Mick/Mission2/DSC_0563.JPG,100%,ロボ1)
#ref(2016a/Member/Mick/Mission2/DSC_0566.JPG,100%,ロボ1)
#ref(2016a/Member/Mick/Mission2/DSC_0565.JPG,100%,ロボ1)
センサーを中心から少しずらし、本体が回転した時に動き過ぎないようにした(半径が短い)。タイム向上を期待しての設置だが、見る限りかなりスムーズに進む手応えがある。
#ref(2016a/Member/Mick/Mission2/DSC_05662.jpg,100%,ロボ1)

#ref(2016a/Member/Mick/Mission2/DSC_0567.JPG,100%,ロボ1)
今回後輪を外し、滑らせることによって小回りを向上させた。パワーのいる駆動は全く必要なかった上、小回りの効きは今回の課題で交差点の認識等で大きく影響するので、前回からの大きな改善と言えよう。

センサーが若干陰った位置にいったが、数値の調整により問題を解決できた。

*ルート [#p402dcdb]
#ref(2016a/Member/Mick/Mission2/2016a-mission2B.png,100%,ru-to)
ルート3を選んだ。センサーの位置から左折のほうが良いと思った。結果的には全く関係なかった。右折もできた。

*プログラム [#oa1c4a4a]
**定義やサブルーチン等 [#yc40fc50]
 #define straight 5//ここの数値をもっと上げたほうが早かったのだろうかと反省。
 #define carb 2   
 #define set_straight SetPower(OUT_AC,straight);
 #define set_carb SetPower(OUT_AC,carb);
 #define go_forward set_straight; OnFwd(OUT_AC); 
 #define turn_leftL set_carb; OnFwd(OUT_C); OnRev(OUT_A);
 #define turn_leftS set_carb; OnFwd(OUT_C); Off(OUT_A);
 #define turn_rightS set_carb; OnFwd(OUT_A); Off(OUT_C);
 #define turn_rightL set_carb; OnFwd(OUT_A); OnRev(OUT_C);
 #define black 38                   //以下しきい値
 #define glayA 42
 #define glayB 45
 #define glayC 48
 #define white 50  //使ってない(笑):つける位置変えた結果車体の影でこの数字示さなくなった
 #define KURO 14   //名前が今見るとわかりにくいが、これは「交差点を判別するのに要する時間」
 #define TURN_TIME 90 //曲がる時間


 task play_music2()  // ファファファファッミ♭ッソッ ファー
 {
    PlayTone(698,10); Wait(20);//f
    PlayTone(698,10); Wait(20);//f
    PlayTone(698,10); Wait(20);//f
    PlayTone(698,30); Wait(40);//f
    PlayTone(622,30); Wait(40);//rs
    PlayTone(784,30); Wait(40);//s
    PlayTone(698,35); Wait(40);
 }
れべる が あがった !!ような おとが する(蛇足とも遊び心ともいう。)
尚これを諦めて PlaySound(SOUND_CLICK); にしたほうが軽いんでソッチの方がいいと思うます。
ただ遊び心には勝てなかった。


 sub go_go_left() //交差点にて曲がるためのもの。
 {
    Off(OUT_AC);
    Wait(100);               //1秒停止し
    PlaySound(SOUND_FAST_UP); //音がなる
    go_forward;//※下記参照
    Wait(50);
    turn_leftL;
    Wait(TURN_TIME);
    Off(OUT_AC);
    go_forward;
    Wait(50);
 }

 sub go_go_right()//上の右折版。あれ。右折のほうが簡単じゃね?(左折多いコースをわざわざ選んだ意味とは)
 {
    Off(OUT_AC);
    Wait(100);
    PlaySound(SOUND_FAST_UP); 
    turn_rightL;
    Wait(TURN_TIME);
    Off(OUT_AC);
 }

 sub go_go_forward()//交差点を超えるための直進。
 {
    Off(OUT_AC);
    Wait(100);
    PlaySound(SOUND_CLICK); 
    go_forward;
    Wait(50);
    Off(OUT_AC);
 }

 sub go_go_forward2()//ゴールするための直進。
 {
    Off(OUT_AC);
    Wait(100);
    PlaySound(SOUND_CLICK); 
    go_forward;
    Wait(100);//ここが長いので枠に入れる
    Off(OUT_AC);
 }

※について
 前回得たことを有効活用した。
#ref(2016a/Member/Mick/Mission2/1467799593UGiJLVb9ieOpQPQ1467799590.gif,100%,ロボ1)
Gifアニメだと「そんな面倒なことしなくても」と思われる気がするし私も「あれ?」と思ったがやってみると本当に必要。必要ったら必要。


 sub go_follow()
 {
        ClearTimer(0);
  while (FastTimer(0) <= KURO) {   //タイマー0を使用
    if (SENSOR_2 < black) {        //黒の範囲にいるとき、
      turn_leftL;                      //大きく左折
    } else if (SENSOR_2 < glayA) { //黒寄りのところにいるとき、
      turn_leftS;                      //少し左に曲がりながら、
       ClearTimer(0);                  //タイマーをリセットかける
    } else if (SENSOR_2 < glayB) { //白寄りのところにいるとき、
      go_forward;                      //直進し、
      ClearTimer(0);                   //タイマーをリセットする
    } else  {                      //それ以外のとき、つまり白いところにいるとき、 
      turn_rightL;                     //大きく右へいきながら、
      ClearTimer(0);                   //タイマーをリセットする。
    } 
    Wait(1);                       //この判定を0.01秒ごとにする
  }
 }

メインディッシュ。
結構しきい値が絶妙なようで、かなりスムーズに進む。特に直進コマンドになるしきい値の幅が丁度いいらしく速い。
他のグループを見ると直進コマンドを持たなかったり持っていないように見えたが、私はやはりよちよち歩きでは

・純粋に遅い

・「丁度境界線くらいのグレーに居続ける」ことが難しく(回転によってセンサーがラインを横切る動きをするため)せっかく良い境界線位置で走れることを放棄するのはもったいない。

思ったので直進すべき位置で直進させた。

 sub go_follow2()
 {
    ClearTimer(1); 
  while (FastTimer(1) <= 300) {   //タイマー1を使用。3秒間以下の行動をする。
    if (SENSOR_2 < black) {        //黒の範囲にいるとき、
      turn_leftL;
    } else if (SENSOR_2 < glayA) { //黒寄りのところにいるとき、
      turn_leftS;                      //少し左に曲がりながら、
    } else if (SENSOR_2 < glayB) { //白寄りのところにいるとき、
      go_forward;                      //直進し、
    } else  {                      //それ以外のとき、つまり白いところにいるとき、 
      turn_rightL;                     //大きく右へいきながら、
    } 
    Wait(1);                       //この判定を0.01秒ごとにする
  }
 }
こちらは右折/左折後に「3秒間交差点がない前提でライントレースをする」もの。
電池残量により

 1.交差点認知した時の角度

 2.前進の距離、回転の角度が変化し、

交差点で曲がったあとに道に直角に入射して、交差点と誤って認知することがあった。これを電池残量に関係なく乗り越えるために、交差点が直近で連続していないことを利用してこのサブルーチンを構築し利用した。

**task main [#jac1b3a4]
 task main ()
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);//センサーセット
    go_follow(); //ライントレースし
    go_go_left();//交差点で左折(S)
    go_follow2();//交差点がないとわかっている間、交差点認識コマンドを省いたトレースを3秒
    go_follow();//ライントレース
    go_go_left();/左折(P)
    go_follow2();//
    go_follow();//(Q)
    go_go_forward();
    go_follow2();
    go_follow();
    go_go_forward();//(Q)
    go_follow2();
    go_follow();
    go_go_right();//(R)
    go_follow2();
    go_follow();
    go_go_left();//(P)
    go_follow2();
    go_follow();
    go_go_forward2();//(ゴール)
    Off(OUT_AC);
    start play_music2;
 }

記録は01:08。コース3にしては上々ではないか。

*反省、感想、次回に向けて [#dbbfed37]
・機体の後ろ足がああいったパーツを使うことで小回りが向上するのを知らなかった。今回これで交差点の認識然りライントレース然りやりやすさが上がったと思う。

・上記の機体の改良に加え、ライントレースのしきい値を特に直進させる範囲で幅を適度にもたせられた結果記録が思ったより早かったのかなと思った。幅は広すぎても交差点認識に影響を及ぼしても行けないが、狭すぎてもタイヤを交互に動かす=ハイハイ動きになってしまうので、いい塩梅をつかめたと思う。

・走行テストするとき等、やはり電池残量は今回も気にしなければならない要素であったので走行時に本当に試したいところだけトライした結果、電池を変える回数を減らすことができ、且つ似た状況を保ってトライできた。

・エラーを吐かなかったところはスルーしてしまっていたが、今思うと直進のスピードはもっと速くしても問題なくタイムを向上できたかもしれない。
次回は完成しても「もっと向上するには」と貪欲にチェックを重ねたい。


***おまけ [#h213aaed]
某配管工が星になって走るときの音。暇を持て余した結果作ったが重たいので使わない。でもせっかく作ったので。
 #define OTO1 8
 #define OTO2 20
 #define OTO3 4
 #define OTO_A 1047
 #define OTO_B 988
 #define OTO_C 698
 #define OTO_D 659
 task play_music()  //fff r fff r frfmmmdmmmdmdm
 {
    PlayTone(OTO_A,OTO1); Wait(OTO2);
    PlayTone(OTO_A,OTO1); Wait(OTO2);
    PlayTone(OTO_A,OTO1); Wait(OTO2);
    PlayTone(587,OTO3); Wait(OTO2-8);
    PlayTone(OTO_A,OTO3); Wait(OTO2-8);
    PlayTone(OTO_A,OTO1); Wait(OTO2);
    PlayTone(587,OTO1); Wait(OTO2);
    PlayTone(OTO_A,OTO3); Wait(OTO2-8);
    PlayTone(587,OTO3); Wait(OTO2-8);
    PlayTone(OTO_A,OTO3); Wait(OTO2-8);//10048
    PlayTone(OTO_B,OTO1); Wait(OTO2);//m
    PlayTone(OTO_B,OTO1); Wait(OTO2);//m
    PlayTone(OTO_B,OTO1); Wait(OTO2);//m
    PlayTone(523,OTO3); Wait(OTO2-8);//d
    PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m
    PlayTone(OTO_B,OTO1); Wait(OTO2);//m
    PlayTone(523,OTO1); Wait(OTO2);//d
    PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m
    PlayTone(523,OTO3); Wait(OTO2-8);//d
    PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m
 }
 task main()
 {
  repeat(4) { 
  start play_music;
  Wait(296);
  }
 }

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