- 追加された行はこの色です。
- 削除された行はこの色です。
[[2015b/MemberOnly]]
#contents
*課題 [#ce5eb945]
&size(20){ボールを離れた場所から缶に当てるロボットとボールを回収するロボット};
**ミッション [#k8bc0ce7]
課題2で作成したコースを用いてタイムレースを行う。
#ref(2015b/Member/velocity/Mission3/2015b-mission3.png,50%,コース)
***ルール [#g792ab8d]
-競技時間はロボットAがSTART A地点のスタートラインを横切って、ロボットBがGOAL B地点のゴールラインに達するまで、あるいは審判が続行不能と判断するまで。
-ロボットAはSTART A地点から出発し、P地点におかれた赤いボールを拾って350mlのアルミ缶に当てる。-その後、ロボットBがボールを回収する。引き続き青いボールについても同様の動作を繰り返す。ロボットBはボールを回収した後、最終的にGOAL Bまでボールを運ぶ。
-アルミ缶は中身が入っているものを使う。
-RISのチームはアルミ缶の上に灯台としてランタンを置く。
-ボールがアルミ缶に当たる前にロボットBがボールに触ってはいけない。
-ロボットAはセンターラインを超えては行けない。
-アルミ缶を5cm以上動かした場合は減点
*ロボット [#j4091ad3]
今回使用したロボットは赤外線センサーを用いた次のようなロボットである。
なお、私たちが担当したのはロボットB(受けて側)である。
#ref(2015b/Member/velocity/Mission3/robot.jpg,50%,ロボット)
**仕組み [#fc786aec]
***キャッチ方法 [#j5cc1124]
通常はこのような形で走行する。
#ref(2015b/Member/velocity/Mission3/normalrun.jpg,50%,ノーマル走行)
この形のままボールキャッチ位置まで移動してくる。
腕の先の赤外線センサーがボールがアルミ缶に向かって来たことを認識すると次の写真のようにもう一方の腕が落ち、ボールをキャッチする。
#ref(2015b/Member/velocity/Mission3/catchrun.jpg,50%,キャッチ)
しかし写真を見ても想像できるだろうが、これではアルミ缶も一緒にキャッチをしてしまう。
そこで活躍するのがこの長い腕である。
アルミ缶とボールを両方キャッチした後、ロボットは後退する。すると長い腕は重みのあるアルミ缶に引っかかりしなり、いずれアルミ缶だけを手放すことができるという仕組みである。(下図)
#ref(2015b/Member/velocity/Mission3/structure1.jpg,50%,キャッチ1)
#ref(2015b/Member/velocity/Mission3/structure2.jpg,50%,キャッチ2)
#ref(2015b/Member/velocity/Mission3/structure3.jpg,50%,キャッチ3)
#ref(2015b/Member/velocity/Mission3/structure4.jpg,50%,キャッチ4)
#ref(2015b/Member/velocity/Mission3/structure5.jpg,50%,キャッチ5)
***後ろに伸びた長い棒 [#j3a9a128]
この棒は錘である。
このロボットは前に長い構造をしている。そのため重心が前にいってしまいタイヤが浮いてしまいうまく進まないということが起きた。そこでつけられたのがこの錘である。
#ref(2015b/Member/velocity/Mission3/weight.jpg,50%,錘)
一番上ではフィグがロボコンの様子を見物している。
#ref(2015b/Member/velocity/Mission3/fig.jpg,50%,フィグ)
*プログラム [#b8919fb0]
**定義 [#cb8e16a6]
#define GO 10
#define STOP 99
#define ready 20
#define speed 35
今回は正確さが勝負になるので、電池の増減にも対応できるようスピードを定義した。他のGO, STOP, readyに関してはペアのロボットとの通信用として用いた。
**関数 [#r57b3ff8]
void move1() {
int msg = STOP;
Off(OUT_B);
RotateMotorEx(OUT_AC,speed,850,0,true,true);
RotateMotorEx(OUT_AC,speed,850,0,true,true); //前進
while (msg != GO) { //メッセージを受信
while (msg != GO) { //信号1を受信するまで待ってろ
Off(OUT_ABC);
Wait(1);
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
void move2() {
RotateMotor(OUT_C,speed,-320);
RotateMotor(OUT_C,speed,-320); //回転して缶の方を向け
OnFwd(OUT_AC,1);
Wait(1);
}
void move3(){
RotateMotorEx(OUT_AC,speed,-200,0,true,true);
RotateMotorEx(OUT_AC,speed,-200,0,true,true); //缶に近づけ
}
void catch(){
long t = 0;
SetSensorLowspeed(S4);
SendResponseNumber(MAILBOX1,ready); //メッセージを送信
SendResponseNumber(MAILBOX1,ready); //信号2を送信
while(true) {
if (SensorUS(S4) >= 30 && t <= 500){
while(true) { //赤外線が反応するか、一定時間たっ
if (SensorUS(S4) >= 30 && t <= 500){ //たら腕を降ろせ
t++;
Wait(1);
} else {
RotateMotor(OUT_B,80,140);
break;
}
}
OnFwd(OUT_B,10);
}
void move4() {
OnFwd(OUT_AC,1);
Wait(1);
RotateMotorEx(OUT_AC,speed,600,0,true,true);
RotateMotorEx(OUT_AC,speed,600,0,true,true); //後退しろ
Off(OUT_B);
}
void AfterCatch() {
RotateMotor(OUT_C,speed,-340);
RotateMotor(OUT_C,speed,-340); //帰れ
OnFwd(OUT_AC,1);
Wait(1);
RotateMotorEx(OUT_AC,speed,-900,0,true,true);
}
**タスクメイン [#c5fd46f5]
task main()
{
move1();
move2();
move3();
catch();
move4();
AfterCatch();
}
*動き方 [#mb819146]
#ref(2015b/Member/velocity/Mission3/moving.png,50%,動き方)
*最後に [#b739bbd9]
**工夫点 [#p44662f6]
-ボールとアルミ缶の判別
初め、どこにボールがあるのか、どこにアルミ缶があるのかを判別し、ボールだけを回収するということを考えていた。しかし、ボールとアルミ缶をどう見分けるかで行き詰まった。
そこで判別を諦め、両方キャッチし、アルミ缶だけ逃がすという方法を考えた。しいて言うと重さ、動きやすさで判別したと言えるだろう。
詳しくは「仕組みのキャッチの項目」に図を用いて説明してある。
-キャッチのタイミング
ペアのロボットから来たボールをどう認識するか、最初は時間制御でやっていた。しかし電池の残量によって変わってきてしまうため赤外線を使った認識へと変えた。
赤外線センサーの前を横切りキャッチゾーンに入るとそれを赤外線センサーが感知して腕を下ろすという仕組みである。
#ref(2015b/Member/velocity/Mission3/sesororder.jpg,50%,赤外線)
-2台のロボットの連携
今回はロボットを2台使っているため、それぞれがペアのロボットを意識して動かなくてはいけない。つまり邪魔をしてはいけないということだ。ペアのロボットは赤外線でアルミ缶探し、アルミ缶の方にボールを投げるという仕組みである。しかしこちらのロボットが大きいために、アルミ缶の前で構えているこちらのロボット反応してしまい、間違った方向にボールを投げてしまうということが多発した。
そこで思いついたのが通信である。私達のロボットBはAがアルミ缶の位置を把握してからアルミ缶の前で構えることとした。
Aがアルミ缶を探す
↓
A準備OK!(信号を送る)
↓
B出発
↓
B構える
↓
B準備OK!(信号を送る)
↓
Aボール投げる
↓
ボール、キャッチゾーンに侵入
↓
Bキャッチ
という流れである。
**壁 [#l2fd43a4]
-ロボットの形状
上でも述べたが、大きいロボットとなってしまったのでバランスを取ることが難しかった。片方のタイヤが浮いてしまい曲がることができないなどの支障が生じた。その解決策としてあの長い錘をつけた。
形状での問題点は重さだけでなかった。腕の一部がコースの紙の端に引っかかるということがあった。
これに関しては紙をテープで固定することで解決する。
-赤外線の誤作動
数回に一回赤外線が反応しなく、ボールが来ているのに腕を降ろさないことがあった。そこでその誤作動をなくすため、ある一定時間反応がなかったら腕を降ろして次の動作に行くようにした。
本当はボールが来てすぐ閉じた方が確実にボールを捕まえられるのだが、もしもの場合にそなえてこのプログラムを入れておいた。
**改善点・欠点 [#j3714d85]
何度も述べている通り、大きさである。やはりロボットはできるだけコンパクトに作るべきだと思う。しかし今回の構造では大きいことを活かした構造なので、小さく作る場合は構造自体を買える必要がある。
そして一番の問題はボールのキャッチミスである。実際本番はキャッチミスをしてしまった。アルミ缶と一緒に外に出てしまうということがまれに起こった。これに関してはボールが当たる位置をもっと正確にすることでこういうことがなくなると思う。キャッチする側としてできることは腕を下ろした後、腕の中で危ない位置関係にならないよう腕を振るということもできただろう。
**感想 [#zf9ff89d]
課題1はロボット中心、課題2がプログラム中心、そして課題3はロボット、プログラム両方重視した課題となっていると感じた。今回は今までで一番大変な課題だった。今までの2つの課題と違い、いろいろな行動を組み合わせなくてはいけない。移動、ボールを投げる拾う、ライントレース、、、その分プログラムも難しくなっていた。この3回の課題でプログラムを書く技術が上げられたと思う。
課題1はロボット中心、課題2がプログラム中心、そして課題3はロボット、プログラム両方重視した課題となっていると感じた。今回は今までで一番大変な課題だった。今までの2つの課題と違い、いろいろな行動を組み合わせなくてはいけない。移動、ボールを投げる拾う、ライントレース、、、その分プログラムも難しくなっていた。この3回の課題でプログラムを書く技術が上げられたと思う。task mainの中を簡単にできたのも成長だなと思った。