センサーを使用してロボットにせんをなぞらせる

目次

概要

 今回の課題は下図のような幅20mmの線を書き、AからSを決められた順序で通り、道中の決められた箇所でコップを取り別の箇所へ移動させるというものだ。禁止事項として[~秒後に~の行動をする]というプログラミングはしないこと。∪の太さを変えないこと。

課題2に使用する図

 私が通ったルートは

D地点へ(スタート)→Cを直進→Bを左折→Pを左折→Qを直進→Rを左折→Fを左折→Sを直進→Y地点の紙コップを取得してコースに戻る→Sを直→Qを左折→Rを直進→X地点に紙コップを置いてコースに戻る→Pを左折→Bを左折(一時停止)→A地点へ(ゴール)

製作したロボット

写真A(全体)

全体とアーム

写真B(前後のタイヤ位置)

モーターAC

ロボットのタイヤはセンサーが地面に直接、接しないようにするためにRisの基本的な構造から前後のタイヤを逆につけることで機体の傾きを調節した。また、急なカーブをすることが必要とされたため、前後のタイヤを互いの距離が近くなるよう(写真B)につけることで急なカーブができるようにした。

写真C(アーム)

アーム

アームはモーターに対してギアを噛ませずに直接つけたため勢いが出てしまった。初めはブロックで作ろうとしたが、アームが地面についた際に勢いで壊れてしまう可能性があった。そこで、柔軟性があり、軽い素材で作ろうということになった。チューブと棒というシンプルな作りにすることで、軽さと柔軟性が出てモーターに対しても優しい作りにすることができた。

写真D(アームの先端)

アーム先端

また、アームの先端に上記のような部品をつけることで、コップを下した際も十分な高さを確保することができ、コップを取った際にアームからコップが出てしまうことを防ぐことができた。この部品をつける以前は、軽すぎたの鞭のように地面に当たった時に跳ね返ってしまったが、その問題も防ぐことができた。

写真E(センサー位置)

センサー

線とセンサーの距離をなるべく近づけることで、余計な情報が入らないようした。初めは高い位置につけていたが、余計な情報が入ったことで正確なライントレースができなかったので低い位置につけることにした。また、このセンサー位置を決定するまでにずいぶんと苦労したので、その過程は最後の苦労した点で記す。

プログラミングに関しての知識と実際に使用した物

ライントレースの概要

 私は線の左側を通ったため、線の色が

’(THRESHOLDの値=53)ならば右急カーブ

白っぽいならば(THRESHOLD=およそ(53+47)/2)ならば右へ

3タ(THRESHOLD=およそ47)ならば直進

すっぽい(THRESHOLDの値=およそ(38+47)/2)ならば左へ

ス(THRESHOLDの値=38)ならば左急カーブ

とした。

基本的なライントレースは、ifとwhileを用いた。例えば、while(FastTimer(t)<=26)ならば0.26秒の間は同じ行動を繰り返すので、ifを用いて白ならば左へ、黒ならば右へ、黒と白の間なら直進と動くことで線の境界線をジグザグに動くことでコースを進んでいった。この時に、それぞれの行動の後にClearTimer(t)を入れることでそれぞれの行動が0.26秒を越さない限りはwhileの行動を繰り返すことができた。

交差点の判断

 上記のifとwhileの性質を利用して交差点の判断も行った。例えば、Dを出発してすぐにある交差点Cでは、真っすぐに進んでも、左、右に行ってもセンサーが黒と判断する時間が0.26秒(while(FastTimer(t)<=26)の場合)を超えてしまい、whileのループから外れてしまう。

交差点判定

 この図においてはオレンジの円がセンサーに該当するが、移動する前のセンサーの位置から機体が前進や右へとそれぞれ移動すると仮定してみても、黒の域から外れないため最終的にはセンサーは黒を感知して左へと移動しようとする。この際にセンサーは矢印のような軌跡をたどっていくが、黒の域を超えないまま連続して左へ行こうとするため、ループの条件としていた「0.26秒より多く同じ行動を繰り返さない限りタイマーをリセットしてループする」から外れている。

 しかし、この時whileのループから外れているということはこれが交差点だという証明になっている。よって、交差点の判断を行うことができた。そして、下記に実際に使ったものを例として挙げておく。

sub left_Line()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);//光センサー準備
   ClearTimer(0);//タイマーをセット
   while(FastTimer(0)<=26)//タイマーセット後の経過時間が0.26秒以下ならばループ
   {
       if(SENSOR_2>THRESHOLD+5)   
       {
           rightSENKAI;//白なら右急カーブ
           ClearTimer(0);//タイマーリセット
       }
       else if(SENSOR_2>THRESHOLD+4)   
       {
           right;//白っぽいなら右へ
           ClearTimer(0);//タイマーリセット
       }
       else if(SENSOR_2>THRESHOLD)  
       {
           P;
           OnFwd(OUT_AC);//灰色(白と黒の境界)なら直進
           ClearTimer(0);//タイマーリセット
       }
       else if(SENSOR_2>THRESHOLD-4)   
       {
           left;//黒っぽいなら左へ
           ClearTimer(0);//タイマーリセット
       }
       else   
       {
           leftSENKAI;//黒なら左急カーブ
       }
   }
   Off(OUT_AC);
}

 このサブルーチンにおいても、これまで説明してきたことが実際に使われているのが分かる。

使用したプログラミング

#define THRESHOLD 47//白の最高53、黒最低38
#define forward(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//直進
#define leftSENKAI OnFwd(OUT_C);OnRev(OUT_A);//左急カーブ
#define left OnFwd(OUT_C);Off(OUT_A);//左カーブ
#define rightSENKAI OnFwd(OUT_A);OnRev(OUT_C);//右急カーブ
#define LINEsyusei rightSENKAI;Wait(25);forward(30);//交差点後、ライントレースに戻る
#define P SetPower(OUT_AC,5);
 
sub right_Line()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   while(FastTimer(0)<=26)
   {
       if(SENSOR_2>THRESHOLD+5)   
       {
           leftSENKAI;
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD+4)   
       {
           left;
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD)  
       {
           P;
           OnFwd(OUT_AC);
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD-4)   
       {
           right;
           ClearTimer(0);
       }
       else   
       {
           rightSENKAI;
       }
   }
  
   Off(OUT_AC);
}
sub right_Linehalf()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   while(FastTimer(0)<=18)
   {
       if(SENSOR_2>THRESHOLD+5)   
       {
           leftSENKAI;
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD+4)   
       {
           left;
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD)  
       {
           P;
           OnFwd(OUT_AC);
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD-4)   
       {
           right;
           ClearTimer(0);
       }
       else
       {
           rightSENKAI;
       }
   }
}

上記のサブルーチンの説明

E-Fを超えるために、初期段階では急カーブのみだと越えることが出来なかったため、ライントレースする側を左から右に交互に切り変えることによって越えようとしていた。しかし、発表直前までには急カーブのみで超えることができたため上記のサブルーチンを使うことはなかった。

sub left_Line()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);//光センサー準備
   ClearTimer(0);//タイマーをセット
   while(FastTimer(0)<=26)//タイマーセット後の経過時間が0.26秒以下ならばループ
   {
       if(SENSOR_2>THRESHOLD+5)   
       {
           rightSENKAI;//白なら右急カーブ
           ClearTimer(0);//タイマーリセット
       }
       else if(SENSOR_2>THRESHOLD+4)   
       {
           right;//白っぽいなら右へ
           ClearTimer(0);//タイマーリセット
       }
       else if(SENSOR_2>THRESHOLD)  
       {
           P;
           OnFwd(OUT_AC);//灰色(白と黒の境界)なら直進
           ClearTimer(0);//タイマーリセット
       }
       else if(SENSOR_2>THRESHOLD-4)   
       {
           left;//黒っぽいなら左へ
           ClearTimer(0);//タイマーリセット
       }
       else   
       {
           leftSENKAI;//黒なら左急カーブ
       }
   }
   Off(OUT_AC);
}
sub left_Linehalf()
{
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   ClearTimer(0);
   while(FastTimer(0)<=12)
   {
       if(SENSOR_2>THRESHOLD+5)   
       {
           rightSENKAI;
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD+4)   
       {
           right;
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD)  
       {
           P;
           OnFwd(OUT_AC);
           ClearTimer(0);
       }
       else if(SENSOR_2>THRESHOLD-4)   
       {
           left;
           ClearTimer(0);
       }
       else   
       {
           leftSENKAI;
       }
   }
}

上記のサブルーチンの説明

sub left_Line()は特殊な場合を除いて、今回のライントレースにおいて主として用いたものだった。sub left_Linehalf()はP-Qなどの円の箇所をライントレースする時に、他と同じようにライントレースをするだけではQを交差点として判断してくれなかったために、FastTimerの時間を短くするなどの変化を持たせたものだ。

task main()
{
left_Line();
LINEsyusei;//C通過
int B;
for (B=1; B<=4; B++){
   left_Line();
   }
Wait(100);//B通過
left_Linehalf();//P-Q
forward(30);//Q通過
right;
Wait(30);
ClearTimer(1);
   while(FastTimer(1)<=1300)//R-F
   {
   left_Line();
   }
int C;
for (C=1; C<=2; C++){
   left_Line();
   }
Wait(100);
forward(40);//Yからコップを取るための準備
leftSENKAI;
Wait(98);
Off(OUT_AC);
OnRev(OUT_B);//アームを動かす
Wait(70);
Off(OUT_B);//Yからコップ取る
rightSENKAI;//再びライントレースするための準備
Wait(80);
left_Line();
Wait(100);
LINEsyusei;
int D;//S-Q
for (D=1; D<=2; D++){
    left_Line();
    }
Wait(100);
left_Linehalf();//Q-R
forward(30);//コップを置くための準備
OnFwd(OUT_B);
Wait(20);
Off(OUT_B);//コップを置く
right;
Wait(40);
int E;//R-B
for (E=1; E<=4; E++){
    left_Line();
    }
LINEsyusei;
forward(100);//ゴール
}

苦労した点の概要

 今回、私が最も苦労した点はP-Sのプログラミングだった。特に、P-QにおいてセンサーがQの交差点部分を交差点と判断させることが出来なかったことだ。初めは、禁止事項,[~秒後に~をする]というプログラミングを組んでいたものの、途中で禁止と通達があり断念。(そもそもそれでP-Qを通ることが出来たかは不明だが)プログラムの要素やロボットの改良を行うことで、この課題をクリアしようとした。

具体的な内容[P-Q]

 改善点として挙げられたのは

 sub left_Linehalf() の交差点判断の時間を縮めることでQを交差点として認識させやすくする

◆妊札鵐機爾琉銘屬鯆磴して余計な情報を省く

’センサーの位置を機体側に近づけることで交差点判断の時間を伸ばす

改善前のセンサー

改善前

改善後のセンサー

改善後

ぁTHRESHOLDに加減する数値を徐々に大きくすることでQに垂直に入るようにし、他の交差点部分と変わらない条件にさせる

 以上の改善後の結果を以下に記す。

 任蓮△匹譴世瓜間を短くしても良い結果は得られなかった。

◆任蓮Qに関しての直接的な結果は得られなかったが、全体的なライントレースの質が向上した。これは、無駄な情報が省かれたために1回ごとに結果が変わるということが少なくなったためと考えられる。

’は、ある程度プラスの結果が得られた。

ぁ任蓮加減する数値をどれだけ変えても良い結果は得られなかったが、THRESHOLDの値事態を変えることである程度プラスの結果が得られた。

本番までに改善できたか?

結果としては、上記の改善をしてもQを交差点として判断させることはできなかった。それがロボット自体の問題なのか、プログラムの問題なのかは分からないが本番までにクリアーすることが出来なかったのは悔やまれる。

感想

 今回の課題は、ロボットの機体よりもプログラミングに関しての障害が多かったように感じられる。そうなると、相方とほとんど同じ機体で変わっているのはプログラムだけとなってくるので、相方ができて自分が出来なかった時はとても悔しかった。しかし、相方と協力し、知恵を出し合いながらする作業はとても楽しかったし、やりがいがあった。ただ、欲を言えば最後まで何の問題もなくゴールしたかった。

 他のグループを見ていると、プログラミングの技術の高さだけでなく、見た目まで凝っているチームがあり見ていても楽しむことができた。締めとして、これまで受けた刺激、悔しさを最後の課題では十二分に発揮してロボテイクスゼミを終了できるようにしたいと思う。


添付ファイル: fileスクリーンショット 2018-02-13 11.19.00 (2).png 57件 [詳細] file20171227_180344 (3).jpg 64件 [詳細] file20180205_155408 (2).jpg 57件 [詳細] file2017b-mission2.png 65件 [詳細] file20171227_180447 (2).jpg 60件 [詳細] file20171227_180424 (2).jpg 49件 [詳細] file20171227_180409 (2).jpg 57件 [詳細] file20171227_180344 (2).jpg 52件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-13 (火) 12:05:22