[[2012b/Member]]

*ライントレースを応用してボールを運んでシュート!をする。(ロボティクス入門ゼミ2012後期課題1)[#top]
**課題 [#l5ef10d6]
図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。

<1人目>
+スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。
+ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。
+ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。
<2人目>
+上の動作でスタートとゴールを逆にして同様の動きをするプログラムを作成せよ。ロボット本体は共通のものを使うとする。

#ref(-1.png)
※2012年度後期・課題 のページを引用 

**メンバー [#xbfdb8de]

以下の2名
-ARomeo (イタリア車のアルファ・ロメオにちなんで) 理学部 :執筆者
-Konbu (褐藻類の昆布であると見られる) 繊維学部 :協力者

***自己紹介と環境 [#h9ed148f]
⑴ARomeo

大阪生まれ、東京育ちの完全な都会育ち。正確は典型的なB型。変人であることに誇りを持つ。
ロボティクスには高校時代東京工業大学の宇宙工学の広瀬教授に師事し、ロボット制作を行ったことによる。そのときは手動ロボットだったためコンピューター操作によるロボットをやってみたかったため。

趣味は旅行、料理、読書、音楽鑑賞、ファッション、サイクリング、グルメ巡り等多岐にわたる。

⑵環境

PCは幼少時代からMacを触ってたこともあり、Mac os10.6.8をメインとして使用。他に10.3.9、10.4.8×2、Win XP Pro を保持


**プログラム [#x668c00a]
使用したプログラム

⑴l1~7

以降に使用する言葉であったり数値を定義し、後に省略して記述出来るようにしている。

 #define BLACK 35 // 定義 BLACK=35ということを示す 光センサー用のしきい値として利用している
 #define u_turn  OnRev(OUT_A); OnFwd(OUT_C); // 定義 Aを逆回転、Cを前回転 つまり左に曲がる
 #define go_forward OnFwd(OUT_AC); // 定義 ACともに前回転 つまり直進
 #define turn_left OnRev(OUT_A); OnFwd(OUT_C); //  定義 Aを逆回転、Cを前回転 つまり左に曲がる
 #define turn_right OnFwd(OUT_A); OnRev(OUT_C); // 定義 Cを逆回転、Aを前回転 つまり右に曲がる
 #define n_turn OnFwd(OUT_A); OnRev(OUT_C); // 定義 Cを逆回転、Aを前回転 つまり右に曲がる
 #define STEP 1


 task main()
 {

⑵l10~20

置いておいたボールに近づきボールを掴む動作を行っている。秒数によって移動距離を調節している。

   SetSensor(SENSOR_3, SENSOR_LIGHT); // 光センサーを入れる。
     ClearTimer(3); // 3のタイマーを0にする(以下同様)
     OnFwd(OUT_B); // 前回転(以下同様) この場合Bの位置に接続されているモーター
     Wait(20); // 時間調節(以下同様) この場合20秒
     Wait(20); // 時間調節(以下同様) この場合0.2秒
     OnFwd(OUT_AC);  
     Wait(90); 
     Off(OUT_B); // 停止(以下同様) この場合Bを停止する。
     Off(OUT_AC); 
     Wait(70);
     OnFwd(OUT_AC);
     Wait(30);
     ClearTimer(3); 

行動内容:光センサーを入れ、3のタイマーを0にする。その後、アームを動かすモーター(センサーBによる)を0.2秒間動かしアームを上げる。次に左右にある両輪を前方向に0.9秒動かす。先ほど上げていたアームのモータを停止させ、そのことでアーム部分の重さを利用し下げてピンポン球を確保する。同時に前方向へと動かしていた両輪も停止させる。最後に両輪を再び前方向に0.3秒分わずかに進ませる。


⑶l22~33

ボールを保持した状態から黒い線上を認識させライン上に光りセンサーを乗せてやるようにしている。


   while (FastTimer(3) <=100){ // 条件 タイマー3が1秒以内のとき
     if (SENSOR_3 <= BLACK){ // 条件 センサー3がBLACKよりも低いとき(以下同様)
        Off(OUT_AC);
        Wait(50);
   } else if(SENSOR_3 > BLACK && FastTimer(3) <=40){ // 条件 タイマー3がBLACKより大きいかつタイマー3が0.4秒以下のとき
        OnFwd(OUT_AC);
        Wait(5);
   } else if(SENSOR_3 > BLACK && FastTimer(3) >40){ // 条件 タイマー3がBLACKより大きいかつタイマー3が0.4秒より大きいとき
        OnRev(OUT_AC);
        Wait(5);
   }
  }
     ClearTimer(3); 

行動内容:タイマー3が一秒に達するまで以下の条件のうち当てはまる行動をする。
-光センサーがしきい値よりも小さい値を示したときは0.5秒停止
-光センサーがしきい値よりも大きい値を示し、かつタイマー3が0.4秒に達していないとき両輪のモータを前方向に動かす。
-光センサーがしきい値よりも大きい値を示し、かつタイマー3が0.4秒以上のとき両輪のモーターを後方に動かす。

&#9335;l35~50

交差点を少し越えたところまでライントレース(黒い線を認識し移動すること)をさせている。終了地点はタイマーによる経過時間を使用し調節している。

   while (FastTimer(3) <=600){ // 条件 タイマーが6秒以内のとき
     if (SENSOR_3 <= BLACK){ // 
        go_forward;
        Wait(10);
        turn_right;
        Wait(10);
        ClearTimer(0); 
   } else if(FastTimer(0) >=100){ // 条件 タイマー0が1秒以上のとき
        u_turn;
        ClearTimer(0);
   } else if(FastTimer(0) >40){ // 条件 タイマー0が0.4秒より大きいとき
        turn_right;              
   } else if(SENSOR_3 > BLACK){  // 条件 センサー3がBLACKより低いとき
        turn_left;       
   }
  }  

行動内容:タイマー3が6秒に達するまで以下の条件のうち当てはまる行動をする。
-光センサーがしきい値よりも小さい値を示したとき前方向に少し進みわずかに右に曲がる。そしてタイマー0をクリアする。
-タイマー0が1秒以上のとき左に曲がり、その後タイマー0をクリアする。
-タイマー0が0.4秒より大きいとき右に曲がる。
-光センサーがしきい値よりも小さい値を示したとき左に曲がる。

     Off(OUT_AC);
     Wait(5);
     u_turn; // 方向転換のためのもの
     Wait(40);
     ClearTimer(3);

行動内容:両輪を一旦停止し左方向へと0.4秒間曲がる。これにより交差点の進むべき方向へと近づける。

&#9336;l56~64

回転と静止を利用して交差点を曲がらせ、きちんとライン上に静止させる。


   while (FastTimer(3) <=100){
     if (SENSOR_3 <= BLACK){
        Off(OUT_AC);
        Wait(50);
   } else if(SENSOR_3 > BLACK){
        u_turn;
        Wait(10);
   }
  }

行動内容:クリアされたタイマー3が1秒経過するまでの間に以下の条件のうち当てはまる行動をする。
-光センサーがしきい値よりも小さい値を示したとき停止
-光センサーがしきい値よりも大きい値を示したとき左方向に曲がる。

     Off(OUT_AC);
     Wait(10);
     ClearTimer(3);

&#9337;l69~81

ライントレースを行い、大きな円周上を越え少ししたところまで進ませる。到達地点はタイマーによって調節している。(交差点は線上にある限り直進という指令により回避されている。)


   while (FastTimer(3) <=1400){
     if (SENSOR_3 < BLACK ){
        go_forward;  
        ClearTimer(0);
   } else if(SENSOR_3 > BLACK && FastTimer(0) >=70){
        u_turn;
        ClearTimer(0);
   } else if(SENSOR_3 > BLACK && FastTimer(0) >=30){
        turn_left;        
   } else if(SENSOR_3 > BLACK ){
        turn_right;
   }  
  }

行動内容:クリアされたタイマー3が14秒経過するまでの間に以下の条件のうち当てはまる行動をする。
-光センサーがしきい値よりも小さい値を示したとき前方向に少し進みわずかに右に曲がる。そしてタイマー0をクリアする。
-タイマー0が0.7秒以上のとき左に曲がり、その後タイマー0をクリアする。
-タイマー0が0.3秒より大きいとき右に曲がる。
-光センサーがしきい値よりも小さい値を示したとき左に曲がる.



     Off(OUT_AC);
     Wait(5);
     ClearTimer(0);
     ClearTimer(1);
     ClearTimer(3);

&#9338;l87~99

前述同様ライントレースを行う。l69~81との異なる点は線外、つまり白色の部分になったときの行動がことなる。これはコースの構造において線が右回りと左回りの2通りがあるためである。また、交差点は同様に黒線上で直進にしているため無視出来る。


   while (FastTimer(3) <=800){
     if (SENSOR_3 < BLACK ){
        go_forward;           
        ClearTimer(1);
        ClearTimer(0);
   } else if( FastTimer(1) >=10){
   } else if( FastTimer(1) >=100){
        u_turn;
   } else if( FastTimer(0) >=70){
        turn_right;  
   } else if(SENSOR_3 > BLACK ){                 
        turn_left;
   }   
  }

行動内容:クリアされたタイマー3が8秒経過するまでの間に以下の条件のうち当てはまる行動をする。
-光センサーがしきい値よりも小さい値を示したとき前方向に進む。そしてタイマー0と1をクリアする。
-タイマー1が1秒以上のとき左に曲がり、その後タイマー0をクリアする。
-タイマー0が0.7秒より大きいとき右に曲がる。
-光センサーがしきい値よりも小さい値を示したとき左に曲がる

     Off(OUT_AC);
     Wait(50);
     ClearTimer(3);
     ClearTimer(0);
     ClearTimer(1);

&#9339;l105~118

またも前述同様ライントレースを行う。ここでは線外での回転の方向が異なるという違い以外に回転する秒数を変えてある。これは回転する秒数を大きくしてしまうと近くに存在する線を認識し道を違えてしまうため、回転する秒数を小さくし機体本体の振り幅を小さくすることで解決するためである。最終到着地は秒数によって設定してある。


   while (FastTimer(3) <= 750){
     if (SENSOR_3 < BLACK){
        go_forward;
        Wait(10);
        ClearTimer(0);
        ClearTimer(1);
   } else if(SENSOR_3 > BLACK && FastTimer(0) >=40){
        n_turn;            
   } else if(SENSOR_3 > BLACK && FastTimer(1) >=10){
        turn_left;  
   } else if(SENSOR_3 > BLACK){
        turn_right;
   }  
  }

行動内容:クリアされたタイマー3が8秒経過するまでの間に以下の条件のうち当てはまる行動をする。
-光センサーがしきい値よりも小さい値を示したとき前方向に進む。そしてタイマー0と1をクリアする。
-タイマー0が0.4秒以上のとき右に曲がり、その後タイマー0をクリアする。
-タイマー0が0.1秒より大きいとき左に曲がる。
-光センサーがしきい値よりも小さい値を示したとき右に曲がる。

&#9340;l121~127

マシンの方向をゴール方向に向けマシン前方のアームを上げ球を発射する。方向の調節は秒数によって設定してある。


     Off(OUT_AC);
     Wait(100);
     OnRev(OUT_AC);
     Wait(60);
     Off(OUT_AC);
     turn_right;
     Wait(42);
     OnFwd(OUT_B);
     Wait(20);
     Off(OUT_B);
     Off(OUT_AC);
 }

行動内容:両側の車輪と接続されているモーターを一端停止させ、0.6秒バックする。次に少し右に曲がりゴール方向へと車体を曲げる。最後にアーム部分と接続されているモーターを動かし上にアームを持ち上げピンポン球を発射する。

&#9341;注意

A=左側のモーターを駆動させ車輪を回転させる。
B=アームを動かすためのモーターと結合してある。
C=右側のモーターを駆動させ車輪を回転させる。

センサー3=光センサーが接続されている。

プログラムに置けるタイマーの利用は・・・

各&#9333;〜&#9340;内のそれぞれにおいて秒数による調節をするために用いてある。

***工夫した点(プログラム面) [#tbc274b4]

-本来ライントレースは黒色部分を右回転(左回転)、白色部分は左回転(右回転)をし線の端をトレースしていくがそうなると交差点部分において障害が出てくる。そこで、黒色を直進するというプログラムにすることで交差点を回避している。
-秒数設定にすることで電池の消費、モーター、ギアの摩耗による回転率の低下等の様々な状況に対し対応を即座に出来るようになっている。プログラムを小分けにしていることも同様の理由による。

***改善することが出来ると好ましい点 [#x6fec69f]

-現状今回当班の作成した状況下においてのみ対応している。他者の書いた同様のマップでは対応出来ない。(黒色や白色の数値であるしきい値が異なるため。)
-少しの変化でうまくいかなくなってしまう。例えば、スタートする地点が数ミリずれる、電池の消耗によるスピードの変化など。

**マシン本体 [#ef341726]

***本体解説 [#pf4b580f]
マシン本体について解説していく。

&#9332;土台

土台は安定する範囲内で横幅を細くしようとした。結果的にはモーターを真横に並べた幅となった。
#ref(download.jpg)

&#9333;アーム

球を掴み、発射することは今回の課題において大きな部分をしめている。中には発射をしない班もあったようだが当班はそこにはこだわった。
#ref(download-1.jpg)

まず、前方にある黄色のアームは球を取りこぼれ落ちないようにするためのものである。

球の後方にある黒色のアームは球を抑えておくこともそうだが発射をするための目的が大きい。前方のアームが上に上がるのと同様に黒のアームも上がる。そのときに球は後ろから押されるので球がきれいに前に発射される。

&#9334;全体

全体像としては縦長である。イメージとしてはロンドンバスであろうか、それにアームが着いている形である。これはどうしても外れやすい部品が何カ所かあったため部品の固定をやっているとたてながになってしまったからである。
#ref(download-3.jpg)

***工夫した点(ロボット面) [#e99bfc9e]

-重心の位置をなるべく中心になるよう前後の重みを調節した。
-一つの機構で球の捕球と発射を行えるようにしてある。

***改善することが出来ると好ましい点 [#c7495c0b]

-ギアとタイヤを変更してスピードを上げれるようにすること。
-急停止時のバランスをより安定させること。

**まとめ [#ic1daf6d]

上記以外の点についての良い点悪い点。

***良い点 [#z6e54e3b]

-割と速いスピードでスタートからゴールまでを行えるように調節してある。

***悪い点 [#ma0b0b72]

-成功率が100%ではないこと

**感想 [#he66e265]

もう少し時間があればと思う点が多々あったのでその点を次回には行かせるようにしていきたいと思った。また、まだまだ動作時間が長いのでスピードを上げられるようにシステム面で変更が考えられたがそこまで手が回らなかった。


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