2018a/Member/yamada/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2018a/Member]]
ライントレース
#contents
*課題 [#d34d14c2]
与えられたコースを走行するロボットとそのプログラムを作成...
&ref(2018a/Member/yamada/Mission2/2018a-mission2.png,60%,...
第1コースを選択した。
&ref(2018a/Member/yamada/Mission2/2018-07-18.png,40%,第1...
*ロボット本体 [#ba6628d3]
?
&ref(2018a/Member/yamada/Mission2/IMG_0567.JPG,20%,ロボッ...
?
&ref(2018a/Member/yamada/Mission2/IMG_0568.JPG,20%,ロボッ...
?
&ref(2018a/Member/yamada/Mission2/IMG_0569.JPG,20%,ロボッ...
&ref(2018a/Member/yamada/Mission2/IMG_0570.JPG,20%,ロボッ...
?
&ref(2018a/Member/yamada/Mission2/IMG_0573.JPG,20%,ロボッ...
?
胴体部分と、缶をつかむ部分(以下、アーム)からなる。
胴体部分とアームはNXT知能ブロックによってしっかりと連結し...
知能ブロック部分を外すと胴体部分とアームの連結がゆるく、...
?
缶をつかんだ時の様子。
モーターAの回転により、アームを開閉する。
人間の手が缶を持つときのような形でつかむ。
?
横から見た図。
?
アーム部分はかなり重く、下に支えがないと機体が前に傾いて...
缶を認識するためのセンサーをアームの下にくるように取り付...
これにより安定した走行が可能になった。
*プログラム [#o879713b]
黒線の左側をライントレースするプログラムを作成した。
最後まで終わらなかった。Xで缶をつかむところまで作成した。
**定義した定数 [#l533de53]
***明るさの判断をするためのしきい値 [#p65dd255]
#define w 58 //これ以上は真っ白
#define lw 57 // これ以下は少し白
#define g 50 //これ以下は灰
#define lb 44 //これ以下は少し黒
#define b 36 //これ以下は真っ黒
-36以下は「真っ黒」とし、このしきい値の定数名はbとした。
-44以下は「少し黒」とし、このしきい値の定数名はblとした。
-50以下は「灰」とし、このしきい値の定数名はgとした。
-57以下は「少し白」とし、このしきい値の定数名はwlとした。
-58以上は「真っ白」とし、このしきい値の定数名はwとした。
***明るさの区間ごとの、ロボットの走行の仕方 [#wf4e24b4]
#define s 30
#define L OnFwd(OUT_B,40);OnRev(OUT_C,40);//左に曲がる
#define R OnFwd(OUT_C,s);OnRev(OUT_B,s);//右に曲がる
#define LL OnFwd(OUT_B,s);Off(OUT_C);//少し左に曲がる
#define LR OnFwd(OUT_C,s);Off(OUT_B);//少し右に曲がる
#define S OnFwd(OUT_BC,s);//直進
-Lは左旋回
-Rは右旋回
-LLは左折
-LRは右折
-Sは直進
回転スピードs
・・・速すぎると単位距離あたりの「明るさの認識」の回数が...
遅すぎるとタイヤが空回りすることがよくあり、うまく...
30が丁度よいと判断した。
Lにおける回転スピード
・・・左折するためにsより速い回転。詳しくは後述のサブルー...
***サブルーチンの基本形 [#fbfc38c1]
{
SetSensorLight(S3);
while(true){
if(SENSOR_3<b){
L; //真っ黒なら左へ ...
}else if(SENSOR_3<lb){
LL; //少し黒なら少し左へ ...
}else if(SENSOR_3<g){
S; //灰なら直進
}else if(SENSOR_3<lw){
LR; //少し白なら少し右へ
}else if(SENSOR_3>w){
R;
} //白なら右へ
}
}
この形(左側ライントレース)を基本とし、これをコースの各...
***各サブルーチン [#f155a2ae]
sub stop_cross() //交差点で一秒止まる、左側ライ...
{
SetSensorLight(S3);
int n1=0;
while(n1<1){
if(SENSOR_3<b){
long t0=FirstTick();
L; //真っ黒なら左へ ...
long t1=CurrentTick();
if(t1-t0>100){Off(OUT_BC);Wait(1000);S;Wait(3...
}else if(SENSOR_3<lb){
LL; //少し黒なら少し左へ ...
}else if(SENSOR_3<g){
S; //灰なら直進
}else if(SENSOR_3<lw){
LR; //少し白なら少し右へ
}else if(SENSOR_3>w){
R;
} //白なら右へ
}
}
AからCへの部分。
黒線の左側をライントレースし、交差点に差し掛かったら一秒...
「真っ黒」を認識し続ける時間(t1-t0)が0.1秒を超えると止ま...
t1は明るさが「真っ黒」である時間を数え始める点。
t2は明るさが「真っ黒」であるのが終わる時間を記録する。
このプログラムで確かに交差点Cで一時停止したが、なぜうまく...
実のところよく分からない。
交差点を認識するというより、「真っ黒」であるのを認識する...
現に、ライントレースで軌道修正する際に「真っ黒」を認識す...
一時停止し、次のサブルーチンに移ってしまっていた。
センサーが(おそらく)「灰」以上に明るい位置からライント...
このサブルーチンが1回実行されると次のサブルーチンに移行す...
交差点を認識し一秒間停止するとn1が1ふえる。すると次のサブ...
sub turn_cross() //曲がり角で止まらず左折する
{
SetSensorLight(S3);
int n2=0;
while(n2<3){
if(SENSOR_3<b){
L;
Wait(450);
OnRev(OUT_BC,s);
Wait(400);
n2++; //黒なら左へ 、曲がり...
}else if(SENSOR_3<lb){
LL; //少し黒なら少し左へ ...
}else if(SENSOR_3<g){
S; //灰なら直進
}else if(SENSOR_3<lw){
LR; //少し白なら少し右へ
}else if(SENSOR_3>w){
R;
} //白なら右へ
}
}
Cから次の曲がり角への部分。
交差点や曲がり角を曲がる際、旋回している途中にセンサが黒...
「少し曲がっては後ろに下がる」ことを繰り返して黒線上から...
失敗することも多いプログラムであった。
左折し終えたら次のサブルーチンに移行するように、変数n2を...
少し左に曲がって下がる、を1回行うとn2が1ふえる。
3回繰り返す(つまり曲がり角を左折する)と次のサブルーチン...
n2<3が真である間、whileの中身のプログラムを実行するように...
sub go_cross() //曲がり角スルー
{
SetSensorLight(S3);
int n3=0;
while(n3<1){
if(SENSOR_3<b){
long t2=CurrentTick();
L; //真っ黒なら左へ ...
long t3=CurrentTick();
if(t3-t2>500){n3++;}
}else if(SENSOR_3<lb){
LL; //少し黒なら少し左へ ...
}else if(SENSOR_3<g){
S; //灰なら直進
}else if(SENSOR_3<lw){
LR; //少し白なら少し右へ
}else if(SENSOR_3>w){
R;
} //白なら右へ
}
}
曲がり角からXの缶へ。
上記のとおり、「曲がっては後ろに下がる」を繰り返さないと...
円をライントレースしていかないようにするためこのようにし...
円の外側に到達すると一瞬左折しようとするができない。その...
この「真っ黒」の時間が0.5秒続くとn3が1ふえる。
「真っ黒」の時間は上記t1-t0と同様にt3-t2によって数える。
このサブルーチンが1回実行されると次のサブルーチンに移行す...
n3が1以上になると次のサブルーチンに移る。
sub get_can() //缶をつかむ
{
OnRev(OUT_A,s);
Wait(700);
Off(OUT_A);
}
缶を掴む。
アームは最初は胴体部分に垂直に開いている。
0.7秒モーターAを回転させて缶を掴む。
センサーは利用していない。
一つ前のサブルーチンを終えた時点で眼の前に缶が来るように...
ただアームを閉じれば缶を掴み取れる。
***mainのタスク [#hc63c04d]
各サブルーチンを順番に並べた。
task main()
{
stop_cross(); //AからC
turn_cross(); //Cからカーブ、曲がり角曲がる
stop_cross(); //Dで止まる
get_can(); //缶をつかむ
Off(OUT_BC);
}
*反省 [#v6bf4f60]
ロボット本体の作成はほとんどパートナーに任せっぱなしだっ...
相変わらず課題を後回しにし、その点でもパートナーに迷惑を...
十分に時間を確保しなかったためにプログラムの作成が終わら...
ひとつひとつのサブルーチンごとに、思った通りにロボットが...
左折、一時停止、急カーブの走行など、どうプログラムを作れ...
タイヤが空回りしたり回らなかったりすることがあったが、タ...
終了行:
[[2018a/Member]]
ライントレース
#contents
*課題 [#d34d14c2]
与えられたコースを走行するロボットとそのプログラムを作成...
&ref(2018a/Member/yamada/Mission2/2018a-mission2.png,60%,...
第1コースを選択した。
&ref(2018a/Member/yamada/Mission2/2018-07-18.png,40%,第1...
*ロボット本体 [#ba6628d3]
?
&ref(2018a/Member/yamada/Mission2/IMG_0567.JPG,20%,ロボッ...
?
&ref(2018a/Member/yamada/Mission2/IMG_0568.JPG,20%,ロボッ...
?
&ref(2018a/Member/yamada/Mission2/IMG_0569.JPG,20%,ロボッ...
&ref(2018a/Member/yamada/Mission2/IMG_0570.JPG,20%,ロボッ...
?
&ref(2018a/Member/yamada/Mission2/IMG_0573.JPG,20%,ロボッ...
?
胴体部分と、缶をつかむ部分(以下、アーム)からなる。
胴体部分とアームはNXT知能ブロックによってしっかりと連結し...
知能ブロック部分を外すと胴体部分とアームの連結がゆるく、...
?
缶をつかんだ時の様子。
モーターAの回転により、アームを開閉する。
人間の手が缶を持つときのような形でつかむ。
?
横から見た図。
?
アーム部分はかなり重く、下に支えがないと機体が前に傾いて...
缶を認識するためのセンサーをアームの下にくるように取り付...
これにより安定した走行が可能になった。
*プログラム [#o879713b]
黒線の左側をライントレースするプログラムを作成した。
最後まで終わらなかった。Xで缶をつかむところまで作成した。
**定義した定数 [#l533de53]
***明るさの判断をするためのしきい値 [#p65dd255]
#define w 58 //これ以上は真っ白
#define lw 57 // これ以下は少し白
#define g 50 //これ以下は灰
#define lb 44 //これ以下は少し黒
#define b 36 //これ以下は真っ黒
-36以下は「真っ黒」とし、このしきい値の定数名はbとした。
-44以下は「少し黒」とし、このしきい値の定数名はblとした。
-50以下は「灰」とし、このしきい値の定数名はgとした。
-57以下は「少し白」とし、このしきい値の定数名はwlとした。
-58以上は「真っ白」とし、このしきい値の定数名はwとした。
***明るさの区間ごとの、ロボットの走行の仕方 [#wf4e24b4]
#define s 30
#define L OnFwd(OUT_B,40);OnRev(OUT_C,40);//左に曲がる
#define R OnFwd(OUT_C,s);OnRev(OUT_B,s);//右に曲がる
#define LL OnFwd(OUT_B,s);Off(OUT_C);//少し左に曲がる
#define LR OnFwd(OUT_C,s);Off(OUT_B);//少し右に曲がる
#define S OnFwd(OUT_BC,s);//直進
-Lは左旋回
-Rは右旋回
-LLは左折
-LRは右折
-Sは直進
回転スピードs
・・・速すぎると単位距離あたりの「明るさの認識」の回数が...
遅すぎるとタイヤが空回りすることがよくあり、うまく...
30が丁度よいと判断した。
Lにおける回転スピード
・・・左折するためにsより速い回転。詳しくは後述のサブルー...
***サブルーチンの基本形 [#fbfc38c1]
{
SetSensorLight(S3);
while(true){
if(SENSOR_3<b){
L; //真っ黒なら左へ ...
}else if(SENSOR_3<lb){
LL; //少し黒なら少し左へ ...
}else if(SENSOR_3<g){
S; //灰なら直進
}else if(SENSOR_3<lw){
LR; //少し白なら少し右へ
}else if(SENSOR_3>w){
R;
} //白なら右へ
}
}
この形(左側ライントレース)を基本とし、これをコースの各...
***各サブルーチン [#f155a2ae]
sub stop_cross() //交差点で一秒止まる、左側ライ...
{
SetSensorLight(S3);
int n1=0;
while(n1<1){
if(SENSOR_3<b){
long t0=FirstTick();
L; //真っ黒なら左へ ...
long t1=CurrentTick();
if(t1-t0>100){Off(OUT_BC);Wait(1000);S;Wait(3...
}else if(SENSOR_3<lb){
LL; //少し黒なら少し左へ ...
}else if(SENSOR_3<g){
S; //灰なら直進
}else if(SENSOR_3<lw){
LR; //少し白なら少し右へ
}else if(SENSOR_3>w){
R;
} //白なら右へ
}
}
AからCへの部分。
黒線の左側をライントレースし、交差点に差し掛かったら一秒...
「真っ黒」を認識し続ける時間(t1-t0)が0.1秒を超えると止ま...
t1は明るさが「真っ黒」である時間を数え始める点。
t2は明るさが「真っ黒」であるのが終わる時間を記録する。
このプログラムで確かに交差点Cで一時停止したが、なぜうまく...
実のところよく分からない。
交差点を認識するというより、「真っ黒」であるのを認識する...
現に、ライントレースで軌道修正する際に「真っ黒」を認識す...
一時停止し、次のサブルーチンに移ってしまっていた。
センサーが(おそらく)「灰」以上に明るい位置からライント...
このサブルーチンが1回実行されると次のサブルーチンに移行す...
交差点を認識し一秒間停止するとn1が1ふえる。すると次のサブ...
sub turn_cross() //曲がり角で止まらず左折する
{
SetSensorLight(S3);
int n2=0;
while(n2<3){
if(SENSOR_3<b){
L;
Wait(450);
OnRev(OUT_BC,s);
Wait(400);
n2++; //黒なら左へ 、曲がり...
}else if(SENSOR_3<lb){
LL; //少し黒なら少し左へ ...
}else if(SENSOR_3<g){
S; //灰なら直進
}else if(SENSOR_3<lw){
LR; //少し白なら少し右へ
}else if(SENSOR_3>w){
R;
} //白なら右へ
}
}
Cから次の曲がり角への部分。
交差点や曲がり角を曲がる際、旋回している途中にセンサが黒...
「少し曲がっては後ろに下がる」ことを繰り返して黒線上から...
失敗することも多いプログラムであった。
左折し終えたら次のサブルーチンに移行するように、変数n2を...
少し左に曲がって下がる、を1回行うとn2が1ふえる。
3回繰り返す(つまり曲がり角を左折する)と次のサブルーチン...
n2<3が真である間、whileの中身のプログラムを実行するように...
sub go_cross() //曲がり角スルー
{
SetSensorLight(S3);
int n3=0;
while(n3<1){
if(SENSOR_3<b){
long t2=CurrentTick();
L; //真っ黒なら左へ ...
long t3=CurrentTick();
if(t3-t2>500){n3++;}
}else if(SENSOR_3<lb){
LL; //少し黒なら少し左へ ...
}else if(SENSOR_3<g){
S; //灰なら直進
}else if(SENSOR_3<lw){
LR; //少し白なら少し右へ
}else if(SENSOR_3>w){
R;
} //白なら右へ
}
}
曲がり角からXの缶へ。
上記のとおり、「曲がっては後ろに下がる」を繰り返さないと...
円をライントレースしていかないようにするためこのようにし...
円の外側に到達すると一瞬左折しようとするができない。その...
この「真っ黒」の時間が0.5秒続くとn3が1ふえる。
「真っ黒」の時間は上記t1-t0と同様にt3-t2によって数える。
このサブルーチンが1回実行されると次のサブルーチンに移行す...
n3が1以上になると次のサブルーチンに移る。
sub get_can() //缶をつかむ
{
OnRev(OUT_A,s);
Wait(700);
Off(OUT_A);
}
缶を掴む。
アームは最初は胴体部分に垂直に開いている。
0.7秒モーターAを回転させて缶を掴む。
センサーは利用していない。
一つ前のサブルーチンを終えた時点で眼の前に缶が来るように...
ただアームを閉じれば缶を掴み取れる。
***mainのタスク [#hc63c04d]
各サブルーチンを順番に並べた。
task main()
{
stop_cross(); //AからC
turn_cross(); //Cからカーブ、曲がり角曲がる
stop_cross(); //Dで止まる
get_can(); //缶をつかむ
Off(OUT_BC);
}
*反省 [#v6bf4f60]
ロボット本体の作成はほとんどパートナーに任せっぱなしだっ...
相変わらず課題を後回しにし、その点でもパートナーに迷惑を...
十分に時間を確保しなかったためにプログラムの作成が終わら...
ひとつひとつのサブルーチンごとに、思った通りにロボットが...
左折、一時停止、急カーブの走行など、どうプログラムを作れ...
タイヤが空回りしたり回らなかったりすることがあったが、タ...
ページ名: