2013b/Member/Naoyoshi/Mission1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2013b/Member]]
#contents
*メンバー [#l22be8ee]
Naoyoshi, Tomo([[2013b/Member/Tomo/Mission1]])
*ロボットの説明 [#e14754cd]
**主な特徴 [#t08b66bd]
&ref(2013b/Member/Naoyoshi/Mission1/DSC_0078.jpg,100%,全...
+ ライントレースの精度を上げるために、ドライブベースを拡...
+ 缶キャッチャー用のモータとNXT本体を前後に配置。車重バラ...
+ NXT本体を立てて組み込み、缶をつかむアームを折りたたんで...
+ 上面にタッチセンサをスタートスイッチとして置いた。
**苦労した点 [#g24788f8]
当初缶を検知するセンサはタッチセンサを使用する方針だった...
缶を掴むアームも、2本の腕で確実に挟むためには、2つの回転...
*プログラムの説明 [#e8ee1ec2]
以下のプログラムはコースを半時計回りするプログラムである
**定義文 [#kd6e2aa4]
#define THRESHOLD 45 //光センサの閾値
#define SPEED_L 30 //ライントレース時のスピード
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_L,SPEED_L); //直進するマクロ
#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 50
#define short_break Off(OUT_BC);Wait(1000);
#define CROSS_TIME 200
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME...
#define FIRSTMAX 10000 //第一段階終了時間
#define SECONDMAX 33000 //第二段階終了時間
#define THIRDMAX 48000 //第三段階終了時間
#define SPEED 50 //缶をつかむ時のスピード
#define RANGE1 3.0 //缶を掴んでから少し前進する距離
#define RANGE2 6.0 //缶を話したあとに後退する距離
#define HAND OUT_A //アームを駆動するモータをAに定義
#define ADDITIONAL_TIME 1500 //缶をつかむ動作でずれたタ...
#define CATCH_TIME 1200 //アームの開閉時間
#define catch OnFwd(HAND,20);Wait(CATCH_TIME);Off(HAND);...
#define release OnRev(HAND,20);Wait(CATCH_TIME);Off(HAND...
long t0,t1,t2,t3; //t0は走行開始時間、t1は缶をつかむタス...
float width; //本体幅を定義、値は後で代入
mutex moveMutex; //この変数を参照しなければタイヤを動か...
**缶をつかむタスク [#q9361be9]
float GetAngle(float r) //与えられた距離r(float型変数)...
{
const float diameter=5.45; //タイヤの直径
const float pi=3.1415; //円周率
float ang=r/(diameter*pi)*360.0; //円周と与えられた距離...
return ang; //angを返す
}
task catch_can() //缶をつかむタスク
{
while(true)
{
if(SensorUS(S4)<=7) //超音波センサーの値が7cm以内の時
{
Acquire(moveMutex); //並列タスク同士が競合しないための...
t1=CurrentTick(); //t1に開始時間を記憶
Off(OUT_BC); //タイヤを停止
catch;
int angleA=GetAngle(RANGE1); //3cm進むための回転角度を...
RotateMotor(OUT_BC,SPEED,angleA); //3cm前進(缶を元の...
int angleB=GetAngle(2*width*3.1415/4); //車幅を半径と...
RotateMotor(OUT_B,SPEED,angleB); //1/4周左回転
RotateMotor(OUT_C,-SPEED,angleB); //1/4周右回転
release;
RotateMotor(OUT_C,-SPEED,angleB); //後ろ向きに1/4周右...
RotateMotor(OUT_B,SPEED,angleB); //後ろ向きに1/4周左...
int angleC=GetAngle(RANGE2); //6cm進むための回転角度...
RotateMotor(OUT_BC,-SPEED,angleC); //6cm後退
if(SENSOR_3>THRESHOLD) //ライン上に戻っていなかった時...
{
until(SENSOR_3<=THRESHOLD)
{
turn_left0;
}
}
t2=CurrentTick(); //t2に終了時間を記憶
t3=t3+(t2-t1)-ADDITIONAL_TIME; //今までの缶をつかむの...
Release(moveMutex); //並列タスクの抑制を開放
}
}
}
私は缶をつかむプログラムを担当した。缶をつかむためには、
- 缶の戻し方
- ロボットをライン上に戻す方法
- 缶をつかむ動作でずれたタイマーの補正
を考えなければならなかった。このうち缶を戻す動作は、下図...
#ref(2013b/Member/Naoyoshi/Mission1/ライントレース.png,10...
ロボットをライン上に戻すためには、元の向きに戻ってから黒...
タイマーのずれに対しては、缶をつかむ動作の前後で時間を記...
**ライントレース用のタスク [#t006768e]
task line_trace() //ライントレース用のタスク
{
int nOnline=0;
while(true)
{
while(nOnline<nMAX)
{
PlaySound(SOUND_CLICK);//第一段階開始、反時計回りコー...
while(CurrentTick()-t0-t3<=FIRSTMAX)
{
Acquire(moveMutex); //並列タスク同士が競合しないため...
if(SENSOR_3<THRESHOLD-4)
{
turn_right1;
}
else if(SENSOR_3<THRESHOLD+4)
{
go_forward;
}
else
{
turn_left1;
}
Wait(STEP);
Release(moveMutex); //競合抑制を開放する
}//終了
PlaySound(SOUND_FAST_UP);//第二段階開始、時計回りコー...
turn_left1;
Wait(700);
while(CurrentTick()-t0-t3<=SECONDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-7)
{
turn_left0;
nOnline++;
}
else
{
if(SENSOR_3<THRESHOLD+7)
{
go_forward;
}
else
{
turn_right1;
}
nOnline=0;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_UP);//第三段階開始、反時計...
turn_right1;
Wait(1000);
while(CurrentTick()-t0-t3<=THIRDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-7)
{
turn_right0;
nOnline++;
}
else
{
if(SENSOR_3<THRESHOLD+7)
{
go_forward;
}
else
{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_CLICK);//第四段階開始、時計回りコーナ...
while(CurrentTick()-t0-t3>THIRDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-4)
{
turn_right1;
}
else if(SENSOR_3<THRESHOLD+4)
{
go_forward;
}
else
{
turn_left1;
}
Wait(STEP);
Release(moveMutex);
}//終了
}
short_break;
turn_left1;
Wait(nMAX*STEP); //交差点判定にかかった時間だけ逆方向に...
cross_line;
nOnline=0;
}
}
今回はライントレース用のプログラムをTomo[[2013b/Member/To...
交差点の判定は一定回数以上右折または左折を繰り返したかで...
**メインタスク [#s7f72931]
task main() //メインタスク。ここからすべてのタスクが開始...
{
t1=0;
t2=0;
t3=0; //時間に関する変数にすべて初期値0を代入
width=12.8; //ロボット本体の幅、回転角度の算出に使う
SetSensorTouch(S1);
SetSensorLight(S3);
SetSensorLowspeed(S4); //センサ類を定義
while(SENSOR_1==0) //タッチセンサが押されるまで待機、タ...
{
Wait(1);
}
t0=CurrentTick(); //開始時間を記憶
Precedes(catch_can,line_trace); //缶をつかむタスクとライ...
}
変数類はtaskの外で定義したが、taskの外では具体的な数値を...
命令文Precedes(a,b);は、aとbのタスクを並列して実行する。...
**苦労した点 [#t4591db9]
例えば
while(A){while(B){X;}}
Y;
というプログラムがあった時、Aが満たされなくなった時にすぐ...
*制作を終えての反省点 [#a475a1fc]
- ロボットが若干大きい。カーブは曲がり切れるが、せっかく...
- プログラムが大きくなりすぎた。今回は掲載しなかったが、...
- 電圧によってタイマーを調整しなければならない。電圧一定...
*発表を終えて [#z8346557]
- 時間調整がうまく行ったので、狙った通りのタイミングで交...
- 缶をつかむ動作の最後に中々ライン上に戻ってくることが出...
*参考にしたサイト [#s72ccc6f]
Daniele Benedettelli, 『NXC を使ったLEGO のNXT ロボットの...
終了行:
[[2013b/Member]]
#contents
*メンバー [#l22be8ee]
Naoyoshi, Tomo([[2013b/Member/Tomo/Mission1]])
*ロボットの説明 [#e14754cd]
**主な特徴 [#t08b66bd]
&ref(2013b/Member/Naoyoshi/Mission1/DSC_0078.jpg,100%,全...
+ ライントレースの精度を上げるために、ドライブベースを拡...
+ 缶キャッチャー用のモータとNXT本体を前後に配置。車重バラ...
+ NXT本体を立てて組み込み、缶をつかむアームを折りたたんで...
+ 上面にタッチセンサをスタートスイッチとして置いた。
**苦労した点 [#g24788f8]
当初缶を検知するセンサはタッチセンサを使用する方針だった...
缶を掴むアームも、2本の腕で確実に挟むためには、2つの回転...
*プログラムの説明 [#e8ee1ec2]
以下のプログラムはコースを半時計回りするプログラムである
**定義文 [#kd6e2aa4]
#define THRESHOLD 45 //光センサの閾値
#define SPEED_L 30 //ライントレース時のスピード
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_L,SPEED_L); //直進するマクロ
#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 50
#define short_break Off(OUT_BC);Wait(1000);
#define CROSS_TIME 200
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME...
#define FIRSTMAX 10000 //第一段階終了時間
#define SECONDMAX 33000 //第二段階終了時間
#define THIRDMAX 48000 //第三段階終了時間
#define SPEED 50 //缶をつかむ時のスピード
#define RANGE1 3.0 //缶を掴んでから少し前進する距離
#define RANGE2 6.0 //缶を話したあとに後退する距離
#define HAND OUT_A //アームを駆動するモータをAに定義
#define ADDITIONAL_TIME 1500 //缶をつかむ動作でずれたタ...
#define CATCH_TIME 1200 //アームの開閉時間
#define catch OnFwd(HAND,20);Wait(CATCH_TIME);Off(HAND);...
#define release OnRev(HAND,20);Wait(CATCH_TIME);Off(HAND...
long t0,t1,t2,t3; //t0は走行開始時間、t1は缶をつかむタス...
float width; //本体幅を定義、値は後で代入
mutex moveMutex; //この変数を参照しなければタイヤを動か...
**缶をつかむタスク [#q9361be9]
float GetAngle(float r) //与えられた距離r(float型変数)...
{
const float diameter=5.45; //タイヤの直径
const float pi=3.1415; //円周率
float ang=r/(diameter*pi)*360.0; //円周と与えられた距離...
return ang; //angを返す
}
task catch_can() //缶をつかむタスク
{
while(true)
{
if(SensorUS(S4)<=7) //超音波センサーの値が7cm以内の時
{
Acquire(moveMutex); //並列タスク同士が競合しないための...
t1=CurrentTick(); //t1に開始時間を記憶
Off(OUT_BC); //タイヤを停止
catch;
int angleA=GetAngle(RANGE1); //3cm進むための回転角度を...
RotateMotor(OUT_BC,SPEED,angleA); //3cm前進(缶を元の...
int angleB=GetAngle(2*width*3.1415/4); //車幅を半径と...
RotateMotor(OUT_B,SPEED,angleB); //1/4周左回転
RotateMotor(OUT_C,-SPEED,angleB); //1/4周右回転
release;
RotateMotor(OUT_C,-SPEED,angleB); //後ろ向きに1/4周右...
RotateMotor(OUT_B,SPEED,angleB); //後ろ向きに1/4周左...
int angleC=GetAngle(RANGE2); //6cm進むための回転角度...
RotateMotor(OUT_BC,-SPEED,angleC); //6cm後退
if(SENSOR_3>THRESHOLD) //ライン上に戻っていなかった時...
{
until(SENSOR_3<=THRESHOLD)
{
turn_left0;
}
}
t2=CurrentTick(); //t2に終了時間を記憶
t3=t3+(t2-t1)-ADDITIONAL_TIME; //今までの缶をつかむの...
Release(moveMutex); //並列タスクの抑制を開放
}
}
}
私は缶をつかむプログラムを担当した。缶をつかむためには、
- 缶の戻し方
- ロボットをライン上に戻す方法
- 缶をつかむ動作でずれたタイマーの補正
を考えなければならなかった。このうち缶を戻す動作は、下図...
#ref(2013b/Member/Naoyoshi/Mission1/ライントレース.png,10...
ロボットをライン上に戻すためには、元の向きに戻ってから黒...
タイマーのずれに対しては、缶をつかむ動作の前後で時間を記...
**ライントレース用のタスク [#t006768e]
task line_trace() //ライントレース用のタスク
{
int nOnline=0;
while(true)
{
while(nOnline<nMAX)
{
PlaySound(SOUND_CLICK);//第一段階開始、反時計回りコー...
while(CurrentTick()-t0-t3<=FIRSTMAX)
{
Acquire(moveMutex); //並列タスク同士が競合しないため...
if(SENSOR_3<THRESHOLD-4)
{
turn_right1;
}
else if(SENSOR_3<THRESHOLD+4)
{
go_forward;
}
else
{
turn_left1;
}
Wait(STEP);
Release(moveMutex); //競合抑制を開放する
}//終了
PlaySound(SOUND_FAST_UP);//第二段階開始、時計回りコー...
turn_left1;
Wait(700);
while(CurrentTick()-t0-t3<=SECONDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-7)
{
turn_left0;
nOnline++;
}
else
{
if(SENSOR_3<THRESHOLD+7)
{
go_forward;
}
else
{
turn_right1;
}
nOnline=0;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_UP);//第三段階開始、反時計...
turn_right1;
Wait(1000);
while(CurrentTick()-t0-t3<=THIRDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-7)
{
turn_right0;
nOnline++;
}
else
{
if(SENSOR_3<THRESHOLD+7)
{
go_forward;
}
else
{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_CLICK);//第四段階開始、時計回りコーナ...
while(CurrentTick()-t0-t3>THIRDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-4)
{
turn_right1;
}
else if(SENSOR_3<THRESHOLD+4)
{
go_forward;
}
else
{
turn_left1;
}
Wait(STEP);
Release(moveMutex);
}//終了
}
short_break;
turn_left1;
Wait(nMAX*STEP); //交差点判定にかかった時間だけ逆方向に...
cross_line;
nOnline=0;
}
}
今回はライントレース用のプログラムをTomo[[2013b/Member/To...
交差点の判定は一定回数以上右折または左折を繰り返したかで...
**メインタスク [#s7f72931]
task main() //メインタスク。ここからすべてのタスクが開始...
{
t1=0;
t2=0;
t3=0; //時間に関する変数にすべて初期値0を代入
width=12.8; //ロボット本体の幅、回転角度の算出に使う
SetSensorTouch(S1);
SetSensorLight(S3);
SetSensorLowspeed(S4); //センサ類を定義
while(SENSOR_1==0) //タッチセンサが押されるまで待機、タ...
{
Wait(1);
}
t0=CurrentTick(); //開始時間を記憶
Precedes(catch_can,line_trace); //缶をつかむタスクとライ...
}
変数類はtaskの外で定義したが、taskの外では具体的な数値を...
命令文Precedes(a,b);は、aとbのタスクを並列して実行する。...
**苦労した点 [#t4591db9]
例えば
while(A){while(B){X;}}
Y;
というプログラムがあった時、Aが満たされなくなった時にすぐ...
*制作を終えての反省点 [#a475a1fc]
- ロボットが若干大きい。カーブは曲がり切れるが、せっかく...
- プログラムが大きくなりすぎた。今回は掲載しなかったが、...
- 電圧によってタイマーを調整しなければならない。電圧一定...
*発表を終えて [#z8346557]
- 時間調整がうまく行ったので、狙った通りのタイミングで交...
- 缶をつかむ動作の最後に中々ライン上に戻ってくることが出...
*参考にしたサイト [#s72ccc6f]
Daniele Benedettelli, 『NXC を使ったLEGO のNXT ロボットの...
ページ名: