[[2016a/Member]] 目次 #contents *課題内容 [#nc7a5ee6] 最終課題は前回の課題で使用したライントレースロボ専用コースを再度利用し、ライントレースを しつつ紙コップを持ち運び、積み重ねる。という一連の動作をを行うプログラムとロボットを2つのハードを組み合わせ製作することだ。 今回はロボコンと言うことで、大ざっぱなルールとしては2つの定められた位置に設置されている紙コップを運び、重ねた数、そしてロボットの技術点の2つの側面から評価をする。20点満点だ。 *ロボットについて [#ba46ea34] 私達は初めライントレースが可能なアーム型のロボットの一体で紙コップの運搬を行おうとしていた。しかしアームの重さなどの都合上非常に不安定で、課題を成功させることができる見通しが立たなかった。そのため、アーム型ロボットを所定の位置に固定し、そのほかにもう一体、紙コップを移動させるための小型ロボットを製作し、小型ロボットが紙コップをアーム型ロボットの前まで運びアーム型ロボットが紙コップを積み重ねるというスタンスで今回の課題に望むことになった。 &ref(2016a/Member/ayemos/Mission3/IMG_2049.JPG,25%); 小型ロボット。 紙コップを上から振り下ろした輪で囲むことで運搬をすることができる。三輪でライントレースロボットがベースだ。 #ref(2016a/Member/ayemos/Mission3/IMG_2054.JPG,25%) アーム型ロボット。 土台に接続されている光センサーによって紙コップの接近を察知し、アームで紙コップを持ち上げ再度下ろす動きをする。 *プログラミングについて(小型) [#if35a0e0] #define THRESHOLD 42 //閾値 #define gofw OnFwd(OUT_AC);Wait(5); //前へ5秒すすむ #define turn_left Off(OUT_A); OnFwd(OUT_C); //左へ曲がる #define senkai_left OnFwd(OUT_C);OnRev(OUT_A);Wait(63); //左旋回6.3秒 #define turn_right OnFwd(OUT_A); Off(OUT_C); //右へ曲がる #define senkai_right OnFwd(OUT_A);OnRev(OUT_C);Wait(60); //右旋回6秒 #define senkai OnFwd(OUT_A);OnRev(OUT_C);Wait(90); //右旋回90秒 #define STEP 1 //0.1秒ごとに色を認識 #define B_up OnFwd(OUT_B);Wait(80);Off(OUT_B); //囲いを8秒あげる #define B_down OnRev(OUT_B);Wait(80);Off(OUT_B); //囲いを8秒あげる #define back OnRev(OUT_AC);Wait(move_time);Off(OUT_AC); //後退 #define tyousei_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t); //左旋回 #define tyousei_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t); //右旋回 #define watasu OnFwd(OUT_AC);Wait(120);Off(OUT_AC);OnRev(OUT_AC);Wait(50);Off(OUT_AC);Wait(2000); intint move_time; //もう一つのロボへ紙コップを渡す 定義付け。 前回利用したライントレースロボットをベースとしている。 今回は閾値を変更することでより誤作動の少ない物へと改良することができた。 int move_time; //後退の時間 void line_follow(int t) { SetSensor(SENSOR_2, SENSOR_LIGHT); ClearTimer(0); while (Timer(0)<t) { if (SENSOR_2 < THRESHOLD){ turn_left; } else { turn_right; } Wait(STEP); }Off(OUT_AC); } sub crossing_fwd() { SetSensor(SENSOR_2, SENSOR_LIGHT); int n=0; while(n<10){ if (SENSOR_2 < THRESHOLD){ turn_left;n++; } else { turn_right;n=0; } Wait(STEP); }Off(OUT_AC);Wait(100);gofw; } sub crossing_stop() { SetSensor(SENSOR_2, SENSOR_LIGHT); int n=0; while(n<10){ if (SENSOR_2 < THRESHOLD){ turn_left;n++; } else { turn_right;n=0; } Wait(STEP); }Off(OUT_AC);Wait(100); } sub crossing_right() { SetSensor(SENSOR_2, SENSOR_LIGHT); int n=0; while(n<10){ if (SENSOR_2 < THRESHOLD){ turn_left;n++; } else { turn_right;n=0; } Wait(STEP); }Off(OUT_AC);Wait(100);senkai_right;OnFwd(OUT_AC);Wait(30); } sub crossing_left() { SetSensor(SENSOR_2, SENSOR_LIGHT); int n=0; while(n<10){ if (SENSOR_2 < THRESHOLD){ turn_left;n++; } else { turn_right;n=0; } Wait(STEP); }Off(OUT_AC);Wait(100);senkai_left; } task main() { move_time=50; //後退の時間を0.5秒に設定 line_follow(105); tyousei_l(30); //急カーブ手前の角度調整 crossing_left(); //Pを左折 line_follow(50); crossing_right(); //Sを右折 crossing_stop(); //Cで停止 tyousei_r(20); //紙コップを取るための角度調整 back; //1つ目の紙コップを取るための後退 B_down; senkai; line_follow(50); crossing_left(); //Sを左折 line_follow(50); crossing_fwd(); //Pを直進 line_follow(25); tyousei_l(40); //急カーブ手前の角度調整 crossing_fwd(); //Rを直進 tyousei_r(15); //紙コップを渡す場所の調整 watasu; tyousei_l(25); //旋回前の調整 senkai; B_up; repeat(2) { OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進 line_follow(50); crossing_fwd(); //Pを直進 crossing_left(); //Sで左折 crossing_stop(); //Dで停止 tyousei_r(20); //紙コップを取るための角度調整 back; //1つ目の紙コップを取るための後退 B_down; senkai; crossing_right(); //Sを右折 crossing_fwd(); //Pを直進 line_follow(25); tyousei_l(40); //急カーブ手前の角度調整 crossing_fwd(); //Rを直進 tyousei_r(15); //紙コップを渡す場所の調整 watasu; tyousei_l(25); //旋回前の調整 senkai; B_up; OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進 line_follow(20); crossing_fwd(); //Pを直進 crossing_right(); //Sを右折 crossing_stop(); //Cで停止 tyousei_r(20); //紙コップを取るための角度調整 back;move_time=move_time-25; //3つ目、5つ目の紙コップを取るとき後退時間を-0.25秒している B_down; senkai; line_follow(50); crossing_left(); //Sを左折 line_follow(50); crossing_fwd(); //Pを直進 line_follow(25); tyousei_l(40); //急カーブ手前の角度調整 crossing_fwd(); //Rを直進 tyousei_r(15); //紙コップを渡す場所の調整 watasu; tyousei_l(25); //旋回前の調整 senkai; B_up; } OnFwd(OUT_AC);Wait(100); //Rをこし、トレースしやすくする直進 line_follow(50); crossing_fwd(); //Pを直進 crossing_left(); //Sを左折 crossing_stop(); //Dで停止 tyousei_r(20); //紙コップを取るための角度調整 back; B_down; senkai; crossing_right(); //Sを右折 crossing_fwd(); //Pを直進 line_follow(25); tyousei_l(40); //急カーブ手前の角度調整 crossing_fwd(); //Rを直進 tyousei_r(15); //紙コップを渡す場所の調整 watasu; senkai; line_follow(15); crossing_right(); //Rを右折 OnFwd(OUT_AC);Wait(200);Off(OUT_AC); //円に向かう } 全体のプログラム。C→B→D→Bを三回行き来しBで待機しているアーム型ロボットの もとへと紙コップを運ぶようにプログラミングされている。 *プログラムについて(アーム型) [#w61c455b] #define nigiru OnFwd(OUT_A);Wait(move_timeA);Off(OUT_A); //アームを閉じる #define hanasu OnRev(OUT_A);Wait(350);Off(OUT_A); //アームを開く #define arm_up OnFwd(OUT_C);Wait(move_timeB);Off(OUT_C); //アームを下げる #define arm_down OnRev(OUT_C);Wait(500);Off(OUT_C); //アームを上げる #define s_arm_down OnRev(OUT_C);Wait(200);Off(OUT_C); //アームを少し下げる int move_timeA; //アームを閉じる時間 int move_timeB; //アームを上げる時間 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT); int n=0; //紙コップを持ち上げた回数を数えるカウン ター move_timeA=400; //アームを閉じる時間を4秒に設定 move_timeB=800; //アームを上げる時間を8秒に設定 while(n<=4){ if(SENSOR_1>50){ s_arm_down;hanasu;arm_down; //紙コップを重ねる nigiru;move_timeB=move_timeB+80; //アームを閉じる(1回ごとに+0.8秒する) arm_up;move_timeA=move_timeA+1; //紙コップを持ち上げる(1回ごとに+0.01秒する) n++; //カウンターを+1する } } s_arm_down;hanasu;arm_up;Off(OUT_A); //6つ目の紙コップを重ねる } Bに固定されたまま位置は移動しない。アームを駆使して紙コップを持ち上げ積み重ねていけるようにプログラミングされている。 *結果 [#od296589] 基本得点 0点 技術点 10.2点 ___________________ 合計 10.2点 *感想 [#v6f77261] 今回の課題においては、人の集まりが非常に悪く、かつ一人一人の役割が明確に配分されていなかったこともあり、ある特定の人にプログラミングやロボット製作を任せてしまうという形になってしまった点が非常に駄目な部分として現れてしまった。 結果として自分は小さなサポートや手伝いをしていた程度でロボットのプログラミングや製作に深く関わることができない側の人間となってしまっていたのが反省点だ。 苦労させらたことは、アーム型ロボットの持ち上げ、重ねる動作が確実な物ではなかった点である。 小型ロボットとの連携が非常に重要になっているため、少しのずれも許されないシステムではあった。 ロボットの不正確さを初めて痛感した課題でもあったと思う。 それでも本番では比較的高評価を得られたことや、自分たちで作り上げたロボットがしっかりと動いている姿を見ることには感動なしはあり得なかった。 全体として全ての課題において非常に大変な思いをしてやってきた講義であったが。 楽しかったことも事実であり。なにより自分でもロボットをプログラミングできるという自身に大きくつながったと思う。 私は機械システム工学科ということもあり、この経験は後々きっと役に立つと思っている。 非常に有意義な時間を過ごせた。