#contents *相方 [#k3de6eaa] リタイアしました(泣) *課題 [#u38952ef] 図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 コースの詳細については授業中説明する(下の図において、黒い線の太さは20mmで、線の中央までの距離がcm表示されている)。 1.スタート地点から出発し、黒い線にそって動く。 2.一つ目の十字の交差点と二つめの十字の交差点の間に置かれたピンポン玉をつかむ。 3.さらに黒線に沿って動いてゴール地点を目指す。 4.ゴールに向けてピンポン玉をシュートする。 ただしT字路では、直進、右折、左折を正しく判断させること。また二人一組で同じロボットを使用し、互いにスタート地点とゴール地点を入れ替えること。ロボット本体は共通のものを使うとする。 さらに以下のような動作に挑戦することが望ましい。 •ゴールエリア外からピンポン玉をシュートする。 •曲線部中央の障害物に接触しないようにすること。 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2014a%2FMission1&openfile=2014a-mission1.png *ロボット本体 [#s3037941] #ref(./IMG_1670.JPG,10%,画像に好きな名前をつける) 全体図です。 #ref(./IMG_1671.JPG,10%,) 正面図。 #ref(./IMG_1672.JPG,10%,) ボールをキャッチするシステムのアップ図。 *考えられる関門 [#tb9768e2] 今回の課題では次のようなことが主な関門となってくると思われた。 1.ライントレースをしゴールまでたどり着く。 2.交差点を見分ける。 3.ピンポン玉をキャッチする。 4.シュート! …どーしよ *工夫した点など、関門への対策 [#ke82f933] まずは1について。これは前回の課題もラインとレースだったので、割と簡単にクリアすることができた。強いて言うなら、せいぜいしきい値を変えたり光センサーの高さ、位置を変えたりしたことぐらいである。 次は2について。これも前回の課題にあったので1と同じような感じで対処できた。 問題は3。これに一番苦労した。ボールをキャッチするためには、車体を動かすモーター以外にもう一つモーターを使わなければならず、車体が重量化してしまった。ちなみに今回作ったロボットはキャッチするというよりは自分の方にボールを持ってくるようになっている。この形が一番シンプルで安定した。 仕組みは、ボールがある位置に来るとモーターが作動し、棒が降りて車体と棒の間にボールを挟むといった感じだ。だいぶ簡略化したが、大体の仕組みはこんな感じである。 最後に4。過去の映像を見ると、棒を上げる⇒車体バック⇒勢いよく前進⇒ゴール!!といった感じだったが、今回は、棒を上げる……だけ!(笑)いちいちバックしなくても、棒を上げるだけでボールの慣性で進んでくれたので棒を挙げるだけで十分だった。 *プログラム(定義) [#z4abe2a2] #define set_power_AL SetPower(OUT_A,2);//右の車輪の力(弱) #define set_power_CL SetPower(OUT_C,2);//左の車輪の力(弱) #define set_power_AH SetPower(OUT_A,4);//右の車輪の力(強) #define set_power_CH SetPower(OUT_C,4);//左の車輪の力(強) #define go_forward set_power_AH;set_power_CH;OnFwd(OUT_AC);//前進(強) #define turn_right0 set_power_AL;set_power_CL;OnFwd(OUT_A);OnRev(OUT_C);//右へ急カーブ #define turn_right1 set_power_AL;OnFwd(OUT_A);Off(OUT_C);//右へカーブ #define turn_left0 set_power_CL;Off(OUT_A);OnFwd(OUT_C);//左へカーブ #define turn_left1 set_power_CL;OnFwd(OUT_C);OnRev(OUT_A);//左へ急カーブ #define nMax 7//ライントレースから他の動作に切り替える条件となる値 #define short_break Off(OUT_AC);Wait(10);//0.1秒運動停止 #define CROSS_TIME 15//交差点通過にかかる時間 #define cross_line set_power_AL;set_power_CL;OnFwd(OUT_AC);Wait(CROSS_TIME);short_brake;//交差点時の動作 #define STEP 1//一動作にかかる時間 #define THRESHOLD 45//しきい値 *メインのプログラム [#ld13a96e] task main{} { SetSensor(SENSOR_2,SENSOR_LIGHT);//光センサーを定義 int nOnline=0;交差点判別に使用するカウンタ int kousa=0;交差点判別に使用するカウンタ(2つ目) ↓一度交差点に差し掛かるまでライントレースし、さしかかったらボールをキャッチするプログラム while(kousa < 1){ while(nOnline<nMAX){ if(SENSOR_2<THRESHOLD-13){ turn_left1; nOnline++; }else{ if(SENSOR_2<TFRESHOLD-10){ //定義した明るさの値より10低かったら turn_left0; //左にカーブ }else if(SENSOR_2<THRESHOLD-6){ //定義した明るさの値より6低かったら go_forward; 前進する }else if(SENSOR_2<THRESHOLD){ //定義した明るさの値より低かったら turn_right0; //右に急カーブ }else{ //その他なら turn_right1; //右にカーブ } nOnline=0;//ライントレース } Wait(STEP); //STEP間待つ } short_break; //小休憩 turn_right0;Wait(50*STEP); if(SENSOR_2<33){ PlaySound(SOUND_UP); turn_left0;Wait(30*STEP); cross_line; OnFwd(OUT_B);Wait(50);Off(OUT_B); kousa++; }else{ turn_left0;Wait(85*STEP); } nOnline=0; }//交差点を見分ける ↓ライントレースし、4つ目の交差点(ゴール)でシュートするプログラム while(kousa < 4){//4つ目の交差点に到達するまで以下のプログラムを行う while(nOnline<nMAX){ if(SENSOR_2<THRESHOLD-13){ turn_left1; nOnline++; }else{ if(SENSOR_2<THRESHOLD-10){ turn_left0; }else if(SENSOR_2<THRESHOLD-6){ go_forward; }else if(SENSOR_2<THRESHOLD){ turn_right0; }else{ turn_right1; } nOnline=0;//ライントレース } Wait(STEP); } short_break; turn_right0;Wait(50*STEP); if(SENSOR_2<33){ PlaySound(SOUND_UP); turn_left0;Wait(30*STEP); cross_line; OnFwd(OUT_B);Wait(50);Off(OUT_B); kousa++; }else{ turn_left0;Wait(85*STEP); } nOnline=0; }//交差点を見分ける OnRev(OUT_B);Wait(50);Off(OUT_B);//シュート!! }//停止。お前はよく頑張った!ゆっくり休みなさい(笑) *反省点 [#n98d489e] 今回では、しきい値の調整が難しかったため後輪をつけない形になってしまったため後ろの方のパーツに負荷がかかってしまった。また、しきい値の調整が甘かったのか全然違うところで勝手に交差点だと判断してしまったりした。そのため、何度かトライしないとうまくいかないという結果になってしまった。