ロボティクス入門ゼミ3つ目の課題は、紙コップを運び、重ねるロボットを作ることでした。細かいルールは省略します。
これが今回作成したロボットです。光センサー、超音波センサー、左右のタイヤはマスター側、アームを動かす2つのモーターはスレーブ側が操作します。
紙コップの運び方について説明します。
まず、超音波センサーで紙コップとの距離を測りながら近づき、紙コップがアームの下に来たら止まります。
次に、アームを下げ、
アームについているタイヤを回して紙コップを引き上げます。
アームを上げます。
持ち上げた紙コップを他の紙コップの上に下ろし、重ねたものをまた同じように持ち上げて運ぶというように考えました。
ここで今回の課題の結果を書き、なぜその結果に至ったのか説明したいと思います。結果は基本得点0点、技術点2点でした。この班のロボットは紙コップを運ぶことができませんでした。紙コップの付近で止まり、持ち上げたり、下ろしたりする動作はできていたのですが、ライントレースができないというロボットの欠点により、この結果になりました。ライントレースができない理由は2つ考えられます。
この班ではマスター側とスレーブ側の2つを使って1つのロボットを作りました。それにより、ロボットが巨大になり、タイヤとタイヤの間が広くなったことでカーブで内側のタイヤを後ろに回してもカーブを曲がり切れませんでした。課題1,2で使ったロボットのような幅のロボットでないと課題2のコースをライントレースできないことがロボットを作る段階で分かっていれば結果は変わっていました。
課題1,2のロボットに比べて、今回のロボットは圧倒的に重いものになりました。そのため、ロボットを正面から見ると、タイヤが八の字に曲がっていました。モーターの出力を最低でも50以上にしないとすぐ動かなくなってしまうため、出力を上げた結果、カーブで光センサーが線の外に出てしまい、ライントレースができませんでした。
ライントレースができないと気付いた時には、ロボットを作り直すほどの時間は残っていませんでした。課題2でやったライントレースならすぐに終わるだろうと思っていました。そこで、最後の手段として考えたのはスタート地点からまっすぐ紙コップまで行き、1個だけ運んで、紙コップの運搬技術だけでも見てもらうということでした。結局紙コップを運ぶことはできなかったのですが。
Bをスタート地点とし、Cまで直進、紙コップを持ち、ゴール地点まで行き、下ろすというプログラムです。
#define SPEED 50 //スピード50 #define go_forward OnFwd(OUT_BC,SPEED); //前進 #define CONN 1 //スレーブを表している #define SIGNALON 21 //腕を動かすためにマスターがスレーブに送る信号 #define SIGNALOFF 22 //腕を動かし終わったことをスレーブがマスターに送る信号 #define SIGNALON2 31 #define SIGNALOFF2 32 #define turn_leftC OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); //左旋回 #define turn_rightC OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED); //右折 task main() { int msg //MAILBOXに来る信号をmsgと定義する SetSensorLowspeed(S1); //端子1に超音波センサ go_forward; //前進 until(SensorUS(S1) <= 9); //センサの半径9cmに紙コップが入ったら停止 Off(OUT_BC); SendRemoteNumber(CONN,MAILBOX1,SIGNALON ); //信号を送る while (true){ ReceiveRemoteNumber(MAILBOX2,true,msg); //msgを受け取っている間 if (msg == SIGNALOFF ){ //信号を受け取ったら左旋回する turn_leftC; Wait(1600); Off(OUT_BC); go_forward; //前進 Wait(1000); Off(OUT_BC); SendRemoteNumber(CONN,MAILBOX1,SIGNALON2 ); //腕を動かすために信号を送る if (msg == SIGNALOFF2 ){ //信号を受け取ったら左旋回し、停止 turn_leftC; Wait(1000); Off(OUT_BC); }else { //それ以外では停止したまま Off(OUT_BC); } } }
#define SIGNALON 21 //腕を動かすためにマスターがスレーブに送る信号 #define SIGNALOFF 22 //腕を動かし終わったことをスレーブがマスターに送る信号 #define LIFT_up OnRev(OUT_C,35);Wait(520);Off(OUT_BC); //腕を上げる #define LIFT_down OnFwd(OUT_C,20);Wait(550);Off(OUT_BC); //腕を下ろす #define CATCH OnFwd(OUT_B,60);Wait(2000);Off(OUT_B); //紙コップを持つ #define RELEASE OnFwd(OUT_B,50);Wait(1500);Off(OUT_B); //紙コップを離す #define CONN 0 //マスターとつながっている #define SIGNALON2 31 #define SIGNALOFF2 32 void ude() //サブルーチン { LIFT_down; CATCH; LIFT_up; CATCH; Off(OUT_B); } task main () { int msg; while (true) { ReceiveRemoteNumber(MAILBOX1,true,msg); //msgを受けている間 if (msg == SIGNALON) { //信号を受け取ったら紙コップを持ち上げる ude(); SendResponseNumber(MAILBOX2,SIGNALOFF); //本体に次の行動をするように信号を送る } if (msg == SIGNALON2) { //信号を受け取ったら紙コップを離す RELEASE; SendResponseNumber(MAILBOX2,SIGNALOFF2); //本体に次の行動をするように信号を送る } else { //どちらでもなかったら動かない Off(OUT_BC); } } }
今回の課題はこれまでの課題より圧倒的に難しく感じました。ロボット作りにかなり時間がかかったからだと思います。授業を通して、ロボットに自立した、思い通りの動きをさせることの大変さを知ると同時に、とても良い経験になったと思います。
課題2のレポートもできるだけ直しておくので、もし時間に余裕があれば、再評価をお願いします。