- 追加された行はこの色です。
- 削除された行はこの色です。
[[2014a/Member]]
目次
#contents
今回の課題
#contents
メンバー
#contents
ロボ本体
#contents
プログラム
#contents
感想・反省
今回の課題
*今回の課題 [#eb4d9be2]
図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 コースの詳細については授業中説明する(下の図において、黒い線の太さは20mmで、線の中央までの距離がcm表示されている)。
スタート地点から出発し、黒い線にそって動く。
一つ目の十字の交差点と二つめの十字の交差点の間に置かれたピンポン玉をつかむ。
さらに黒線に沿って動いてゴール地点を目指す。
ゴールに向けてピンポン玉をシュートする。
ただしT字路では、直進、右折、左折を正しく判断させること。また二人一組で同じロボットを使用し、互いにスタート地点とゴール地点を入れ替えること。ロボット本体は共通のものを使うとする。
さらに以下のような動作に挑戦することが望ましい。
ゴールエリア外からピンポン玉をシュートする。
曲線部中央の障害物に接触しないようにすること。
#ref http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2014a%2FMission1&openfile=2014a-mission1.png
メンバー
*メンバー [#r721ebf1]
saborijini,hodaka
ロボ本体
*ロボ本体 [#k3d43183]
1.ベース部分
細かいコースを走るためにコンパクト化を図った。
#ref http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=P1040021.JPG&refer=2014a%2FMember%2Fhodaka%2FMission1
&ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=P1040021.JPG&refer=2014a%2FMember%2Fhodaka%2FMission1,30%);
小さい写真になってしまったが、ボールをキャッチするまではアームを上げたこの状態で進む。
#ref http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=P1040024.JPG&refer=2014a%2FMember%2Fhodaka%2FMission1
&ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=P1040024.JPG&refer=2014a%2FMember%2Fhodaka%2FMission1,30%);
ボールをキャッチするとアームが下がったこの状態で進む。
#ref http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=P1040025.JPG&refer=2014a%2FMember%2Fhodaka%2FMission1
&ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=P1040025.JPG&refer=2014a%2FMember%2Fhodaka%2FMission1,30%);
プログラム
*プログラム [#pa83204d]
以下はhodakaが作ったプログラムだが、あまりうまく動作しなかった。
定義
#define IKICHI 45
#define SPEED_HIGH 45
#define SPEED_LOW 30
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_C,speedL);
#define go OnRL(SPEED_HIGH,SPEED_HIGH);//直進する
#define turn_left OnRL(SPEED_HIGH,0);//左折する
#define senkai_left OnRL(SPEED_LOW,-SPEED_LOW);//左旋回する
#define turn_right OnRL(0,SPEED_HIGH);//右折する
#define senkai_right OnRL(-SPEED_LOW,SPEED_LOW);//右旋回する
#define STEP 1
#define nMAX 300
#define short_break Off(OUT_AC);Wait(1000);//小休憩
#define CROSS_TIME 200
#define cross_line OnRL(SPEED_HIGH,SPEED_HIGH);Wait(CROSS_TIME);short_break;//交差点を渡る
#define UP_DOWN 38
#define catch OnFwd(OUT_B,UP_DOWN);Wait(600);Off(OUT_B);//アームを下ろす
#define release OnRev(OUT_B,UP_DOWN);Wait(600);OnRev(OUT_AC,45);Wait(500);OnFwd(OUT_B,UP_DOWN);Wait(600);
OnFwd(OUT_AC,45);Wait(500);Off(OUT_AC);//アームを一旦上げ、後退して再びアームを下ろし、前進する
タスク
task main()
{
SetSensorLight(S1);//光センサーをセット
int nOnline=0;
long t0 = CurrentTick();//時間を測る
if(CurrentTick-t0=1500){catch;}
else if (CurrentTick-t0=4000){release;}
go;//ライントレースのプログラム
Wait(500);
while(true){
while(nOnline < nMAX){
if(SENSOR_1 < IKICHI-7){
senkai_right;
nOnline++;
}else{
if(SENSOR_1 < IKICHI-7){
senkai_right;
}else if (SENSOR_1 < IKICHI+7){
go;
}else if (SENSOR_1 < IKICHI+10){
senkai_left;
}else{
senkai_left;
}
nOnline=0;
}
Wait(STEP);
}//交差点のプログラム
short_break;
senkai_left;Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
}
そして、以下がsaborijiniが協力してくれた優秀なプログラムである。
ライントレースを基本とし、スタートからの経過時間を測ってアームを下ろし、ボールを運び、ゴールまで運ぶ。ということを考えていたのだが、経過時間は電池の消耗具合などによって誤差が生じることが多く、うまくいかなかった。そして、以下がsaborijiniが協力してくれた優秀なプログラムである。
定義
#define Line 44
#define Max 1
#define speed 36
#define step 1
#define time 210
サブルーチン
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);//光センサーをセット
int nOnline=0;
int nCrossline=0;
go_fwd();
until(SENSOR_1 <= Line);//黒い線まで直進
short_break();//小休止
cross();//黒線を横断
short_break();//小休止
while(nCrossline < 4){
while(nOnline < Max){
if(SENSOR_1 < Line-12){
turn_right();nOnline++;
}else{
if(SENSOR_1 < Line-7){
turn_right();
}else if(SENSOR_1 < Line+7){
go_fwd();
}else{
turn_left();}
nOnline=0; }
Wait(step); }
cross();
short_break();
nOnline=0;
nCrossline++;
if(nCrossline < 2){
OnFwd(OUT_AC,speed);
Wait(50);
turn_right();
Wait(250);
short_break();
OnFwd(OUT_B,28);
Wait(680);
Off(OUT_B); }}
while(nOnline < Max){
if(SENSOR_1 < Line-12){
turn_right();nOnline++;
}else{
if(SENSOR_1 < Line-7){
turn_right();
}else if(SENSOR_1 < Line+7){
go_fwd();
}else{
turn_left();}
nOnline=0; }
Wait(step); }
cross();
short_break();
nOnline=0;
nCrossline++;
if(nCrossline < 2){
OnFwd(OUT_AC,speed);
Wait(50);
turn_right();
Wait(250);
short_break();
OnFwd(OUT_B,28);
Wait(680);
Off(OUT_B); }}
OnRev(OUT_B,28);
Wait(680);
Off(OUT_ABC);
}
このプログラムは完璧に動作し、課題1の発表は成功した。しかし、僕はこのプログラムをいまひとつ理解できていない。詳しくはsaborijiniのページ http://yakushi.shinshu-u.ac.jp/robotics/?2014a%2FMember%2Fsaborijini%2FMission1#x0709217を参考にしていただきたい。
感想・反省
*感想・反省 [#g016d933]
何より苦労したのはプログラミングである。思うように動かず、自分一人の力ではまともにライントレースすることさえできたかわからない。saborijiniの協力があってやっと動くところまでこぎつけた。
ロボに関してはdaiの班のベースを参考にコンパクトにすることを意識した。
いずれもみんなの協力あってこそである。次回の課題2にむけて、もう少し独力でできるようになりたい。