2016b/Member/mamedeppo/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*課題 [#y81382c6]
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=atta...
ルート1を担当する。
「A地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ...
Aスタート → P直進 → Q直進 → (ピンポン玉をキャッチ) → Q直...
ただし、
なるべく速く正確に動くロボットになるように工夫して、交差...
ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい
可能であればC,Dのゴールエリアライン上からシュートする」
*ロボット [#bd99d88b]
**全体像 [#hce31d60]
#ref(7ケーブル有り.jpg)
RISに比べれば巨大になった。本体のボタンは押しやすい。
**各パーツ [#hbdb37bb]
#ref(1ケーブル無し.jpg)
光センサは紙面と垂直にギリギリまで接近させた。精度よく、...
前輪は左右に激しく揺れるので滑りにくいゴムタイヤはつけな...
#ref(8中心部.jpg)
本体、モーターA、光センサ、超音波センサだけを取り出した写...
#ref(6横棒.jpg)
左右のモーターが八の字に開かないよう後ろから横棒のパーツ...
#ref(キャッチボール.jpg)
超音波センサの真下にボールが来た時、モーターAのアームで枠...
アームが上がっているとき、超音波センサのすぐ前を棒が遮る...
カーブで機体が揺れると失敗するので点Qを通過したあとすぐに...
*プログラム [#e14514df]
**サブルーチンプログラム [#fea0d26a]
***線を追う [#c3b5760e]
・定義
#define turn_right OnRev(OUT_B,40);
#define turn_right_slow OnRev(OUT_B,40); OnFwd(OUT_C,30);
#define turn_left OnRev(OUT_C,40);
#define turn_left_slow OnRev(OUT_C,40); OnFwd(OUT_B,30);
#define go OnRev(OUT_BC,40);
#define MAX_TIME 500
40%のスピードが最もコースから外れにくく、交差点の誤認識...
交差点で進路を確かめるために旋回したり、機体の向きを整え...
sub FOLLOW_LINE()
{
long t0=CurrentTick();
while(CurrentTick()-t0<MAX_TIME){
if(SENSOR_1<=42){ //線上黒なら右折
turn_right;
}else if(SENSOR_1<=48){
turn_right_slow;
t0=CurrentTick();
}else if(SENSOR_1<=58){ //丁度黒線と白紙の境界線...
go;
t0=CurrentTick();
}else if(SENSOR_1<=65){
turn_left_slow;
t0=CurrentTick();
}else{
turn_left; //線外白なら左折
t0=CurrentTick();
}
}
Off(OUT_BC);
PlaySound(SOUND_UP); //停止した時=交差点認識...
Wait(2000);
}
交差点でない限り、ロボットが黒線の左側を追って走り続ける...
・QR間の急なカーブを曲がる
#ref(10ヘアピンミス.jpg)
授業の発表時、FOLLOW_LINEではQR間の急なカーブを曲がりきれ...
なのでこの区間だけ小刻みにタイヤを動かしてしっかり線上を...
#define kokizami_right OnRev(OUT_B,50); OnFwd(OUT_C,40);
#define kokizami_left OnRev(OUT_C,50); OnFwd(OUT_B,40);
sub FOLLOW_LINE_KOKIZAMI()
{
long t0=CurrentTick();
while(CurrentTick()-t0<MAX_TIME){
if(SENSOR_1<=42){
kokizami_right; //変更
}else if(SENSOR_1<=48){
turn_right_slow;
t0=CurrentTick();
}else if(SENSOR_1<=58){
go;
t0=CurrentTick();
}else if(SENSOR_1<=65){
turn_left_slow;
t0=CurrentTick();
}else{
kokizami_left; //変更
t0=CurrentTick();
}
}
Off(OUT_BC);
PlaySound(SOUND_UP);
Wait(2000);
}
FOLLOW_LINEとほとんど変更していないが、QR間を辿れるように...
#ref(12ヘアピンクリア.jpg)
***右折・左折・直線 [#nede7519]
おおよその動きは以下のGIFを参照
#ref(cross_gif.gif)
sub USETSU()
{
OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC);
OnRev(OUT_C,50); Wait(1500); Off(OUT_C);
}
点Rで右折する。Rで交差点認識した時、機体は左寄りに進みす...
sub SASETSU()
{
OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC);
OnRev(OUT_B,50); Wait(1500); Off(OUT_B);
}
点Sで左折する。Sで交差点認識した時、機体は進みすぎている...
sub CROSS()
{
go; Wait(800); Off(OUT_BC);
}
点P.Qで2回ずつ交差点を直進する。垂直の線の幅をまっすぐ通...
***ボールをつかむ [#r1421a19]
sub CATCH_BALL()
{
go;
until (abs(SensorUS(S2)-13)>=4);
if(abs(SensorUS(S2)-13)>=4){
Off(OUT_BC); //ボールを認...
OnRev(OUT_A,30); Wait(500); Off(OUT_A); //アームを下...
}
}
点Qを過ぎてからはFOLLOW_LINEではガタガタしてボールを認識...
平常時のSensorUS(S2)の値は13cm、ボールが真下に来た時は8cm...
なので絶対値を計算する関数abs()で平常時の13cmから4cm前後...
***ゴールにシュート [#m3d8c6fb]
sub GOAL()
{
OnFwd(OUT_A,30); Wait(300); Off(OUT_A); //Aのアーム...
OnFwd(OUT_BC,40); Wait(800); Off(OUT_BC); //少しロボッ...
OnRev(OUT_A,30); Wait(500); Off(OUT_A); //Aのアーム...
OnRev(OUT_BC,60); Wait(500); Off(OUT_BC); //ロボットを...
}
発表時は距離が足りずボールに当たらなかった。
紙の上でボールの位置が安定しないのでこのアームの形だと難...
**メインプログラム [#ua9900a3]
task main()
{
SetSensorLight(S1);
SetSensorLowspeed(S2); //光センサ、超音波センサを設定
FOLLOW_LINE();
CROSS(); //直進P
FOLLOW_LINE();
CROSS(); //直進Q
CATCH_BALL(); //ボールをキャッチ
FOLLOW_LINE();
CROSS(); //直進Q
FOLLOW_LINE_KOKIZAMI();
USETSU(); //右折R
FOLLOW_LINE();
CROSS(); //直進P
FOLLOW_LINE();
SASETSU(); //左折S
FOLLOW_LINE();
GOAL(); //ゴール
}
全ての動作を部品化したのでとても見やすい。メンテナンスも...
*実演の反省 [#a6a9a55c]
・初めてスタートからゴールまで走りきってくれた。
・QR間が曲がりきれなかった。→解決した
・ボールをゴールにシュートできなかった。→不可能ではないが...
*学んだこと・課題 [#r6b9eff9]
・前回の反省(プログラムしやすいようにロボットを組み立て...
・一つの動作が終わった時に音や画面表示などサインを出して...
・閾値の設定やFOLLOW_LINEの定義の値はまだ改善の余地がある...
*感想 [#p819a847]
やっとNXTに慣れてきたと感じた。それでもわからないことはた...
終了行:
#contents
*課題 [#y81382c6]
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=atta...
ルート1を担当する。
「A地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ...
Aスタート → P直進 → Q直進 → (ピンポン玉をキャッチ) → Q直...
ただし、
なるべく速く正確に動くロボットになるように工夫して、交差...
ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい
可能であればC,Dのゴールエリアライン上からシュートする」
*ロボット [#bd99d88b]
**全体像 [#hce31d60]
#ref(7ケーブル有り.jpg)
RISに比べれば巨大になった。本体のボタンは押しやすい。
**各パーツ [#hbdb37bb]
#ref(1ケーブル無し.jpg)
光センサは紙面と垂直にギリギリまで接近させた。精度よく、...
前輪は左右に激しく揺れるので滑りにくいゴムタイヤはつけな...
#ref(8中心部.jpg)
本体、モーターA、光センサ、超音波センサだけを取り出した写...
#ref(6横棒.jpg)
左右のモーターが八の字に開かないよう後ろから横棒のパーツ...
#ref(キャッチボール.jpg)
超音波センサの真下にボールが来た時、モーターAのアームで枠...
アームが上がっているとき、超音波センサのすぐ前を棒が遮る...
カーブで機体が揺れると失敗するので点Qを通過したあとすぐに...
*プログラム [#e14514df]
**サブルーチンプログラム [#fea0d26a]
***線を追う [#c3b5760e]
・定義
#define turn_right OnRev(OUT_B,40);
#define turn_right_slow OnRev(OUT_B,40); OnFwd(OUT_C,30);
#define turn_left OnRev(OUT_C,40);
#define turn_left_slow OnRev(OUT_C,40); OnFwd(OUT_B,30);
#define go OnRev(OUT_BC,40);
#define MAX_TIME 500
40%のスピードが最もコースから外れにくく、交差点の誤認識...
交差点で進路を確かめるために旋回したり、機体の向きを整え...
sub FOLLOW_LINE()
{
long t0=CurrentTick();
while(CurrentTick()-t0<MAX_TIME){
if(SENSOR_1<=42){ //線上黒なら右折
turn_right;
}else if(SENSOR_1<=48){
turn_right_slow;
t0=CurrentTick();
}else if(SENSOR_1<=58){ //丁度黒線と白紙の境界線...
go;
t0=CurrentTick();
}else if(SENSOR_1<=65){
turn_left_slow;
t0=CurrentTick();
}else{
turn_left; //線外白なら左折
t0=CurrentTick();
}
}
Off(OUT_BC);
PlaySound(SOUND_UP); //停止した時=交差点認識...
Wait(2000);
}
交差点でない限り、ロボットが黒線の左側を追って走り続ける...
・QR間の急なカーブを曲がる
#ref(10ヘアピンミス.jpg)
授業の発表時、FOLLOW_LINEではQR間の急なカーブを曲がりきれ...
なのでこの区間だけ小刻みにタイヤを動かしてしっかり線上を...
#define kokizami_right OnRev(OUT_B,50); OnFwd(OUT_C,40);
#define kokizami_left OnRev(OUT_C,50); OnFwd(OUT_B,40);
sub FOLLOW_LINE_KOKIZAMI()
{
long t0=CurrentTick();
while(CurrentTick()-t0<MAX_TIME){
if(SENSOR_1<=42){
kokizami_right; //変更
}else if(SENSOR_1<=48){
turn_right_slow;
t0=CurrentTick();
}else if(SENSOR_1<=58){
go;
t0=CurrentTick();
}else if(SENSOR_1<=65){
turn_left_slow;
t0=CurrentTick();
}else{
kokizami_left; //変更
t0=CurrentTick();
}
}
Off(OUT_BC);
PlaySound(SOUND_UP);
Wait(2000);
}
FOLLOW_LINEとほとんど変更していないが、QR間を辿れるように...
#ref(12ヘアピンクリア.jpg)
***右折・左折・直線 [#nede7519]
おおよその動きは以下のGIFを参照
#ref(cross_gif.gif)
sub USETSU()
{
OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC);
OnRev(OUT_C,50); Wait(1500); Off(OUT_C);
}
点Rで右折する。Rで交差点認識した時、機体は左寄りに進みす...
sub SASETSU()
{
OnFwd(OUT_BC,50); Wait(500); Off(OUT_BC);
OnRev(OUT_B,50); Wait(1500); Off(OUT_B);
}
点Sで左折する。Sで交差点認識した時、機体は進みすぎている...
sub CROSS()
{
go; Wait(800); Off(OUT_BC);
}
点P.Qで2回ずつ交差点を直進する。垂直の線の幅をまっすぐ通...
***ボールをつかむ [#r1421a19]
sub CATCH_BALL()
{
go;
until (abs(SensorUS(S2)-13)>=4);
if(abs(SensorUS(S2)-13)>=4){
Off(OUT_BC); //ボールを認...
OnRev(OUT_A,30); Wait(500); Off(OUT_A); //アームを下...
}
}
点Qを過ぎてからはFOLLOW_LINEではガタガタしてボールを認識...
平常時のSensorUS(S2)の値は13cm、ボールが真下に来た時は8cm...
なので絶対値を計算する関数abs()で平常時の13cmから4cm前後...
***ゴールにシュート [#m3d8c6fb]
sub GOAL()
{
OnFwd(OUT_A,30); Wait(300); Off(OUT_A); //Aのアーム...
OnFwd(OUT_BC,40); Wait(800); Off(OUT_BC); //少しロボッ...
OnRev(OUT_A,30); Wait(500); Off(OUT_A); //Aのアーム...
OnRev(OUT_BC,60); Wait(500); Off(OUT_BC); //ロボットを...
}
発表時は距離が足りずボールに当たらなかった。
紙の上でボールの位置が安定しないのでこのアームの形だと難...
**メインプログラム [#ua9900a3]
task main()
{
SetSensorLight(S1);
SetSensorLowspeed(S2); //光センサ、超音波センサを設定
FOLLOW_LINE();
CROSS(); //直進P
FOLLOW_LINE();
CROSS(); //直進Q
CATCH_BALL(); //ボールをキャッチ
FOLLOW_LINE();
CROSS(); //直進Q
FOLLOW_LINE_KOKIZAMI();
USETSU(); //右折R
FOLLOW_LINE();
CROSS(); //直進P
FOLLOW_LINE();
SASETSU(); //左折S
FOLLOW_LINE();
GOAL(); //ゴール
}
全ての動作を部品化したのでとても見やすい。メンテナンスも...
*実演の反省 [#a6a9a55c]
・初めてスタートからゴールまで走りきってくれた。
・QR間が曲がりきれなかった。→解決した
・ボールをゴールにシュートできなかった。→不可能ではないが...
*学んだこと・課題 [#r6b9eff9]
・前回の反省(プログラムしやすいようにロボットを組み立て...
・一つの動作が終わった時に音や画面表示などサインを出して...
・閾値の設定やFOLLOW_LINEの定義の値はまだ改善の余地がある...
*感想 [#p819a847]
やっとNXTに慣れてきたと感じた。それでもわからないことはた...
ページ名: