[[2017a/Member]] #contents *課題 [#t37a0a55] 空き缶を収集し、ゴールに空き缶をなるべく高く積み上げる #ref(2017a/Member/rayonne/Mission3/A.png) ◦図のピンク色の場所に350mlの空き缶を置く ◦図のライトブルーの円のいずれか一箇所に中身の入った350mlの缶を置く 詳細については[[課題3>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission3]]を参照 *ロボット [#a75f3e41] **動作 [#p50048e1] 運ぶロボットがTまで缶を運び、通信機能を用いて積むロボットに積むためのプログラムを起動するように命令することによって缶を積み上げる。 今回の課題で自身とkkは運ぶロボット、Ryoma、Kawachanが積み上げるロボットを担当した。 **運ぶロボット [#od79bd14] ロボットはライントレースに用いたものに缶を入れるアームをつけ、不安定だった部分の補強などを行って利用した。 &ref(2017a/Member/rayonne/Mission3/B.jpg); &ref(2017a/Member/rayonne/Mission3/A.jpg); **積むロボット [#ya2ea7f1] 移動用のモーターは1つのため前後のみの運動となる。運ぶロボットの命令によって前方のアームを用いて積む動作を開始する。 詳しくは[[Kawachan>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMember%2FKawachan%2FMission3]],[[Ryoma>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMember%2FRyoma%2FMission3]]を参照してほしい。 &ref(2017a/Member/rayonne/Mission3/c.JPG); &ref(2017a/Member/rayonne/Mission3/d.JPG); *プログラム [#b1308fb2] **全体の説明 [#k6949788] 今回の課題ではE,F,EF間のカーブにある3つの缶を運ぶプログラムにした。一部個所では黒線をトレースせず、交差点からの回転の秒数を用いて缶の位置を特定した。 **define [#s6b6cbe4] #define CONN 1 int a; long t; int msg; **サブルーチン [#f60c7794] ・黒線の右側をトレースする。xは出発する交差点の曲がり始めや誤認しやすいカーブを超える大体の秒数を入れる。 sub migi_susumu(int x) { t=CurrentTick(); while(CurrentTick()-t<x){ a=0; while(a<=3){ if(SENSOR_1>=55){ OnFwd(OUT_A,30); OnRev(OUT_C,30); }else if(SENSOR_1>=50){ OnFwd(OUT_A,30); Off(OUT_C); }else if(SENSOR_1>=45){ OnFwd(OUT_C,30); Off(OUT_A); }else{ OnFwd(OUT_C,30); OnRev(OUT_A,30); a=a+1; } } } sound_up(); } ・黒線の左側をトレースする。y上のxと同じ。 sub hidari_susumu(int y) { t=CurrentTick(); while(CurrentTick()-t<y){ a=0; while(a<=3){ if(SENSOR_1>=55){ OnFwd(OUT_C,30); OnRev(OUT_A,30); }else if(SENSOR_1>=50){ OnFwd(OUT_C,30); Off(OUT_A); }else if(SENSOR_1>=45){ OnFwd(OUT_A,30); Off(OUT_C); }else{ OnFwd(OUT_A,30); OnRev(OUT_C,30); a=a+1; } } } sound_up(); } ・機体は急激に曲がりだすと交差点と認識するため、交差点を直進したいときは機体の角度を調整、行きたい線上に持っていく。 sub chousei() { OnFwd(OUT_A,35); OnRev(OUT_C,35); Wait(600); OnFwd(OUT_AC,30); Wait(400); } ・機体は急激に曲がりだすと交差点と認識するため、交差点を直進したいときは機体の角度を調整、行きたい線上に持っていく。 sub chousei_2() { OnFwd(OUT_C,30); OnRev(OUT_A,30); Wait(750); OnFwd(OUT_AC,30); Wait(500); } ・地点S側から地点Rに来た機体を地点Tの前で停止させる。 sub s_t() { OnFwd(OUT_C,20); OnFwd(OUT_A,10); Wait(600); OnFwd(OUT_AC,30); Wait(950); Off(OUT_AC); Wait(400); sound_up(); } ・地点Q側から地点Rに来た機体を地点Tの前で停止させる。 sub q_t() { OnRev(OUT_A,15); OnFwd(OUT_C,40); Wait(230); OnFwd(OUT_AC,30); Wait(600); sound_up(); } ・Tに缶を置いた後、後退して旋回、円弧SRを見つけ出し、地点Sまで進む。 sub hukki_s() { OnRev(OUT_AC,40); Wait(950); OnFwd(OUT_C,35); OnRev(OUT_A,10); Wait(1000); while(SENSOR_1>=50){ OnFwd(OUT_C,30); OnRev(OUT_A,10); } Off(OUT_AC); hidari_susumu(1000); sound_up(); } ・地点Fの缶を取った後、旋回して円弧QRを見つけ出し、地点Rまで進む。 sub hukki_r() { OnFwd(OUT_C,30); OnRev(OUT_A,10); Wait(3000); while(SENSOR_1>=50){ OnFwd(OUT_C,30); OnRev(OUT_A,10); } Off(OUT_AC); hidari_susumu(1500); sound_up(); } **taskmain [#t65269be] task main() { SetSensorLight(S1); OnFwd(OUT_AC,30); //地点A Wait(600); migi_susumu(1500); //地点E、缶を取る migi_susumu(1500); //地点P migi_susumu(1500); //地点S chousei(); migi_susumu(2000); //地点R s_t(); //地点Tに缶を置く RemoteStartProgram(CONN,"taiki.rxe"); //slaveに”taiki.rxe”を起動するように命令 hukki_s(); //地点S chousei_2(); hidari_susumu(2000); //地点P Off(OUT_AC); Wait(20000); //slaveの缶を積む動作を邪魔しないように待機 OnFwd(OUT_C,30); //地点Fの方向へ向き、まっすぐ進む OnRev(OUT_A,30); Wait(900); OnFwd(OUT_AC,30); Wait(1900); sound_up(); //地点F、缶を取る hukki_r(); //地点R q_t(); //地点Tに缶を置く OnFwd(OUT_C,10); //地点Fの方向へ向き、まっすぐ進む OnRev(OUT_A,10); RemoteStartProgram(CONN,"tumu.rxe"); //slaveに”tumu.rxe”を起動するように命令 hukki_s(); //地点S chousei_2(); hidari_susumu(2000); //地点P OnFwd(OUT_AC,30); //機体を線の左側から右側に変える Wait(600); Off(OUT_AC); Wait(15000); //slaveの缶を積む動作を邪魔しないように待機 migi_susumu(1500); //地点E migi_susumu(28000); //地点Q migi_susumu(1500); //地点P chousei(); migi_susumu(2000); //地点S chousei(); migi_susumu(2000); //地点R s_t(); OnFwd(OUT_A,30); OnFwd(OUT_C,35); Wait(500); //地点Tに缶を置く RemoteStartProgram(CONN,"tumu2.rxe"); //slaveに”tumu2.rxe”を起動するように命令 OnRev(OUT_AC,30); Wait(500); hukki_s(); //地点S chousei_2(); hidari_susumu(2000); //地点R chousei_2(); hidari_susumu(2000); //地点Q chousei_2(); Off(OUT_AC); Wait(15000); //slaveの缶を積む動作を邪魔しないように待機 hidari_susumu(2000); //地点P hidari_susumu(1500); //積んだ缶を範囲内に押し込む Off(OUT_AC); OnRev(OUT_AC,30); Wait(1500); //GOALから離れる } *感想 [#pa87a676] 今回の課題では電池の消耗によってプログラムを何度も修正しなくてはならなくなったが、ロボット間の通信やトレースを利用することによって安定して動作できた。初めから製作方針を固めたことによって変更などの無駄な時間をとらなくて済んだことが成功要因の一つだと思う。