#contents *課題2 [#q9f9cf6a] 下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。 **コース [#sd0456bc] #ref(2019a/Member/aoto/Mission2/course2019a.png,100%,robot) **ミッション [#b86789f7] A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。 私は、以下のようなルートで試みた。 A,B(スタート)→C(直進)→D(停止後、直進)→G(左折)→J(左折)→K(左折)→L(ボールを掴んだ後、180度回転、直進)→M(停止)→A(シュート!) *ロボット [#p655b343] #ref(2019a/Member/aoto/Mission2/robot.jpg,90%,robot) 初期段階のロボットにアームを取り付けたものである。 光センサーをタイヤの間に取り付けた。 #ref(2019a/Member/aoto/Mission2/robot2.jpg,90%,robot2) ボールを運ぶ部分は3つ目のモーターを使うことでより安定してボールを運ぶ機構を作ることができると考えられるが、私たちは簡易的なアームにすべてを託した。 *プログラム [#ma223713] **定義 [#offa0f4f] 右折、左折、右旋回、左旋回、そして直進を定義した。 #define migi0 OnFwd(OUT_C,25);Off(OUT_B); //左折 #define hidari0 OnFwd(OUT_B,25);Off(OUT_C); //右折 #define migi1 OnFwd(OUT_C,30);OnRev(OUT_B,30); //左旋回 #define hidari1 OnFwd(OUT_B,30);OnRev(OUT_C,30); //右旋回 #define tyokusinn OnFwd(OUT_BC,30); //直進 光センサーの値を測定したところ -黒26 -黒灰35 -白灰45 -白52 という結果になった。以後この値をもとにプログラムを作成した。 **交差点で停止するライントレースプログラム [#o8f0c9c9] 交差点は通常の直線と違い黒の値を長い間認識することが分かった。交差点を判断する方法については、ライトセンサーが黒を認知する時間が長いと交差点、またはT字路であると判断できる。 つまり、交差点で停止させるには黒にいる時間が一定時間を超えると、ライントレースを止めるプログラムを作る必要がある。 void line_trace() { SetSensorLight(S3); long t0; //long型でt0を定義 t0=CurrentTick(); //t0に現在の時間を代入 while(CurrentTick()-t0<100){ //今からt0になるまで0.1秒経つまでの間プログラムを行う if(SENSOR_3>50){ //明るさ51以上(真っ白)が測定されると migi1; //右旋回 t0=CurrentTick(); //t0を更新 }else if(SENSOR_3>43){ //明るさ44〜50(白よりの境界線)が測定されると migi0; //右折 t0=CurrentTick(); //t0を更新 }else if(SENSOR_3>38){ //明るさ39〜43(白と黒の境界線)が測定されると tyokusinn; //直進 t0=CurrentTick(); //t0を更新 }else if(SENSOR_3>30){ //明るさ31〜38(黒よりの境界線)が測定されると hidari0; //左折 t0=CurrentTick(); //t0を更新 }else{ //明るさ30以下が測定されると hidari1; //左旋回 } } Wait(1000); //1秒停止 } t0という時間変数を用いて黒が連続して観測される時間を図っている。 このプログラムは黒以外の値をとるとt0を更新し続けるため、交差点のような長いあいだ黒の値を取る地点で停止をし、それ以外はライントレースを行うようになっている。 このプログラムは黒以外の値をとるとt0を更新し、黒ではt0は更新されないため、交差点のような長いあいだ黒の値を取る地点で停止をし、それ以外はライントレースを行うようになっている。 **停止後、直進、左折するプログラム [#g7df47c9] 交差点やT字路で停止したあとの動作を定義する void go() { OnFwd(OUT_BC,35); Wait(100); //0.1秒直進 } void left() { OnFwd(OUT_C,35); Wait(80); //0.08秒左折 } **カーブに対応したプログラム [#v5562ca8] 交差点で停止するプログラムでは、黒を0.1秒以上認知した場合、動作を終えるようにした。しかし、カーブの場合は0.1秒以上黒を認識することがあるので、そのルートのときは以下のように活動時間を決めるプログラムを用いる。 void line_trace2(long tt) //メインプログラムで()に数字を入れると、以下のプログラムのttにその数字が代入される { SetSensorLight(S3); long t1; //long型でt1を定義 t1=CurrentTick() //t1は現在の時間である while(CurrentTick()-t1<tt){ //今からt1になるまでtt/1000秒経つまでの間プログラムを繰り返す if(SENSOR_1>50){ //明るさ51以上(真っ白)が測定されると migi1; //右旋回 }else if(SENSOR_1>44){ //もし光センサで44〜50の値(白よりの境界線)が測定されると migi0; //右折 }else if(SENSOR_1>39){ //もし光センサで39〜43の値(白と黒の境界線)が測定されると tyokusinn; //直進 }else if(SENSOR_1>30){ //もし光センサで31〜38の値(黒よりの境界線)が測定されると hidari0; //左折 }else{ //もし光センサで30以下の値(真っ黒)が測定されると hidari1; //左旋回 } } } **全体のプログラム [#hf2d1e43] task main() { go; //AからBへ進む Wait(100); //0.1秒行う(調整用) line_trace(); //BからDまで進む go; //Dの交差点を直進する line_trace; //DからGまで進む left; //Gを左折 line_trace; //GからJまで進む left; //Jを左折 line_trace; //JからKまで進む left; //Kを左折 line_trace(2500); //2.5秒でKからLまで進む、ボールを掴む hidari0; //左旋回 Wait(600); //0.6秒行う(要調整) go; wait(40); //先の左側に移動(要調整) line_trace2(10000); //10秒間(急カーブ)進む line_trace; //Mまで進む go; //シュート! Wait(20); } *感想 [#rd2a72ee] 結論を言うと今回の課題は達成することができなかった。動作させても、大幅にラインから外れてしまい再びラインを認識する頃には車体がラインに垂直になってしまうというような事例が多発した。原因は、光センサーの位置にあると思う。タイヤよりもやや後ろ側に取り付けてしまったため、センサーの認識が送れ、思った通りに作動しないと考えられる。ロボットの構造は、プログラムの値などに深く関わってくるため、早期に改良する必要があったと反省している。次回はチーム全員で行うため、反省を生かして成功させれるように努めたい。