- 追加された行はこの色です。
- 削除された行はこの色です。
[[2015a/MemberOnly]]
#contents
*今回の課題 [#e37991ac]
半径1メートル以内にある缶を音響センサーを用いて発見し、ボールを転がしながら缶から25センチまで接近する。そして、そこからシュートを打って缶にボールを命中させる、というものである。その際に、ロボットが缶から半径25センチ圏内にあった場合は、距離が30センチまで離れる様にしなければならない。
*ロボットについて [#d490114e]
今回のロボットは、課題2で用いたものに少し手を加えただけであるので、詳細は課題2で見てほしい。ここでは、課題3用に手を加えた点のみ説明する。
今回のロボットは、課題2で用いたものに少し手を加えただけであるので、詳細は課題2で見てほしい。
ここでは、課題3用に手を加えた点のみ説明する。
**アーム [#sfe5ee77]
以前はボールを転がしながら移動すると、ボールがマシンの中心に収まっていない限り正確なシュートが打てなかった。しかし、今回はアームの構造を変えて、ボールを囲むと同時に移動に支障をきたさない程度に固定できるようにした。
#ref(./IMG_3042.JPG,15%)
#ref(./IMG_3042.JPG,10%)
**超音波センサー [#zcba2ce0]
この課題に不可欠な超音波センサーは、超音波を用いることで物体との距離を測定する事ができる。また、アームの付け根部分に設置したのでアームと物体との距離の誤差が最少になるようにした。
#ref(./IMG_3043.JPG,15%)
#ref(./IMG_3043.JPG,10%)
*プログラム [#z221dfd1]
**定義 [#nc614397]
#define SpinTime 8000 //回転する時間
#deine Spin OnFwd(OUT_C,30);OnRev(OUT_B,30);Off(OUT_BC);Wait(2000); //その場で回転
#define Sekkin OnFwd(OUT_BC,20);Wait(500);Off(OUT_BC);Wait(3000); //缶の方向に接近
#define Shoot OnRev(OUT_BC,50);Wait(200);Off(OUT_BC);OnRev(OUT_A,30);Wait(500);OnFwd(OUT_BC,100);Wait(200);Off(OUT_BC); //ボールをシュート
#define SpinTime 8000
#define Stop Off(OUT_BC);Wait(500);
#define Spin OnFwd(OUT_C,25);OnRev(OUT_B,25); //その場で回転
#define Sekkin OnFwd(OUT_BC,25);Wait(1000); //少し前に進む
#define Shoot_position 25
#define Shoot OnRev(OUT_BC,50);Wait(200);Off(OUT_BC);OnFwd(OUT_A,30);Wait(500);OnFwd(OUT_BC,100);Wait(200);Off(OUT_BC);Wait(10000);
#define Back OnRev(OUT_BC,25);Wait(3800);
**本体のプログラム [#b5bdf3f2]
缶の探し方は、一度その場で回転して缶を見つけ、その方向に少し移動する。ここで、同じ動作をもう一度繰り返しす事によって缶の位置を正確に測定できるした。そして、缶が25センチの位置に来たらシュートを打つようにした。
task main()
缶の探し方は、一度その場で回転して缶を見つけて仮の最小値を更新し、缶の方向へ少し移動する。そして、もう一度同じ動作を繰り返してから缶まで半径25センチの位置まで近づき、シュートを打つ。2回同じ動作をさせている理由は、缶の位置を正確に計測しボールを当てやすくするためである。また、もし缶が予め半径25センチ以内にあった場合は、バックして半径30センチ以上離れてから通常の缶にボールを当てるプログラムが動くようになっている。
task main()
{
SetSensor(S3); //
int d_min = 100; //仮の最小値
repeat(2){ // 下の論理式の繰り返し
while(true){
long t = CurrentTick(); //時間の設定
while(CurrentTick()-t<= SpinTime){
Spin; //回転
if(SetSonsor(S3) < d_min){ //測定された距離が仮の最小値より小さい時
d_min=SetSensor(S3); //仮の最小値更新
}
}
Spin; //回転
until(SetSensor(S3) == d_min); //センサーが仮の最小値になるまで
Sekkin; //
SetSensorLowspeed(S2);
int d_min=100; //物体までの距離の仮の最小値を1メートルと設定。
int COUNT=0;
long t0=CurrentTick();
/*缶が予め半径25センチ圏内の時*/
while(CurrentTick()-t0 <= SpinTime){
Spin;
if(SensorUS(S2) < Shoot_position){
Back; //バックして缶から半径30センチ圏外まで移動。
COUNT++;
}
}
/*缶が予め半径25センチ圏外の時*/
while(COUNT <= 1){
long t = CurrentTick();
while(CurrentTick()-t <= SpinTime){ //8秒間回転し、その間に缶との距離を計測し最小値を更新。この8秒とは、マシンが一回転して全方向をセンサーで調べられるようにワザと長めに設定した。
Spin;
if(SensorUS(S2) < d_min){
d_min=SensorUS(S2);
}
}
if(COUNT == 0){ //回転して缶の位置を測定、そして缶の方向へ少し接近。その際にカウンターをプラス1する。カウンターは1未満だと再び上のwhile(COUNT <= 1)を繰り返すので、もう一度缶を探す事が出来る。
Spin;
until(SensorUS(S2) == d_min);
Sekkin;
COUNT++;
} else { //カウンターが1の時はこのelse内のプログラムが実行される。これは回転した後、缶から半径25センチ圏内に入った時ボールをシュートするようになっている。
Spin;
until(SensorUS(S2) == d_min);
Sekkin;
until(SensorUS(S2) <= Shoot_position);
Shoot;
}
}
while(COUNT == 2){ //カウンターが2になるとプログラムが終了する。
Off(OUT_BC);
Wait(10000);
}
Shoot;
}
}
*課題3に対する感想 [#g7159432]
今回は課題2のロボットにセンサーを付け、アームを改良しただけだったのでロボット製作に苦労する事は無かった。また、プログラムも比較的使えるようになって来たので大きく苦労する事はなかったが、缶の捜索において、2度同じプログラムを使用して精度を高めるという案を思いつくのが大変だった。
今回は課題2のロボットにセンサーを付け、アームを改良しただけだったのでロボット製作に苦労する事は無かった。しかし、プログラムはロボットに送る際エラーが多発し、原因を究明するのはとても大変であった。また、缶を探すにあたって2度同じプログラムを実行させる事で、ボールを缶にぶつける精度を上げるというアイディアを思い付くのにとても苦労した。