2012b/Member

課題1レポート

メンバー

  • atchoo:繊維学部所属 凡人
  • aspect:工学部所属 唯一神
  • ウベック:パイロット AB型、乙女座、パイロット歴25年

課題の紹介

写真のようなコースを作成しロボットを制御するというものです。

2012b-mission1.png

一人目

  1. スタート地点から出発しピンポン球を回収します。
  2. ライン(黒線)をトレースしながらゴールを目指し、途中のT字路では直進、右折、左折の判断をします。
  3. ゴールしたらエリア外からピンポン球をゴールめがけて打ち出します。

二人目

  • 一人目とは逆周りにコースを回ります。

作成したロボットの紹介

  • ロボットの名前  YURIKA号
    2012-12-19_18-56-24_533.jpg
  • ロボットの外観: 全体像としてはクレーン車をモチーフにしました。重心はどちらかというと前寄りにありますが安定した走行をすることができます。
  • アーム: このアームを作るにあたって参考となったのは「ゆりかご」です。最初は横から抑え込むものを考えていたのですが、車幅がサイズオーバーだったので諦めました。次に「クワガタの角」をイメージしたアームを作っていたのですがなかなかうまくいかず、球をいかに安定して回収、運搬、シュートをするかを考えたときに最終的に「ゆりかご」になりました。また左右のぶれを解消するためにゆりかごの先端に車輪の一部を搭載しました。球を回収、シュートするときはそれぞれゆりかごの先端と末端にある棒を使います。
2012-12-19_18-54-54_670.jpg

   球を回収するときの写真

2012-12-19_18-55-16_581.jpg

   球を取り込んだときの写真

2012-12-19_20-47-16_445.jpg

   球を打ち出すときの写真

  ゆりかごが球を回収する時は巻き込むようにモーターを回転させ、球を打ち出すときは先ほどと逆回転させます。

  • プログラムの説明: 今回の課題であるライントレースをするにあたり交差点の判断、直角カーブゆるやかなカーブなどなどと様々な壁が立ちはだかりました。そこで僕らのチームではswitch-case文というプログラムを使用することになりました。switch-case文ではプログラムを複数のパターンに分岐させ、その中から実行したいプログラムを選択して処理できます。このおかげで様々な壁を乗り越えることができました。
    #define THRESHOLD 51 // しきい値
    #define SPEED_H 50 // 直線用のスピード
    #define SPEED_L 40 // カーブのスピード
    #define SPEED_S 25 // シュート用のスピード
    #define OnRL(speedR,speedL) \
    OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
    #define go_forward OnRL(SPEED_H,SPEED_H); // 直進
    #define turn_left1 OnRL(SPEED_L,-SPEED_L);// 左旋回
    #define turn_left0 OnRL(SPEED_L,0);// 左折
    #define turn_right0 OnRL(0,SPEED_L);// 右折
    #define turn_right1 OnRL(-SPEED_L,SPEED_L);// 右旋回
    #define STEP 1 // 1回の判断で動く時間
    #define nMAX1 140 // 通常のカーブとして許容できる繰り返しの最大値
    #define nMAX2 150 // ゴールとして判断する繰り返しの最大値
    #define xturn 170 //交差点突破の方向修正
    #define yturn 200 //シュートの方向修正
    #define short_break Off(OUT_BC); Wait(1000); // 小休止
    #define CROSS_TIME 200 // 交差点通過にかかる時間
    /* 交差点を渡る */
    #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
    #define st1 8000 // 時間の変数1
    #define st2 5000 // 時間の変数2
    
    task main()
    {
    	SetSensorLight(S3);
    	int nOnline = 0; // 続けて黒になった回数 (カウンタ)
    	long t0 = CurrentTick();	// タイマ
     	int pattern = 1; // 行動するパターン
    
    	//////////////////////////////////////////
    	/* 球の回収				*/
    	//////////////////////////////////////////
    	OnFwd(OUT_A,SPEED_S);Wait(430); // 球の回収
    	Off(OUT_A);Wait(1000);
    	OnFwd(OUT_BC,SPEED_S);Wait(750);	// 前進する
    	Off(OUT_BC);Wait(1000);
    
    		
    
    	t0 = CurrentTick();	// タイマのリセット
    
    	while (true) {
    		switch(pattern){
    			//////////////////////////////////////////////////////////////////
    			/* 1:直角・急カーブを曲がるトレースパターン			*/
    			/* 2:交差点を直進するトレースパターン				*/
    			/* 3:交差点を突破するパターン					*/
    			/* 4:ゴールのパターン						*/
    			/* 5:シュートするパターン					*/
    			//////////////////////////////////////////////////////////////////
    			case 1:
    				//////////////////////////////////////////////////////////////////
    				/* 直角・急カーブを曲がるパターン				*/
    				//////////////////////////////////////////////////////////////////
    				
    				if (CurrentTick() - t0 >= st1) {	// パターンの変更の判断
    					t0 = CurrentTick(); // タイマのリセット
    					nOnline=0; // カウンタをリセット
    					pattern = 2; // 交差点を直進するパターン
    					break;
    				}
    
    				if (SENSOR_3 < THRESHOLD-10) {
    					turn_left1;
    				} else if (SENSOR_3 < THRESHOLD-5) {
    					turn_left0;
    				} else if (SENSOR_3 < THRESHOLD+5) {
    					go_forward;
    				} else if (SENSOR_3 < THRESHOLD+10) {
    					turn_right0;
    				} else {
    					turn_right1;
    				}
    				Wait(STEP);
    
    				break;
    
    			case 2:
    				//////////////////////////////////////////////////////////////////
    				/* 交差点を直進していいパターン					*/
    				//////////////////////////////////////////////////////////////////
    				if (CurrentTick() - t0 >= st2) { //パターン変更の判断
    					Off(OUT_BC);Wait(1000);
    					t0 = CurrentTick();
    					pattern = 4; // ゴールするパターン
    					break;
    				}
    				if(nOnline > nMAX1){	// 交差点判断
    					Off(OUT_BC);Wait(1000);	
    					pattern = 3; // 交差点を突破するパターン
    					break;
    				}
    
    				if (SENSOR_3 < THRESHOLD-10) {
    					turn_left1;
    					nOnline++; // カウンタを増やす
    				} else if (SENSOR_3 < THRESHOLD-5) {
    					turn_left0;
    					nOnline++; // カウンタを増やす
    				} else {
    					if (SENSOR_3 < THRESHOLD+5) {
    						go_forward;
    					} else if (SENSOR_3 < THRESHOLD+10) {
    						turn_right0;
    					} else {
    						turn_right1;
    					}
    					nOnline=0; // カウンタをリセット
    				}
    				Wait(STEP);
    				break;
    
    			case 3:
    				//////////////////////////////////////////////////////////////////
    				/* 交差点を突破するパターン					*/
    				//////////////////////////////////////////////////////////////////		
    				short_break; // 小休憩
    				turn_right1; Wait(xturn); // 進行方向修正
    				Off(OUT_BC);Wait(1000);
    				cross_line; // 交差点を渡る
    				nOnline=0; //カウンタをリセット
    				pattern = 2; // 交差点を直進するパターン
    				break;
    
    			case 4:
    				//////////////////////////////////////////////////////////////////
    				/* ゴールするパターン						*/
    				//////////////////////////////////////////////////////////////////
    				
    				if(nOnline > nMAX2){	// ゴール判断
    					pattern = 5; // シュートするパターン
    					break;
    				}
    
    				if (SENSOR_3 < THRESHOLD-10) {
    					turn_left1;
    					nOnline++; // カウンタを増やす
    				} else {
    					if (SENSOR_3 < THRESHOLD-5) {
    						turn_left0;
    					} else if (SENSOR_3 < THRESHOLD+5) {
    						go_forward;
    					} else if (SENSOR_3 < THRESHOLD+10) {
    						turn_right0;
    					} else {
    						turn_right1;
    					}
    					nOnline=0; // カウンタをリセット
    				}
    				Wait(STEP);
    				break;
    
    			case 5:
    				//////////////////////////////////////////////////////////////////
    				/* シュートするパターン					*/
    				//////////////////////////////////////////////////////////////////		
    				short_break; // 小休憩
    				turn_right1; Wait(yturn); // 進行方向修正
    				Off(OUT_BC);Wait(1000);
    				OnRev(OUT_A,SPEED_H);Wait(360); //シュート
    				Off(OUT_A);Wait(1000);
    				pattern = 6; // 終了
    				break;
    
    			default:
    				Off(OUT_ABC);
                                    break;
    		}
    	}
    }

感想・反省点

  • ロボットを完成させるタイミングが遅かったのでプログラムの調整をする時間があまり取れませんでした。次の課題の時にはもっと早くロボットを完成させてプログラムの調整に時間をかけたいと思います。
  • ロボットの全長がほかの班に比べやや大きめなので動きに誤差が出てしまいました。次はロボットの小型化とプログラムの精密さを追及したいと思います。

 パートナーのaspectさん、本当にありがとうございました。


添付ファイル: file2012b-mission1.png 125件 [詳細] file2012-12-19_20-47-16_445.jpg 137件 [詳細] file2012-12-19_18-54-54_670.jpg 132件 [詳細] file2012-12-19_18-55-16_581.jpg 120件 [詳細] file2012-12-19_18-56-24_533.jpg 127件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-21 (金) 16:52:12