[[2013b/Member]] *ロボットの紹介 [#c75591f6] &ref(2013b/Member/ohma/Mission2/DSC_0232.jpg ,680×640,横から見た図); 自分たちのチームのロボットは、ライントレース用と缶積用の2つに用途を分けてプログラムをそれぞれ入れてます。機体の作成で力を入れたのは、 ・缶積用のエレベーターを如何に軽く、丈夫に出来るか(丈夫でないと積む時や移動時に壊れてしまう為) ・缶をどうやってしっかり掴めるようにするか(最初は掴んでも缶が滑ってしまったため) ・機体全体の耐久度 です。ビスを打ったり、アームの接着面を増やしたりして、ある程度解決しました。 *コース攻略 [#j6d158ea] プログラムを調整して最後までやっていったが、接触によって機体が正常に作動しないことが多く、確実に1つ缶を置くことを重点的に狙うようにプログラムを変更しました。 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2013b%2FMission2&openfile=robocon2013b.png スタートからゴールまでの間にある缶を取り、ゴールに持っていくことだけを狙いました。 *プログラムの説明 [#f4994119] #define OPEN 1 #define GO 2 #define PUT 3 #define BACK 4 #define THERESHOLD 47 // 閾値 #define HIGHPOWER 3 // 直進用パワー #define LOWPOWER 2 // カーブ用パワー #define set_power_H SetPower(OUT_AC,HIGHPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H; OnRev(OUT_AC); #define turn_left1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); // 左旋回 #define turn_left0 set_power_L; OnRev(OUT_C); Off(OUT_A); // 左折 #define turn_right0 set_power_L; OnRev(OUT_A); Off(OUT_C); // 右折 #define turn_right1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); // 右旋回 #define STEP 1 #define nMAX 35 // 通常のカーブとみなす時間の上限 #define short_break Off(OUT_AC); Wait(100); // 小休止 #define cross_line go_forward set_power_H; OnFwd(OUT_AC); Wait(20); short_break; // 交差点通過 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); int nOnline=0; ClearTimer(1); 最初の缶へは直進で向かう。 while (FastTimer(1) <= 500) { go_forward; if (SENSOR_3 > 48) { // 缶を発見 SendMessage(OPEN); // アームを動かすように指示 Off(OUT_AC); } until (Message() == GO); // アームの動作が終了したら go_forward; // 再び直進 } 開始から5秒経ったら、ライントレースを開始。 開始から5秒経ったら、ライントレースを開始。 ClearTimer(0); while (true) { if (SENSOR_1 < THERESHOLD -4) { turn_right1; } else { if (SENSOR_1 < THERESHOLD -2) { turn_right0; } else if (SENSOR_1 < THERESHOLD +2) { go_forward; } else if (SENSOR_1 < THERESHOLD +4) { turn_left0; } else { turn_left1; } if (SENSOR_3 > 48) { SendMessage(OPEN); Off(OUT_AC); } if (nOnline == 8) { OnFwd(OUT_A); OnRev(OUT_C); Wait(300); SendMessage(PUT); } until (Message() == GO); while (FastTimer(0) < nMAX) { if (SENSOR_1 < THERESHOLD -4) { turn_right1; } else { if (SENSOR_1 < THERESHOLD -2) { turn_right0; } else if (SENSOR_1 < THERESHOLD +2) { go_forward; } else if (SENSOR_1 < THERESHOLD +4) { turn_left0; } else { turn_left1; } ClearTimer(0); } Wait(STEP); } turn_left1; Wait(nMAX*STEP); cross_line; nOnline++; PlaySound(SOUND_CLICK); ClearTimer(0); if (SENSOR_3 > 48) { SendMessage(OPEN); Off(OUT_AC); } until (Message() == BACK); OnRev(OUT_AC); Wait(100); } } ↑ アーム用 † #define OPEN 1 #define GO 2 #define PUT 3 #define BACK 4 #define PowerA SetPower(OUT_A,0); #define PowerB SetPower(OUT_A,7); #define PowerC SetPower(OUT_C,0); #define PowerD SetPower(OUT_C,10); task main() { ClearMessage(); while (true) { PowerC; OnFwd(OUT_C); until (Message() == OPEN); PowerA; OnRev(OUT_A); Wait(40); PowerC; OnRev(OUT_C); Wait(90); PowerB; OnFwd(OUT_A); Wait(40); PowerD; OnFwd(OUT_C); Wait(160); SendMessage(GO); PowerC; OnFwd(OUT_C); until (Message() == PUT); PowerC; OnRev(OUT_C); Wait(50); PowerA; OnRev(OUT_A); Wait(40); SendMessage(BACK); } Wait(10); } *感想 [#u97dadec] 機体の耐久性を如何にして上げるのかを重点的に取り組んで、どうすれば耐久性を上げられるかが分かってよかった。また、あることをすると別の事が成り立たなくなるなどのジレンマにも悩まされたりしました。辛かったのは、いくらプログラムをうまく調節しても、実際に動かす時に他の要因でうまく動くことが出来ないことがあることを知ったことです。