[[2012b/MemberOnly/進行状況]]

*ロボコン [#h786b651]
*メンバー [#sf2b89b5]
--aspect:工学部所属。前回と同じく唯一神。
--HIBINO:繊維学部所属。今回から仲間に加わった勇者。
--atchoo:繊維学部所属。しがない掃除夫。
**メンバー [#sf2b89b5]
--aspect:工学部所属 前回と同じく唯一神。今回は更なる覚醒を魅せる。
--HIBINO:繊維学部所属 今回から仲間に加わった勇者。後に伝説となる。
--atchoo:繊維学部所属 しがない掃除夫。片付けスキルが飛躍的に向上した。

*競技内容 [#l4801722]
**競技内容 [#l4801722]
課題1で用いたコースを図のようにつなげ6個の箱を移し替えるというものです。
#ref(2012b/Member/atchoo/Mission/,80%)
#ref(2012b/Member/atchoo/Mission2/robocon2012b.png,80%)
-基本ルール
--白い紙パックと黒い紙パックを入れ替える。
--競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
--課題1のスタート地点からスタートする。
--スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。
--開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
--途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
--最終的にゴールに運び込まれた紙パックの数で点数を計算する。

*ロボットの紹介 [#eae84a20]
**ロボットの紹介 [#eae84a20]
--今回は課題1でaspect,atchooの作った機体をベースに改良を加えました。具体的には箱を感知する超音波センサー、箱をつかむためのアームを加えました。他の班に比べ、やや細目のボディになりました。
#ref(2012b/Member/atchoo/Mission2/2013-02-06_13-03-24_30.jpg,35%)
ロボットの全体像
#ref(2012b/Member/atchoo/Mission2/2013-02-06_13-05-59_239.jpg,35%)
#ref(2012b/Member/atchoo/Mission2/2013-02-06_13-06-16_908.jpg,35%)
ロボットのアーム:
箱を3つ運ぶにあたって同時に運ぶのは無理だったので2回に分けて運ぶことにしました。1回目は1個、2回目は2個運びます。またこの腕の長さを利用して中央にある木の壁を越えることができます。

**プログラムの紹介 [#ea507f0f]
今回も様々な行動を求められていたのでswitch-case文というものを用いました。行動をパターン分岐させやや複雑な動きもできるようになりました。ロボットの調子が少し悪く前進がスムーズにいかなかったので前進のプログラムがやや変わっています。箱の発見は超音波センサーで行うようになっています。

 #define SPD 40
 #define SPD_H 30   //進むスピード 
 #define SPD_Ah -15 //アームの閉じる速度
 #define SPD_Ar 15  //アームの開く速度
 #define TIM_W 800  //動作準備のための待機時間
 #define trasew1 OnFwdReg(OUT_BC,40,OUT_REGMODE_SYNC);Wait(1); //トレース1という行動
 #define trasew2 OnFwd(OUT_C,40);Off(OUT_B);Wait(1); //トレース2という行動
 
 task main ()
 {
 	SetSensorLight(S1);      //ライトセンサー定義
 	SetSensorLowspeed(S2);   //超音波センサー定義
 	SetSensorTouch(S3);      //タッチセンサー定義
  
 	int pattern = 1;         //パターン設置
 	long t0 = CurrentTick(); //タイマーの設置
 	int t1 = 0;			//カウンターの設置
 	int count = 0;		//カウンターの設置
 	
 	while(true)
 	{
 		switch(pattern)    //"pattern"の開始
 		{
 		
 		case 1: //箱に至るまでの直進
 			if(SensorUS(S2) > 8) //超音波センサーでの判断
 			{
 				if(t1 <= 300)
  				{
 					t1++; //カウンターを増やす
 					OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進
 					Wait(1);
 
 			}
 				else
 				{
 					t1 = 0;
 					trasew2;
 				}
  				break;
 			}
 			
 			pattern = 2; //パターン2へ移行
 			break;
 
 		case 2: //箱をつかむ
 			
 			if(count == 1);
 				{
 					OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進
 					Wait(550);
 				}
 			
 			Off(OUT_BC);
 			Wait(TIM_W);
 			if(count == 0)
 			{
 				OnFwd(OUT_A,-20); //箱をつかむ
 				Wait(TIM_W);
 				pattern = 5; //パターン5へ移行
 				break;
 			}
 			
 			
 			OnFwd(OUT_A,-50); //移動中箱を固定する
 			Wait(TIM_W);
 			pattern = 5;
 			break;
 			
 			
 			
 			
 		case 5: //箱をつかんだ状態で目的地の壁へ移動
 			if(count == 0)
 			{
 				OnFwdReg(OUT_BC,-SPD,OUT_REGMODE_SYNC); //後退
 				Wait(3600);
 				OnFwd(OUT_B,30);
 				OnFwd(OUT_C,-30); //旋回
 				Wait(1600);
 				Off(OUT_BC);
 				Wait(TIM_W);
 				pattern = 3;
 				break;
 			}
 				OnFwdReg(OUT_BC,-SPD,OUT_REGMODE_SYNC); //後退
 				Wait(4200);
 				OnFwd(OUT_B,30);
 				OnFwd(OUT_C,-30); //旋回
 				Wait(1560);
 				Off(OUT_BC);
 				Wait(TIM_W);
 				t0 = CurrentTick();
 				pattern = 3;
 				break;
 
 
 
 
 
 
 		case 3: //タッチセンサーが接触するまで前進してそこからまた箱に向き直す
 			if(SENSOR_3 == 0)
 			{
 				if(t1 <= 10000000)
 				{
 					t1++; カウンターを増やす
 					OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進
 					Wait(1);
 				}
 				else
 				{
 					t1 = 0;
 					trasew2; //トレース2を行う
 				}
 				break;
 			}
 			Off(OUT_BC);
 			OnFwd(OUT_A,30); //箱を離す
 			Wait(TIM_W);
 			Off(OUT_A);
 			if(count == 0)
 			{
 				OnFwdReg(OUT_BC,-SPD,OUT_REGMODE_SYNC); //後退
 				Wait(3000);
 				OnFwd(OUT_B,-30);
 				OnFwd(OUT_C,30); //旋回
 				Wait(1200);
 				count ++ ; //カウンターを増やす
 				Off(OUT_BC);
 				pattern = 1; //パターン1へ移行
 				break;
 			}
 			
 			
 			OnFwdReg(OUT_BC,-SPD,OUT_REGMODE_SYNC); //後退
 				Wait(1550);
 				OnFwd(OUT_B,-30);
 				OnFwd(OUT_C,30); //旋回
 				Wait(1100);
 				Off(OUT_BC);
 				pattern = 4; //パターン4へ移行
 				break;		
 			
 		case 4: //ゴールに箱を入れる
 			if(SensorUS(S2) > 8) //超音波センサーでの判断
 			{
 				if(t1 <= 90)
 				{
 					t1++; //カウンターを増やす
 					OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進
 					Wait(1);
 				}
 				else
 				{
 					t1 = 0;
 					trasew2;
 				}
 				break;
 			}
 			Wait(TIM_W);
 			OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進
 			Wait(TIM_W);
 			Off(OUT_BC);
 			OnFwd(OUT_A,-30); //箱をつかむ
 			Wait(TIM_W);
 			OnFwd(OUT_B,-30);
 			OnFwd(OUT_C,30); //向きの調整
 			Wait(800);
 			OnFwdReg(OUT_BC,SPD,OUT_REGMODE_SYNC); //前進
 			Wait(880);
 			Off(OUT_BC);
 			Wait(30000);
 			break;
 
 		}
 	}
 } 

**考察 [#y3e8a692]
結果として箱はうまく運べませんでした。2台のロボットの連携もうまくできなかったです。原因はプログラムをじっくり考える時間がなく完璧に仕上げられなかったこと、電池の残量に影響されてしまうこと、センサーも使っていたが時間制御も使っていたことだと思います。また機械の調子もすこし悪かったような気がします。基本中の基本である前進ができなくどうしても曲がってしまいました。ブルートゥースでの通信も間に合わなく連携ができませんでした。

**感想 [#b19ed448]
ロボコンはとても難しかったです。箱をいかにして壁の向こう側に置くか、そしてそれをいかにしてゴールに置くか。動作を重ねても誤差のなるべく出ないプログラムとは何なのか。またその誤差を修正するにはどうすればよいか、など問題点が山積みでした。解決のためにもっと柔軟な発想が求められている気がします。また、このロボティクス入門ゼミという講義を通してロボットを制御することの難しさを痛感しました。ロボットの挙動は自分の意思とは異なるものばかりでした。それでも思い通りに動いたときの感動がすごかったです。とても限られた時間でしたがこの経験を将来役立てていこうと思いました。


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