2019a/Member/Yuta/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
目次
#contents
*課題について [#k147760c]
**コース [#q7f47694]
#ref(./2019a-mission2.png)
**ミッション [#x8152e70]
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E →...
*ロボットについて [#vaff14d9]
今回のロボットは,マニュアルに載っている基本の型をベース...
#ref(./s_IMG_3605.jpg)
↑機体を前から撮影した写真
#ref(./s_IMG_3606.jpg)
↑機体を後ろから撮影した写真
**センサーの取り付け位置 [#o009f6ff]
明るさを読み取るための光センサーをロボットに取り付ける際...
また,センサーの取り付け位置をタイヤの軸にできるだけ近づ...
#ref(./s_taiya.jpg)
**ボールを捉える機構 [#t6bb9ae6]
ボールを捉える機構の工夫として,多少ずれたとしても捉えら...
*プログラミングについて [#d134b74b]
今回作ったプログラムではライントレースする際判定をより繊...
,センサーの値を5段階で判定した.
まずNXTのモニター機能でセンサーが完全に黒の線上にある時と...
次に,bkackから+5の値までを黒寄りの灰色,whiteから−5の...
#ref(./s_line.jpg)
**定義 [#xb374300]
まずdefineで次のように定義した
#define black 30 ...
#define white 50 ...
#define speedH 30 ...
#define speedL 10 ...
#define speedM 5 ...
#define catch OnFwd(OUT_A,10);Wait(1300); ...
#define release OnRev(OUT_A,10);Wait(1300); ...
#define mae OnFwd(OUT_BC,speedH); ...
#define turnRRR OnFwd(OUT_C,speedH);OnRev(OUT_B,speedM);...
#define turnLLL OnFwd(OUT_C,speedH);ONRev(OUT_C,speedM);...
#define turnRR OnFwd(OUT_C,speedH);Off(OUT_B); ...
#define turnLL OnFwd(OUT_B,speedH);Off(OUT_C); ...
#define turnR OnFwd(OUT_C,speedH);OnFwd(OUT_B,speedL); ...
#define turnL OnFwd(OUT_B,speedH);OnFwd(OUT_C,speedL); ...
#define step 1 ...
#define jikan 100 ...
#define teishi Off(OUT_BC);Wait(300); ...
**直線のライントレース(交差点に差し掛かるとループから抜...
このプログラムではラインの右側をトレースしている.
トレースをする際黒のライン上にいるときは右に曲がるように...
CurrentTickを使うこととによって完全に黒い線上にいる時間を...
ここでは黒でいる時間の上限をt_maxとし,そこにjikanの値を...
void linetraceS() //完全に黒がjikan以上だったら外れる
{
long t0=0,t_black=0,t_max=jikan;
t0=CurrentTick();
while(t_black<t_max){ ...
if(SENSOR_3>=white){ ...
turnLL; ...
} else if(SENSOR_3>white-5){ ...
turnL; ...
} else if(SENSOR_3>black+5){ ...
mae; ...
} else if(SENSOR_3>=black){ ...
turnR; ...
} else{ ...
turnRR; ...
t0=CurrentTick(); ...
until((SENSOR_3<black+5)&&(SENSOR_3>black)); ...
t_black=CurrentTick()-t0; ...
}
Wait(step);
}
}
**カーブのときのライントレース(交差点に差し掛かるとルー...
交差点の判断は直進のときと同様の方法で行っている.
基本的には直線のときと同じ条件での構成になるが,今回制作...
void linetraceC() //完全に黒がjikan以上だったら外れる
{
long t0=0,t_black=0,t_max=jikan;
t0=CurrentTick();
while(t_black<t_max){ ...
if(SENSOR_3>=white){ ...
turnLLL; ...
} else if(SENSOR_3>white-5){ ...
turnLL; ...
} else if(SENSOR_3>black+5){ ...
mae; ...
} else if(SENSOR_3>=black){ ...
turnRR; ...
} else{ ...
turnRRR; ...
t0=CurrentTick(); ...
until((SENSOR_3<black+5)&&(SENSOR_3>black)); ...
t_black=CurrentTick()-t0; ...
}
Wait(step);
}
}
**交差点を直進して突破するサブルーチン [#z37ab65c]
前に示した2つのサブルーチンでは,完全に黒でいる時間が長...
その状況を突破するために,まず白よりの灰色になるまで前進...
void crossline()
{
mae; //前進
until(SENSOR_3>white-5); //白よりの灰色になるまで
turnLL: //左曲がり
until(SENSOR_3<black); //完全に黒になるまで
}
**交差点を曲がるサブルーチン [#kc503869]
・右の曲がるときのサブルーチン
このときもやはり斜め右を向いた状態から始まるので,そのま...
void Rcurve()
{
OnFwd(OUT_C,20);OnRev(OUT_B,10); //回転
until(SENSOR_3>white); //完全に白になるまで
}
・左に曲がるときのサブルーチン
このときも同様に右斜め前を向いて始まるので,そこから完全...
void Lcurve()
{
turnLLL; //キツい左曲がり
until(SENSOR_3>white); //完全に白になるまで
}
**回転するサブルーチン [#v1c59447]
課題のコース上Lにてボールを回収しゴールに向かう際回転する...
ボール回収後,ラインから外れるために一度前進しその後ライ...
void kaiten()
{
mae; //前進
Wait(900); //0.9秒間
OnFwd(OUT_B,20);OnRev(OUT_C,10); //回転
until(SENSOR_3<black+5); //黒寄りの灰色に...
}
**プログラムの全体 [#tb005e49]
今回自分はコースを時計回りする動きをしなくてはいけなかっ...
各行の後ろのアルファベットは,コースに振り分けられたもの...
BtoCはBからCの間のプログラムであることを表している.
task main()
{
SetSensorLight(S3);
linetraceS(); //BtoC
crossline(); //C
linetraceC(); //CtoD
teishi; //D
crossline(); //D
linetraceS(); //DtoE
Rcurve(); //E
linetraceS(); //EtoF
Rcurve(); //F
linetraceS(); //FtoG
teishi; //G
Rcurve(); //G
linetraceC(); //GtoH
crossline(); //H
linetraceC(); //HtoI
crossline(); //I
linetraceC(); //ItoJ
Rcurve(); //J
linetraceS(); //JtoK
Lcurve(); //K
linetraceS(); //KtoL
Wait(2900); //KtoL
catch; //Lでボールを取る
kaiten(); //L
linetraceS(); //LtoK
crossline(); //K
linetraceC(); //KtoM
teishi; //M
mae; //M
Wait(1000); //10秒間
release; //ゴールでボールを離す
}
*感想・反省点 [#z926a9c8]
CurrentTickなどを使った定義に手こずったが,結果ちゃんと動...
コース上L地点でボールを回収するところで線の端で止まるプロ...
カーブの際,内側のタイヤを逆回転させなくてはいけないので...
終了行:
[[2019a/Member]]
目次
#contents
*課題について [#k147760c]
**コース [#q7f47694]
#ref(./2019a-mission2.png)
**ミッション [#x8152e70]
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E →...
*ロボットについて [#vaff14d9]
今回のロボットは,マニュアルに載っている基本の型をベース...
#ref(./s_IMG_3605.jpg)
↑機体を前から撮影した写真
#ref(./s_IMG_3606.jpg)
↑機体を後ろから撮影した写真
**センサーの取り付け位置 [#o009f6ff]
明るさを読み取るための光センサーをロボットに取り付ける際...
また,センサーの取り付け位置をタイヤの軸にできるだけ近づ...
#ref(./s_taiya.jpg)
**ボールを捉える機構 [#t6bb9ae6]
ボールを捉える機構の工夫として,多少ずれたとしても捉えら...
*プログラミングについて [#d134b74b]
今回作ったプログラムではライントレースする際判定をより繊...
,センサーの値を5段階で判定した.
まずNXTのモニター機能でセンサーが完全に黒の線上にある時と...
次に,bkackから+5の値までを黒寄りの灰色,whiteから−5の...
#ref(./s_line.jpg)
**定義 [#xb374300]
まずdefineで次のように定義した
#define black 30 ...
#define white 50 ...
#define speedH 30 ...
#define speedL 10 ...
#define speedM 5 ...
#define catch OnFwd(OUT_A,10);Wait(1300); ...
#define release OnRev(OUT_A,10);Wait(1300); ...
#define mae OnFwd(OUT_BC,speedH); ...
#define turnRRR OnFwd(OUT_C,speedH);OnRev(OUT_B,speedM);...
#define turnLLL OnFwd(OUT_C,speedH);ONRev(OUT_C,speedM);...
#define turnRR OnFwd(OUT_C,speedH);Off(OUT_B); ...
#define turnLL OnFwd(OUT_B,speedH);Off(OUT_C); ...
#define turnR OnFwd(OUT_C,speedH);OnFwd(OUT_B,speedL); ...
#define turnL OnFwd(OUT_B,speedH);OnFwd(OUT_C,speedL); ...
#define step 1 ...
#define jikan 100 ...
#define teishi Off(OUT_BC);Wait(300); ...
**直線のライントレース(交差点に差し掛かるとループから抜...
このプログラムではラインの右側をトレースしている.
トレースをする際黒のライン上にいるときは右に曲がるように...
CurrentTickを使うこととによって完全に黒い線上にいる時間を...
ここでは黒でいる時間の上限をt_maxとし,そこにjikanの値を...
void linetraceS() //完全に黒がjikan以上だったら外れる
{
long t0=0,t_black=0,t_max=jikan;
t0=CurrentTick();
while(t_black<t_max){ ...
if(SENSOR_3>=white){ ...
turnLL; ...
} else if(SENSOR_3>white-5){ ...
turnL; ...
} else if(SENSOR_3>black+5){ ...
mae; ...
} else if(SENSOR_3>=black){ ...
turnR; ...
} else{ ...
turnRR; ...
t0=CurrentTick(); ...
until((SENSOR_3<black+5)&&(SENSOR_3>black)); ...
t_black=CurrentTick()-t0; ...
}
Wait(step);
}
}
**カーブのときのライントレース(交差点に差し掛かるとルー...
交差点の判断は直進のときと同様の方法で行っている.
基本的には直線のときと同じ条件での構成になるが,今回制作...
void linetraceC() //完全に黒がjikan以上だったら外れる
{
long t0=0,t_black=0,t_max=jikan;
t0=CurrentTick();
while(t_black<t_max){ ...
if(SENSOR_3>=white){ ...
turnLLL; ...
} else if(SENSOR_3>white-5){ ...
turnLL; ...
} else if(SENSOR_3>black+5){ ...
mae; ...
} else if(SENSOR_3>=black){ ...
turnRR; ...
} else{ ...
turnRRR; ...
t0=CurrentTick(); ...
until((SENSOR_3<black+5)&&(SENSOR_3>black)); ...
t_black=CurrentTick()-t0; ...
}
Wait(step);
}
}
**交差点を直進して突破するサブルーチン [#z37ab65c]
前に示した2つのサブルーチンでは,完全に黒でいる時間が長...
その状況を突破するために,まず白よりの灰色になるまで前進...
void crossline()
{
mae; //前進
until(SENSOR_3>white-5); //白よりの灰色になるまで
turnLL: //左曲がり
until(SENSOR_3<black); //完全に黒になるまで
}
**交差点を曲がるサブルーチン [#kc503869]
・右の曲がるときのサブルーチン
このときもやはり斜め右を向いた状態から始まるので,そのま...
void Rcurve()
{
OnFwd(OUT_C,20);OnRev(OUT_B,10); //回転
until(SENSOR_3>white); //完全に白になるまで
}
・左に曲がるときのサブルーチン
このときも同様に右斜め前を向いて始まるので,そこから完全...
void Lcurve()
{
turnLLL; //キツい左曲がり
until(SENSOR_3>white); //完全に白になるまで
}
**回転するサブルーチン [#v1c59447]
課題のコース上Lにてボールを回収しゴールに向かう際回転する...
ボール回収後,ラインから外れるために一度前進しその後ライ...
void kaiten()
{
mae; //前進
Wait(900); //0.9秒間
OnFwd(OUT_B,20);OnRev(OUT_C,10); //回転
until(SENSOR_3<black+5); //黒寄りの灰色に...
}
**プログラムの全体 [#tb005e49]
今回自分はコースを時計回りする動きをしなくてはいけなかっ...
各行の後ろのアルファベットは,コースに振り分けられたもの...
BtoCはBからCの間のプログラムであることを表している.
task main()
{
SetSensorLight(S3);
linetraceS(); //BtoC
crossline(); //C
linetraceC(); //CtoD
teishi; //D
crossline(); //D
linetraceS(); //DtoE
Rcurve(); //E
linetraceS(); //EtoF
Rcurve(); //F
linetraceS(); //FtoG
teishi; //G
Rcurve(); //G
linetraceC(); //GtoH
crossline(); //H
linetraceC(); //HtoI
crossline(); //I
linetraceC(); //ItoJ
Rcurve(); //J
linetraceS(); //JtoK
Lcurve(); //K
linetraceS(); //KtoL
Wait(2900); //KtoL
catch; //Lでボールを取る
kaiten(); //L
linetraceS(); //LtoK
crossline(); //K
linetraceC(); //KtoM
teishi; //M
mae; //M
Wait(1000); //10秒間
release; //ゴールでボールを離す
}
*感想・反省点 [#z926a9c8]
CurrentTickなどを使った定義に手こずったが,結果ちゃんと動...
コース上L地点でボールを回収するところで線の端で止まるプロ...
カーブの際,内側のタイヤを逆回転させなくてはいけないので...
ページ名: