2013b/Member/bs/Mission1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[戻る>2013b/Member]]
#contents
*課題 [#f8d8effa]
自作したコース(下図)に沿って一周するロボットを作成せよ。
-次のステップでプログラムを作成すること。
--交差点をきちんと認識し、正しく判断して通過できるように...
--確実に一周できるようにする。スタート地点から出発して元...
--空き缶を交差点から10cm以上離した線上に起き、それを一旦...
--1個の空き缶でうまくいったら、2個の空き缶でやってみる。
~(授業で示されたコース図)&br;
#ref(zu.jpg)&br;
筆者は反時計回りを担当した。
*ロボット [#r5a0698c]
-ドライブベースを小型化した。
-光センサーをより駆動部に近づけた。
-車輪を2つに減らした。
~→小回りがきくようになった。&br;
-支えとして、車輪ではなく底の丸いパーツを使用した。
~→可動部を減らし、故障しうる箇所を減らした。
&br;&br;(ドライブベースの写真)
#ref(image_1.jpeg)
#ref(image_2.jpeg)
(ロボットの写真)
#ref(image.jpeg)
*プログラム [#s5e6edef]
**コード [#y86f0d4c]
/*マクロ・定数*/
#define THRESHOLD 45 //ライントレースの閾値
#define set_H SetPower(OUT_AC,7); //直進用速度
#define set_L SetPower(OUT_AC,1); //カーブ用速度
#define turn_l1 set_L;OnFwd(OUT_C);OnRev(OUT_A); //反時...
#define turn_l0 set_L;OnFwd(OUT_C);Off(OUT_A); //反時計...
#define turn_r0 set_L;OnFwd(OUT_A);Off(OUT_C); //時計回...
#define turn_r1 set_L;OnFwd(OUT_A);OnRev(OUT_C); //時計...
#define go_fwd set_H;OnFwd(OUT_AC); //前進
#define go_rev set_H;OnRev(OUT_AC); //後退
#define STEP 1 //ライントレースの各動作時間
#define C1 1000 //最初の交差点に近づくまでの時間
#define LAST_C 3000 //最後の交差点に近づくまでの時間
#define TURN_T 74 //90°回転するための所要時間
#define CAN_T 61 //ドライブ長だけ進むのに必要な時間
#define Clock FastTimer(0)-AFT+BEF //缶を動かすのに使っ...
#define NCROSS 5 //交差点を判断するための閾値
#define MOR 100 //交差点を検知したあと、次の交差点を検知...
/*グローバル変数*/
int nline=0; //交差点横断用のカウンタ
int BEF=0; //缶を動かす前の時刻を記録する変数
int AFT=0; //缶を動かした後の時刻を記録する変数
int RCH=0; //反転カウンタ
/*インライン関数*/
void line(){ //通常ライントレース
if(SENSOR_2<THRESHOLD-7){turn_l1;} //黒い部分を感知した...
else if(SENSOR_2<THRESHOLD-5){turn_l0;} //黒寄りの境界...
else if(SENSOR_2<THRESHOLD+3){go_fwd;} //境界を探知した...
else if(SENSOR_2<THRESHOLD+5){turn_r0;} //白寄りの境界...
else{turn_r1;} //白い部分を感知したら時計回り旋回
Wait(STEP); //決定した動作を一定時間行う
}
void line_r(){ //各動作の方向を反転したライントレース
if(SENSOR_2<THRESHOLD-7){turn_r1;}
else if(SENSOR_2<THRESHOLD-5){turn_r0;}
else if(SENSOR_2<THRESHOLD+3){go_fwd;}
else if(SENSOR_2<THRESHOLD+5){turn_l0;}
else{turn_l1;}
Wait(STEP);
}
void line_c(){ //交差点探索を含むライントレース
if(SENSOR_2<THRESHOLD-7){turn_l1;nline++;} //黒い場所を...
else{ //その他の場合はカウンタを0に戻す
if(SENSOR_2<THRESHOLD-5){turn_l0;}
else if(SENSOR_2<THRESHOLD+3){go_fwd;}
else if(SENSOR_2<THRESHOLD+5){turn_r0;}
else{turn_r1;}
nline=0;
}
Wait(STEP);
}
/*サブルーチン*/
sub cross(){ //交差点横断サブルーチン
Off(OUT_AC);PlaySound(2);Wait(10); //交差点を渡り始める...
turn_r1;Wait(TURN_T/2); //方向修正
go_fwd;Wait(40); //交差点を渡る
if(Clock<LAST_C){turn_r1;until(SENSOR_2<THRESHOLD+5);} /...
else{turn_l1;until(SENSOR_2<THRESHOLD+5);RCH++;} //最後...
nline=0; //カウンタをリセット
ClearTimer(1); //一定時間は交差点を検知しないようにする。
}
sub canturn(){ //缶移動サブルーチン
BEF=FastTimer(0); //実行前の時刻を記録
Off(OUT_AC);PlaySound(5);Wait(10); //缶を動かし始めるこ...
go_fwd;Wait(CAN_T); //缶と一緒にドライブ長だけ進む
turn_l1;Wait(2*TURN_T); //缶と一緒に180°反時計回り旋回
go_rev;Wait(CAN_T);turn_r1;Wait(2*TURN_T); //缶を置いて...
AFT=FastTimer(0)+CAN_T; //実行後の時刻+αを記録
}
/*メインタスク*/
task main(){
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0); //走行時間タイマー
ClearTimer(1); //交差点検知を停止させるためのタイマー
/*初期動作*/
go_fwd;until(SENSOR_2>=THRESHOLD+4);PlaySound(2);Off(OUT...
//スタート直後の交差点を超えるまで前進
turn_r1;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OU...
//黒いところを感知するまで時計回り旋回
/*その後の動作*/
while(true){
/*状態?:ライントレース開始後一定時間経っていないor交差点...
while(Clock<C1||FastTimer(1)<MOR){
if(SENSOR_1==0){line();} //ライントレース
else{canturn();} //缶を検知したら移動させる
}
/*状態?:ライントレース開始後一定時間経っており、交差点横...
さらに反転カウンタに値が入っていないとき*/
while(Clock>=C1&&RCH==0&&FastTimer(1)>=MOR){
if(SENSOR_1==0){
if(nline>=NCROSS){cross();}
//黒い部分を一定以上連続で検知したら交差点を渡る
else{line_c();} //交差点を探しながらライントレース
}
else{canturn();} //缶を検知したら移動させる
}
/*状態?:反転カウンタに値が入っているとき(=最後の交差点を...
while(RCH>=1){
if(SENSOR_1==0){line_r();} //反転ライントレース
else{canturn();} //缶を検知したら移動させる
}
}
}
**プログラムの詳細 [#h25e3882]
#ref(image-22ma.jpg,wrap)
***ポイントA(「初期動作」) [#ja4d8cb7]
1.まず白い部分を検知するまで前進する。~
2.その後黒い部分を検知するまで時計回り旋回を行う。~
~
この部分で通常のライントレースをすると、ロボットの初期位...
確実に反時計回りコースに侵入するようにこのような方法をと...
***ポイントBまでの間 [#r0146767]
1. 開始後10秒経過するまでは状態?で動作する。~
2.10秒経過したら、状態?に移行する。~
3.黒い部分を5回連続で検知したら、交差点横断サブルーチン...
4.実行後1秒以内は状態?で動作する。~
5.1秒経過後は再び状態?に移行する。~
開始後10秒以内・交差点横断後1秒以内に状態?で動作するの...
なお、交差点横断サブルーチンの内容は次項に譲る。~
***交差点横断サブルーチン [#x794f54d]
1.停止して、音を発して交差点横断を始めることを知らせる。~
2.ロボットがコースに対しておよそ平行になるように、45°...
3.0.4秒直進する。~
4.ラインからずれている場合はライン上に乗るまで時計回り旋...
5.黒い部分を連続で検知した回数を記録するカウンタをリセッ...
6.実行後1秒は交差点探索を行わないようにするため、タイマ...
***ポイントB [#aa169d2c]
ポイントBの前まで(状態?・?)は進行方向左側の境界に沿ってラ...
~
1.まず交差点横断サブルーチンの1〜3までを行う。~
2.このときロボットは進行方向右側にずれるので、4を逆回転...
3.反転カウンタに+1加える。(状態?のトリガー)~
4.5・6を行う。~
5.状態?で動作する。~
~
ここで行っているのは、ライントレースに用いる境界の切り替...
境界の切り替えを行わなかった場合、進行方向左側の境界には...
ゴールを探索する手段を別に講じる必要があった。~
しかし境界を切り替えることにより、ゴールするときに特別の...
~
***プログラムのまとめ [#laf2f2ac]
このプログラムは基本的に次の3つの状態を遷移しながら動作す...
状態?:進行方向左側の境界に沿ったライントレース~
状態?:交差点認識を含む進行方向左側の境界に沿ったライント...
状態?:進行方向右側の境界に沿ったライントレース~
~
このほかに、「初期動作」、缶を移動する工程が存在する。~
#ref(文書1.png,wrap)
*反省点 [#s5f73126]
-プログラム制作の所要時間を甘く見積もりすぎた結果、プログ...
--缶を移動するプログラムが出来なかった。
~
-原理不明のまま動作している部分がある。
終了行:
[[戻る>2013b/Member]]
#contents
*課題 [#f8d8effa]
自作したコース(下図)に沿って一周するロボットを作成せよ。
-次のステップでプログラムを作成すること。
--交差点をきちんと認識し、正しく判断して通過できるように...
--確実に一周できるようにする。スタート地点から出発して元...
--空き缶を交差点から10cm以上離した線上に起き、それを一旦...
--1個の空き缶でうまくいったら、2個の空き缶でやってみる。
~(授業で示されたコース図)&br;
#ref(zu.jpg)&br;
筆者は反時計回りを担当した。
*ロボット [#r5a0698c]
-ドライブベースを小型化した。
-光センサーをより駆動部に近づけた。
-車輪を2つに減らした。
~→小回りがきくようになった。&br;
-支えとして、車輪ではなく底の丸いパーツを使用した。
~→可動部を減らし、故障しうる箇所を減らした。
&br;&br;(ドライブベースの写真)
#ref(image_1.jpeg)
#ref(image_2.jpeg)
(ロボットの写真)
#ref(image.jpeg)
*プログラム [#s5e6edef]
**コード [#y86f0d4c]
/*マクロ・定数*/
#define THRESHOLD 45 //ライントレースの閾値
#define set_H SetPower(OUT_AC,7); //直進用速度
#define set_L SetPower(OUT_AC,1); //カーブ用速度
#define turn_l1 set_L;OnFwd(OUT_C);OnRev(OUT_A); //反時...
#define turn_l0 set_L;OnFwd(OUT_C);Off(OUT_A); //反時計...
#define turn_r0 set_L;OnFwd(OUT_A);Off(OUT_C); //時計回...
#define turn_r1 set_L;OnFwd(OUT_A);OnRev(OUT_C); //時計...
#define go_fwd set_H;OnFwd(OUT_AC); //前進
#define go_rev set_H;OnRev(OUT_AC); //後退
#define STEP 1 //ライントレースの各動作時間
#define C1 1000 //最初の交差点に近づくまでの時間
#define LAST_C 3000 //最後の交差点に近づくまでの時間
#define TURN_T 74 //90°回転するための所要時間
#define CAN_T 61 //ドライブ長だけ進むのに必要な時間
#define Clock FastTimer(0)-AFT+BEF //缶を動かすのに使っ...
#define NCROSS 5 //交差点を判断するための閾値
#define MOR 100 //交差点を検知したあと、次の交差点を検知...
/*グローバル変数*/
int nline=0; //交差点横断用のカウンタ
int BEF=0; //缶を動かす前の時刻を記録する変数
int AFT=0; //缶を動かした後の時刻を記録する変数
int RCH=0; //反転カウンタ
/*インライン関数*/
void line(){ //通常ライントレース
if(SENSOR_2<THRESHOLD-7){turn_l1;} //黒い部分を感知した...
else if(SENSOR_2<THRESHOLD-5){turn_l0;} //黒寄りの境界...
else if(SENSOR_2<THRESHOLD+3){go_fwd;} //境界を探知した...
else if(SENSOR_2<THRESHOLD+5){turn_r0;} //白寄りの境界...
else{turn_r1;} //白い部分を感知したら時計回り旋回
Wait(STEP); //決定した動作を一定時間行う
}
void line_r(){ //各動作の方向を反転したライントレース
if(SENSOR_2<THRESHOLD-7){turn_r1;}
else if(SENSOR_2<THRESHOLD-5){turn_r0;}
else if(SENSOR_2<THRESHOLD+3){go_fwd;}
else if(SENSOR_2<THRESHOLD+5){turn_l0;}
else{turn_l1;}
Wait(STEP);
}
void line_c(){ //交差点探索を含むライントレース
if(SENSOR_2<THRESHOLD-7){turn_l1;nline++;} //黒い場所を...
else{ //その他の場合はカウンタを0に戻す
if(SENSOR_2<THRESHOLD-5){turn_l0;}
else if(SENSOR_2<THRESHOLD+3){go_fwd;}
else if(SENSOR_2<THRESHOLD+5){turn_r0;}
else{turn_r1;}
nline=0;
}
Wait(STEP);
}
/*サブルーチン*/
sub cross(){ //交差点横断サブルーチン
Off(OUT_AC);PlaySound(2);Wait(10); //交差点を渡り始める...
turn_r1;Wait(TURN_T/2); //方向修正
go_fwd;Wait(40); //交差点を渡る
if(Clock<LAST_C){turn_r1;until(SENSOR_2<THRESHOLD+5);} /...
else{turn_l1;until(SENSOR_2<THRESHOLD+5);RCH++;} //最後...
nline=0; //カウンタをリセット
ClearTimer(1); //一定時間は交差点を検知しないようにする。
}
sub canturn(){ //缶移動サブルーチン
BEF=FastTimer(0); //実行前の時刻を記録
Off(OUT_AC);PlaySound(5);Wait(10); //缶を動かし始めるこ...
go_fwd;Wait(CAN_T); //缶と一緒にドライブ長だけ進む
turn_l1;Wait(2*TURN_T); //缶と一緒に180°反時計回り旋回
go_rev;Wait(CAN_T);turn_r1;Wait(2*TURN_T); //缶を置いて...
AFT=FastTimer(0)+CAN_T; //実行後の時刻+αを記録
}
/*メインタスク*/
task main(){
SetSensor(SENSOR_1,SENSOR_TOUCH);
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0); //走行時間タイマー
ClearTimer(1); //交差点検知を停止させるためのタイマー
/*初期動作*/
go_fwd;until(SENSOR_2>=THRESHOLD+4);PlaySound(2);Off(OUT...
//スタート直後の交差点を超えるまで前進
turn_r1;until(SENSOR_2<=THRESHOLD-5);PlaySound(2);Off(OU...
//黒いところを感知するまで時計回り旋回
/*その後の動作*/
while(true){
/*状態?:ライントレース開始後一定時間経っていないor交差点...
while(Clock<C1||FastTimer(1)<MOR){
if(SENSOR_1==0){line();} //ライントレース
else{canturn();} //缶を検知したら移動させる
}
/*状態?:ライントレース開始後一定時間経っており、交差点横...
さらに反転カウンタに値が入っていないとき*/
while(Clock>=C1&&RCH==0&&FastTimer(1)>=MOR){
if(SENSOR_1==0){
if(nline>=NCROSS){cross();}
//黒い部分を一定以上連続で検知したら交差点を渡る
else{line_c();} //交差点を探しながらライントレース
}
else{canturn();} //缶を検知したら移動させる
}
/*状態?:反転カウンタに値が入っているとき(=最後の交差点を...
while(RCH>=1){
if(SENSOR_1==0){line_r();} //反転ライントレース
else{canturn();} //缶を検知したら移動させる
}
}
}
**プログラムの詳細 [#h25e3882]
#ref(image-22ma.jpg,wrap)
***ポイントA(「初期動作」) [#ja4d8cb7]
1.まず白い部分を検知するまで前進する。~
2.その後黒い部分を検知するまで時計回り旋回を行う。~
~
この部分で通常のライントレースをすると、ロボットの初期位...
確実に反時計回りコースに侵入するようにこのような方法をと...
***ポイントBまでの間 [#r0146767]
1. 開始後10秒経過するまでは状態?で動作する。~
2.10秒経過したら、状態?に移行する。~
3.黒い部分を5回連続で検知したら、交差点横断サブルーチン...
4.実行後1秒以内は状態?で動作する。~
5.1秒経過後は再び状態?に移行する。~
開始後10秒以内・交差点横断後1秒以内に状態?で動作するの...
なお、交差点横断サブルーチンの内容は次項に譲る。~
***交差点横断サブルーチン [#x794f54d]
1.停止して、音を発して交差点横断を始めることを知らせる。~
2.ロボットがコースに対しておよそ平行になるように、45°...
3.0.4秒直進する。~
4.ラインからずれている場合はライン上に乗るまで時計回り旋...
5.黒い部分を連続で検知した回数を記録するカウンタをリセッ...
6.実行後1秒は交差点探索を行わないようにするため、タイマ...
***ポイントB [#aa169d2c]
ポイントBの前まで(状態?・?)は進行方向左側の境界に沿ってラ...
~
1.まず交差点横断サブルーチンの1〜3までを行う。~
2.このときロボットは進行方向右側にずれるので、4を逆回転...
3.反転カウンタに+1加える。(状態?のトリガー)~
4.5・6を行う。~
5.状態?で動作する。~
~
ここで行っているのは、ライントレースに用いる境界の切り替...
境界の切り替えを行わなかった場合、進行方向左側の境界には...
ゴールを探索する手段を別に講じる必要があった。~
しかし境界を切り替えることにより、ゴールするときに特別の...
~
***プログラムのまとめ [#laf2f2ac]
このプログラムは基本的に次の3つの状態を遷移しながら動作す...
状態?:進行方向左側の境界に沿ったライントレース~
状態?:交差点認識を含む進行方向左側の境界に沿ったライント...
状態?:進行方向右側の境界に沿ったライントレース~
~
このほかに、「初期動作」、缶を移動する工程が存在する。~
#ref(文書1.png,wrap)
*反省点 [#s5f73126]
-プログラム制作の所要時間を甘く見積もりすぎた結果、プログ...
--缶を移動するプログラムが出来なかった。
~
-原理不明のまま動作している部分がある。
ページ名: