[[2019a/Member]]
*目次 [#gfd180ac]
#contents
*課題内容 [#j3d00ab6]
黒線の幅は20mmでなるべく均等な濃さにすること。ゴールには、長さ15または16のブロックおく。~
課題2のコース
#ref(2019a/Member/yuka/Mission2/課題のルート,10%,課題のルート)
A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する。~
(他のメンバーとは別の経路になるようにする)。
-A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
#br
-A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進//左に旋回(出力30)) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。
*ロボットの仕様 [#cb96596b]
#ref(2019a/Member/yuka/Mission2/斜め上.jpg,10%,斜め上)
-前輪と後輪とモーターなどの基本構造は説明書のままにした。
-光センサーは正確な値を図れるように車体前方の車輪のすぐそばに、そして、床からも離れすぎない位置に光センサーをつけた。
#ref(2019a/Member/yuka/Mission2/前.jpg,10%,前)
#ref(2019a/Member/yuka/Mission2/左横.jpg,10%,左横)
-部品を減らして構造を単純化するために、ボールを掴むのではなく、上から覆いかぶさってボールを引きずって運ぶ方式をとった。
#ref(2019a/Member/yuka/Mission2/アーム.jpg,10%,アーム)
*プログラミング [#p5058ead]
-定義したこと
--BLACK 21 //ライン��
--B_WHITE 31 //ライン��
--Gray 35 //ライン��
--W_BLACK 56 //ライン��
--WHITE 63 //ライン��
添付ファイル色図を参照
--MOVE_TIME1 400 //ライントレースする時間
--go_forward OnFwd(OUT_BC,30);
--turn_left OnFwd(OUT_B,30);Off(OUT_C);
--turn_right OnFwd(OUT_C,30);Off(OUT_B);
--short_break Off(OUT_BC);Wait(1000);
--rot_left OnFwd(OUT_B,30);OnRev(OUT_C,30); //左に旋回(出力30)
--rot_right OnFwd(OUT_C,30);OnRev(OUT_B,30); //右に旋回
--rot_left2 OnFwd(OUT_B,40);OnRev(OUT_C,40); //左に旋回(出力40 ←出力を上げることで回りやすくした)
--A_down OnFwd(OUT_A,20);Wait(300);Off(OUT_A); //ボールを運ぶアームを下げる
--A_up OnRev(OUT_A,30);Wait(300);Off(OUT_A); //ボールを運ぶアームを上げる
--go_back OnRev(OUT_BC,30);Wait(300);Off(OUT_BC);
--follow_line() //線上を進む
{
SetSensorLight(S3);
long t0 = CurrentTick();
while(CurrentTick()-t0<=MOVE_TIME1) {
if (SENSOR_3>WHITE) {t0=CurrentTick();
rot_right; //明るさが63より大きいとき右に旋回
} else if (SENSOR_3>W_BLACK){t0=CurrentTick();
turn_right; //明るさが56より大きいとき右にまがる
} else if (SENSOR_3>Gray){t0=CurrentTick();
go_forward; //明るさが35より大きいとき直進
} else if (SENSOR_3>W_BLACK) {t0=CurrentTick();
turn_left; //明るさが31より大きいとき左にまがる
} else {
rot_left; //明るさが21より大きいとき左に旋回
}
}
}
--cross_line() //交差点を曲がらずに超える
{
while(SENSOR_3<Gray){
go_forward; //明るさが35より大きいとき直進
}
while(SENSOR_3>W_BLACK){
turn_right; //明るさが31より大きいとき右にまがる
}
Off(OUT_BC);
}
--fetch() //線を追うときに時間内で動作を終える
{
long t1;
t1=CurrentTick();
while(CurrentTick()-t1<400){
if(SENSOR_3>WHITE) {
rot_left; //明るさが63より大きいとき左に旋回
} else if (SENSOR_3>W_BLACK){
turn_right; //明るさが56より大きいとき右にまがる
} else if (SENSOR_3>Gray){
go_forward; //明るさが35より大きいとき直進
} else if (SENSOR_3>W_BLACK) {
turn_left; //明るさが31より大きいとき左に旋回
} else {
rot_right; //明るさが21より大きいとき右に旋回
}
}
}
*ライントレースする仕組み
---光センサーにより線上の明るさを感知して、判別すると添付ファイル順路のように進む。センサーには予めしきい値として5つの値を入れておいた。(添付ファイル色図を参照)
---交差点はBLACKの時間によって判断している。
まず交差点に行くまでは上記のように進む。交差点に行きつくとセンサーが黒と認識している時間が長くなるが、黒と認識している時間に制限を設けることで、その時間を超えるとロボットが停止する(交差点を判断する)ようになっている。
-プログラムの全体像
task main()
follow_line();
short_break;
cross_line();
go_forward;
Wait(300); //アームを下ろす前に一度止まる
A_down; //アームをおろしてから
fetch(); //進む
follow_line();
rot_left2;
Wait(1600); //200度ほど旋回して
go_forward;
Wait(600); //次のラインまですすむ
turn_left;
turn_left;
Wait(1000); //センサーがうまく反応しなかったので左に曲がって
go_forward;
Wait(500); //次のラインまで進む
follow_line();
cross_line();
follow_line();
A_up; //アームを上げて
go_forward(); //シュート
}
*生じた問題と改善 [#hddd9d01]
-KLにかけての交差点を超えてボールを取り、旋回してKJ間の道になかなか戻らない~
→明るさの調整と定義した操作を利用した。
#br
-旋回するときに他の線をたどりだしてしまう
→出力を上げて光センサーがラインを感知する暇を作らない。
*結果 [#u2e285cf]
-一回でコースをすべて回りきることは一回くらいしかなかった。
-部分的に走行できても途中で道を外れてしまうことが多かった。
#ref(2019a/Member/yuka/Mission2/運ぶ様子.jpg,10%,運ぶ様子)
#ref(2019a/Member/yuka/Mission2/ゴール直前.jpg,10%,ゴール直前)
#ref(2019a/Member/yuka/Mission2/ゴール.jpg,10%,ゴール)
*反省と感想 [#uc82f4b9]
-ロボットの作成は課題1よりは難しくなかったが、色の微調整が難しかった。
-すべてがfollow_line で進めることができなかったので、このプログラミングでは課題2のコースのみしか走れないので、次回は汎用性をあげたプログラミングを作れるようになりたい。