[[2018a/Member]] *課題3 [#z995bac0] &ref(IMG_3613.PNG); ***基本ルール [#f958b00e] 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。~ 図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領 域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。~ Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。~ 開始の合図から5秒以内にスタートボタンを押す作業を完了すること。~ 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。~ ***基本得点の計算方法 [#d803a8a8] 運んだ空き缶の数×3点~ 空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。~ 円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。~ 間違った円内に空き缶を置いた場合は、1個につき1点減点。~ 間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点~ ***技術点の計算方法 [#p42120d4] 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安: 空き缶を探し取りにいくまでの動作 (3点) 空き缶を掴む動作 (3点) 空き缶を運ぶ動作 (2点) 空き缶を置く動作 (2点) 空き缶を積む動作 (3点) 2台のRCXまたはNXT、EV3の連携の良さ(2点) 自立型のロボットとしての形や動作の美しさ、斬新さ(2点) その他 (3点) *ロボットの説明 [#q2029d82] **本体の説明 [#ufb04fe2] &ref(IMG_3581.jpg); 今回の課題において私たちのグループは、親機(画像上)と子機(画像下)の二台が缶をつかみ、運ぶ機構を考えた。 私は親機の製作に関わった。 **ロボットの構造 [#ge0554a1] &ref(IMG_3586.jpg); 親機は、積んだ缶の3段目をつかみ、子機が二段目をつかんで引き出す際のささえとしても機能している。 &ref(IMG_3589.jpg); **ロボットの工夫した点 [#aa1c8e0f] ロボット製作において、今回はライントレースの正確性よりも速度を意識した。 また、缶をつかむ機構では、なるべくゆっくり閉まるようにし、缶をつかむ正確性をあげた。 *プログラム [#o146986a] **define [#yc90971d] #define turn_left Off(OUT_AC);OnFwd(OUT_A);OnRev(OUT_C);Wait(2);Off(OUT_AC); #define turn_right Off(OUT_AC);OnFwd(OUT_C);OnRev(OUT_A);Wait(2);Off(OUT_AC); #define run_left Off(OUT_AC);OnFwd(OUT_A);Wait(2);Off(OUT_AC); #define run_right Off(OUT_AC);OnFwd(OUT_C);Wait(2);Off(OUT_AC); #define arm_open Off(OUT_B);OnRev(OUT_B);Wait(20);Off(OUT_B); #define arm_close Off(OUT_B);OnFwd(OUT_B); #define turn_left_free OnFwd(OUT_A);OnRev(OUT_C); #define turn_right_free OnFwd(OUT_C);OnRev(OUT_A); #define turn_left_small OnFwd(OUT_A); #define turn_right_small OnFwd(OUT_C); turn_left,turn_left_freeは両方のタイヤを回転させて左へ曲がる.turn_leftはライントレースするサブルーチンの中でのみ機能し,turn_left_freeはどこでも使えるプログラムとなっている. turn_left_small,run_leftはタイヤ1つだけ回転し回転の内側のタイヤは止まっている.そうすることで大きく旋回することができる.turn_left_smallはどこでも使えるプログラムであるが,run_leftはサブルーチンの中のみで機能するプログラムとなっている. 右に曲がる,turn_right,turn_right_free,turn_right_small,run_rightも上記と同様. arm_openで空き缶を掴むためのアームを開き,arm_closeでアームを閉じ,空き缶を掴む. sub follow_line_right(){ClearTimer(0); while(FastTimer(0)<18) if(SENSOR_2<38){ turn_right; // センサー2が黒を認識したら,右へ曲がる }else if(SENSOR_2<42){ run_right;ClearTimer(0); // センサー2がグレーっぽい黒を認識したら,大きく右へ曲がる }else if(SENSOR_2<47){ OnFwd(OUT_AC);ClearTimer(0); // センサー2がグレーを認識したら,まっすぐ進む }else if(SENSOR_2<50){ run_left;ClearTimer(0); // センサー2がグレーっぽい白を認識したら,大きく左へ曲がる }else if(SENSOR_2<55){ turn_left;ClearTimer(0); // センサー2が白を認識したら,左へ曲がる }} 上のサブルーチンは黒線の右側をライントレースするプログラムとなっている.センサー2が0.18秒以上黒を認識したら,上のサブルーチンから外れ,次のプログラムへと行く. sub follow_line_left(){ClearTimer(0); while(FastTimer(0)<18) if(SENSOR_2<38){ turn_left; // センサー2が黒を認識したら,左へ曲がる }else if(SENSOR_2<42){ run_left;ClearTimer(0); // センサー2がグレーっぽい黒を認識したら,大きく左へ曲がる }else if(SENSOR_2<47){ OnFwd(OUT_AC);ClearTimer(0); // センサー2がグレーを認識したら,まっすぐ進む }else if(SENSOR_2<50){ run_right;ClearTimer(0); // センサー2がグレーっぽい白を認識したら,大きく右へ曲がる }else if(SENSOR_2<55){ turn_right;ClearTimer(0); // センサー2が白を認識したら,右へ曲がる }} 上のプログラムは黒線の左側をライントレースするプログラムとなっている.センサー2が0.18秒以上黒を認識したら,上のサブルーチンから外れ,次のプログラムへと行く. task main() { OnFwd(OUT_AC); Wait(200); Off(OUT_AC); // A'からHに向かって進む(黒線まで) SetSensor(SENSOR_2,SENSOR_LIGHT); follow_line_left(); // Hまで黒線左側をライントレース turn_right_small; Wait(90); turn_right_free; Wait(15); Off(OUT_AC); // HからIに方向転換 follow_line_left(); // HからIに進む 黒線左側をライントレース Off(OUT_AC); Wait(300); // "こき"の動きとの時間合わせ 少しIで待つ turn_right_free; Wait(10); Off(OUT_AC); // Yに体が向くように少し方向転換 OnFwd(OUT_AC); Wait(40); // IからYまで直進 Off(OUT_AC); arm_close; // 缶を掴む Wait(1000); // 相手が2段目の空き缶を抜くまで待機 arm_open; // 3段目の空き缶をアームを放すことで1段目の空き缶の上に乗せる OnFwd(OUT_AC); Wait(25); Off(OUT_AC); // 缶をがっちり抱える turn_right_small; Wait(110); Off(OUT_AC); // Yで右に90°方向転換 OnFwd(OUT_AC); Wait(30); // 黒線左側をライントレースできるように円から抜ける Off(OUT_AC); follow_line_left(); // 黒線左側をライントレースし,Gまで進む turn_left_small; Wait(30); turn_left_free; Wait(35); // Gで左へ曲がる Off(OUT_AC); Wait(1500); // "こき"が通り過ぎるまで待つ OnFwd(OUT_AC); Wait(120); Off(OUT_AC); // 缶をおいていく OnRev(OUT_AC); Wait(120); // Gに戻る turn_right_free; Wait(70); Off(OUT_AC); // 右に回転して軌道に戻る follow_line_left(); // ライントレース Off(OUT_AC); Wait(300); // "こき"の動きとの時間合わせ turn_right_free; Wait(10); Off(OUT_AC); // 少し右に曲がることでXに体を向ける. OnFwd(OUT_AC); Wait(20); // 空き缶まで行く Off(OUT_AC); Wait(100); // "こき"との時間合わせ arm_close; // 缶を掴む Wait(500); // 相手が2段目の空き缶を抜くまで待機 arm_open; // 3段目の空き缶をアームを放すことで1段目の上に乗せる OnRev(OUT_AC); Wait(120); Off(OUT_AC); Wait(100); // XからG辺りまで後退 turn_right_free; Wait(75); Off(OUT_AC); Wait(200); // 右へ曲がる OnFwd(OUT_AC); Wait(200); Off(OUT_AC); Wait(200); // 直進 turn_left_free; Wait(75); Off(OUT_AC); Wait(200); // 左へ曲がる OnFwd(OUT_AC); Wait(260); Off(OUT_AC); Wait(200); // A'で空き缶を抱える turn_left_free; Wait(85); Off(OUT_AC); Wait(200); // A'で左へ曲がる OnFwd(OUT_AC); Wait(100); Off(OUT_AC); // 空き缶をXに置く OnRev(OUT_AC); Wait(100); Off(OUT_AC); // Xで少し後退 Off(OUT_AC); //終了 } *感想 [#gef442db] 今回の課題で製作した機械には正確性が少なかった。 本番での走行では、照明の光度が設定と異なり、親機が正常な動きをしなかった。 みなさんの前で、親機と子機がタイミングよく缶をつかむ光景を見てほしかったが、それがかなわず少し残念な気持ちの残る発表となった。 本番では子機だけの走行となったが、今までで一番いい結果が残すことが出来たので、よかったと思う。 *動画URL *動画URL [#e0a4a857] 今まで動かした中で一番よく動いてくれたロボットたちの動画はこちら https://youtu.be/Pok_ylCWW7A