2015a/Member/KTY/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*目次 [#q0beaeb0]
#contents
*課題の説明 [#ib723224]
&ref(./img.jpeg,20%);
-画像のようなコースを作成し、与えられた条件を満たしてゴー...
***条件 [#ndfbf27e]
+A,B,Cのいずれかから、それぞれ指定された場所までコースに...
+交差点は曲がらずに通過する。
+途中に設置されたボールをゴールまで持っていく。(可能なら...
今回私が担当するのは、BからスタートしてAまで移動するもの...
コースは下の画像のとおり。(S=スタート,G=ゴール)
&ref(./img2.jpeg,20%);
*ロボットの説明 [#bd77b578]
**本体 [#s425d79f]
&ref(./image[2].jpeg,20%);
これが今回私たちのチームが制作したロボットである。~
アームでボールを囲み、ゴールまで運ぶ。
**アーム [#ie485727]
***アーム1 [#wf712d8e]
&ref(./image.jpeg,13%);
本体の下部にあり、ボールをキャッチし外に出ないようにする...
***アーム2 [#peeefd4c]
&ref(./image[6].jpeg,15%);
本体の上部にあり、最初は開いている。~
ボールが射程範囲に入るころに閉じ、ゴールまで運べるように...
シュートのときは再度開く。
*コンセプト [#a317f46d]
光センサの値が低い(黒〜灰色)ときは右に、高い(灰色〜白)と...
そのためラインの左側に沿ってゴールまで移動していく。~
光センサの値が低い場合が続いたら交差点と判断し、突破用の...
光センサの値が高い場合が続いたらゴール前だと判断し、シュ...
ただし最初のカーブで光センサの値が高い場合が続いてしまう...
ボールは上で書いたように、2つのアームを使って運ぶ。~
ボールが射程範囲に入る時間をあらかじめ測っており、そのこ...
シュートはアーム2を開き、体当たりすることで行う。
*プログラム [#ye3fb51e]
**マクロ [#y9ccd10e]
#define THRESHOLD 39 //光センサの基準値
#define SPEED_H 30 //直線に進むときのスピード
#define SPEED_L 20 //曲線に進むときのスピード
#define downtime 10000 //ボールが射程範囲に入る...
#define down OnFwd(OUT_A,40);Wait(500);Off(OUT_A);Wait(3...
#define up OnRev(OUT_A,40);Wait(500);Off(OUT_A);Wait(300...
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_H, SPEED_H); //まっすぐ...
#define turn_left1 OnRL(SPEED_L, -SPEED_L); // 左旋回
#define turn_left0 OnRL(SPEED_L, 0); // 左折
#define turn_right0 OnRL(0, SPEED_L); // 右折
#define turn_right1 OnRL(-SPEED_L, SPEED_L); // 右旋回
#define STEP 1
#define nMAX 300 //光センサの値が低い状態がこの時...
#define CROSS_TIME 200 //交差点突破に必要な時間
#define goal OnRev(OUT_BC,50);Wait(500);Off(OUT_BC);Wait...
up;OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC); ...
**サブルーチン [#mc07ce40]
***小休止 [#yd51f688]
sub short_break(long s){
int a=0;
while(a<1000){
Off(OUT_BC);
Wait(STEP);
if(CurrentTick()-s<=downtime+1.0 && downtime<=Cu...
down;
}
a++;
}
}
激しい動作を行った後の小休止用サブルーチン。~
メインプログラム上では発進時刻を引数にとる。~
休止中にアーム2を下げる時間がきてもいいように、0.001秒ご...
判定は、開始時刻と現在の時刻の差がアーム2を下げる予定時間...
判定をクリアしたら、アーム2が下がる。
***交差点突破 [#qa0ca622]
sub cross_line(long t){
int b=0;
while(b<CROSS_TIME){
OnRL(SPEED_L,SPEED_L);
Wait(STEP);
if(CurrentTick()-t<=downtime+1.0 && downtime<=Cu...
down;
}
b++;
}
}
交差点突破用サブルーチン。~
定義したCROSS_TIMEの分だけ前進する。~
これも小休止用と同じく、0.001秒ごとに判定を行っている。
***進行方向修正 [#v9214ccc]
sub c_direction(long u){
int c=0;
while(c<nMAX){
turn_left1;
Wait(STEP);
if(CurrentTick()-u<=downtime+1.0 && downtime<=Cu...
down;
}
c++;
}
}
進行方向を修正するサブルーチン。~
交差点判定後に進行方向を修正するためのものである。~
これも上記の2つと同様に判定を行っている。
**メイン [#a1376baa]
開始から10秒まで(前半)と、10秒以降(後半)とで違うプログラ...
***開始から10秒まで [#i2b8cf80]
task main(){
SetSensorLight(S3); //光センサ
int nOnline=0; //黒線上にいる回数のカウン...
long t0=CurrentTick(); //開始時刻
while (CurrentTick()-t0<10000) //開始から10秒までの間{
while (nOnline < nMAX) //黒線上にいる時間が一定...
if(CurrentTick()-t0<=downtime+1 && downtime<...
down;
}
if (SENSOR_3 < THRESHOLD-8){ //黒線上にいる...
turn_right1; //右旋回
nOnline++; //カウンター(黒)を増やす
}
else {
if (SENSOR_3 < THRESHOLD-5){ //黒線より...
turn_right0; //右折
}
else if (SENSOR_3 < THRESHOLD+5){ //境界付近...
go_forward; //直進
}
else if (SENSOR_3 < THRESHOLD+8){ //白よりの...
turn_left0; //左折
}
else{ //白紙上に...
turn_left1; //左旋回
}
nOnline=0;//カウンター(黒)をリセット
}
Wait(STEP);//0.001秒動作を継続
}
//カウンターが一定数に達したら
short_break(t0); //小休止
c_direction(t0); //軌道修正
cross_line(t0); //交差点突破
nOnline=0; //カウンター(黒)をリセット
}
開始から10秒まではこのプログラムに従って動く。~
光センサの値に従って、右旋回・右折・直進・左折・左旋回を...
右旋回が一定時間続いた場合、交差点を突破する。
***開始から10秒以降 [#c297922f]
int g=0; //白紙上にいる回数のカウンター(...
while(CurrentTick()-t0>10000.0 && CurrentTick()-t0<10000...
while (nOnline < nMAX){ //カウンター(黒)が一定数未満...
if(CurrentTick()-t0<=downtime+1 && downtime<=Cur...
down;
}
if (SENSOR_3 < THRESHOLD-8){ //黒線上にあるとき
turn_right1; //右旋回
nOnline++; //カウンター(黒)を増やす
g=0; //カウンター(白)をリセット
}
else if (SENSOR_3 >= THRESHOLD+8){ //白紙上にい...
turn_left1; //左旋回
g++; //カウンター(白)を増やす
nOnline=0; //カウンター(黒)をリセット
if(g==nMAX){ //カウンター(白)が一定数に達し...
nOnline=nMAX;//カウンター(黒)を一定値す...
}
}
else{
if (SENSOR_3 < THRESHOLD-5){ //黒線よりの境...
turn_right0; //右折
}
else if (SENSOR_3 < THRESHOLD+5){ //境界付近...
go_forward; //直進
}
else if (SENSOR_3 < THRESHOLD+8){ //白よりの...
turn_left0; //左折 }
nOnline=0; //カウンター(黒)をリセット
g=0; //カウンター(白)をリセット
}
Wait(STEP);0.001秒動作を継続
}
if(g<nMAX){ //カウンター(黒)が一定数に達した場合...
short_break(t0);//小休止
c_direction(t0);//軌道修正
cross_line(t0); //交差点突破
nOnline=0; //カウンター(黒)をリセット
}
else if(g==nMAX){カウンター(白)が一定数に達した...
short_break(t0);//小休止
turn_right1;Wait(nMAX*STEP);//軌道修正
goal;//シュート
t0-=10000000;//開始時刻の数値を減らすことで...
}
}
}
開始から10秒以降はこのプログラムに従って動く。~
前半と同じく光センサの値に従って、右旋回・右折・直進・左...
また左旋回が一定時間続いた場合、シュートして終了する。~
なお、条件に開始から10000秒で終了するとあるが、これはt0の...
*結果 [#e41fff56]
スタートからライントレースを行い、交差点突破、ボールの確...
*苦労したところ・反省点 [#h7ce2d02]
**苦労したこと [#b65b839b]
-ロボット製作において、ボールをキャッチさせるためにタッチ...
-プログラミングにおいては様々な苦労があった。前回につづき...
**反省点 [#o868e8fc]
-ロボット制作においては、もっと時間を費やしたほうがよかっ...
-プログラミングにおいては、考えを整理して一から組むべきだ...
*感想 [#f439ae4e]
反省点の項では今回のロボットやプログラムについてネガティ...
またプログラミングにおいても、新しく習ったタイマー機能や...
終了行:
*目次 [#q0beaeb0]
#contents
*課題の説明 [#ib723224]
&ref(./img.jpeg,20%);
-画像のようなコースを作成し、与えられた条件を満たしてゴー...
***条件 [#ndfbf27e]
+A,B,Cのいずれかから、それぞれ指定された場所までコースに...
+交差点は曲がらずに通過する。
+途中に設置されたボールをゴールまで持っていく。(可能なら...
今回私が担当するのは、BからスタートしてAまで移動するもの...
コースは下の画像のとおり。(S=スタート,G=ゴール)
&ref(./img2.jpeg,20%);
*ロボットの説明 [#bd77b578]
**本体 [#s425d79f]
&ref(./image[2].jpeg,20%);
これが今回私たちのチームが制作したロボットである。~
アームでボールを囲み、ゴールまで運ぶ。
**アーム [#ie485727]
***アーム1 [#wf712d8e]
&ref(./image.jpeg,13%);
本体の下部にあり、ボールをキャッチし外に出ないようにする...
***アーム2 [#peeefd4c]
&ref(./image[6].jpeg,15%);
本体の上部にあり、最初は開いている。~
ボールが射程範囲に入るころに閉じ、ゴールまで運べるように...
シュートのときは再度開く。
*コンセプト [#a317f46d]
光センサの値が低い(黒〜灰色)ときは右に、高い(灰色〜白)と...
そのためラインの左側に沿ってゴールまで移動していく。~
光センサの値が低い場合が続いたら交差点と判断し、突破用の...
光センサの値が高い場合が続いたらゴール前だと判断し、シュ...
ただし最初のカーブで光センサの値が高い場合が続いてしまう...
ボールは上で書いたように、2つのアームを使って運ぶ。~
ボールが射程範囲に入る時間をあらかじめ測っており、そのこ...
シュートはアーム2を開き、体当たりすることで行う。
*プログラム [#ye3fb51e]
**マクロ [#y9ccd10e]
#define THRESHOLD 39 //光センサの基準値
#define SPEED_H 30 //直線に進むときのスピード
#define SPEED_L 20 //曲線に進むときのスピード
#define downtime 10000 //ボールが射程範囲に入る...
#define down OnFwd(OUT_A,40);Wait(500);Off(OUT_A);Wait(3...
#define up OnRev(OUT_A,40);Wait(500);Off(OUT_A);Wait(300...
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_H, SPEED_H); //まっすぐ...
#define turn_left1 OnRL(SPEED_L, -SPEED_L); // 左旋回
#define turn_left0 OnRL(SPEED_L, 0); // 左折
#define turn_right0 OnRL(0, SPEED_L); // 右折
#define turn_right1 OnRL(-SPEED_L, SPEED_L); // 右旋回
#define STEP 1
#define nMAX 300 //光センサの値が低い状態がこの時...
#define CROSS_TIME 200 //交差点突破に必要な時間
#define goal OnRev(OUT_BC,50);Wait(500);Off(OUT_BC);Wait...
up;OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC); ...
**サブルーチン [#mc07ce40]
***小休止 [#yd51f688]
sub short_break(long s){
int a=0;
while(a<1000){
Off(OUT_BC);
Wait(STEP);
if(CurrentTick()-s<=downtime+1.0 && downtime<=Cu...
down;
}
a++;
}
}
激しい動作を行った後の小休止用サブルーチン。~
メインプログラム上では発進時刻を引数にとる。~
休止中にアーム2を下げる時間がきてもいいように、0.001秒ご...
判定は、開始時刻と現在の時刻の差がアーム2を下げる予定時間...
判定をクリアしたら、アーム2が下がる。
***交差点突破 [#qa0ca622]
sub cross_line(long t){
int b=0;
while(b<CROSS_TIME){
OnRL(SPEED_L,SPEED_L);
Wait(STEP);
if(CurrentTick()-t<=downtime+1.0 && downtime<=Cu...
down;
}
b++;
}
}
交差点突破用サブルーチン。~
定義したCROSS_TIMEの分だけ前進する。~
これも小休止用と同じく、0.001秒ごとに判定を行っている。
***進行方向修正 [#v9214ccc]
sub c_direction(long u){
int c=0;
while(c<nMAX){
turn_left1;
Wait(STEP);
if(CurrentTick()-u<=downtime+1.0 && downtime<=Cu...
down;
}
c++;
}
}
進行方向を修正するサブルーチン。~
交差点判定後に進行方向を修正するためのものである。~
これも上記の2つと同様に判定を行っている。
**メイン [#a1376baa]
開始から10秒まで(前半)と、10秒以降(後半)とで違うプログラ...
***開始から10秒まで [#i2b8cf80]
task main(){
SetSensorLight(S3); //光センサ
int nOnline=0; //黒線上にいる回数のカウン...
long t0=CurrentTick(); //開始時刻
while (CurrentTick()-t0<10000) //開始から10秒までの間{
while (nOnline < nMAX) //黒線上にいる時間が一定...
if(CurrentTick()-t0<=downtime+1 && downtime<...
down;
}
if (SENSOR_3 < THRESHOLD-8){ //黒線上にいる...
turn_right1; //右旋回
nOnline++; //カウンター(黒)を増やす
}
else {
if (SENSOR_3 < THRESHOLD-5){ //黒線より...
turn_right0; //右折
}
else if (SENSOR_3 < THRESHOLD+5){ //境界付近...
go_forward; //直進
}
else if (SENSOR_3 < THRESHOLD+8){ //白よりの...
turn_left0; //左折
}
else{ //白紙上に...
turn_left1; //左旋回
}
nOnline=0;//カウンター(黒)をリセット
}
Wait(STEP);//0.001秒動作を継続
}
//カウンターが一定数に達したら
short_break(t0); //小休止
c_direction(t0); //軌道修正
cross_line(t0); //交差点突破
nOnline=0; //カウンター(黒)をリセット
}
開始から10秒まではこのプログラムに従って動く。~
光センサの値に従って、右旋回・右折・直進・左折・左旋回を...
右旋回が一定時間続いた場合、交差点を突破する。
***開始から10秒以降 [#c297922f]
int g=0; //白紙上にいる回数のカウンター(...
while(CurrentTick()-t0>10000.0 && CurrentTick()-t0<10000...
while (nOnline < nMAX){ //カウンター(黒)が一定数未満...
if(CurrentTick()-t0<=downtime+1 && downtime<=Cur...
down;
}
if (SENSOR_3 < THRESHOLD-8){ //黒線上にあるとき
turn_right1; //右旋回
nOnline++; //カウンター(黒)を増やす
g=0; //カウンター(白)をリセット
}
else if (SENSOR_3 >= THRESHOLD+8){ //白紙上にい...
turn_left1; //左旋回
g++; //カウンター(白)を増やす
nOnline=0; //カウンター(黒)をリセット
if(g==nMAX){ //カウンター(白)が一定数に達し...
nOnline=nMAX;//カウンター(黒)を一定値す...
}
}
else{
if (SENSOR_3 < THRESHOLD-5){ //黒線よりの境...
turn_right0; //右折
}
else if (SENSOR_3 < THRESHOLD+5){ //境界付近...
go_forward; //直進
}
else if (SENSOR_3 < THRESHOLD+8){ //白よりの...
turn_left0; //左折 }
nOnline=0; //カウンター(黒)をリセット
g=0; //カウンター(白)をリセット
}
Wait(STEP);0.001秒動作を継続
}
if(g<nMAX){ //カウンター(黒)が一定数に達した場合...
short_break(t0);//小休止
c_direction(t0);//軌道修正
cross_line(t0); //交差点突破
nOnline=0; //カウンター(黒)をリセット
}
else if(g==nMAX){カウンター(白)が一定数に達した...
short_break(t0);//小休止
turn_right1;Wait(nMAX*STEP);//軌道修正
goal;//シュート
t0-=10000000;//開始時刻の数値を減らすことで...
}
}
}
開始から10秒以降はこのプログラムに従って動く。~
前半と同じく光センサの値に従って、右旋回・右折・直進・左...
また左旋回が一定時間続いた場合、シュートして終了する。~
なお、条件に開始から10000秒で終了するとあるが、これはt0の...
*結果 [#e41fff56]
スタートからライントレースを行い、交差点突破、ボールの確...
*苦労したところ・反省点 [#h7ce2d02]
**苦労したこと [#b65b839b]
-ロボット製作において、ボールをキャッチさせるためにタッチ...
-プログラミングにおいては様々な苦労があった。前回につづき...
**反省点 [#o868e8fc]
-ロボット制作においては、もっと時間を費やしたほうがよかっ...
-プログラミングにおいては、考えを整理して一から組むべきだ...
*感想 [#f439ae4e]
反省点の項では今回のロボットやプログラムについてネガティ...
またプログラミングにおいても、新しく習ったタイマー機能や...
ページ名: