[[2018a/Member]] 目次 #contents *課題 [#e60ea248] http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission2&openfile=2018a-mission2.png -決められたラインをトレースするロボットを作り、プログラミングする。 -途中350mlの空き缶を移動させる。 -ここでは第1コースをトレースする。 **第1コース [#g2c7b1bb] +Aをスタート +Bを直進 +Cで一時停止の後、直進 +Dで一時停止の後、Xの空き缶をキャッチしてD地点に戻る +DからEに向かい、Eを直進 +Fを左折 +Gで一時停止の後、左折 +Hで一時停止の後、右折 +Iで一時停止の後、右折 +Lを直進 +Kを直進 +Jで一時停止の後、空き缶をYに置きてJに戻りBに向かう +Bで一時停止の後、左折 +Aで停止 *ロボット [#s2d9208d] **全体 [#w7c4635b] #ref(ロボティクス3.jpg) -基本的には1番最初に作った四輪のロボットをそのまま使った。 -最初三輪のほうが小回りが効いていいのでは?と考えたけどなかなか安定して進ませることができなかったので結局四輪にした。 **アーム(?)の構造 [#l720c3f1] #ref(ロボティクス1.jpg) -このようにアーム(?)を下げて缶が動かないようにするだけのとてもシンプルなものにした。 -最初はしっかりとしたアームで缶を固定しようとしたのだが、なかなかいい案が思いつかず、これにたどり着いた。 #ref(ロボティクス2.jpg) -構造自体も最もシンプルな構造にした。 -シンプルゆえパワーを抑えないとめちゃくちゃ早く動いてしまう。 *プログラム [#g2c52e93] **交差点判断 [#m3e23008] -「連続で黒が続いたら」交差点と判断している。 -交差点のところを無視というプログラムができなかったので、交差点では1回1回止まらせている。 -交差点を曲がらず無視して直進というプログラムができなかったので、交差点では1回1回止まらせている。 **定義 [#e8d0d035] #define go OnFwd(OUT_AC);Off(OUT_AC); #define turn_right OnFwd(OUT_A);Off(OUT_C); #define turn_left OnFwd(OUT_C);Off(OUT_A); #define turn_r OnFwd(OUT_A);OnRev(OUT_C); #define turn_l OnFwd(OUT_C);OnRev(OUT_A); #define black 30 #define white 50 #define bw 35 #define wb 47 #define grey 43 #define set_power_A SetPower(OUT_B,3); #define wait Wait(100); -閾値を黒、白、灰色、黒よりの白、白よりの黒の5つに分けてより細かく判断できるように設定した。 **サブルーチン [#pb447c01] sub trace_1() //左トレース { int n=0; while(n<=3) { if(SENSOR_2>=white){ turn_r; n=0; }else if(SENSOR_2>=wb){ turn_right; n=0; }else if(SENSOR_2>=grey){ go; n=0; }else if(SENSOR_2>=bw){ turn_left; n=0; }else{ turn_l; n++; } } } -左トレースは基本的にこのサブルーチンでトレースさせている。 sub trace_2() // 左トレース(内側急カーブ) { int x=0; while(x<=20) { if(SENSOR_2>=white){ turn_r; x=0; }else if(SENSOR_2>=wb){ turn_right; x=0; }else if(SENSOR_2>=grey){ go; x=0; }else if(SENSOR_2>=bw){ turn_left; x=0; }else{ turn_l; x++; } } } -G地点からH地点に行くまでの内側のUターンで1度止まって次の行動に移るためのサブルーチン。 -内側のカーブはどうしても黒が連続してしまうので、変数の値を、20とやや大きい値に設定した。 sub trace_3() //右トレース1 { int y=0; while(y<=1) { if(SENSOR_2>=white){ turn_l; y=0; }else if(SENSOR_2>=wb){ turn_left; y=0; }else if(SENSOR_2>=grey){ go; y=0; }else if(SENSOR_2>=bw){ turn_right; y=0; }else{ turn_r; y++; } } } sub trace_4() //右トレース2 { int z=0; while(z<=2) { if(SENSOR_2>=white){ turn_l; z=0; }else if(SENSOR_2>=wb){ turn_left; z=0; }else if(SENSOR_2>=grey){ go; z=0; }else if(SENSOR_2>=bw){ turn_right; z=0; }else{ turn_r; z++; } } } -HからI→L→K→Jの部分はどうしても右トレースでないといけないのでこのサブルーチン3、4でトレースさせている。 -右トレース1と2で違うところは変数の値が1だけ違うというところ。1変えるだけで黒の判断が早くなったり遅くなったりするので少しずつ実際に走らせながら調整した。 **メイン [#a85f3a9e] task main () { SetSensor(SENSOR_2,SENSOR_LIGHT); trace_1(); Off(OUT_AC); wait; //C turn_r; Wait(10); OnFwd(OUT_AC); wait; trace_1(); Off(OUT_AC); //D wait; OnFwd(OUT_AC); Wait(20); Off(OUT_AC); wait; set_power_A; OnRev(OUT_B); //アームdown Wait(30); Off(OUT_B); OnRev(OUT_AC); Wait(20); Off(OUT_AC); trace_1(); Off(OUT_AC); //G wait; trace_2(); Off(OUT_AC); wait; turn_l; Wait(10); trace_1(); Off(OUT_AC); //H wait; turn_r; Wait(95); trace_3(); Off(OUT_AC); //I wait; trace_4(); Off(OUT_AC); go; Wait(30); trace_4(); Off(OUT_AC); go; Wait(30); trace_4(); Off(OUT_AC); //J wait; turn_l; Wait(95); set_power_A; OnFwd(OUT_B); //アームup Wait(30); Off(OUT_B); turn_r; wait; Off(OUT_AC); trace_1(); Off(OUT_AC); //B wait; trace_1(); Off(OUT_AC); } *まとめ [#k7a34eda] **結果 [#tc7dd7dd] -1度は成功したもののそれ以降は惜しいとこまではいってもほとんど失敗に終わってしまった。 **反省点 [#d448e875] -変位でこだわってしまっていたのでおとなしくタイマーでやれば良かったと思っている。 -タスクメインのほうをもっとコンパクトにプログラムできれば良かった。 -前輪からセンサーまでの間をもう少し詰めれば良かった。 -コースの色ムラをもう少しなくせば良かった。 **感想 [#l15556f2] -今回はロボットは簡単に出来たのだが、プログラムにとても苦労した。 -