[[2016a/Member]] #contents *今回の課題 [#ea03fa7c] まず簡単に言うと課題はロボットに紙コップを運ばせることである。 紙コップをたくさん重ねて運べば、その分点数は高くなる。 さらに紙コップを1つも運べなかったとしても、他のチームからロボットの評価をしてもらう。 ロボットの工夫点や見た目など様々な評価基準があり、20点満点で評価され、 課題の点数に追加する形で加点される。 *私たちのロボット [#t24740f0] **積み重ねロボット [#t50ef94d] &ref(2016a/Member/katsumi/Mission3/積み重ねロボット2.JPG); &ref(2016a/Member/katsumi/Mission3/積み重ねロボット1.JPG); このロボットの役割は紙コップを重ねることである。 モーターAでアームを開閉し、モーターCでアームを上下している。 下に光センサーがついているのがポイントで、白いコップの明るさを感知するようになっている。 また紙コップをつかむために、センサーとアームの位置が微調整されている。 さらにこのロボット自体は移動しないので、ロボットの位置のズレによるミスは発生しない。 **運搬ロボット [#m4fcedcd] &ref(2016a/Member/katsumi/Mission3/運搬ロボット2.JPG); &ref(2016a/Member/katsumi/Mission3/運搬ロボット1.JPG); このロボットはライトレース用のロボットをベースとしている。 3輪にすることで小回りが効くようになっていて、変更点は見ての通り紫色のアームである。 このアーム内にコップを入れることで確実に目的地まで運搬することが可能になる。 *積み重ねロボットのプログラミング [#w3a0c570] #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つ目の紙コップを重ねる } 前述の通り、このロボットは移動しないのでコップを積み重ねる作業のみを行う。 白いコップをセンサーで感知し、値が50を超えたときに動作する仕組みだ。 動きが遅いのがネックだが、その分正しい位置にコップがくればほぼ確実に積み重ねられる 安定感があるのがメリットだ。 *運搬ロボットのプログラミング [#oac2641e] #define THRESHOLD 42 //閾値 #define gofw OnFwd(OUT_AC);Wait(5); //直進 #define turn_left Off(OUT_A); OnFwd(OUT_C); //左折 #define senkai_left OnFwd(OUT_C);OnRev(OUT_A);Wait(63); //交差点左旋回 #define turn_right OnFwd(OUT_A); Off(OUT_C); //右折 #define senkai_right OnFwd(OUT_A);OnRev(OUT_C);Wait(60); //交差点右旋回 #define senkai OnFwd(OUT_A);OnRev(OUT_C);Wait(90); //180度旋回 #define STEP 1 //一回の判定で進む時間 #define B_up OnFwd(OUT_B);Wait(80);Off(OUT_B); //出力Bの腕を上げる #define B_down OnRev(OUT_B);Wait(80);Off(OUT_B); //出力Bの腕を下げる #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); //積み重ねロボとの接触調整 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); //円に向かう ) 運搬ロボットはライントレースに従ってAから紙コップの位置まで移動し、紫色のアームでコップを囲うようにプログラムされている。 1つずつ交互にコップを積み重ねロボットの元へと運び、全部で4つ運ぶ予定だった。 *結果 [#y8fd37bf] 基本得点(課題クリアの得点) 0点 技術点(他チームによる点数評価の平均点) 10,2点 合計得点 10,2点 全体順位 4位 *反省点 [#z8fceb72] まずロボット製作に時間をかけすぎてしまい、結局複雑な構造のロボットを操作する羽目になった。 いくら立派なロボットであっても、操作性が悪ければ元も子もない。 また光センサーを用いて紙コップを認識させることが思ったよりも非常に難しかった。 少しでも明るさが変わっただけで動きがずれてしまうので、何か別の方法で認識させるほうがよかったと思う。 *最後に [#re2cf288] 先生は「とても簡単な作業もロボットにやらせることは実はまだまだ難しい。」とおっしゃっていました。 この講義はまさに現代のロボット工業の課題を実感する良い経験であると私は感じました。 私はずっとロボットに興味を持っていたため、この講義を受講したわけですが ロボットというものがこんなに扱いずらいものとは思ってもみなかったです。 今後、さらにロボットと関わっていく私にとって、ロボットの本質を少しでも 探れたことはこれからの学びに大きく貢献していくに違いありません。