[[2014a/Member]]
*今回の課題 [#s226aa99]
図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 コースの詳細については授業中説明する(下の図において、黒い線の太さは20mmで、線の中央までの距離がcm表示されている)。
スタート地点から出発し、黒い線にそって動く。
一つ目の十字の交差点と二つめの十字の交差点の間に置かれたピンポン玉をつかむ。
さらに黒線に沿って動いてゴール地点を目指す。
ゴールに向けてピンポン玉をシュートする。
ただしT字路では、直進、右折、左折を正しく判断させること。また二人一組で同じロボットを使用し、互いにスタート地点とゴール地点を入れ替えること。ロボット本体は共通のものを使うとする。
さらに以下のような動作に挑戦することが望ましい。
ゴールエリア外からピンポン玉をシュートする。
曲線部中央の障害物に接触しないようにすること。
課題1のコース
&ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2014a%2FMission1&openfile=2014a-mission1.png);
*ロボット解説 [#gdd343b7]
&ref(IMG_0141.JPG);課題コースのカーブの半径が小さいので出来るだけ車体を小さくしました。車幅が小さくなって機動性が上がったと思います。
&ref(IMG_0142.JPG);光センサを地面に対して垂直にタイヤの近くに設置しました。これにより黒線の認識がより正確になったと思います。
&ref(IMG_0143.JPG);これはアームを上げた状態です。アームのモーターを積み上げることで車体をコンパクトに収め、アームが球に接触してしまうのを防ぐようにしています。
&ref(IMG_0144.JPG);これはアームを下した状態です。アームは球をつかむのではなく、コの字と車体で球を囲むようにしました。このアームで多少の球との位置のズレも許容されます。
*プログラム解説 [#x0709217]
#define Line 43 //黒と白の境界値
#define Max 10 //黒の認識(左旋回)を連続で行える最大値
#define speed 30 //移動に用いるモーターのスピード
#define step 1 //ライントレースする間隔時間(0.001秒)
#define time 190 //黒線を横断する時間
sub go_fwd()
{ OnFwd(OUT_AC,speed); } //前進
sub turn_left()
{ OnFwd(OUT_A,speed);OnRev(OUT_C,speed); } //左旋回
sub turn_right()
{ OnRev(OUT_A,speed);OnFwd(OUT_C,speed); } //右旋回
sub short_break()
{ Off(OUT_AC);Wait(700); } //一時停止
sub cross()
{ OnFwd(OUT_AC,speed);Wait(time); } //黒線を横断
task main()
{
SetSensorLight(S1); //センサ1に光センサを設置
int nOnline=0; //センサが黒線に反応した回数を0に定義
int nCrossline=0; //黒線に横断した回数を0に定義
go_fwd(); //黒線になるまで前進
until(SENSOR_1 <= Line);
short_break(); //一時停止してから黒線を横断して一時停止
cross();
short_break();
while(nCrossline < 4){ //3回黒線を横断する間は下記を繰り返す
while(nOnline < Max){ //�々�の認識が最大値より小さい間は下記を繰り返す
if(SENSOR_1 < Line-15){ //センサ<境界値-15で左旋回・黒の認識が1回増える
turn_left();nOnline++;
}else{
if(SENSOR_1 < Line-7){ //境界値-15<センサ<境界値-7で左旋回
turn_left();
}else if(SENSOR_1 < Line+7){ //境界値-7<センサ<境界値+7で前進
go_fwd();
}else{
turn_right();} //それ以外(境界値+7<センサ)で右旋回
nOnline=0; } //黒の認識をリセット
Wait(step); } //�,�0.001秒の間隔で行う
cross(); //黒の認識が最大値以上になったら黒線を横断
short_break();
nOnline=0; //黒の認識をリセット
nCrossline++; //黒線を横断した回数を1回増やす
if(nCrossline < 2){ //横断回数が2回より小さい(1回)時↓
OnFwd(OUT_AC,speed); //少し前進し右旋回してから一時停止
Wait(200);
turn_right();
Wait(180);
short_break();
OnFwd(OUT_B,28); //バーを下ろす
Wait(680);
Off(OUT_B); }
}
OnRev(OUT_B,28); //横断4回目になる時バーを上げて全停止
Wait(680);
Off(OUT_ABC);
}
*感想 [#eb84fb1a]
今回の課題では車体を作ることよりもプログラムをゼロから作るほうが大変でした。今まで習ったプログラムで、如何にして自分の想像した動作を表すかが難しかったです。特にバーの上げ下げのタイミングに多く時間を費やしました。どこに球があってどこで終わりなのか、の表現を始めは時間を用いてやろうとしました。しかしこの方法ではバッテリーや床の環境次第で設定し直さなければなりませんでした。そのため横断回数のカウントとifを用いてタイミングを決めました。出来たら超音波センサを使ったプログラミングに挑戦したいと思います。