[[2013a/Member]]
*ロボットの紹介 [#fd1e0fdb]
私たちのグループは下のようなロボットでMission2のロボコンに挑みました。
#ref(ロボ1.jpg)
まず、このロボットの一番の特徴といえば、なんといってもこのアームです。
このアームでは方向転換をしないでパスを出したり、受けたりできます。このことによって、プログラムの作成は格段に楽になりました。
#ref(無題-A.jpg)
このアームは結構角度の微調整が可能なので、ボールをキャッチするときにボールが奥に入って、さらに、打ち出す時にいい感じに斜めに飛ぶようにします。しかし、この微調整が毎回バッテリーの調子やコースの紙の状態によって異なるので大変でした。ボールをキャッチするときには、アームのモータを正方向に回転させて、ボールを奥に取り込んだらタッチセンサーが反応して止まるようにしました。このタッチセンサーにはボールが当たって反応しやすいようにべこべこしたものを取り付けました。ボールを打ち出す時には負の方向に回転させて、単純にボールを打ち出します。このアームを取り付けると重心が前になりすぎてしまうので、小さいタイヤを取り付けてロボットを安定させました。ここも、タイヤの高さを調節したり、タイヤが動くように調整するのが大変でした。
#ref(無題-B.jpg)
このロボットは往復でターンすると向きが変わってアームが外に向いてしまうという欠点がありました。その欠点を補うために後ろにも光センサーを取り付けました。この光センサーを使って、帰りはバック走することで行きの時と同じようにパス交換ができるようになりました。~
また、どうしてもパス交換の時に方向転換したくなかったので、ドライブベースも横向きに設置しました。こうすることによって、進行方向を向いたまま相手のロボットと通信できるようになりました。しかし、結局通信は使いませんでした。
*コース攻略 [#h8b19d4f]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2013a%2FMission2&src=robocon2013a.png
このロボットはアームがコースの内側を向いている行きの時には、進行方向を向いているだけでボールをキャッチしたり、打ち出したりして、パス交換ができるのですが、帰りにはアームが外側に向いてしまい、通常の進行方向にボールを打ち出すロボットよりも長い時間旋回しなければなりませんでした。そこで、ロボットの後ろにも光センサーを取り付けて、進行方向が変わるときに半回転することなく、そのままバック走することで、この問題を解決することにしました。
ほかの部分はプログラムの作成と並行に説明します。
*プログラムの作成 [#le3d3b4c]
・定義づけ
#define THRESHOLD 40
#define HHIPOWER 7 // 直線とボールを打ち出すとき用の強めのパワー
#define POWER 2 // カーブ、旋回用の弱めのパワー
#define LOWPOWER 0 // ボールをキャッチする用の弱いパワー
#define set_power_HH SetPower(OUT_AC,HHIPOWER);
#define set_power_M SetPower(OUT_AC,POWER);
#define set_power_L SetPower(OUT_B,LOWPOWER);
#define go_forward set_power_HH; OnFwd(OUT_AC); // 前に進む動作
#define go_back set_power_HH; OnRev(OUT_AC); // 後ろに進む動作
#define turn_left1 set_power_M; Off(OUT_A); OnFwd(OUT_C); // 左にカーブする動作」
#define turn_right1 set_power_M; OnFwd(OUT_A); Off(OUT_C); // 右にカーブする動作
#define turn_left2 set_power_M; OnRev(OUT_A); OnFwd(OUT_C); // 左に旋回する動作
#define turn_right2 set_power_M; OnFwd(OUT_A); OnRev(OUT_C); // 右に旋回する動作
#define catch_ball set_power_L; OnFwd(OUT_B); // ボールをキャッチする動作
#define pass_ball set_power_HH; OnRev(OUT_B);Wait(150);Off(OUT_B); // ボールを打ち出す動作
#define STEP 1 // 1回の判断で動作させる時間
・ここからがロボットを動かすための指令
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT); // 「1」のところに光センサーを設置
SetSensor(SENSOR_2,SENSOR_TOUCH); // 「2」のところにタッチセンサーを設置
SetSensor(SENSOR_3,SENSOR_LIGHT); // 「3」のところに光センサーを設置
�〆能蕕縫棔璽襪鮗茲襪箸海�~
ボールをキャッチするところでは、アームの長さを生かして下図の赤い矢印のあたりから左旋回することによってボールを取るようにしました。
#ref(無題-C.jpg)
ClearTimer(0); // タイマーをリセット
while (FastTimer(0) <= 430) { // 4.3秒間、通常のライントレース
if (SENSOR_3 < THRESHOLD-4) {
turn_left2;
} else
if (SENSOR_3 < THRESHOLD-3) {
turn_left1;
} else if (SENSOR_3 < THRESHOLD+5) {
go_forward;
} else if (SENSOR_3 < THRESHOLD+10) {
turn_right1;
} else {
turn_right2;
}
Wait(STEP);
}
PlaySound(SOUND_UP); // 4.3秒間、通常のライントレースを行ったら、ピロピロ〜と高い音を鳴らす
set_power_M; OnRev(OUT_A); OnFwd(OUT_C); Wait(580); // 5.8秒間、左に旋回する
while(SENSOR_2==0){ // タッチセンサーがオフの間、ボールをキャッチする動作を行う
catch_ball;
}
Off(OUT_B);
��ボールを取ってから進行方向にロボットを向けるまで~
ボールを取ってからも光センサーが黒に反応するまで左旋回させることによって進行方向にロボットを持っていくのですが、ボールを取ってからすぐに光センサーを使ってしまうと、初めに逆方向の黒線に反応してしまうので、2秒間タイマーを使って旋回して、初めの黒線を突破してから光センサーを使いました。
Wait(200); // 2秒間、ボールをキャッチするときの左旋回を続ける
Off(OUT_AC);
while (SENSOR_3 > THRESHOLD-5) { // 光センサーが黒い線に反応するまで、左に旋回
turn_left2;
}
Off(OUT_AC);
�ぅ棔璽襪鯊任曾个�~
ロボットを進行方向に向けたら、すぐにボールを打ち出す動作に入ります。そのまま打ってしまうと缶に直撃してしまうので少し戻ってからボールを打ち出します。
go_back;Wait(80);Off(OUT_AC);Wait(100); // 0.8秒間後ろに下がって、1秒間停止
pass_ball; // ボールを打ち出す
�ゥ棔璽襪鯊任曾个靴討�ら、ボールを受けるまで~
通常のライントレースをして、ボールを受ける位置までタイマーを使って移動するのですが、ボールを打ち出した時に後ろに下るので、ラインを脱線してしまうから、少し前に進んでからライントレースを行います。ボールはアームの範囲内に出されると、自然とアームの内側に収まるので、少し左にカーブして、ボールをアームの奥に移動させてからボールをキャッチします。
go_forward;Wait(80);Off(OUT_AC); // 0.8秒間前進して、黒い線に反応できるところまで移動する
ClearTimer(0); // タイマーをリセット
while (FastTimer(0) <= 170) { // 1.7秒間、通常のライントレース
if (SENSOR_3 < THRESHOLD-4) {
turn_right2;
} else
if (SENSOR_3 < THRESHOLD-3) {
turn_right1;
} else if (SENSOR_3 < THRESHOLD+5) {
go_forward;
} else if (SENSOR_3 < THRESHOLD+10) {
turn_left1;
} else {
turn_left2;
}
Wait(STEP);
}
Off(OUT_AC); // 1.7秒間、通常のライントレースを行ったら停止する
Wait(1000); // 相手からのパスがくるまでの10秒間停止して待つ
turn_left1;Wait(100); // 1秒間左にカーブして、ボールをアームの奥まで移動させる
while(SENSOR_2==0){ // タッチセンサーがオフの間、ボールをキャッチする動作を続ける
catch_ball;
}
Off(OUT_B);
PlaySound(SOUND_UP); // ボールをキャッチしたら、ピロピロ〜と高い音を鳴らす
}
ロボコンで発表したプログラムはここまでです。
☆缶に向かってシュート~
缶にシュートするときのプログラムも一応作ってあったので添付します。
最後にブールを受ける位置から、シュートするまでのプログラムです。これは結構高い確率で缶に命中していました。
ここで大事なのは、シュートする位置取りなので1秒前進、0.6秒左に旋回することによって絶好の位置に着きます。ここまできたら、そのままシュートします。
task main()
{
OnFwd(OUT_AC);Wait(100); // 1秒前進
OnRev(OUT_A); OnFwd(OUT_C);Wait(60);Off(OUT_AC); // 0.6秒、左に旋回
OnRev(OUT_B);Wait(100);Off(OUT_B); // ボールを打ち出す
}
*まとめ [#z7aea378]
今回も期限に間に合わずに残念な結果になってしまいました。この講義で私はコンピュータを前にしてプログラミングすることの難しさを思い知らされました。しかし、だんだんやっていくうちに、少しロボットが思い道理に動かせるようになったり、早くプログラムが作れるようなったりしたことは、良かったです。自分は工学部で将来はコンピュータを使った仕事に就くかもしれないので、ここで試行錯誤した経験は将来に生かされると思います。ロボットの組み立ては、相方と協力しながら改良を重ねて、最初は考えもしなかった形になり、楽しかったです。また、ロボコンでは、チームで協力し合うことが大事で、テスト前だったこともあり、なかなか時間を合わせることが難しかったのですが、チームに助けられてここまでできたと思うので、ロボットをする上での仲間の大切さを知りました。チームメイトには感謝したいです。