- 追加された行はこの色です。
- 削除された行はこの色です。
[[2018a/Member]]
*目次 [#cba7d61f]
#contents
*課題2.ライントレースロボット [#kfccd99d]
*課題2.ライントレースロボット.概要 [#kfccd99d]
あらかじめ指定されたコースをトレースし,場合によって空き缶を掴むなどの動作をする.
以下の画像は私の担当したコースである.Xで空き缶を掴み,Yで空き缶を離す.
#ref(./2018a-mission2.png,80%,コース画像)
*機体の説明 [#oa7a6e12]
今回私達が制作した機体は下のようなものである.
#ref(./ロボティクス.jpg,90%,全体画像)
今回私達は空き缶を掴む構造は”クワガタ構造”を取り入れたが,ただクワガタ構造にしただけではうまく空き缶がつかめなかったので顎の片側を大きく開くことで機体が左回転をしたときにちょうど手前の顎にはぶつからず,奥の顎にすっぽりハマるように工夫をした.また,機体が左回転をしたときにちょうどそこに空き缶が来るようにアームの長さを調整した.また,最初は顎の高さがなかったため空き缶がうまくつかめなかったので顎に壁をつけることで安定性を調節した.その壁を私達は”ウォール・マリア”と呼んだ.
#ref(./ロボティクス2.jpg,90%,アーム画像)
*プログラムについて [#tc961eeb]
**ライントレースに使用した定義 [#x47c5e37]
#define rightsenkai OnFwd(OUT_A);OnRev(OUT_C);//右旋回
#define rightmagaru OnFwd(OUT_A);Off(OUT_C);//右に曲がる
#define leftsenkai OnFwd(OUT_C);OnRev(OUT_A);//左旋回
#define leftmagaru OnFwd(OUT_C);Off(OUT_A);//左に曲がる
#define sstop Wait(100);//一秒間停止
主に上の定義を使用してライントレースの定義を作成した.
**ライントレースプログラム [#m03642b9]
今回私達はライントレースにおいて以下のように三段階の色を光センサーで判別するようにしました.
#ref(./ライントレース.png,50%,ライントレース画像)
黒い線の左側をライントレースするときに使った定義は以下の3つである.
場合によって左側をトレースしたほうが回りやすかったり右側をトレースしたほうが回りやすかったりすることがあったため左右両方のライントレースを作成した.
#define Line(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(0);while(FastTimer(0)<=t){if(SENSOR_2>60){rightsenkai;ClearTimer(0);}else if(SENSOR_2>59){rightsenkai;ClearTimer(0);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(0);}else if(SENSOR_2>42){leftmagaru;}}Off(OUT_AC);
#define Line1(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(1);while(FastTimer(1)<=t){if(SENSOR_2>60){rightsenkai;ClearTimer(1);}else if(SENSOR_2>59){rightsenkai;ClearTimer(1);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(1);}else if(SENSOR_2>42){leftmagaru;}}Off(OUT_AC);
#define Line2(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(2);while(FastTimer(2)<=t){if(SENSOR_2>60){rightsenkai;ClearTimer(2);}else if(SENSOR_2>59){rightsenkai;ClearTimer(2);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(2);}else if(SENSOR_2>42){leftmagaru;}}Off(OUT_AC);
以下,左側のライントレースである.
#define Line_Rev(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(0);while(FastTimer(0)<=t){if(SENSOR_2>60){leftsenkai;ClearTimer(0);}else if(SENSOR_2>59){leftsenkai;ClearTimer(0);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(0);}else if(SENSOR_2>42){rightmagaru;}}Off(OUT_AC);
#define Line1_Rev(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(1);while(FastTimer(1)<=t){if(SENSOR_2>60){leftsenkai;ClearTimer(1);}else if(SENSOR_2>59){leftsenkai;ClearTimer(1);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(1);}else if(SENSOR_2>42){rightmagaru;}}Off(OUT_AC);
defineで定義したために横にとても長いプログラムとなってしまった.
**交差点の判断 [#td61a106]
交差点の判断方法は黒(42)が35/100秒続いた場合,そこを交差点と判断し一時停止するようにした.黒以外の色以外の色に入った場合タイマーをクリアすることで黒が続いたときのみ停止することに成功した.
**その他の定義 [#k62acc0a]
#define arm_c OnRev(OUT_B);Wait(20);OnFwd(OUT_AC);Wait(10);Off(OUT_AC);leftsenkai;Wait(27);OnFwd(OUT_B);Wait(20);//アームを閉じる
X地点で一秒間停止した後アームを閉じるのと,空き缶を顎に入れるためにこのプログラムを使う.
#define go OnFwd(OUT_AC);Wait(20);Off(OUT_AC);
#define go1 OnFwd(OUT_AC);Wait(20);Off(OUT_AC);
位置調整等で使用した.
**メインプログラム [#q487c7f0]
task main()
{
Line(35)//A-C
sstop;
rightsenkai;
Wait(20);
Off(OUT_AC);//A-C
Line1(90)//C-D
sstop;
arm_c;//アームを閉じる
Line(105)//D-F
Line1(57)//F-G
Line(32)//F-G
sstop;
leftsenkai;
Wait(60);//Gでの方向転換
Off(OUT_AC);
Line(68)//G-H
Line2(60)
Line1(35)
Line(35)G-H
rightsenkai;
Wait(60);//Hでの方向転換
Off(OUT_AC);
Line1_Rev(20)//H-I
sstop;//一秒停止
Line_Rev(30)//I-L
go;
Line1_Rev(20)//L-K
go1;
Line_Rev(30)//K-J
sstop;
leftsenkai;//空き缶をYに置き再びJに戻る.始
Wait(100);
Off(OUT_AC);
OnRev(OUT_AC);
Wait(100);
Off(OUT_AC);
Wait(60);
Off(OUT_B);
OnRev(OUT_B);
Wait(30);
rightsenkai;
Wait(80);
Off(OUT_ABC;
leftmagaru;
Wait(60);
Off(OUTA_AC);//空き缶をYに置き再びJに戻る.終
rightsenkai;//Jでの方向転換
Wait(45);
Off(OUT_AC);
Line1(50);//J-B
sstop;//一秒停止
go;
leftsenkai;//Bでの方向転換
Wait(40);
Line(30);//B-A
}
*発生した問題 [#jde91c91]
私達のグループはもともとRIS本体の調子が良くなくプログラム製作中にファイヤーウェアが飛んでしまったり,私のディビアンが立ち上がらなくなったりと問題が発生し何度も先生のおせわになりました.なので一つのパソコンで2つのプログラムを別々に作成することとなり相方にはとても迷惑をかけてしまった.また,defineで使っているライントレースを連続して使用するとプログラムが上手く作動しなかったりしました.それ故に私達のグループは同じライントレースが2つ3つ用意されているのです.
*反省と感想 [#lf90694a]
今回作成した”ライントレースロボット”は課題1のときよりも一段と難易度が上がり相方と何度も落ち合って試行錯誤をしたがなかなか進まなかった.ライントレースがうまく行かなかったと”発生した問題”のところで挙げさせていただきましたがライントレースをある一定の時間内は黒の時間が長くてもwhileを抜け出さないようにするプログラムをうまく作ることができれば解消できたかもしれなかった.本当に今回作成したものは時間がかかったがそのおかげもあってか初めて組むこととなった相方と知り合うきっかけとなり仲良くなれたことがとても良かった.次回は定義ではなくサブルーチンを使えると良いと思う.