2019b/Member/yuu/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題2:ライントレース [#b5adab8b]
下の図のようなコースを各チームで作成し、「ミッション」を...
&ref(IMG_5730bcomp.png,nolink,90%, );
**コースについて [#lbeb3b1d]
1人目のコースを走ります。
+A地点から出発
+B
+C (直進)
+D (一時停止の後、直進)
+E, F 通過
+G (一時停止の後、左折)
+H (一時停止の後、左折)
+I (ボール or キューボイドをつかんでUターン)
+H (直進)
+J (一時停止)
+A地点に入る(ゴール)
線に沿って進めるか、交差点を判断できるか、ボールをつかめ...
*ロボットについて [#u97ed52b]
インストラクションに乗っていたロボット元にして、線を認識...
超音波センサは前にある物体との距離を測るセンサです。ボー...
モータにはボールを囲うためを枠がつけられています。ロボッ...
&ref(IMG_5744bcomp.jpg,nolink,90%, );
&ref(IMG_E5690comp.jpg,nolink,81%, );
もともとボールを持ち上げて運ぶものを作ろうとしていたので...
*プログラムについて [#rd8aea22]
&ref(IMG_E5747comp.jpg,nolink,90%, );
&ref(IMG_E5748comp.jpg,nolink,90%, );
**一本道の場合 [#s362ccf6]
線の左側をトレースする方法について説明します。ライトセン...
**交差点の認識 [#jf8412e1]
「左に大きく曲がる」が続いた場合に交差点と判断します。具...
**ボールを拾う直前以外のライントレース サブルーチン [#na9...
void line_follow(long tmin=0, long tmax=0, int side=1) ...
{
SetSensorLight(S3); ...
int turn, bril; ...
long time1 = CurrentTick(); ...
long time2 = CurrentTick(); ...
while((CurrentTick()-time2 < 230) && (CurrentTick()-...
bril = SENSOR_3 - 50; ...
turn = side*pow(bril*0.14, 5); ...
if(abs(turn)>90){
turn = 90*(abs(turn)/turn); ...
}
OnFwdSync(OUT_BC, 20, turn);
if((CurrentTick()-time1 < tmin)||(bril > -11)){
time2 = CurrentTick(); ...
}
NumOut(0, 48, bril); ...
NumOut(0, 56, turn*side);
}
Off(OUT_BC); ...
Wait(1000); ...
}
ライントレースしてtmin[ms]経った後、交差点を見つけると1秒...
>
//line_followの8行目
bril = SENSOR_3 - 50;
turn = side*pow(bril*0.14, 5);
if(abs(turn)>90){
turn = 90*(abs(turn)/turn);
}
SENSOR_3はライトセンサの値で、明るい(白)ほど大きく、暗い(...
ちなみに、abs(A)はA絶対値、pow(A,B)はAのB乗を表します。
>
//line_follow 7行目
while((CurrentTick()-time2 < 230) && (CurrentTick()-time...
>
//line_follow 14行目
if((CurrentTick()-time1 < tmin)||(bril > -11)){
time2 = CurrentTick();
}
CurrentTick()-time1はサブルーチン開始から経過した時間で、...
ちなみに、&&はAND(論理積)、||はOR(論理和)を表します。
**ボールを拾う直前(H→I)のライントレース ザブルーチン [#oe...
void line_follow2(long tmin=0, long tmax=0, int side=1)
{
SetSensorLight(S3);
SetSensorLowspeed(S2); ...
int turn,bril;
long time1 = CurrentTick();
long time2 = CurrentTick();
while((CurrentTick()-time2 < 230) && (CurrentTick()-...
bril = SENSOR_3 - 50;
turn = side*pow(bril*0.14, 5);
if(abs(turn)>90){
turn = 90*(abs(turn)/turn);
}
OnFwdSync(OUT_BC, 20, turn);
if((CurrentTick()-time1 < tmin)||(bril > -11)){
time2 = CurrentTick();
}
NumOut(0, 48, bril);
NumOut(0, 56, turn*side);
}
Off(OUT_BC);
Wait(1000);
}
line_followとほとんど同じですが、8行目whileの条件式を追加...
**G、H交差点での左回転 [#r994d37a]
void turn_left(){
SetSensorLight(S3);
RotateMotorEx(OUT_BC, 30, 180, 0, true, true);
OnFwdSync(OUT_BC, 30, -100);
Wait(1000); //初めの線は...
while(SENSOR_3 > 60){}
Wait(180);
Off(OUT_BC);
}
そのままライントレースを続けて交差点を曲がろうとすると、...
&ref(IMG_E5732comp.jpg,nolink,90%, );
&ref(IMG_E5733comp.jpg,nolink,90%, );
&ref(IMG_E5734comp.jpg,nolink,90%, );
**I地点での右旋回 [#a9309a44]
void turn_right(){
SetSensorLight(S3);
OnFwdSync(OUT_BC, 30, 100);
Wait(1000);
while(SENSOR_3 > 60){}
Wait(180);
Off(OUT_BC);
}
ボールを拾った後のUターンです。Uターンした後、センサの位...
**メインプログラム [#xcf574a1]
task main()
{
ClearScreen();
Off(OUT_A);
RotateMotorEx(OUT_BC, 20, 100, 0, true, true); ...
line_follow(3000, 100000, 1); ...
TextOut(0, 0, "ABCD");
RotateMotorEx(OUT_BC, 20, 100, 10, true, true); ...
line_follow(3000, 100000, 1); ...
TextOut(0, 8, "EFG");
turn_left();
line_follow(1000, 100000, 1); ...
TextOut(0, 16, "GH");
turn_left();
line_follow2(1000, 100000, 1); ...
TextOut(0, 24, "HI");
RotateMotorEx(OUT_BC, 30, 40, 0, true, true);
RotateMotor(OUT_A, 30, -45); ...
Off(OUT_A); ...
turn_right(); ...
TextOut(0, 32, "IH");
line_follow(30000, 60000, -1); ...
TextOut(0, 40, "IJ");
RotateMotorEx(OUT_BC, 30, 500, 0, true, true);
}
交差点を直進するときにはライトセンサを使うとややこしくな...
*結果・感想 [#jf3ae9c7]
JからAに入るところで交差点を検知してくれず、ゴール付近ま...
機能をつけようとして、brilが0に近いところでは加速させてい...
*おまけ [#veb8571c]
プログラムの内容ばかりになったので、掴む機構の試作(失敗作...
&ref(IMG_5682(1)comp.jpg,nolink,50%, );
&ref(IMG_5682(4)comp.jpg,nolink,50%, );
&ref(IMG_5682(5)comp.jpg,nolink,50%, );
&ref(IMG_5682(7)comp.jpg,nolink,50%, );
超音波センサの位置を調節しにくい、ボールが正面にないと回...
終了行:
目次
#contents
*課題2:ライントレース [#b5adab8b]
下の図のようなコースを各チームで作成し、「ミッション」を...
&ref(IMG_5730bcomp.png,nolink,90%, );
**コースについて [#lbeb3b1d]
1人目のコースを走ります。
+A地点から出発
+B
+C (直進)
+D (一時停止の後、直進)
+E, F 通過
+G (一時停止の後、左折)
+H (一時停止の後、左折)
+I (ボール or キューボイドをつかんでUターン)
+H (直進)
+J (一時停止)
+A地点に入る(ゴール)
線に沿って進めるか、交差点を判断できるか、ボールをつかめ...
*ロボットについて [#u97ed52b]
インストラクションに乗っていたロボット元にして、線を認識...
超音波センサは前にある物体との距離を測るセンサです。ボー...
モータにはボールを囲うためを枠がつけられています。ロボッ...
&ref(IMG_5744bcomp.jpg,nolink,90%, );
&ref(IMG_E5690comp.jpg,nolink,81%, );
もともとボールを持ち上げて運ぶものを作ろうとしていたので...
*プログラムについて [#rd8aea22]
&ref(IMG_E5747comp.jpg,nolink,90%, );
&ref(IMG_E5748comp.jpg,nolink,90%, );
**一本道の場合 [#s362ccf6]
線の左側をトレースする方法について説明します。ライトセン...
**交差点の認識 [#jf8412e1]
「左に大きく曲がる」が続いた場合に交差点と判断します。具...
**ボールを拾う直前以外のライントレース サブルーチン [#na9...
void line_follow(long tmin=0, long tmax=0, int side=1) ...
{
SetSensorLight(S3); ...
int turn, bril; ...
long time1 = CurrentTick(); ...
long time2 = CurrentTick(); ...
while((CurrentTick()-time2 < 230) && (CurrentTick()-...
bril = SENSOR_3 - 50; ...
turn = side*pow(bril*0.14, 5); ...
if(abs(turn)>90){
turn = 90*(abs(turn)/turn); ...
}
OnFwdSync(OUT_BC, 20, turn);
if((CurrentTick()-time1 < tmin)||(bril > -11)){
time2 = CurrentTick(); ...
}
NumOut(0, 48, bril); ...
NumOut(0, 56, turn*side);
}
Off(OUT_BC); ...
Wait(1000); ...
}
ライントレースしてtmin[ms]経った後、交差点を見つけると1秒...
>
//line_followの8行目
bril = SENSOR_3 - 50;
turn = side*pow(bril*0.14, 5);
if(abs(turn)>90){
turn = 90*(abs(turn)/turn);
}
SENSOR_3はライトセンサの値で、明るい(白)ほど大きく、暗い(...
ちなみに、abs(A)はA絶対値、pow(A,B)はAのB乗を表します。
>
//line_follow 7行目
while((CurrentTick()-time2 < 230) && (CurrentTick()-time...
>
//line_follow 14行目
if((CurrentTick()-time1 < tmin)||(bril > -11)){
time2 = CurrentTick();
}
CurrentTick()-time1はサブルーチン開始から経過した時間で、...
ちなみに、&&はAND(論理積)、||はOR(論理和)を表します。
**ボールを拾う直前(H→I)のライントレース ザブルーチン [#oe...
void line_follow2(long tmin=0, long tmax=0, int side=1)
{
SetSensorLight(S3);
SetSensorLowspeed(S2); ...
int turn,bril;
long time1 = CurrentTick();
long time2 = CurrentTick();
while((CurrentTick()-time2 < 230) && (CurrentTick()-...
bril = SENSOR_3 - 50;
turn = side*pow(bril*0.14, 5);
if(abs(turn)>90){
turn = 90*(abs(turn)/turn);
}
OnFwdSync(OUT_BC, 20, turn);
if((CurrentTick()-time1 < tmin)||(bril > -11)){
time2 = CurrentTick();
}
NumOut(0, 48, bril);
NumOut(0, 56, turn*side);
}
Off(OUT_BC);
Wait(1000);
}
line_followとほとんど同じですが、8行目whileの条件式を追加...
**G、H交差点での左回転 [#r994d37a]
void turn_left(){
SetSensorLight(S3);
RotateMotorEx(OUT_BC, 30, 180, 0, true, true);
OnFwdSync(OUT_BC, 30, -100);
Wait(1000); //初めの線は...
while(SENSOR_3 > 60){}
Wait(180);
Off(OUT_BC);
}
そのままライントレースを続けて交差点を曲がろうとすると、...
&ref(IMG_E5732comp.jpg,nolink,90%, );
&ref(IMG_E5733comp.jpg,nolink,90%, );
&ref(IMG_E5734comp.jpg,nolink,90%, );
**I地点での右旋回 [#a9309a44]
void turn_right(){
SetSensorLight(S3);
OnFwdSync(OUT_BC, 30, 100);
Wait(1000);
while(SENSOR_3 > 60){}
Wait(180);
Off(OUT_BC);
}
ボールを拾った後のUターンです。Uターンした後、センサの位...
**メインプログラム [#xcf574a1]
task main()
{
ClearScreen();
Off(OUT_A);
RotateMotorEx(OUT_BC, 20, 100, 0, true, true); ...
line_follow(3000, 100000, 1); ...
TextOut(0, 0, "ABCD");
RotateMotorEx(OUT_BC, 20, 100, 10, true, true); ...
line_follow(3000, 100000, 1); ...
TextOut(0, 8, "EFG");
turn_left();
line_follow(1000, 100000, 1); ...
TextOut(0, 16, "GH");
turn_left();
line_follow2(1000, 100000, 1); ...
TextOut(0, 24, "HI");
RotateMotorEx(OUT_BC, 30, 40, 0, true, true);
RotateMotor(OUT_A, 30, -45); ...
Off(OUT_A); ...
turn_right(); ...
TextOut(0, 32, "IH");
line_follow(30000, 60000, -1); ...
TextOut(0, 40, "IJ");
RotateMotorEx(OUT_BC, 30, 500, 0, true, true);
}
交差点を直進するときにはライトセンサを使うとややこしくな...
*結果・感想 [#jf3ae9c7]
JからAに入るところで交差点を検知してくれず、ゴール付近ま...
機能をつけようとして、brilが0に近いところでは加速させてい...
*おまけ [#veb8571c]
プログラムの内容ばかりになったので、掴む機構の試作(失敗作...
&ref(IMG_5682(1)comp.jpg,nolink,50%, );
&ref(IMG_5682(4)comp.jpg,nolink,50%, );
&ref(IMG_5682(5)comp.jpg,nolink,50%, );
&ref(IMG_5682(7)comp.jpg,nolink,50%, );
超音波センサの位置を調節しにくい、ボールが正面にないと回...
ページ名: