[[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]
使用したプログラム

 #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()
 {
   SetSensor(SENSOR_3, SENSOR_LIGHT); // 光センサーを入れる。
     ClearTimer(3); // 3のタイマーを切る(以下同様)
     OnFwd(OUT_B); // 前回転(以下同様) この場合Bの位置に接続されているモーター
     Wait(20); // 時間調節(以下同様) この場合20秒
     OnFwd(OUT_AC);  
     Wait(90); 
     Off(OUT_B); // 停止(以下同様) この場合Bを停止する。
     Off(OUT_AC); 
     Wait(70);
     OnFwd(OUT_AC);
     Wait(30);
     ClearTimer(3); 
   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); 
   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;       
   }
  }  
     Off(OUT_AC);
     Wait(5);
     u_turn;
     u_turn; // 方向転換のためのもの
     Wait(40);
     ClearTimer(3);
   while (FastTimer(3) <=100){
     if (SENSOR_3 <= BLACK){
        Off(OUT_AC);
        Wait(50);
   } else if(SENSOR_3 > BLACK){
        u_turn;
        Wait(10);
   }
  }
     Off(OUT_AC);
     Wait(10);
     ClearTimer(3);
   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;
   }  
  }
     Off(OUT_AC);
     Wait(5);
     ClearTimer(0);
     ClearTimer(1);
     ClearTimer(3);
   while (FastTimer(3) <=800){
     if (SENSOR_3 < BLACK ){
        go_forward;           
        ClearTimer(1);
        ClearTimer(0);
   } else if( FastTimer(1) >=10){
        u_turn;
   } else if( FastTimer(0) >=70){
        turn_right;  
   } else if(SENSOR_3 > BLACK ){                 
        turn_left;
   }   
  }
     Off(OUT_AC);
     Wait(50);
     ClearTimer(3);
     ClearTimer(0);
     ClearTimer(1);
   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;
   }  
  }
     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);
 }


***説明 [#wb47742e]
&#9332;l1~l7
 以降に使用する言葉であったり数値を定義し、後に省略して記述出来るようにしている。
&#9332;l1~7

-アメリ
-イギリス
-スイス
-イタリア
++ヴェネチア
++ローマ
---バチカン
++ナポリ
以降に使用する言葉であったり数値を定義し、後に省略して記述出来るようにしている。

&#9333;l10~20

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

&#9334;l22~33

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

&#9335;l35~50

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

&#9336;l56~64

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

&#9336;l69~81

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

&#9337;l87~99

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

&#9339;l105~118

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

&#9340;l121~127

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

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

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

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

-現状今回当班の作成した状況下においてのみ対応している。
-少しの変化でうまくいかなくなってしまう。

**マシン本体 [#ef341726]


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