[[2019a/Member]] *目次 [#n5474560] #contents *課題について [#be1acf0d] **課題内容 [#t1388e7b] 〇下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成する。 ***コース [#sb8ba9b1] #ref(2019a/Member/kou/Mission2/2019a-mission2.png,70%) #ref(2019a/Member/kou/Mission2/Inked2019a-mission2_LI.jpg,70%) ***ミッション [#r26cbca0] ・A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)~ ・交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。 **方針 [#yb1853fd] ・ライントレースを行う際、カラーセンサーが読み取った数値によって黒と白の判別をする。今回は黒いラインと模造紙の白の境をジグザグに移動する方法を選んだ。この方法だと交差点を検知しやすいという反面、別の場所で交差点を誤認してしまうことがある。そのため誤認してしまう場所を調べロボットをその度コースに復帰させる必要がある。~ ・Dの交差点では黒の検知時間が長くなることを利用して一時停止できる関数を作成した。~ ・AからDまではコースの外側をライントレースさせ、Dからはコースの内側でライントレースをさせることでGからの円のライントレースを円滑に進められるようにした。これは、初めから内側でトレースしてしまうとCを交差点と誤認してしまうからである。 *ロボットについて [#sb4ba8d1] #ref(2019a/Member/kou/Mission2/IMG_2079.JPG,10%) ロボットの全体像である。コースが小さく、狭いためロボットの小回りはプログラミングで調整した。アーム部分はミディアムモーターと接続されており、可動域は180度である。カラーセンサーはロボット中央部分に接続されており、模造紙との距離が離れすぎてしまうと読み取る値もバラバラになってしまうので近くに固定するのが重要である。 #ref(2019a/Member/kou/Mission2/IMG_2082 (2).JPG,12%) あらかじめアームを上に上げておくことでライントレースしやすくして、ピンポン球回収の時にだけアームを動かせばいいようにした。 *プログラムについて [#n25d76b3] **モジュールのインポートとインスタンスの作成部分 [#d98c7357] #!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep #sleep関数をインポート a = LargeMotor('outA') #左の車輪のモーターをa d = LargeMotor('outD') #右の車輪のモーターをd c = MediumMotor('outB') #アーム部分のミディアムモーターをc cs = ColorSensor('in3') cs.mode = 'COL-REFLECT' #光の反射値を読み取るモードである **関数の作成部分 [#p7aa890f] モーターをリセットする関数である。 def motor_init(): a.reset() c.reset() d.reset() ロボットを前進、後退させる関数である。モーターを回転させる時間を変数tを用いた。~ 例えばt=1000のときモーターは約1秒間回転する。 def move_advance(t):#前進 a.run_timed(time_sp=t, speed_sp=-100,stop_action='brake') d.run_timed(time_sp=t, speed_sp=-100,stop_action='brake') sleep(t/1000) def move_back(t):#後退 a.run_timed(time_sp=t, speed_sp=100,stop_action='brake') d.run_timed(time_sp=t, speed_sp=100,stop_action='brake') sleep(t/1000) ロボットを左回転、右回転させる関数である.~ モーターの回転をそれぞれ逆回転にして左右回転できるようにした。変数tについては前進、後退と一緒である。 def move_left(t):#左回転 a.run_timed(time_sp=t, speed_sp=100,stop_action='brake') d.run_timed(time_sp=t, speed_sp=-100,stop_action='brake') sleep(t/1000) def move_right(t):#右回転 a.run_timed(time_sp=t, speed_sp=-100,stop_action='brake') d.run_timed(time_sp=t, speed_sp=100,stop_action='brake') sleep(t/1000) def line_follow(t): motor_init() t0 = time.time() while time.time() - t0 < t: if cs.value() <= 11: a.run_forever(speed_sp=50) d.run_forever(speed_sp=-100) else: a.run_forever(speed_sp=-100) d.run_forever(speed_sp=50) t0 = time.time() if time.time() - t0 > t: a.stop() d.stop() sleep(1) def line_follow2(t): motor_init() t0 = time.time() while time.time() - t0 < t: if cs.value() <= 11: a.run_forever(speed_sp=-100) d.run_forever(speed_sp=50) else: a.run_forever(speed_sp=50) d.run_forever(speed_sp=-100) t0 = time.time() if time.time() - t0 > t: a.stop() d.stop() sleep(1) アーム部分を上下させる関数である。回転させる角度をtとした。回転するスピードは100で安定した。 def age(t): c.run_to_rel_pos(position_sp=t, speed_sp=100, stop_action='hold') sleep(1) def sage(t): c.run_to_rel_pos(position_sp=-t, speed_sp=100, stop_action='hold') sleep(1) **実際のプログラム [#xe1796de] line_follow(0.8)#交差点Dまでライントレースする move_right(700) move_advance(700) line_follow2(1.5) move_right(900) move_advance(600) line_follow2(0.9) move_left(500) move_advance(500) line_follow2(0.7) move_left(500) move_advance(500) line_follow2(0.7) move_right(300) move_advance(300) line_follow2(0.65) move_advance(1500) move_left(1200) move_back(3500) sage(140) move_advance(1000) age(60) move_right(2000) line_follow2(1.5) *反省・感想だお☆ [#nf54a9b5] プルコギ🎵プルコギ🎵プルコギ🎵