[[2018a/Member]]
*目次 [#p4fcb1c1]
#contents

*課題3 [#f1398342]
 空き缶を分別して所定の場所に運ぶ。

**フィールドの説明 [#x446a9b2]
 フィールドは課題2で使用した紙を使用する。
#ref(コース3.png)

 2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。
#ref(缶の積み方.PNG)

 空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。
**ルール [#q0af4dda]
 基本ルール

 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。

 図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。

 Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。

 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。

 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。

 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
#ref(缶の積み方2.PNG)
 この置き方が最大の得点

***基本得点の計算方法 [#u85c45a6]
 運んだ空き缶の数×3点

 空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。

 円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。

 間違った円内に空き缶を置いた場合は、1個につき1点減点。

 間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点

***技術点の計算方法 [#p4a651f2]
 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 

得点の目安:

 空き缶を探し取りにいくまでの動作 (3点)

 空き缶を掴む動作 (3点)

 空き缶を運ぶ動作 (2点)

 空き缶を置く動作 (2点)

 空き缶を積む動作 (3点)

 2台のRCXまたはNXT、EV3の連携の良さ(2点)

 自立型のロボットとしての形や動作の美しさ、斬新さ(2点)

 その他 (3点)


*ロボットの説明 [#jbe56304]

**全体の説明 [#ab9a2f92]
 今回はRISを2台使えたので、通信を使ってロボットを上下2つに分けた。

 上部は缶を掴むためのアーム機構で、下部は車体の移動を行う機構である。

 本体は縦長の箱をイメージしており、旋回しても缶にぶつからないスマートな形になっている。後部にRIS2台をのせ、前方にアームがついているためバランスもよく、倒れづらくなってる。
#ref(全体像.jpg)

**上部(アーム機構)の説明 [#v348164e]
 アーム機構は上下スライド式になっており、缶の3段目の位置まで動くようになっている。

 RISの特徴である平たいギアを繋げることで高い位置まで可動が可能になる。しかし缶を3段積んだときの高さには届かなかったので、一段目の缶の半分から上の高さをアームが動ける最低位置とすることで、3段目まで届くように改善した。

 スライドをさせるためにガイドを作った。形はホチキスの針をイメージした。全体を包み込むようにすることで、安定を保つことができた。

 また、ガイドとアームの間にわずかな空間ができてしまうため、タイヤで押し付け、よりガイドに沿って動くことができるようにした。
#ref(アーム機構.PNG)

 アームは缶の位置が多少ずれてもカバーできるように、大きく開くようにした。また閉じたときに缶に密着するよう、径の大きさを試行錯誤し、タイヤを指先に付けることで摩擦力を増やした。
#ref(アーム.jpg)


**下部(車体)の説明 [#t5158db6]
 車輪は二輪にすることで、その場での旋回ができりようにした。このままだとふらついてしまうので、前後に支えとなるパーツを付け安定させた。

 車輪には回転センサを付けており、90度の回転や180度の回転が正確に行えるようにした。

 車体の裏には光センサを2つ付けた。これにより、センサが線分LFと線分GFの両方を黒と認識した時に止まることができる。センサを1つにすると、トレースをして交差点に差し掛かった時に止まらず、極短い時間内ではあるが車体が左右に曲がってしまい正面を向くことができない。2つにしたのはこれを防ぐという理由もある。
#ref(下のセンサー.jpg)

 車体の前方にはタッチセンサが付いており、缶タワーに当たった時に止まれるようになっている。

 缶が軽いためタッチセンサが反応しなかったが、てこの原理を利用したパーツを付けたことで、弱い力でセンサが反応するようにした。画像を見るとわかるが、タッチセンサが左に大きく離れてた場所に付いている。これにより車体の正面に缶が当たった時にセンサを反応させることができる。
#ref(タッチセンサー2.jpg)

*プログラムの説明 [#e5421905]
**戦略 [#p5bd8be8]
戦略は以下の通りである。

Yの円の3段目をXの円に移動。

Xの円にあった缶を円外に出し、掴んだ缶を置く。

Yの円に戻り、2段目の缶を掴む。

少し横にずらし、Yの円内にある残りの缶を押し出す。

掴んだ缶をYの円内に置く。

#ref(移動.png)
**define [#e9dc2a21]
 defineはアーム用・車体用の2つに分け、それぞれ用意した。

 上部のdefineは、缶を掴むTOJIRU・缶を離すHIRAKU・タッチセンサの作動値THRがある。

 TOJIRUにOff(OUT_A);があると缶が落ちてしまうので書いていない。

 上部のdefine
 #define TOJIRU Wait(50);OnFwd(OUT_A);Wait(100);       //アームを閉じる
 #define HIRAKU Wait(50);OnRev(OUT_A);Wait(30);Off(OUT_A);  //アームを開く
 #define THR 1000		               //缶に接近を検知するセンサのしきい値
 #define THR 1000		               //缶に接近を検知するセンサのしきい値

 下部のdefineは、90度左に曲がるTURNL・90度右に曲がるTURNR・缶を置くときに前に進むFOR・置いた後後ろに下がるBACK・缶がタッチセンサを押すまで動くFCANがある。

 下部のdefine
 #define TURNL Wait(80);OnFwd(OUT_C);OnRev(OUT_A);ClearSensor(SENSOR_2);until(SENSOR_2>=41);Off(OUT_AC);		//左に曲がる
 #define TURNR Wait(80);OnFwd(OUT_A);OnRev(OUT_C);ClearSensor(SENSOR_2);until(SENSOR_2<=-41);Off(OUT_AC);    //右に曲がる
 #define TURNL Wait(80);OnFwd(OUT_C);OnRev(OUT_A);ClearSensor(SENSOR_2);until(SENSOR_2>=41);Off(OUT_AC);	    //左に曲がる
 #define TURNR Wait(80);OnFwd(OUT_A);OnRev(OUT_C);ClearSensor(SENSOR_2);until(SENSOR_2<=-41);Off(OUT_AC);     //右に曲がる
 #define FOR Wait(80);OnFwd(OUT_AC);ClearSensor(SENSOR_2);until(SENSOR_2<=-23);Off(OUT_AC);			//缶を置くときに少し前に進む
 #define BACK Wait(80);OnRev(OUT_AC);ClearSensor(SENSOR_2);until(SENSOR_2>=23);Off(OUT_AC);			//缶を置くときに少し前に進んだ分戻る
 #define FCAN Wait(80);OnFwd(OUT_AC);ClearTimer(0);until(100==Message());Off(OUT_AC);time=Timer(0)*10;    //接近の知らせを受けるまで前進 その時間をtime0に記録
 #define FCAN Wait(80);OnFwd(OUT_AC);ClearTimer(0);until(100==Message());Off(OUT_AC);time=Timer(0)*10;        //接近の知らせを受けるまで前進 その時間をtime0に記録


**上部 [#jee4f262]
 //上段risのsendMssageは100番代
 #define TOJIRU Wait(50);OnFwd(OUT_A);Wait(100);       //缶を掴む
 #define HIRAKU Wait(50);OnRev(OUT_A);Wait(30);Off(OUT_A);  //缶を置く
 #define THR 1000		               //缶に接近を検知するセンサのしきい値

 task main(){
 SetSensor(SENSOR_3,SENSOR_TOUCH);
 SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);
 SetPower(OUT_A,7);
 SetPower(OUT_C,7);
	ClearMessage();
	SendMessage(1);	
 //三段目Aの缶
       until(201==Message());	        //移動終了を受信したらアームを開きアームを移動
	ageru(1);			//3段目の位置までアームを移動
	HIRAKU
	SendMessage(101);		//右に90度曲がり 前進
	until(THR>SENSOR_3);		//缶に接近したら
	SendMessage(100);		//缶に接近したメッセージ
	TOJIRU             //掴む
	ageru(10);			//少し上げる
	SendMessage(102);		//少し下がって右に90度回転
	until(202==Message());	    //終了を受信
         orosu(1);            //1段目の高さまで下す
	SendMessage(103); 		//右に90度回転
	until(203==Message()); 	//終了を受信
	HIRAKU             //離す
	SendMessage(104);		//少し後退
 //二段目Aの缶
	until(201==Message());  	//缶をおいて左に90度曲がった後
	ageru(2);            //アームを2段目の高さまで上げる
	HIRAKU             //アームを開く
	SendMessage(101);		//右に90度曲がり 前進させる
	until(THR>SENSOR_3);		//缶に接近したら
	SendMessage(100);		//缶に接近したメッセージ
	TOJIRU
	ageru(10);			//少し上げる
	SendMessage(102);		//少し後退し 左に90度回転
	until(202==Message());
	orosu(2);			//アームを1段目の高さまで下げる
	SendMessage(103);        //右に90度回転 円内の缶をどかす
	until(203==Message());
	HIRAKU             //缶を置く
 }

 void ageru(int a){
 OnFwd(OUT_C);
	switch (a){
		case 1:
		Wait(320);      //1段目から3段目の時間
		break;
		case 2:
		Wait(130);      //1段目から2段目の時間
		break;
		case 10:
		Wait(55);       //缶をちょっと持ち上げる時間
		break;
	}
  Off(OUT_C);
 }

 void orosu(int b){
 OnRev(OUT_C);
	switch (b){
		case 1:
		Wait(200);      //3段目から1段目の時間
		break;
		case 2:
		Wait(80);       //2段目から1段目の時間
		break;
		case 3:
		Wait(60);       //2段目から1.5段目の時間
		break;
		case 20:
		Wait(20);       //ちょっと下げる時間
		break;
	}
  Off(OUT_C);
 Wait(100);
 }


**下部 [#s125c9c9]
 下段ris sendは200番代
 #define TURNL Wait(80);OnFwd(OUT_C);OnRev(OUT_A);ClearSensor(SENSOR_2);until(SENSOR_2>=41);Off(OUT_AC);
 #define TURNR Wait(80);OnFwd(OUT_A);OnRev(OUT_C);ClearSensor(SENSOR_2);until(SENSOR_2<=-41);Off(OUT_AC);
 #define FOR Wait(80);OnFwd(OUT_AC);ClearSensor(SENSOR_2);until(SENSOR_2<=-23);Off(OUT_AC);			        //缶を置くときに少し前に進む
 #define BACK Wait(80);OnRev(OUT_AC);ClearSensor(SENSOR_2);until(SENSOR_2>=23);Off(OUT_AC);			        //缶を置くときに少し前に進んだ分戻る
 #define FCAN Wait(80);OnFwd(OUT_AC);ClearTimer(0);until(100==Message());Off(OUT_AC);time=Timer(0)*10;                   //接近の知らせを受けるまで前進 その時間をtime0に記録

 int time;             //define FCANで使用
 task main(){          //下のRIS用、移動と回転
	SetSensor(SENSOR_1,SENSOR_LIGHT);
	SetSensor(SENSOR_2,SENSOR_ROTATION);
	SetSensor(SENSOR_3,SENSOR_LIGHT);
	SetSensorMode(SENSOR_1,SENSOR_MODE_RAW);
	SetSensorMode(SENSOR_3,SENSOR_MODE_RAW);
	SetPower(OUT_A,2);
	SetPower(OUT_C,2);
	ClearMessage();
	until(1==Message());
	//移動開始
	//53センチ前進
	OnFwd(OUT_AC);
	ClearSensor(SENSOR_2);
	until(SENSOR_2<=-165);
	Off(OUT_AC);
	TURNL                                  //左に90度回転
	//真ん中まで前進
	OnFwd(OUT_AC);
	Wait(180); 
	until(SENSOR_1>777||SENSOR_3>777);     //交差点で停止
	Wait(10);
	Off(OUT_AC);
	//移動終わり
	PlaySound(SOUND_DOUBLE_BEEP);
	Wait(100);
	

**メインプログラム [#u231d5a8]
 3段目Aの缶をCの1段目へ
	SendMessage(201);		         //メッセージを送りアームを開き3段目の位置まで移動させる
	until(101==Message());
	//左に90度 缶の直前まで前進
	TURNL                                    //左に90度回転
	Wait(50);
	FCAN                                //缶の位置まで前進
	until(102==Message());
	OnRev(OUT_AC);			         //缶の位置まで進んだ分下がる
	Wait(time);
	Off(OUT_AC);
	TURNR                                  //右に90度回転
	SendMessage(202);                        //1段目の高さまで下す
	until(103==Message());
	Wait(80);
	TURNR                                   //右に90度回転 円内の缶をどかす
	OnFwd(OUT_A);OnRev(OUT_C);ClearSensor(SENSOR_2);until(SENSOR_2<=-5);Off(OUT_AC);
	FOR
	SendMessage(203);		        //缶を置く
	until(104==Message());
	BACK


 2段目Aの缶をAの1段目へ
	TURNL                                   //左に90度回転
	SendMessage(201);		        //アームを開き、2段目の高さまで上げる
	until(101==Message());	                //終わりを受信
	TURNL                                   //左に90度回転
	FCAN                                    //缶の位置まで前進
	until(102==Message());	                //掴み終わったら
	TURNL                                   //左に90度回転
	SendMessage(202);                       //1段目の高さまで下す
	until(103==Message());	                //終わりを受信
	TURNR                                   //右に90度回転
	BACK
	BACK
	SendMessage(203);		        //置かせる
 }

*結果 [#t868494f]
 本番ではやり直しの末、無事にロボットが動き、基本点6点+技術点より全体で2位という好成績を収めることができた。

 テスト明けということもあり、とにかく時間が無かった。週末を使って車体とプログラムが完成したこともあり、缶を積むまではいかなかった。

 ぎりぎりまで2段目を積むプログラムを試したが、回転センサが正しく動かないこともあり、やむを得ず積まないものに変更となってしまった。



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