[[2019a/Member]]
#contents
*課題について [#h3147c70]
ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
&ref(2019a/Member/TT/Mission3/2019a-mission3.png,70%,課題のコース);
フィールドの説明
-フィールドは課題2で使用した紙を使用する。
-生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。
-残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。
-プラ容器には色をつけたり文字や記号を書いてもよい。
-プラ容器は両面テープ等でフィールドに固定してもよい。
-2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。
基本ルール
-競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
-図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
-開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
-競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
-競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。
基本得点の計算方法
-プラ容器内の玉を1個運べば8点。二つとも運べば20点。
-L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。
-競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。
-競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
-競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
-競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。
技術点の計算方法
-以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安:
-玉を探し取りにいくまでの動作 (3点)
-玉を掴む動作 (3点)
-玉をを運ぶ動作 (2点)
-玉を容器の中に入れる動作 (2点)
-2台のRIS、NXT、EV3の連携の良さ(2点)
-自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
-その他 (3点)
*ロボットの構造について [#l4338c3a]
私たちの班はピンポン玉を以下の写真のようなクレーン型のアームで持ち上げるようにした。
タイヤは3輪である
より正確にするため、左右に2つの光センサーを取り付けた
RISは、クレーンで挟む動作を行うモーターとクレーンを上に持ち上げる動作を行うモーターに使うものを1つ、車体の右タイヤ用と左タイヤ用のモーターと2つの光センサーを取り付けたものを1つ、合わせて2つのRISを用いた。
&ref(2019a/Member/TT/Mission3/20190807_131328.jpg,50%,ロボの構造);
下の写真はクレーンを伸ばした時の様子である。
輪ゴムの伸縮力にによって、クレーンが勢いよく伸びて壊れたり、ピンポン玉に勢いよくぶつかったりするのを防いだ。
&ref(2019a/Member/TT/Mission3/20190807_131415.jpg,50%,ロボの構造);
*作戦の流れ [#xa966c6a]
&ref(2019a/Member/TT/Mission3/2019a-mission3 (1).png,80%,作戦の流れ);
上図の� 銑�の場所で以下のような操作を行う
��C地点まで前進し、C地点の黒線で停止する
��C地点で90度右回転する
��クレーンを下げ、ピンポン玉をつかみ、クレーンを上げる
��C地点で90度左回転する
��B地点まで前進し、B地点の黒線で停止する
��B地点で90度右回転する
��C'地点まで前進し、C'地点の黒線で停止する
�┘�レーンを下げ、ピンポン玉を箱の中に落とし、クレーンを上げる
��C'地点まで後退する
��B地点まで後退し、B地点の黒線で停止する
� 銑�の操作を2回行うことによって箱の中にある2個のピンポン玉をもう一つの箱に移す
*プログラムについて [#a294d7ae]
まず初めに通信で送る数字を定義した。
#define SIGNALON_C 39
#define SIGNALON_T 2
-サブルーチンについて
右の光センサーについて
sub black_R()
{
while(FastTimer(0)<10)
{
if(SENSOR_3<37){Off(OUT_AC); //黒線で停止
Wait(100);}
else{OnRev(OUT_AC); //白いとき前進
ClearTimer(0);}
}
}
左の光センサーについて
sub black_L()
{
while(FastTimer(0)<10)
{
if(SENSOR_1<37){Off(OUT_AC); //黒線で停止
Wait(100);}
else{OnRev(OUT_AC); //白いとき前進
ClearTimer(0);}
}
}
右の光センサーについて2
sub back()
{
while(FastTimer(0)<10)
{
if(SENSOR_3<37){Off(OUT_AC); //黒線で停止
Wait(100);}
else{OnFwd(OUT_AC); //白いとき後退
ClearTimer(0);}
}
}
-実際のプログラム
上記のサブルーチンを用いて以下のようにプログラムした
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
図�,瞭阿�
ClearTimer(0);
black_R(); //C地点まで前進
OnRev(OUT_AC); //車体の微調整
Wait(100);
Off(OUT_AC);
ClearTimer(0);
black_R();
図�△瞭阿�
OnFwd(OUT_C); //90度右回転
OnRev(OUT_A);
Wait(55);
Off(OUT_AC);
Wait(100);
図��の動き
SendMessage(SIGNALON_C); //もう一つのRISに通信する
Off(OUT_AC);
Wait(1000); //ピンポン玉をつかみ終わるまで待つ
図�い瞭阿�
OnFwd(OUT_A); //90度左回転する
OnRev(OUT_C);
Wait(60);
Off(OUT_AC);
Wait(100);
図�イ瞭阿�
ClearTimer(0);
back(); //C地点の黒線まで後退
OnFwd(OUT_AC); //C地点の黒線を渡る
Wait(100);
Off(OUT_AC);
ClearTimer(0);
back(); //C地点からB地点まで後退
Wait(100);
図�Δ瞭阿�
OnFwd(OUT_A); //B地点で右回転
OnRev(OUT_C);
Wait(60);
Off(OUT_AC);
Wait(100);
図�Г瞭阿�
ClearTimer(0);
black_L(); //C'地点の黒線まで前進
OnRev(OUT_AC);
Wait(100);
Off(OUT_AC);
図�┐瞭阿�
SendMessage(SIGNALON_T); //もう一つのRISに通信
Off(OUT_AC);
Wait(1000); //ピンポン玉を落とし終わるまで待つ
図��の動き
ClearTimer(0);
back(); //C'地点の黒線まで後退
OnFwd(OUT_AC);
Wait(100);
Off(OUT_AC);
図��の動き
ClearTimer(0);
back(); //B地点の黒線まで後退する
OnFwd(OUT_C); //B地点で90度左回転する
OnRev(OUT_A);
Wait(55);
Off(OUT_AC);
Wait(100);
上記の� 銑�のプログラムを繰り返し、2個目のピンポン玉を移動させる
ClearTimer(0); //図�,瞭阿�
black_R();
OnFwd(OUT_C); //図�△瞭阿�
OnRev(OUT_A);
Wait(55);
Off(OUT_AC);
Wait(100);
SendMessage(SIGNALON_C); //図��の動き
Off(OUT_AC);
Wait(1000);
OnFwd(OUT_A); //図�い瞭阿�
OnRev(OUT_C);
Wait(60);
Off(OUT_AC);
Wait(100);
ClearTimer(0);
back(); //図�イ瞭阿�
OnFwd(OUT_AC);
Wait(100);
Off(OUT_AC);
ClearTimer(0);
back();
Wait(100);
OnFwd(OUT_A); //図�Δ瞭阿�
OnRev(OUT_C);
Wait(60);
Off(OUT_AC);
Wait(100);
ClearTimer(0); //図�Г瞭阿�
black_L();
OnRev(OUT_AC);
Wait(100);
Off(OUT_AC);
ClearTimer(0);
back();
OnFwd(OUT_AC);
Wait(100);
Off(OUT_AC);
SendMessage(SIGNALON_T); //図�┐瞭阿�
Off(OUT_AC);
Wait(1000);
ClearTimer(0); //図����の動き
back();
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(55);
Off(OUT_AC);
Wait(100);
}
-クレーンの上下用のRISのプログラムについて
#define SIGNALON_C 39
#define SIGNALON_T 2
task main()
{
ClearMessage();
while(true)
{
if(Message()==SIGNALON_C){ //図��で受信する
OnFwd(OUT_A); //クレーンをおろす
Wait(50);
Off(OUT_A);
OnRev(OUT_B); //ピンポン玉をつかむ
Wait(10);
Off(OUT_B);
OnRev(OUT_A); //クレーンを上げる
Wait(300);
Off(OUT_A);}
else if(Message()==SIGNALON_T){ //図�┐納�信する
OnFwd(OUT_A); //クレーンをおろす
Wait(50);
Off(OUT_A);
OnFwd(OUT_B); //ピンポン玉を落とす
Wait(10);
Off(OUT_B);
OnRev(OUT_A); //クレーンを上げる
Wait(300);
Off(OUT_A);}
}
}
*結果 [#we77cee9]
図�△�C地点の黒線停止まではうまくいった。図��の通信がうまくいかず、クレーンが起動しなかった。そして、ピンポン玉を持ち上げることができないまま図�イ料犧遒貌�り、B地点の黒線を認識できずに前進し続けてしまった。ロボが台から落下して、機体が大破し、そこで終了となった。
*感想・反省 [#ze2fe11d]
車体が軽すぎたためか、動くスピードが速く、光センサーで黒線を認識できなかったので、認識できる適切な速度で動ける機体にするべきであった。
L,L'地点のピンポン玉を移動させるプログラムも考えておくべきだった。
RIS間の通信がうまくいかなかったので、通信が届きやすい機体の構造にすべきであった。
ピンポン玉をつかむことすらできなかったのが非常に悔しいです。