図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。
<1人目>
※2012年度後期・課題 のページを引用
以下の2名
⑴ARomeo
大阪生まれ、東京育ちの完全な都会育ち。正確は典型的なB型。変人であることに誇りを持つ。 ロボティクスには高校時代東京工業大学の宇宙工学の広瀬教授に師事し、ロボット制作を行ったことによる。そのときは手動ロボットだったためコンピューター操作によるロボットをやってみたかったため。
趣味は旅行、料理、読書、音楽鑑賞、ファッション、サイクリング、グルメ巡り等多岐にわたる。
⑵環境
PCは幼少時代からMacを触ってたこともあり、Mac os10.6.8をメインとして使用。他に10.3.9、10.4.8×2、Win XP Pro を保持
使用したプログラム
⑴l1~7
以降に使用する言葉であったり数値を定義し、後に省略して記述出来るようにしている。
#define BLACK 35 // 定義 BLACK=35ということを示す 光センサー用のしきい値として利用している #define u_turn OnRev(OUT_A); OnFwd(OUT_C); // 定義 Aを逆回転、Cを前回転 つまり左に曲がる #define go_forward OnFwd(OUT_AC); // 定義 ACともに前回転 つまり直進 #define turn_left OnRev(OUT_A); OnFwd(OUT_C); // 定義 Aを逆回転、Cを前回転 つまり左に曲がる #define turn_right OnFwd(OUT_A); OnRev(OUT_C); // 定義 Cを逆回転、Aを前回転 つまり右に曲がる #define n_turn OnFwd(OUT_A); OnRev(OUT_C); // 定義 Cを逆回転、Aを前回転 つまり右に曲がる #define STEP 1
task main() {
⑵l10~20
置いておいたボールに近づきボールを掴む動作を行っている。秒数によって移動距離を調節している。
SetSensor(SENSOR_3, SENSOR_LIGHT); // 光センサーを入れる。 ClearTimer(3); // 3のタイマーを0にする(以下同様) OnFwd(OUT_B); // 前回転(以下同様) この場合Bの位置に接続されているモーター Wait(20); // 時間調節(以下同様) この場合0.2秒 OnFwd(OUT_AC); Wait(90); Off(OUT_B); // 停止(以下同様) この場合Bを停止する。 Off(OUT_AC); Wait(70); OnFwd(OUT_AC); Wait(30); ClearTimer(3);
行動内容:光センサーを入れ、3のタイマーを0にする。その後、アームを動かすモーター(センサーBによる)を0.2秒間動かしアームを上げる。次に左右にある両輪を前方向に0.9秒動かす。先ほど上げていたアームのモータを停止させ、そのことでアーム部分の重さを利用し下げてピンポン球を確保する。同時に前方向へと動かしていた両輪も停止させる。最後に両輪を再び前方向に0.3秒分わずかに進ませる。
⑶l22~33
ボールを保持した状態から黒い線上を認識させライン上に光りセンサーを乗せてやるようにしている。
while (FastTimer(3) <=100){ // 条件 タイマー3が1秒以内のとき if (SENSOR_3 <= BLACK){ // 条件 センサー3がBLACKよりも低いとき(以下同様) Off(OUT_AC); Wait(50); } else if(SENSOR_3 > BLACK && FastTimer(3) <=40){ // 条件 タイマー3がBLACKより大きいかつタイマー3が0.4秒以下のとき OnFwd(OUT_AC); Wait(5); } else if(SENSOR_3 > BLACK && FastTimer(3) >40){ // 条件 タイマー3がBLACKより大きいかつタイマー3が0.4秒より大きいとき OnRev(OUT_AC); Wait(5); } } ClearTimer(3);
行動内容:タイマー3が一秒に達するまで以下の条件のうち当てはまる行動をする。
⑷l35~50
交差点を少し越えたところまでライントレース(黒い線を認識し移動すること)をさせている。終了地点はタイマーによる経過時間を使用し調節している。
while (FastTimer(3) <=600){ // 条件 タイマーが6秒以内のとき if (SENSOR_3 <= BLACK){ // go_forward; Wait(10); turn_right; Wait(10); ClearTimer(0); } else if(FastTimer(0) >=100){ // 条件 タイマー0が1秒以上のとき u_turn; ClearTimer(0); } else if(FastTimer(0) >40){ // 条件 タイマー0が0.4秒より大きいとき turn_right; } else if(SENSOR_3 > BLACK){ // 条件 センサー3がBLACKより低いとき turn_left; } }
行動内容:タイマー3が6秒に達するまで以下の条件のうち当てはまる行動をする。
Off(OUT_AC); Wait(5); u_turn; // 方向転換のためのもの Wait(40); ClearTimer(3);
行動内容:両輪を一旦停止し左方向へと0.4秒間曲がる。これにより交差点の進むべき方向へと近づける。
⑸l56~64
回転と静止を利用して交差点を曲がらせ、きちんとライン上に静止させる。
while (FastTimer(3) <=100){ if (SENSOR_3 <= BLACK){ Off(OUT_AC); Wait(50); } else if(SENSOR_3 > BLACK){ u_turn; Wait(10); } }
行動内容:クリアされたタイマー3が1秒経過するまでの間に以下の条件のうち当てはまる行動をする。
Off(OUT_AC); Wait(10); ClearTimer(3);
⑹l69~81
ライントレースを行い、大きな円周上を越え少ししたところまで進ませる。到達地点はタイマーによって調節している。(交差点は線上にある限り直進という指令により回避されている。)
while (FastTimer(3) <=1400){ if (SENSOR_3 < BLACK ){ go_forward; ClearTimer(0); } else if(SENSOR_3 > BLACK && FastTimer(0) >=70){ u_turn; ClearTimer(0); } else if(SENSOR_3 > BLACK && FastTimer(0) >=30){ turn_left; } else if(SENSOR_3 > BLACK ){ turn_right; } }
行動内容:クリアされたタイマー3が14秒経過するまでの間に以下の条件のうち当てはまる行動をする。
Off(OUT_AC); Wait(5); ClearTimer(0); ClearTimer(1); ClearTimer(3);
⑺l87~99
前述同様ライントレースを行う。l69~81との異なる点は線外、つまり白色の部分になったときの行動がことなる。これはコースの構造において線が右回りと左回りの2通りがあるためである。また、交差点は同様に黒線上で直進にしているため無視出来る。
while (FastTimer(3) <=800){ if (SENSOR_3 < BLACK ){ go_forward; ClearTimer(1); ClearTimer(0); } else if( FastTimer(1) >=100){ u_turn; } else if( FastTimer(0) >=70){ turn_right; } else if(SENSOR_3 > BLACK ){ turn_left; } }
行動内容:クリアされたタイマー3が8秒経過するまでの間に以下の条件のうち当てはまる行動をする。
Off(OUT_AC); Wait(50); ClearTimer(3); ClearTimer(0); ClearTimer(1);
⑻l105~118
またも前述同様ライントレースを行う。ここでは線外での回転の方向が異なるという違い以外に回転する秒数を変えてある。これは回転する秒数を大きくしてしまうと近くに存在する線を認識し道を違えてしまうため、回転する秒数を小さくし機体本体の振り幅を小さくすることで解決するためである。最終到着地は秒数によって設定してある。
while (FastTimer(3) <= 750){ if (SENSOR_3 < BLACK){ go_forward; Wait(10); ClearTimer(0); ClearTimer(1); } else if(SENSOR_3 > BLACK && FastTimer(0) >=40){ n_turn; } else if(SENSOR_3 > BLACK && FastTimer(1) >=10){ turn_left; } else if(SENSOR_3 > BLACK){ turn_right; } }
行動内容:クリアされたタイマー3が8秒経過するまでの間に以下の条件のうち当てはまる行動をする。
⑼l121~127
マシンの方向をゴール方向に向けマシン前方のアームを上げ球を発射する。方向の調節は秒数によって設定してある。
Off(OUT_AC); Wait(100); OnRev(OUT_AC); Wait(60); Off(OUT_AC); turn_right; Wait(42); OnFwd(OUT_B); Wait(20); Off(OUT_B); Off(OUT_AC); }
行動内容:両側の車輪と接続されているモーターを一端停止させ、0.6秒バックする。次に少し右に曲がりゴール方向へと車体を曲げる。最後にアーム部分と接続されているモーターを動かし上にアームを持ち上げピンポン球を発射する。
⑽注意
A=左側のモーターを駆動させ車輪を回転させる。 B=アームを動かすためのモーターと結合してある。 C=右側のモーターを駆動させ車輪を回転させる。
センサー3=光センサーが接続されている。
プログラムに置けるタイマーの利用は・・・
各⑵〜⑼内のそれぞれにおいて秒数による調節をするために用いてある。
マシン本体について解説していく。
⑴土台
土台は安定する範囲内で横幅を細くしようとした。結果的にはモーターを真横に並べた幅となった。
⑵アーム
球を掴み、発射することは今回の課題において大きな部分をしめている。中には発射をしない班もあったようだが当班はそこにはこだわった。
まず、前方にある黄色のアームは球を取りこぼれ落ちないようにするためのものである。
球の後方にある黒色のアームは球を抑えておくこともそうだが発射をするための目的が大きい。前方のアームが上に上がるのと同様に黒のアームも上がる。そのときに球は後ろから押されるので球がきれいに前に発射される。
⑶全体
全体像としては縦長である。イメージとしてはロンドンバスであろうか、それにアームが着いている形である。これはどうしても外れやすい部品が何カ所かあったため部品の固定をやっているとたてながになってしまったからである。
上記以外の点についての良い点悪い点。
もう少し時間があればと思う点が多々あったのでその点を次回には行かせるようにしていきたいと思った。また、まだまだ動作時間が長いのでスピードを上げられるようにシステム面で変更が考えられたがそこまで手が回らなかった。