目次
課題3の大まかな概要については,空き缶を運搬するロボットを作り,指定箇所へ空き缶を運搬し,積み上げ,運搬・積み上げ方法による空き缶の位置を基準とした基礎点と,ロボットに対する工夫や空き缶の運用・積み上げの華麗さを基準とした技術点により点数を競うというものだった. (詳しくは,ロボティクス入門ゼミの2018年前期 課題3参照)
フィールドは,課題2のコースにスタート地点をつけ足したもので,私たちの班はライントレースをしないプログラミングをした.私たちの班は,2台のロボットを作成し,それぞれのロボットが以下のような軌道を通り,空き缶を運ぶようにプログラミングをした.
私たちは超音波センサーを搭載した,同じ型のロボットを2台作成した.全体像としては,超音波センサーに加え,空き缶を移動させるためのアームを取り付けた形である.
超音波センサーは空き缶の位置を特定するために取り付けた.空き缶をしっかり見つけるために,できるだけコースの全体像を見渡せる正面に取り付けた.超音波センサーは以下のように取り付けた.
アームは,垂直方向と水平方向を向いたギアをそれぞれ接触させ,噛み合わせることで空き缶を挟み込むことができるようなアームを作成することに成功した.アームは以下の写真のように取り付けた.
得点を取るために私たちが考えたプランとしては,確実に点を取るために,まず,積み上げられている缶を2台のロボットで同時に入れ替え,その後,2段目の缶をつかみ再び入れ替えていくというものだった.この方法では理論上,最低でも6点は取れる予定であった.
今回私たちの班は,2つのロボットを作ったので,それぞれをマスターとスレーブにわけ,Bluetoothでそれぞれを繋げ,スイッチ一つで2台とも動くようにした.
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); } } }
#define CONN 1 [#k5c86b76] 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); }
task main () [#v75aca1d] { 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); } }