2016b/Member/ta.kashi/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2016b/Member]]
#contents
* 概要 [#a20e41ad]
今回の[[課題:http://yakushi.shinshu-u.ac.jp/robotics/?201...
"AからDのコースでは, A(スタート)->P->Q->(ボール捕獲)->Q->...
#ref(2016b/Member/ta.kashi/Mission2/map.png,80%,マップ)
* 動作の仕組み [#hb5e6b36]
** ライントレース [#o5fd7a41]
今回は光センサーを"ひとつだけ"使用してライントレースを行...
もしセンサーが"黒線上"と判断した時は, 進行方向を左に修正...
ただしこの方法では交差点を検出できない(左屈折と判断して左...
** 交差点の判断 [#rf03b1a4]
しかし, 光センサーが交差点を通過するとき, 光センサーは一...
#ref(2016b/Member/ta.kashi/Mission2/fig3.jpg,80%,交差点の...
* ハードウェアについて [#d88ec1ce]
#ref(2016b/Member/ta.kashi/Mission2/fig1.jpg,80%,完成した...
#ref(2016b/Member/ta.kashi/Mission2/fig4.JPG,80%,ボールを...
今回のローバーは, mindstorm付属のテキストに紹介されている...
- 光センサー
- ボール捕獲用アーム
をフロントにセットした.
NXT本体, ボール捕獲用アームがそれぞれタイヤ駆動用モーター...
** 光センサー [#g31ebbe2]
光センサーは紙面すれすれに設置することもできたが, 紙面と...
#ref(2016b/Member/ta.kashi/Mission2/fig2.jpg,80%,光センサ...
黒線の, 左側の境界をなぞっていくので, 光センサーはフロン...
** ボール捕獲用アーム [#d15a2b06]
フロント部分にモーターユニットを設置する余裕がなかったの...
むしろ, 前輪のグリップ力が上がることで, 他のチームにあっ...
* ソフトウェアについて [#k387a557]
以下がコードである.
#define SPEED 30
#define go_forward OnFwd(OUT_BC, SPEED);
#define l_turn OnFwd(OUT_B, SPEED); Off(OUT_C);
#define r_turn OnFwd(OUT_C, SPEED); Off(OUT_B);
#define timer_r t0 = CurrentTick();
/*
OUT_A -> ハンドル制御
OUT_B -> タイヤ(右)
OUT_C -> タイヤ(左)
SNS_4 -> 光センサー(ライントレース)
*/
//交差点直進
sub CROSS_GO()
{
RotateMotor(OUT_B, SPEED, -150);
go_forward; Wait(500);
}
//交差点右折
sub CROSS_R()
{
RotateMotor(OUT_B, SPEED, -300);
go_forward; Wait(900);
}
//交差点左折
sub CROSS_L()
{
RotateMotor(OUT_B, SPEED, 90);
}
//ボールを捕獲
sub BALLGET()
{
go_forward; Wait(700);
Off(OUT_BC); Wait(500);
RotateMotor(OUT_A, SPEED, -50);
Off(OUT_ABC); Wait(500);
}
//ボールを射出
sub BALLTHROW()
{
RotateMotor(OUT_B, SPEED, -170);
RotateMotor(OUT_A, SPEED, 50);
Off(OUT_ABC); Wait(500);
OnFwd(OUT_BC, SPEED + 30); Wait(200); Off(OUT_BC);
}
task main()
{
SetSensorLight(S4);
long t0 = CurrentTick();
//交差点を数える
int cross = 0;
while(cross <= 7)
{
if (CurrentTick() - t0 < 2000)
{
if(SENSOR_4 > 48)
{
r_turn; timer_r;
}
else if(SENSOR_4 > 42)
{
go_forward; timer_r;
}
else
{
l_turn;
}
}
//交差点とゴール
else
{
Off(OUT_BC); Wait(1000);
if ((cross == 0) || (cross == 2) || (cross == 5))
{
/* 交差点を直進 */
CROSS_GO();
}
else if (cross == 1)
{
/* 交差点を直進後,ボールを捕獲 */
CROSS_GO(); BALLGET();
}
else if (cross == 3)
{
/* ヘアピンカーブ */
RotateMotor(OUT_B, SPEED, 100);
}
else if (cross == 4)
{
/* 交差点右折 */
CROSS_R();
}
else if (cross == 6)
{
/* 交差点左折 */
CROSS_L();
}
else if (cross == 7)
{
/* ボール射出 */
BALLTHROW();
}
cross ++;
timer_r;
}
}
}
以下に詳細を説明する.
** モーターとセンサーの説明 [#cabe6d7b]
/*
OUT_A -> ハンドル制御
OUT_B -> タイヤ(右)
OUT_C -> タイヤ(左)
SNS_4 -> 光センサー(ライントレース)
*/
これは, それぞれのモーターの出力とセンサーの対応を示して...
** モーターのトルク,移動等の定義 [#m5248ead]
#define SPEED 30
#define go_forward OnFwd(OUT_BC, SPEED);
#define l_turn OnFwd(OUT_B, SPEED); Off(OUT_C);
#define r_turn OnFwd(OUT_C, SPEED); Off(OUT_B);
#define timer_r t0 = CurrentTick();
- SPEEDはモーターのトルクの定義(バッテリー電圧の変化を吸...
- go_forwardは前進
- l_turnは進路を左方向に調整
- r_turnは進路を右方向に調整
- timer_rはタイマーをリセットする(交差点の判断に利用)
これ以外の複雑な動作(交差点の進行, ボールの捕獲・射出など...
** 各種動作の定義 [#k08685fe]
//交差点直進
sub CROSS_GO()
{
RotateMotor(OUT_B, SPEED, -150);
go_forward; Wait(500);
}
//交差点右折
sub CROSS_R()
{
RotateMotor(OUT_B, SPEED, -300);
go_forward; Wait(900);
}
//交差点左折
sub CROSS_L()
{
RotateMotor(OUT_B, SPEED, 90);
}
//ボールを捕獲
sub BALLGET()
{
go_forward; Wait(700);
Off(OUT_BC); Wait(500);
RotateMotor(OUT_A, SPEED, -50);
Off(OUT_ABC); Wait(500);
}
//ボールを射出
sub BALLTHROW()
{
RotateMotor(OUT_B, SPEED, -170);
RotateMotor(OUT_A, SPEED, 50);
Off(OUT_ABC); Wait(500);
OnFwd(OUT_BC, SPEED + 30); Wait(200); Off(OUT_BC);
}
*** 交差点直進・右折・左折 [#w52bdcb4]
ライントレースを一旦中止し, 進行方向を修正し, ある程度直...
*** ボールを捕獲・射出 [#p23e7d13]
ボールは交差点Qの10cm先にあるので, 交差点Qを通過後10cm進...
射出時は進行方向を修正し, アームをあげて, ローバーを急発...
** task main() [#v84e643e]
task main()
{
光センサーとそのポートを定義.
SetSensorLight(S4);
交差点の判断にタイマーを利用する. ここでlong型のt0に現在...
long t0 = CurrentTick();
通過する交差点が何番目の交差点なのかを判断する. 交差点(ヘ...
//交差点を数える
int cross = 0;
crossが8になった時(=すべての交差点, ヘアピンカーブ, ゴー...
while(cross <= 7)
{
光センサーの値が
- 48以上 : 右へ進路変更
- 42以上48未満 : 直進
- 42未満 : 左へ進路変更
if (CurrentTick() - t0 < 2000)
{
if(SENSOR_4 > 48)
{
r_turn; timer_r;
}
else if(SENSOR_4 > 42)
{
go_forward; timer_r;
}
else
{
l_turn;
}
}
タイマーを利用し, "左へ進路変更"が2秒間続くと交差点(ヘア...
+ 交差点P(1) : 直進
+ 交差点Q(1) : 直進後,ボールを捕獲
+ 交差点Q(2) : 直進
+ ヘアピンカーブ : 直進
+ 交差点R : 右折
+ 交差点P(2) : 直進
+ 交差点S : 左折
+ ゴール : ボール射出
である. 各動作のあとにcrossの値を増やし, タイマーをリセッ...
//交差点とゴール
else
{
Off(OUT_BC); Wait(1000);
if ((cross == 0) || (cross == 2) || (cross == 5))
{
/* 交差点を直進 */
CROSS_GO();
}
else if (cross == 1)
{
/* 交差点を直進後,ボールを捕獲 */
CROSS_GO(); BALLGET();
}
else if (cross == 3)
{
/* ヘアピンカーブ */
RotateMotor(OUT_B, SPEED, 100);
}
else if (cross == 4)
{
/* 交差点右折 */
CROSS_R();
}
else if (cross == 6)
{
/* 交差点左折 */
CROSS_L();
}
else if (cross == 7)
{
/* ボール射出 */
BALLTHROW();
}
cross ++;
timer_r;
}
}
}
* 感想 [#ud632351]
ローバー自体の設計が遅れてしまい, それが原因で16日の発表...
一方で, ロボットやプログラム自体は当初思っていたよりもし...
終了行:
[[2016b/Member]]
#contents
* 概要 [#a20e41ad]
今回の[[課題:http://yakushi.shinshu-u.ac.jp/robotics/?201...
"AからDのコースでは, A(スタート)->P->Q->(ボール捕獲)->Q->...
#ref(2016b/Member/ta.kashi/Mission2/map.png,80%,マップ)
* 動作の仕組み [#hb5e6b36]
** ライントレース [#o5fd7a41]
今回は光センサーを"ひとつだけ"使用してライントレースを行...
もしセンサーが"黒線上"と判断した時は, 進行方向を左に修正...
ただしこの方法では交差点を検出できない(左屈折と判断して左...
** 交差点の判断 [#rf03b1a4]
しかし, 光センサーが交差点を通過するとき, 光センサーは一...
#ref(2016b/Member/ta.kashi/Mission2/fig3.jpg,80%,交差点の...
* ハードウェアについて [#d88ec1ce]
#ref(2016b/Member/ta.kashi/Mission2/fig1.jpg,80%,完成した...
#ref(2016b/Member/ta.kashi/Mission2/fig4.JPG,80%,ボールを...
今回のローバーは, mindstorm付属のテキストに紹介されている...
- 光センサー
- ボール捕獲用アーム
をフロントにセットした.
NXT本体, ボール捕獲用アームがそれぞれタイヤ駆動用モーター...
** 光センサー [#g31ebbe2]
光センサーは紙面すれすれに設置することもできたが, 紙面と...
#ref(2016b/Member/ta.kashi/Mission2/fig2.jpg,80%,光センサ...
黒線の, 左側の境界をなぞっていくので, 光センサーはフロン...
** ボール捕獲用アーム [#d15a2b06]
フロント部分にモーターユニットを設置する余裕がなかったの...
むしろ, 前輪のグリップ力が上がることで, 他のチームにあっ...
* ソフトウェアについて [#k387a557]
以下がコードである.
#define SPEED 30
#define go_forward OnFwd(OUT_BC, SPEED);
#define l_turn OnFwd(OUT_B, SPEED); Off(OUT_C);
#define r_turn OnFwd(OUT_C, SPEED); Off(OUT_B);
#define timer_r t0 = CurrentTick();
/*
OUT_A -> ハンドル制御
OUT_B -> タイヤ(右)
OUT_C -> タイヤ(左)
SNS_4 -> 光センサー(ライントレース)
*/
//交差点直進
sub CROSS_GO()
{
RotateMotor(OUT_B, SPEED, -150);
go_forward; Wait(500);
}
//交差点右折
sub CROSS_R()
{
RotateMotor(OUT_B, SPEED, -300);
go_forward; Wait(900);
}
//交差点左折
sub CROSS_L()
{
RotateMotor(OUT_B, SPEED, 90);
}
//ボールを捕獲
sub BALLGET()
{
go_forward; Wait(700);
Off(OUT_BC); Wait(500);
RotateMotor(OUT_A, SPEED, -50);
Off(OUT_ABC); Wait(500);
}
//ボールを射出
sub BALLTHROW()
{
RotateMotor(OUT_B, SPEED, -170);
RotateMotor(OUT_A, SPEED, 50);
Off(OUT_ABC); Wait(500);
OnFwd(OUT_BC, SPEED + 30); Wait(200); Off(OUT_BC);
}
task main()
{
SetSensorLight(S4);
long t0 = CurrentTick();
//交差点を数える
int cross = 0;
while(cross <= 7)
{
if (CurrentTick() - t0 < 2000)
{
if(SENSOR_4 > 48)
{
r_turn; timer_r;
}
else if(SENSOR_4 > 42)
{
go_forward; timer_r;
}
else
{
l_turn;
}
}
//交差点とゴール
else
{
Off(OUT_BC); Wait(1000);
if ((cross == 0) || (cross == 2) || (cross == 5))
{
/* 交差点を直進 */
CROSS_GO();
}
else if (cross == 1)
{
/* 交差点を直進後,ボールを捕獲 */
CROSS_GO(); BALLGET();
}
else if (cross == 3)
{
/* ヘアピンカーブ */
RotateMotor(OUT_B, SPEED, 100);
}
else if (cross == 4)
{
/* 交差点右折 */
CROSS_R();
}
else if (cross == 6)
{
/* 交差点左折 */
CROSS_L();
}
else if (cross == 7)
{
/* ボール射出 */
BALLTHROW();
}
cross ++;
timer_r;
}
}
}
以下に詳細を説明する.
** モーターとセンサーの説明 [#cabe6d7b]
/*
OUT_A -> ハンドル制御
OUT_B -> タイヤ(右)
OUT_C -> タイヤ(左)
SNS_4 -> 光センサー(ライントレース)
*/
これは, それぞれのモーターの出力とセンサーの対応を示して...
** モーターのトルク,移動等の定義 [#m5248ead]
#define SPEED 30
#define go_forward OnFwd(OUT_BC, SPEED);
#define l_turn OnFwd(OUT_B, SPEED); Off(OUT_C);
#define r_turn OnFwd(OUT_C, SPEED); Off(OUT_B);
#define timer_r t0 = CurrentTick();
- SPEEDはモーターのトルクの定義(バッテリー電圧の変化を吸...
- go_forwardは前進
- l_turnは進路を左方向に調整
- r_turnは進路を右方向に調整
- timer_rはタイマーをリセットする(交差点の判断に利用)
これ以外の複雑な動作(交差点の進行, ボールの捕獲・射出など...
** 各種動作の定義 [#k08685fe]
//交差点直進
sub CROSS_GO()
{
RotateMotor(OUT_B, SPEED, -150);
go_forward; Wait(500);
}
//交差点右折
sub CROSS_R()
{
RotateMotor(OUT_B, SPEED, -300);
go_forward; Wait(900);
}
//交差点左折
sub CROSS_L()
{
RotateMotor(OUT_B, SPEED, 90);
}
//ボールを捕獲
sub BALLGET()
{
go_forward; Wait(700);
Off(OUT_BC); Wait(500);
RotateMotor(OUT_A, SPEED, -50);
Off(OUT_ABC); Wait(500);
}
//ボールを射出
sub BALLTHROW()
{
RotateMotor(OUT_B, SPEED, -170);
RotateMotor(OUT_A, SPEED, 50);
Off(OUT_ABC); Wait(500);
OnFwd(OUT_BC, SPEED + 30); Wait(200); Off(OUT_BC);
}
*** 交差点直進・右折・左折 [#w52bdcb4]
ライントレースを一旦中止し, 進行方向を修正し, ある程度直...
*** ボールを捕獲・射出 [#p23e7d13]
ボールは交差点Qの10cm先にあるので, 交差点Qを通過後10cm進...
射出時は進行方向を修正し, アームをあげて, ローバーを急発...
** task main() [#v84e643e]
task main()
{
光センサーとそのポートを定義.
SetSensorLight(S4);
交差点の判断にタイマーを利用する. ここでlong型のt0に現在...
long t0 = CurrentTick();
通過する交差点が何番目の交差点なのかを判断する. 交差点(ヘ...
//交差点を数える
int cross = 0;
crossが8になった時(=すべての交差点, ヘアピンカーブ, ゴー...
while(cross <= 7)
{
光センサーの値が
- 48以上 : 右へ進路変更
- 42以上48未満 : 直進
- 42未満 : 左へ進路変更
if (CurrentTick() - t0 < 2000)
{
if(SENSOR_4 > 48)
{
r_turn; timer_r;
}
else if(SENSOR_4 > 42)
{
go_forward; timer_r;
}
else
{
l_turn;
}
}
タイマーを利用し, "左へ進路変更"が2秒間続くと交差点(ヘア...
+ 交差点P(1) : 直進
+ 交差点Q(1) : 直進後,ボールを捕獲
+ 交差点Q(2) : 直進
+ ヘアピンカーブ : 直進
+ 交差点R : 右折
+ 交差点P(2) : 直進
+ 交差点S : 左折
+ ゴール : ボール射出
である. 各動作のあとにcrossの値を増やし, タイマーをリセッ...
//交差点とゴール
else
{
Off(OUT_BC); Wait(1000);
if ((cross == 0) || (cross == 2) || (cross == 5))
{
/* 交差点を直進 */
CROSS_GO();
}
else if (cross == 1)
{
/* 交差点を直進後,ボールを捕獲 */
CROSS_GO(); BALLGET();
}
else if (cross == 3)
{
/* ヘアピンカーブ */
RotateMotor(OUT_B, SPEED, 100);
}
else if (cross == 4)
{
/* 交差点右折 */
CROSS_R();
}
else if (cross == 6)
{
/* 交差点左折 */
CROSS_L();
}
else if (cross == 7)
{
/* ボール射出 */
BALLTHROW();
}
cross ++;
timer_r;
}
}
}
* 感想 [#ud632351]
ローバー自体の設計が遅れてしまい, それが原因で16日の発表...
一方で, ロボットやプログラム自体は当初思っていたよりもし...
ページ名: