*課題2 内容 [#wcd30cdd] **ボール回収シュートロボット [#f14814a0] ***重要項目 [#c6ed76ee] ・ライントレース ・黒ラインの交差点を確認する ・ボール(ピンポン球)の回収、排出 ***主なプログラミング内容 [#n628e256] 課題フィールド #ref(./2015a-mission2.png,70%) 上図のA(スタート地点)からC(ゴール枠)に行く。 途中でP〜Q間にあるボールを回収しシュートする。 私のロボットではボール位置は辺PQ間の折り目のところ。設置に輪ゴムを用いて上に置いた。 下記動画参照。 ***微調整すべき項目 [#v7a4af08] ・黒の値 ・nMAX値 ・THRESHOLDの+値(旋回と右左折の判断値幅) ・方向微調整 *ロボット外観 [#t490a7b6] **全体 [#c23b5251] スタンダードタイプから取り込み機構を付けられるよう改造していった。 RCX本体が後退したため重心バランスも考慮した。 #ref(./IMG_3505.JPG,60%) #ref(./IMG_3506.JPG,60%) #ref(./IMG_3507.JPG,60%) **ボール回収機構 [#d4f11142] 閉じた状態 #ref(./IMG_3508.JPG,50%) 開いた状態 #ref(./IMG_3509.JPG,50%) ボールをキャッチした状態 #ref(./IMG_3502.JPG,50%) #ref(./IMG_3504.JPG,50%) *走行動画 [#g5f2a270] **https://youtu.be/2UnyJd-Vjqo [#td2d6475] *プログラミング [#taed3917] **定数について [#ee717ec2] 前進マクロ #define go_a OnFwd(OUT_AC);Wait(60);Off(OUT_AC); //前進 #define go_b OnFwd(OUT_AC);Wait(80);Off(OUT_AC); //前進 通常のカーブとして許容できる繰り返しの最大値 #define nMAX 7 一回の判断で動作させる時間(0.01秒) #define STEP 1 黒の値 #define THRESHOLD 32 パワー調整 #define HIPOWER 7 // 直線用のパワー #define LOWPOWER 4 // カーブのパワー #define set_power_H SetPower(OUT_AC,HIPOWER); //(←今回は使用しなかったが微調整用に用意しておいた。) #define set_power_L SetPower(OUT_AC,LOWPOWER); ライントレースに使った移動マクロ #define go_forward set_power_L; OnFwd(OUT_AC); //直進 #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); //左旋回 #define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A); //左折 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右折 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右旋回 **メイン函数 [#r6bf1c9b] task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); int nOnline=0; //続けて黒になった回数をカウント Off(OUT_AC);PlaySound(SOUND_UP);Wait(100); //スタート合図 ↑モーターにかかったままのエネルギーをリセットするために以下同様動作ごとにOffをかける。 その時に確認音を鳴らして行く。 OnRev(OUT_B);Wait(25);Off(OUT_B); //アームを開く go_a; //最初のライン越え AからT字路、十字路までライントレースを開始する 黒(32)_左旋回 < 34 < 左折 < 42 < 直進 < 47 < 右折 < 51 < 白(52)_右旋回 while(nOnline < nMAX) { if (SENSOR_2 < THRESHOLD+2) { turn_left1; // 左旋回 nOnline++; //カウント+1 } else if (SENSOR_2 < THRESHOLD+10) { turn_left0; // 左折 nOnline=0; //カウンタリセット } else if (SENSOR_2 < THRESHOLD+15) { go_forward; // 直進 nOnline=0; } else if (SENSOR_2 < THRESHOLD+19) { turn_right0; // 右折 nOnline=0; } else { turn_right1; // 右旋回 nOnline=0; } Wait(STEP); } Off(OUT_AC); ↑ライトセンサでの白と黒とその間の判別を32〜51の間で見て進み方を変えることでスムーズなライントレースが可能になる 左旋回の時に曲がっても黒である状態をカウントし、それが多くなったところで交差点を認識する。それ以外の進みをする時はカウンターをリセットする OnFwd(OUT_B);Wait(25);Off(OUT_B); //アームを閉じてボールをホールド Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(200); //交差点で2秒小休止 OnFwd(OUT_A);OnRev(OUT_C);Wait(40); //進行方向修正 OnFwd(OUT_AC);Wait(70); Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50); //小休止 nOnline=0; //カウンタをリセット 次のライントレースは前のと逆向きに走る。 ヘアピンカーブの内側をライントレースするとそれが交差点と誤って認識してしまうからである。 while(nOnline < nMAX) //逆方向のライントレース { if (SENSOR_2 < THRESHOLD+2) { turn_right1; // 右旋回 nOnline++; //カウント+1 } else if (SENSOR_2 < THRESHOLD+10) { turn_right0; // 右折 nOnline=0; } else if (SENSOR_2 < THRESHOLD+15) { go_forward; // 直進 nOnline=0; } else if (SENSOR_2 < THRESHOLD+19) { turn_left0; // 左折 nOnline=0; } else { turn_left1; // 左旋回 nOnline=0; } Wait(STEP); } Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(100); //ゴール前の線で小休止 ゴールにボールをシュートするための操作を行う。 進行方向を修正し OnRev(OUT_AC);Wait(50); OnFwd(OUT_C);OnRev(OUT_A);Wait(30); Off(OUT_AC);PlaySound(SOUND_CLICK);Wait(50); アームを開き OnRev(OUT_B);Wait(25);Off(OUT_B); 押し出すようにしてボールをシュート go_b; OnFwd(OUT_B);Wait(25);Off(OUT_B); //アームを閉じる PlaySound(SOUND_DOWN); //終了確認音 } *考察、感想 [#c4fb8aae] ボールが今回ピンポン球で軽すぎるということで、アーム内に入った時の確認としてのタッチセンサーを諦めた。 ボール位置を微調整するなど我ながらゴリ押しな課題ロボットになってしまった。 黒線連続認識回数については理論的には0.01秒単位であるがかなり認識は荒く、 極端さすらある微調整を行ってようやくプログラムを組むことができた。 THRESHOLD+ の値を変化させて範囲を拡大縮小しスムーズなライントレースを目指した。 *【追記】ロボコン課題 [#i3366b3d] ロボコン用のページを作成した。 ロボコンの動画とプログラミングを以下に記す。 **http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMember%2Fluminous%2FMission2%2Frobocon [#r50622ed]