課題2の目次 #contents *今回の課題内容 [#m66ec619] ***コース [#naa9aeb0] 授業中に説明した下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。 黒線の幅は20mmでなるべく均等な濃さにすること。 ゴールは1x16のビーム1本、1x8のビーム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] マクロとして右折、左折、右旋回、直進を定義し4種類の動作を使い分けてロボットを動かすことにした。 ボールをシュートするときにはロボットの動きに合わせてボールが動くようプログラムし、シュートすることにした。 #define THRESHOLD 42 //閾値 #define turn_right OnFwd(OUT_C); Off(OUT_A); //右折 #define turn_left OnFwd(OUT_A); Off(OUT_C); //左折 #define turn_right0 OnFwd(OUT_C); OnRev(OUT_A); //右旋回 #define go_straight OnFwd(OUT_AC); //直進 #define STEP 3 //1回の動作に要する時間 #define MAX 100 //通常のカーブの最大値 #define shoot turn_left; Wait(50); turn_right0; Wait(30); //ボールをシュート **サブルーチン [#b7ebe574] ライントレースの基本となる黒い線の端をなぞって進んでいくという動作を交差点、三叉路、ゴールにそれぞれたどりつくまで続けるプログラムをサブルーチンとして定義した。 それぞれ4種類の動作は進んでいる場所の明るさによって変化する4つのパターンとして場合分けをすることにした。 sub trace() { while(FastTimer(0) < MAX) { //タイマーが一定の値になるまで繰り返す ClearTimer(0); //タイマーの値をリセット if (SENSOR_2 < THRESHOLD-10) { turn_right0; } else if(SENSOR_2 < THRESHOLD-5) { turn_right; } else if(SENSOR_2 < THRESHOLD) { go_straight; } else { turn_left; } Wait(STEP); ClearTimer(0); } } **メインタスク [#n4909171] 交差点とゴールを別のものと認識させるために2つに場合分けをして交差点と三叉路を通り過ぎた後はゴールであるとするプログラムを作成した。 交差点から三叉路に向かう際ボールを掴んで急停止することでボールが転がって行ってしまうことを避けるため三叉路ではいったん右折してから停止するようにしている。 task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); ClearTimer(0); int goal = 0; while(true) { trace(); //ライントレースの開始 if(goal == 0) { //交差点に到達した場合 Off(OUT_AC); Wait(200); //2秒間停止 until(SENSOR_2 > THRESHOLD) { //交差点から三叉路まで直進 go_straight; } turn_right0; Wait(50); Off(OUT_AC); Wait(200); //2秒間停止 goal = 1; //次到達する場所がゴールであると認識させる } else if(goal == 1) { //ゴールに到達した場合 shoot; } } } *反省点と課題 [#d2fa31e3] 最初に作った説明書通りのロボットを動かすことに固執してしまいコースから外れてしまうことが多々あるにもかかわらずプログラムした動作でそれを何とかしようとすることに大幅な時間を使ってしまった。その後独自のロボットを製作したところコースから外れることはなくなったのでもっと早くからロボット製作に時間を使っておくべきであった。 実際にライントレースをしてみると電灯の位置によりロボットが影を作って暗くなってしまいプログラムした通りに動かないことがあったのでロボットだけでなく周辺の状況を確認しながら制作していくべきであると感じた。 *まとめ [#s91c64c4] 全体的に初動が遅く基本となるところで躓いてしまうことで時間を使ってしまい課題に対して考察する十分な時間をとることができなかった。最終的に先生に聞いたり周りの人と協力することで単純な構造であったが何とか完成させることができた。次のロボット製作は最初から協力し合うことで要点を理解し、最終的には独自のプログラムを作成していけるようにしていきたい。