私達は、3段目の缶を勢いで払い落とし、2段目と1段目の缶を円の中に入れることができるということを目標にロボットを作成した。そのようにした理由は、高得点を狙い過ぎで0点をとってしまうよりも、確実に得点を取りに行ったほうが良いと考えたからである。
私たちは、二機のロボットを連携させることで、缶を運ぶロボットを作ることにした。理由は、ロボットの移動経路を渦巻き状にすることで、左右対称な動きとなり、ロボット制作、プログラミングの両方を簡略化することができると考えたからである。ロボット全体の写真と、移動経路を表した写真は次のとおりである。
移動経路の写真において、紫色で示してある経路がmaster側の移動経路で、青色で示してあるものがslave側の移動経路を表している。master側が缶を探すタイミングでslave側のプログラムが起動するように調整してあるため、二台のロボットが左右対称の動きをし、美しい動きをするようになっている。
・ロボットでの工夫点
私はこのロボットにおいて、アームが最も工夫した点であると考える。私が最も注目してほしい点は、ギアを垂直に接続し、アームの構造も左右対称にすることで、ロボット制作を簡単にすることができたということである。 アームとモーターの接続部分写真は次のとおりである。
写真の左側のタイヤは、アームとこのタイヤの3点で缶をつかむことで、缶がずり落ちてしまう問題を解決することができた。 また、アーム上部の写真は次のとおりである。
アーム先端部分のタイヤのゴムがアームと缶の間の摩擦を大きくし、持ちやすくなっている。また、このアームは、二段目の缶を持つように設計されている。写真では輪ゴムが利用されているが、この輪ゴムは、アームの重心が外側にあるため、ギアが外れやすく、空回りすることが多かったので、ゴムによってそのような問題が発生しないようにするということと、ゴムの色を変えることで、masterとslaveを見分けることにも利用している。
私たちのロボットは、最初の写真のように、移動経路を渦巻き状にすることで、左右対称な動きとなり、プログラムが簡潔に、かつ簡単にすることができるという点を重視し、工夫をした。また、缶を超音波センサーで探し、一定距離まで近づくようなプログラムを整形した。このプログラムが最も苦労した点で、工夫した点あるともいえる。しかし、超音波センサーを利用すること自体が苦労した点であるわけではなく、超音波センサーの認識が速すぎたため、缶に超音波を当てたまま近づくことができるように直進させるため、モーターの出力を調整することに苦労した。また、缶と認識する距離を40cmとすることにより、誤って人に向かって突進することがないようになっている。このプログラムの内容は次のとおりである。
task main () { while(SensorUS(S4)>40) //測った距離が40cm以上の間 { OnFwd(OUT_C,25); OnRev(OUT_B,25); until(SensorUS(S4)<40);//40cm以下まで旋回 if(SensorUS(S4)<40) //40cm以下になったとき { PlaySound (SOUND_CLICK); Wait(50); OnFwd(OUT_C,25); OnRev(OUT_B,25); Wait(150); //缶に対面するように角度調整 OnFwd(OUT_C,30); OnFwd(OUT_B,34); until(SensorUS(S4)<8);//缶との距離が8cmになるまで前進 Off(OUT_BC); Wait(300); OnFwd(OUT_C,30); OnFwd(OUT_B,34); Wait(300); Off(OUT_BC); OnRev(OUT_A,30); //缶を掴む Wait(400); Off(OUT_A); } } }
私達が作成したロボットにmasterとslaveが存在する。最初の経路の写真の紫色で示した経路で缶を運ぶようになっている。masterとは言っても、最初に移動し、slaveのプログラムを衝突しないタイミングで起動するだけである。対角線上に移動するプログラム以外はモーターの出力調整を除いてでプログラムは変わらない。masterのプログラムは次のとおりである。
#define CONN 1 task main () { OnFwd(OUT_C,70); OnFwd(OUT_B,72); Wait(1700); //対角線上になるまで移動する Off(OUT_BC); OnFwd(OUT_A,30); Wait(400); Off(OUT_A); SetSensorLowspeed(S4); //缶を探す while(SensorUS(S4)>40) { OnFwd(OUT_C,25); OnRev(OUT_B,25); until(SensorUS(S4)<40); if(SensorUS(S4)<40) //缶を発見したとき { PlaySound (SOUND_CLICK); Wait(50); OnFwd(OUT_C,25); OnRev(OUT_B,25); Wait(150); OnFwd(OUT_C,30); OnFwd(OUT_B,34); until(SensorUS(S4)<8);//缶との距離が8cm以下になるまで前進 Off(OUT_BC); Wait(300); OnFwd(OUT_C,30); OnFwd(OUT_B,34); Wait(300); Off(OUT_BC); OnRev(OUT_A,30); //缶を掴む Wait(400); Off(OUT_A); } OnFwd(OUT_B,25); OnFwd(OUT_C,25); Wait(1800); //写真の紫の線の楕円軌道の中央部分まで移動 until ( BluetoothStatus(CONN) == NO_ERR ); RemoteStartProgram(1, "slave.rxe"); Off(OUT_BC); Wait(9000); //slaveが青の線の楕円軌道の中央部分まで移動するまで待機する OnFwd(OUT_B,60); OnFwd(OUT_C,25); Wait(3600); //缶を置く場所まで移動する Off(OUT_BC); OnRev(OUT_B,25); OnRev(OUT_C,25); Wait(3600); //誤作動防止と、得点が下がる缶を外に出すため下がる OnFwd(OUT_B,30); OnRev(OUT_C,30); Wait(800); //誤作動防止と、得点が下がる缶を外に出すため旋回する Off(OUT_BC); } OnFwd(OUT_A,30); //得点が下がる缶を円の外に出す Wait(400); Off(OUT_A); }
また、slave側のプログラムは次のとおりである。
task main () { SetSensorLowspeed(S4); while(SensorUS(S4)>40)//缶を探す { OnFwd(OUT_B,25); OnRev(OUT_C,25); until(SensorUS(S4)<40); if(SensorUS(S4)<40)//缶を発見したとき { PlaySound (SOUND_CLICK); Wait(50); Off(OUT_BC); Wait(200); OnRev(OUT_C,25); OnFwd(OUT_B,25); Wait(150); //缶と対面するように角度調整 Off(OUT_BC); Wait(200); OnFwd(OUT_C,20); OnFwd(OUT_B,22); until(SensorUS(S4)<8);//缶との距離が8cm以下になるまで前進 Off(OUT_BC); Wait(300); OnFwd(OUT_C,30); OnFwd(OUT_B,34); Wait(300); //缶との距離をさらに近づけ、つかみやすくするために前進する Off(OUT_BC); OnRev(OUT_A,17); //缶を掴む Wait(800); Off(OUT_A); } OnFwd(OUT_C,35); OnFwd(OUT_B,25); Wait(2800); //緩やかに曲がり、楕円軌道を描きやすくする Off(OUT_BC); Wait(10); OnFwd(OUT_C,25); OnFwd(OUT_B,50); Wait(2000); //円上に缶を運ぶ Off(OUT_BC); OnRev(OUT_A,17); //もう一度缶をしっかり掴む Wait(800); Off(OUT_A); OnRev(OUT_C,25); OnRev(OUT_B,25); Wait(800); //2段目の缶を持ち帰り、得点を狙うための後退 Off(OUT_BC); OnFwd(OUT_B,40); OnRev(OUT_C,40); Wait(1000); //缶を持ち帰る OnFwd(OUT_C,25); OnFwd(OUT_B,50); Wait(1500); //持ち帰った缶を円上まで運ぶ Off(OUT_BC); OnFwd(OUT_A,17); //缶をはなす Wait(800); Off(OUT_A); } }
masterとslaveでプログラムは多少の違いはあるが、slaveのプログラムは、masterのプログラムの多くをコピーして利用することができたため、2台のロボットのプログラミングは、他のグループのプログラミングよりも簡単だったと思う。
私達のロボットは、本番では2点を獲得した。私達は、1点でも得点を獲得することが目標であったので、本来の目的は達成しており、予定の点数よりも多く獲得できている。しかし、私にとってはあまり納得の行かない結果となった。そのようになった理由が2つある。第一に、缶を運ぶとき、2台のロボットが衝突してしまったからだ。私は、前日と当日の調整の時間から、そのような事故が決して怒らないように時間と出力を調整したため、予行練習のときは、衝突や誤作動による事故がなかったため、本番でもうまく行くと考えていた。しかし、本番では、slave側の缶の認識後の動作が2回ともおかしく、缶が8cm以下になるまで前進するプログラムはうまく動作しなかったため、直進し続けてしまい、正常に動作しているmasterと衝突してしまった。この影響で、slaveの運んでいた缶は円上まで運ぶことができず、2点となってしまった。しかし、slaveがmaster側が運んで置く場所にあった缶をすべて押しのけたため、masterの運んできた缶の分の2点を獲得することができた。第二に、全体的に移動の際のスピードが速く、3段目だけでなく、1段目の缶も飛んでいきそうになっていた点である。実際には、1段目の缶は飛び出すことはなく、踏みとどまってはいたが、ラッキーでそのようになったと思う。そのため、全体的な移動スピードを15%ほど下げた状態でプログラムを行えば、より安定した動きとなったと思う。この2点を改善することができていたら、私達のロボットは、6点以上の得点を狙うことが可能だったと考える。