- 追加された行はこの色です。
- 削除された行はこの色です。
課題2の目次
#contents
*今回の課題内容 [#m66ec619]
***コース [#naa9aeb0]
授業中に説明した下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
黒線の幅は20mmでなるべく均等な濃さにすること。 ゴールは1x16のビーム1本、1x8のビーム2本、およびそれらを接続するためのプレートを使用し、コの字に組み合わせて作る。
#ref(./2015a-mission2.png,46%,課題2のコース)
#ref(./2015a-mission2.png,43%,課題2のコース)
***ミッション [#i3998df1]
3つの経路の内1つを選び黒い線にそって動くロボットを作成する。
そして、途中(P地点とQ地点)の間においたボール(ピンポン玉またはNXT付属のボール)を 目的地まで運んで、ゴールに入れる。その途中、三叉路および交差点では2秒間停止すること。
今回自分はC地点からA地点へ(Q交差点では直進、P三叉路では右折)の経路で動くロボットを作成した。
*ロボット本体の説明 [#eecf640c]
最初に作ったロボットではセンサーの位置がロボット本体と離れすぎていたので、プログラムと動作のずれが生じてしまうことを避けるためにロボット本体の前方に密着させる形でセンサーを取り付けた。
&ref(./DSC_0001.jpg,10%,ロボット本体の画像);
&ref(./_28504.jpg,20%,ボールを運ぶアーム);
最初に作ったロボットではセンサーの位置がロボット本体と離れすぎていたので、プログラムと動作のずれが生じてしまった。それを避けるため、ロボット本体の裏にセンサーを取り付けたがその場合その場で回り続けて進まなくなってしまった。よってロボット正面の部分に密着させ,紙にも近づける形でセンサーを取り付けることによりこれらの問題は解決して安定して動作させることができるようになった。
ボールを運ぶアームは最初は小さめに制作していたがボールを上手く掴めなかったり途中で転がって行って運べなかったりした。よって比較的大きめのアームにした所最後までボールを運びきることはできたがシュートはできなかったのゴールに直接ボールを運ぶことにした。
*プログラムの説明 [#yac40c4c]
**定義文 [#g20e2f95]
マクロとして右折、左折、直進を定義し3種類の動作を使い分けてロボットを動かすことにした。
そして交差点を渡る際の動作も定義することでメインのプログラムをできるだけ簡単にした。
#define BLACK 40 //この値以下を黒と認識
#define WHITE 50 //この値以上を白と認識
#define turn_right OnFwd(OUT_C); Off(OUT_A); //右折
#define turn_left OnFwd(OUT_A); Off(OUT_C); //左折
#define go_straight OnFwd(OUT_AC); //直進
#define STEP 3 //1回の動作に要する時間
#define MAX 100 //通常のカーブの最大値
#define cross_line go_forward;Wait(20); Off(OUT_AC); //交差点を渡る
**サブルーチン [#b7ebe574]
ライントレースの基本となる黒い線の端をなぞって進んでいくという動作を交差点、三叉路、ゴールにそれぞれたどりつくまで続けるプログラムをサブルーチンとして定義した。
それぞれ3種類の動作は進んでいる場所の明るさによって線の上の場合、境界付近の場合、線から外れた場合として3つのパターンに場合分けをすることにした。
sub trace()
{
while(FastTimer(0) < MAX) { //MAXの値になるまで繰り返す
ClearTimer(0);
if (SENSOR_2 < BLACK) { //線上の場合
turn_right; //右折
}
else if(SENSOR_2 < WHITE ) { //境界付近の場合
go_straight; //前進
}
else { //線から外れた場合
turn_left; //左折
}
Wait(STEP);
}
}
**メインタスク [#n4909171]
交差点とゴールを別のものと認識させるために3つ場合分けを使って交差点と三叉路を通り過ぎた後はゴールであると認識させ、ゴールした後は繰り返さず止まるプログラムを作成した。
交差点から三叉路に向かう際ボールを掴んで急停止することでボールが転がって行ってしまうことを避けるため三叉路ではいったん右折してから停止するようにしている。
task main()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
ClearTimer(0);
int goal = 0; //ゴールを認識させる変数を定義
while(goal != 2)
{
trace(); //ライントレースの開始
if(goal == 0) { //交差点に到達した場合
Off(OUT_AC);
Wait(200); //点Qで2秒間停止
cross_line;
turn_right;
Wait(30);
Off(OUT_AC);
Wait(200); //点Pで2秒間停止
goal = 1; //次到達する場所がゴールであると認識させる
ClearTimer(0);
}
else if(goal == 1) { //ゴールに到達した場合
turn_right; //直接ゴールにボールを運ぶ
Wait(80);
Off(OUT_AC);
goal = 2; //ライントレースの終了を認識させる
}
}
}
*反省点と課題 [#d2fa31e3]
最初に作った説明書通りのロボットを動かすことに固執してしまいコースから外れてしまうことが多々あるにもかかわらずプログラムした動作でそれを何とかしようとすることに大幅な時間を使ってしまった。その後独自のロボットを製作したところコースから外れることはなくなったのでもっと早くからロボット製作に時間を使っておくべきであった。
実際にライントレースをしてみると電灯の位置によりロボットが影を作って暗くなってしまいプログラムした通りに動かないことがあったのでロボットだけでなく周辺の状況を確認しながら制作していくべきであると感じた。
*まとめ [#s91c64c4]
全体的に初動が遅く基本となるところで躓いてしまうことで時間を使ってしまい課題に対して考察する十分な時間をとることができなかった。最終的に先生に聞いたり周りの人と協力することで単純な構造であったが何とか完成させることができた。次のロボット製作は最初から協力し合うことで要点を理解し、最終的には独自のプログラムを作成していけるようにしていきたい。