今回は黒の線をライントレースするロボットを作りました #ref(Top/2017b/ember/hakuwa/Mission2/IMG_20171227_175558.jpg,50%,ロボットの全容 紙コップをとるためのアームは振り下ろし式にした) #ref(./IMG_20171227_175558.jpg,50%,ロボットの全容 紙コップをとるためのアームは振り下ろし式にした) *概要 [#g2a82811] **ロボット [#a3cf9a3e] #ref(./IMG_20171227_175558.jpg,80%,) ↑ロボットの全容 今回は紙コップをつかむためのアームを振り下ろし式にした また安定性を出すために真上ではなく斜め後ろに振り上げるようにした #ref(./IMG_20171227_175634 (2).jpg,80%) ↑アームを下した状態 紙コップが倒れずかつ多少誤差が出ても アームの中に紙コップを入れ運べるように幅を調節した アームの中に紙コップを入れ運べるように幅を調節した #ref(./IMG_20171227_175725 (2).jpg,80%) ↑センサの位置をモータのやや前にすることで誤差を軽減した しかしそのせいでセンサが少し上についてしまったため ライントレースに誤差が生じてしまった しかしそのせいでセンサが少し上についてしまったため ライントレースに誤差が生じてしまった **コース [#j8a3255f] #ref(./2017b-mission2[1].png,50%) 今回は上記もコースを下記のようなルートでライントレースをした 1,Aをスタート 2,Bを直進 3,Cを右折 4,Fを直進 5,Rを左折(一時停止) 6,Pを直進 7,X地点の紙コップを取得してコースに戻る 8,Qを左折 9,Sを直進(一時停止) 10,Y地点に紙コップを置いてコースに戻る 11,Sを直進(一時停止) 12,Fを左折(一時停止) 13,Cを右折(一時停止) 14,D地点へ(ゴール) **プログラミング [#k434884c] *ライントレース [#k812e944] 今回は下記図のようにジグザグに動き白か黒の継続時間によって停止するようにした #ref(./ru-to.png,50%) またプログラミングをtの関数で定義することで同じ色にいた時間を適宜変更することが可能になり急なカーブでも緩やかなカーブでも対応できるようにした def line_follow(t): t0 = time.time() t1 = time.time() while t0 - t1 < t: # 規定時間以上同じ色にいた時停止するようにする t1=time.time() if cs.value() >= 15: # 白の時 while cs.value() >= 15: mA.run_forever(speed_sp= 250) mD.run_forever(speed_sp= -80) t0=time.time() elif cs.value() < 15: # 黒の時 while cs.value() <=15: mA.run_forever(speed_sp= -80) mD.run_forever(speed_sp= 250) t0=time.time() mA.stop() mD.stop() sleep(2) def line_follow_slow(): #緩やかなカーブでの動き line_follow(0.6) mA.run_forever(speed_sp= 100) mD.run_forever(speed_sp= -100) sleep(1.3) mA.stop() mD.stop() sleep(2) def line_follow_sharp(): #急なカーブでの動き line_follow(0.4) mA.run_timed(time_sp=500, speed_sp=200, stop_action='brake') mD.run_timed(time_sp=500, speed_sp=-80, stop_action='brake') line_follow(0.4) mD.run_timed(time_sp=200, speed_sp=200, stop_action='brake') line_follow(0.6) def line_follow_circle(): #円での動き line_follow() mA.run_forever(speed_sp=100) mD.run_forever(speed_sp=-100) sleep(0.25) mA.stop() mD.stop() sleep(1) line_follow_slow() **交差点での動作 [#a5140cac] def forward(): #直進 mA.run_forever(speed_sp=100) mD.run_forever(speed_sp=100) sleep(0.5) mA.stop() mD.stop() sleep(1) def left(): #左折 mA.run_forever(speed_sp=200) mD.run_forever(speed_sp=-80) sleep(1) mA.stop() mD.stop() sleep(1) def right(): #右折 mA.run_forever(speed_sp=-80) mD.run_forever(speed_sp=200) sleep(1) mA.stop() mD.stop() sleep(1) **紙コップの処理 [#nab9aced] def get_cop(): #紙コップをつかむ right() mB.run_timed(time_sp=500, speed_sp=-200, stop_action='brake') sleep(1) left() def release_cop(): #紙コップを置く mB.run_timed(time_sp=500, speed_sp=200, stop_action='brake') sleep(1) mA.run_forever(speed_sp=-80) mD.run_forever(speed_sp=200) sleep(0.4) mA.stop() mD.stop() sleep(1) **実際の動作 [#bfb4fcf7] line_follow_slow()#1の動作 forward() line_follow_slow()#2の動作 right() line_follow_slow()#3の動作 forward() line_follow_sharp()#4の動作 right() line_follow_slow()#5の動作 sleep(3) left() line_follow_slow()#6,7の動作 get_cop() line_follow_circle()#8,9,10の動作 release_cop() line_follow_slow()#11の動作 sleep(2) forward() line_follow_slow()#12の動作 sleep(2) left() line_follow_slow()#13の動作 sleep(2) right() line_follow_slow()#14の動作 mA.run_timed(time_sp=1000,speed_sp=200,stop_action='brake') mD.run_timed(time_sp=1000,speed_sp=200,stop_action='brake') *総括 [#u0a243b9] 今回は誤差を少なくするためにセンサを近づけたのだがそのために少しセンサが浮いたため黒の判定が難しくなり結果誤差を生んでしまった。このため成功率が下がってしまったためもう少し地面に近づけるように改良できればよかった