2015b/Member/S_Toya/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2015b/Member]]
*課題 ライントレースをさせる [#ee80bb25]
**課題条件 [#y2e710f9]
#ref(2015b/Member/S_Toya/Mission2/2015b-mission2.png)
上図 B 地点より各交差点について「右→右→左→左→直進→直進」...
*目次 [#idd668c8]
#contents
*1 ロボット紹介 [#d8a9d32e]
**1-1 光センサ設置位置 [#bece28f8]
車体の小回りを利かせるために、車体の回転半径を小さくさせ...
したがって、車輪と光センサを極力近づけた。
#ref(2015b/Member/S_Toya/Mission2/足回り.jpg)
**1-2 後輪について [#v2e0df78]
小回りを利かすためには地面に対する抵抗を最小限にする必要...
そこで、そこでゴムタイヤ二つを前輪とし、タイヤのホイール...
#ref(2015b/Member/S_Toya/Mission2/後輪.jpg)
今回の課題では回転や旋回が数多く使われる。したがってこの...
*2 プログラム紹介 [#w9e8c32e]
今回の課題はプログラミングが重要な課題となる。それぞれの...
**2-1定数 [#g10d4e0e]
/*数値代入系*/
#define shiki 48 //黒と白の閾値の基礎
#define TMAX 25 //黒い線をTMAX秒以上通過すると「交差点」...
/*動作制御系*/
#define forward OnFwd(OUT_AC); //直進
#define back OnRev(OUT_AC); //後退
#define left_t OnRev(OUT_A); OnFwd(OUT_C); //左旋回
#define left Off(OUT_A); OnFwd(OUT_C); //左回転
#define right_t OnRev(OUT_C); OnFwd(OUT_A); //右旋回
#define right Off(OUT_C); OnFwd(OUT_A); //右回転
#define modosu ClearTimer(1);tomaru(100);right_t;Wait(fi...
#define W_Fwd if(SENSOR_2 >= 48){forward;until(SENSOR_2 ...
#define W_LEFT if(SENSOR_2 >= 48){left_t;until(SENSOR_2 ...
**2-2 マクロ [#d0e9b5bb]
#define tomaru(t) Off(OUT_AC);Wait(t); //t秒だけ停止
#define power(s) SetPower(OUT_A+OUT_C,s); //モータのパワ...
**2-3 ライントレースと交差点判断 [#qc635338]
今回「ライントレース」と「交差点判断」の二つのプログラム...
/*global変数*/
int n = 0;
交差点に何度進入したかをカウントする。
変数nはmain関数でも使うため、global変数として置く。
sub decision()
{
/*ライントレース*/
int find = 100;//交差点かどうか見極めるために用いる。今w...
while(find > 80){
if (SENSOR_2 < shiki -7){ //計測値が閾値より-7以下の時...
right_t;
} else if (SENSOR_2 < shiki -4){ //計測値が閾値より-4か...
right;
} else if (SENSOR_2 < shiki){ //計測値が閾値から-4の時...
forward;
} else if(SENSOR_2 < shiki +4){ //計測値が閾値から+4の...
left;
} else { //計測値が閾値より+4以上...
left_t;
}
if(SENSOR_2 > shiki -5){//計測値が閾値より-5以上の時に...
ClearTimer(0);
}
今回のライントレースは黒い線の右側の境界線部分で行った。...
したがって、閾値を適当な黒の色として、その前後で値が多き...
#ref(2015b/Member/S_Toya/Mission2/GIFトレース.gif)
次にタイマーについての説明を行う。このタイマーは計測値が...
もしタイマーが一定時間進んだ場合、それはロボットの目の前...
交差点かどうかの判別方法について説明する。
/*交差点判断*/
if(FastTimer(0) > TMAX){
tomaru(100); //動きを安定させるため、とりあえず停止す...
forward;Wait(40); //目の前の黒い線を越す
ClearTimer(1);//先ほどとは別のタイマーをセットする。こ...
left_t;//左旋回をする
until(SENSOR_2 < shiki);//左旋回を留める
find = FastTimer(1);//最初に定義した変数 find をタイマ...
if (find > 80){//findが0.8秒より長いということは目の前...
modosu;//find 秒だけ戻り、0.4秒後退して元の場所に戻る。
right_t;Wait(8);//元のままでは繰り返しになるため、少...
tomaru(50);//動作を安定させるための少しばかりの停止
}
}
} modosu;//findが0.8秒未満、つまり交差点に差し掛かったと...
n++;//今、何回目の交差点かをカウントする。
}
目の前に黒い線が来た場合、それが「交差点」なのか「曲がり...
今回その判断材料として「次に現れる黒線までの時間(find)...
黒線に差し掛かった場合の手順を説明すると
?目の前の黒い線を越し、白いところへ出る
?左へ旋回する
?旋回している時間(find)を計測する。
?もし、findが短ければ(0.8秒未満)、?で越えた黒線の先にも...
?もし、findが長ければ(0.8秒以上)、?で越えた黒線の先には...
ということである。
文字ではなかなかわかりにくいと思われる。そこで下図を見て...
&size(20){交差点に進入した場合};
#ref(2015b/Member/S_Toya/Mission2/GIF交差点.gif)
&size(20){曲がり角に進入した場合};
#ref(2015b/Member/S_Toya/Mission2/GIF曲線探査.gif)
一番最初のコース図を見てもらうとわかるように、今回丁字路...
また、曲がり角だとわかった場合、そのまま元の場所に戻った...
**2-4 main関数 [#p164f7b8]
前節ではsubルーチン(decison)の説明を行った。本節ではmai...
main関数内では主に交差点だとsubルーチン内で判断された時の...
task main()
{
power(3); //モータの出力を3にする
SetSensor(SENSOR_2,SENSOR_LIGHT); //SENSORの設定
ClearTimer(0); //subルーチン内で使用するタイマーをスタート
while(true){
それぞれの交差点についての対応の仕方についてを説明する。
また、各交差点について?から?の通し番号を振る。番号の対応...
#ref(2015b/Member/S_Toya/Mission2/map.jpg)
&size(20){?右折};
if (n == 0) { //1回目の交差点
decision(); //subルーチン
right_t;Wait(35);
tomaru(50);
power(0);//ゆっくり前進
W_Fwd;
power(3);//モータの出力を元に戻す
}
?の交差点では右折をする。
?では交差点を認識したら、まず右に旋回する。そしてゆっくり...
こうすることで、滑らかにトレースを再開することができる。...
&size(20){?右折};
else if(n == 1){ //2回目の交差点
decision(); //subルーチン
right_t;Wait(20);
tomaru(50);
power(0);//ゆっくり前進
W_Fwd;
power(3);//モータの出力を元に戻す
}
?では交差点を認識したら、まず?に比べ少しだけ右に旋回する...
?は?に比べて、交差点の後の直線が短い。したがって、旋回し...
&size(20){?左折};
else if(n == 2) { //3回目の交差点
decision(); //subルーチン
forward;Wait(47);
left_t;Wait(60);
tomaru(50);
power(0);//ゆっくり左旋回
W_LEFT;
right_t;Wait(10);
power(3);//モータの出力を元に戻す
}
?では交差点を認識したら、まず直進し、大きく左に旋回し正面...
ゆっくりと左旋回をする理由は??と同じである。
また、最初に旋回する前に直進するのは、そうすることで黒い...
&size(20){?左折};
else if (n == 3){ //4回目の交差点
decision(); //subルーチン
left_t;Wait(25);
forward;Wait(40);
left_t;Wait(60);
tomaru(50);
power(0);//ゆっくり左旋回
W_LEFT;
right_t;Wait(10);
power(3);//モータの出力を元に戻す
}
?では交差点を認識したら、まず&size(18){左};に旋回する。次...
?で、?で行わなかった最初の左旋回を行うのには理由がある。...
したがって、?では右に傾いた車体を左へ向くように矯正する必...
&size(20){?,?直進};
else{ //5回目以降の交差点
decision(); //subルーチン
forward;Wait(35);//無理やり黒線を越える
tomaru(50);
}
}
}
?,?では交差点を直進させる。
したがって交差点を確認したら無理やり数秒間直進させてトレ...
*3 感想・考察 [#lb2f7ae1]
今回はプログラムがメインの活動であった。「変数」が何かす...
また、可能な限りシンプルな動きで解決させたいと思っていた...
今回は出来なかったが、大まかな時間指定で交差点と曲がり角...
プログラムがメインではあったが、ハードの設計も個人なりに...
終了行:
[[2015b/Member]]
*課題 ライントレースをさせる [#ee80bb25]
**課題条件 [#y2e710f9]
#ref(2015b/Member/S_Toya/Mission2/2015b-mission2.png)
上図 B 地点より各交差点について「右→右→左→左→直進→直進」...
*目次 [#idd668c8]
#contents
*1 ロボット紹介 [#d8a9d32e]
**1-1 光センサ設置位置 [#bece28f8]
車体の小回りを利かせるために、車体の回転半径を小さくさせ...
したがって、車輪と光センサを極力近づけた。
#ref(2015b/Member/S_Toya/Mission2/足回り.jpg)
**1-2 後輪について [#v2e0df78]
小回りを利かすためには地面に対する抵抗を最小限にする必要...
そこで、そこでゴムタイヤ二つを前輪とし、タイヤのホイール...
#ref(2015b/Member/S_Toya/Mission2/後輪.jpg)
今回の課題では回転や旋回が数多く使われる。したがってこの...
*2 プログラム紹介 [#w9e8c32e]
今回の課題はプログラミングが重要な課題となる。それぞれの...
**2-1定数 [#g10d4e0e]
/*数値代入系*/
#define shiki 48 //黒と白の閾値の基礎
#define TMAX 25 //黒い線をTMAX秒以上通過すると「交差点」...
/*動作制御系*/
#define forward OnFwd(OUT_AC); //直進
#define back OnRev(OUT_AC); //後退
#define left_t OnRev(OUT_A); OnFwd(OUT_C); //左旋回
#define left Off(OUT_A); OnFwd(OUT_C); //左回転
#define right_t OnRev(OUT_C); OnFwd(OUT_A); //右旋回
#define right Off(OUT_C); OnFwd(OUT_A); //右回転
#define modosu ClearTimer(1);tomaru(100);right_t;Wait(fi...
#define W_Fwd if(SENSOR_2 >= 48){forward;until(SENSOR_2 ...
#define W_LEFT if(SENSOR_2 >= 48){left_t;until(SENSOR_2 ...
**2-2 マクロ [#d0e9b5bb]
#define tomaru(t) Off(OUT_AC);Wait(t); //t秒だけ停止
#define power(s) SetPower(OUT_A+OUT_C,s); //モータのパワ...
**2-3 ライントレースと交差点判断 [#qc635338]
今回「ライントレース」と「交差点判断」の二つのプログラム...
/*global変数*/
int n = 0;
交差点に何度進入したかをカウントする。
変数nはmain関数でも使うため、global変数として置く。
sub decision()
{
/*ライントレース*/
int find = 100;//交差点かどうか見極めるために用いる。今w...
while(find > 80){
if (SENSOR_2 < shiki -7){ //計測値が閾値より-7以下の時...
right_t;
} else if (SENSOR_2 < shiki -4){ //計測値が閾値より-4か...
right;
} else if (SENSOR_2 < shiki){ //計測値が閾値から-4の時...
forward;
} else if(SENSOR_2 < shiki +4){ //計測値が閾値から+4の...
left;
} else { //計測値が閾値より+4以上...
left_t;
}
if(SENSOR_2 > shiki -5){//計測値が閾値より-5以上の時に...
ClearTimer(0);
}
今回のライントレースは黒い線の右側の境界線部分で行った。...
したがって、閾値を適当な黒の色として、その前後で値が多き...
#ref(2015b/Member/S_Toya/Mission2/GIFトレース.gif)
次にタイマーについての説明を行う。このタイマーは計測値が...
もしタイマーが一定時間進んだ場合、それはロボットの目の前...
交差点かどうかの判別方法について説明する。
/*交差点判断*/
if(FastTimer(0) > TMAX){
tomaru(100); //動きを安定させるため、とりあえず停止す...
forward;Wait(40); //目の前の黒い線を越す
ClearTimer(1);//先ほどとは別のタイマーをセットする。こ...
left_t;//左旋回をする
until(SENSOR_2 < shiki);//左旋回を留める
find = FastTimer(1);//最初に定義した変数 find をタイマ...
if (find > 80){//findが0.8秒より長いということは目の前...
modosu;//find 秒だけ戻り、0.4秒後退して元の場所に戻る。
right_t;Wait(8);//元のままでは繰り返しになるため、少...
tomaru(50);//動作を安定させるための少しばかりの停止
}
}
} modosu;//findが0.8秒未満、つまり交差点に差し掛かったと...
n++;//今、何回目の交差点かをカウントする。
}
目の前に黒い線が来た場合、それが「交差点」なのか「曲がり...
今回その判断材料として「次に現れる黒線までの時間(find)...
黒線に差し掛かった場合の手順を説明すると
?目の前の黒い線を越し、白いところへ出る
?左へ旋回する
?旋回している時間(find)を計測する。
?もし、findが短ければ(0.8秒未満)、?で越えた黒線の先にも...
?もし、findが長ければ(0.8秒以上)、?で越えた黒線の先には...
ということである。
文字ではなかなかわかりにくいと思われる。そこで下図を見て...
&size(20){交差点に進入した場合};
#ref(2015b/Member/S_Toya/Mission2/GIF交差点.gif)
&size(20){曲がり角に進入した場合};
#ref(2015b/Member/S_Toya/Mission2/GIF曲線探査.gif)
一番最初のコース図を見てもらうとわかるように、今回丁字路...
また、曲がり角だとわかった場合、そのまま元の場所に戻った...
**2-4 main関数 [#p164f7b8]
前節ではsubルーチン(decison)の説明を行った。本節ではmai...
main関数内では主に交差点だとsubルーチン内で判断された時の...
task main()
{
power(3); //モータの出力を3にする
SetSensor(SENSOR_2,SENSOR_LIGHT); //SENSORの設定
ClearTimer(0); //subルーチン内で使用するタイマーをスタート
while(true){
それぞれの交差点についての対応の仕方についてを説明する。
また、各交差点について?から?の通し番号を振る。番号の対応...
#ref(2015b/Member/S_Toya/Mission2/map.jpg)
&size(20){?右折};
if (n == 0) { //1回目の交差点
decision(); //subルーチン
right_t;Wait(35);
tomaru(50);
power(0);//ゆっくり前進
W_Fwd;
power(3);//モータの出力を元に戻す
}
?の交差点では右折をする。
?では交差点を認識したら、まず右に旋回する。そしてゆっくり...
こうすることで、滑らかにトレースを再開することができる。...
&size(20){?右折};
else if(n == 1){ //2回目の交差点
decision(); //subルーチン
right_t;Wait(20);
tomaru(50);
power(0);//ゆっくり前進
W_Fwd;
power(3);//モータの出力を元に戻す
}
?では交差点を認識したら、まず?に比べ少しだけ右に旋回する...
?は?に比べて、交差点の後の直線が短い。したがって、旋回し...
&size(20){?左折};
else if(n == 2) { //3回目の交差点
decision(); //subルーチン
forward;Wait(47);
left_t;Wait(60);
tomaru(50);
power(0);//ゆっくり左旋回
W_LEFT;
right_t;Wait(10);
power(3);//モータの出力を元に戻す
}
?では交差点を認識したら、まず直進し、大きく左に旋回し正面...
ゆっくりと左旋回をする理由は??と同じである。
また、最初に旋回する前に直進するのは、そうすることで黒い...
&size(20){?左折};
else if (n == 3){ //4回目の交差点
decision(); //subルーチン
left_t;Wait(25);
forward;Wait(40);
left_t;Wait(60);
tomaru(50);
power(0);//ゆっくり左旋回
W_LEFT;
right_t;Wait(10);
power(3);//モータの出力を元に戻す
}
?では交差点を認識したら、まず&size(18){左};に旋回する。次...
?で、?で行わなかった最初の左旋回を行うのには理由がある。...
したがって、?では右に傾いた車体を左へ向くように矯正する必...
&size(20){?,?直進};
else{ //5回目以降の交差点
decision(); //subルーチン
forward;Wait(35);//無理やり黒線を越える
tomaru(50);
}
}
}
?,?では交差点を直進させる。
したがって交差点を確認したら無理やり数秒間直進させてトレ...
*3 感想・考察 [#lb2f7ae1]
今回はプログラムがメインの活動であった。「変数」が何かす...
また、可能な限りシンプルな動きで解決させたいと思っていた...
今回は出来なかったが、大まかな時間指定で交差点と曲がり角...
プログラムがメインではあったが、ハードの設計も個人なりに...
ページ名: