目次 #contents *課題2 ~ライントレース~ [#ia867925] -B地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をC地点においたゴールへシュートする -なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること -可能であればC,Dのゴールエリアライン上からシュートする **ライントレースのアプローチ [#ec206763] +黒いライン上をジグザグに移動する +黒いラインと模造紙の白色の境目をジグザグに移動する(今回使用した方法) +PID制御 等 ***解説 [#o08f2bad] いずれの方法もカラーセンサによってラインを検知している +&size(20){黒いライン上をジグザグに移動する}; #br #ref(./1lt.jpg,80%) #br メリット:ラインを見失わない&br;デメリット:交差点を検知できない可能性が高く、移動に時間がかかる #br +&size(20){黒いラインと模造紙の白色の境目をジグザグに移動する}; #br #ref(./2.jpg,80%) #br メリット:移動が早い、交差点を検知しやすい&br;デメリット:交差点を誤検知することがある #br +&size(20){PID制御}; #br #ref(./3.jpg,80%) #br メリット:直進、カーブでの動きがスムーズになる&br;デメリット:急なカーブが多いコースには不向きであり、調整が難しい PID制御とは“比例と積分と微分を使った制御”のことであり、P制御では現在の状況に対して操作量を決定する(カーブをどのぐらい曲がるのかを操作する)、I制御では過去の状況に対して操作量を決定する(カーブが終わり際に発生するP制御の誤差を修正する)、D制御は未来の状況を予測して操作量を決定する(カーブに差し掛かかった際にロボットが曲がり始めるようにする)今回はこの制御を断念したため、使用していない。よって詳しい説明は割愛する。 #ref(./pid.jpg,80%) *ロボット本体の解説 [#i92926bf] #ref(./catch1.JPG,80%) #br **駆動機構 [#l696d499] #ref(./bottom.JPG,around,80%) EV3 Lモーター ×2 (税込4,644円/個) -特徴:重いものをゆっくり 動かすのが得意 -このモーターでロボットの直進、回転を行う #br キャスター #clear #br **ライン検知機構 [#ed578a88] #ref(./cs.JPG,around,80%) EV3カラーセンサー -カラーモード(7種類の色(色なしを加えると8種類)を計測)、反射光の強さモード(光の反射量を計測)&br; (今回は反射光の強さモードを使用する) #clear **ボール検知機構 [#q782cc83] #ref(./us.JPG,around,80%) EV3超音波センサー -3cmから250cmまでを計測でき、5cmを計測すると(ボールを検知すると)アームを動かす #clear **ボール保持機構 [#f2e91cec] #ref(./arm.JPG,around,80%) EV3 Mモーター ×1(税込3,780円) -特徴:軽いものを素早く 動かすのが得意 -今回はアームの上げ下げが行えるようになっている #clear #br #ref(./catch_1.JPG,around,80%) ボール発射ガイド -ボールの射出の精度を上げるために取り付けてある #clear #br *プログラムの解説 [#j545b986] #!/usr/bin/env python3 from ev3dev.ev3 import * import ev3dev.ev3 as ev3 import time arm = ev3.MediumMotor('outA') mr = ev3.LargeMotor('outB') ml = ev3.LargeMotor('outC') us = ev3.UltrasonicSensor('in1') gy = ev3.GyroSensor('in2') cs = ev3.ColorSensor('in3') #5~80 x = 0 lfr = -200 lfl = -80 sr = -80 sl = -150 lr = -80 ll = -200 #def sound(): # if x == 1: # ev3.Sound.speak('CHECK POINT! R') # elif x == 2: # ev3.Sound.speak('CHECK POINT! P') # elif x == 3: # ev3.Sound.speak('CHECK POINT! Q') # elif x == 4: # ev3.Sound.speak('CHECK POINT! Q') # elif x == 5: # ev3.Sound.speak('CHECK POINT! R') # elif x == 6: # ev3.Sound.speak('CHECK POINT! P') # elif x == 7: # ev3.Sound.speak('CHECK POINT! S') def line_follow(): while cs.value() >= 50: #white mr.run_forever(speed_sp=-lfr) ml.run_forever(speed_sp=lfl) t0 = time.time() while cs.value() < 50: #black mr.run_forever(speed_sp=lfl) ml.run_forever(speed_sp=-lfr) #behave at intersection(normal:turn_right) def go_straight(): mr.run_forever(speed_sp=-lfl) ml.run_forever(speed_sp=lfr) time.sleep(1.2) mr.run_forever(speed_sp=200) ml.run_forever(speed_sp=210) time.sleep(0.5) if cs.value() >= 50: #white while cs.value() >= 50: mr.run_forever(speed_sp=-lfr) ml.run_forever(speed_sp=lfl) t0 = time.time() else: #black mr.run_forever(speed_sp=lfl) ml.run_forever(speed_sp=-lfr) t0 = time.time # mr.run_forever(speed_sp=150) # ml.run_forever(speed_sp=220) # time.sleep(0.5) def turn_left(): mr.run_forever(speed_sp=-lfl) ml.run_forever(speed_sp=lfr) time.sleep(elapsed_time) mr.run_forever(speed_sp=-lfr) ml.run_forever(speed_sp=lfl) time.sleep(elapsed_time) #behave of ball def ball_catch(): arm.run_forever(speed_sp=-60) time.sleep(2) arm.stop() def shoot(): mr.run_forever(speed_sp=-lfl) ml.run_forever(speed_sp=lfr) time.sleep(1.4) mr.stop() ml.stop() # ev3.Sound.speak('Shoot!') time.sleep(1) mr.run_forever(speed_sp=-100) ml.run_forever(speed_sp=-100) time.sleep(0.6) arm.run_forever(speed_sp=60) time.sleep(1) mr.stop() ml.stop() time.sleep(1) arm.stop() mr.run_forever(speed_sp=-100) ml.run_forever(speed_sp=-100) time.sleep(1) arm.run_forever(speed_sp=-60) time.sleep(2) arm.stop() mr.run_forever(speed_sp=300) ml.run_forever(speed_sp=300) time.sleep(1) mr.stop() ml.stop() arm.run_forever(speed_sp=300) time.sleep(0.6) arm.stop() # B -> R(go_straight) -> P(turn_R) -> Q(go_straight) -> ball_catch # -> Q(go_straight) -> R(turn_R) -> P(go_straight) -> S(turn_R) -> shoot Sound.play('start.wav') time.sleep(1) mr.run_forever(speed_sp=220) ml.run_forever(speed_sp=220) time.sleep(1) if cs.value() >= 50: #white while cs.value() >= 50: mr.run_forever(speed_sp=-lfr) ml.run_forever(speed_sp=lfl) t0 = time.time() else: #black mr.run_forever(speed_sp=lfl) ml.run_forever(speed_sp=-lfr) t0 = time.time while True: t0 = time.time() line_follow() elapsed_time = time.time() - t0 print(elapsed_time,cs.value()) if elapsed_time > 1.18: x += 1 print('count = ',x) mr.stop() ml.stop() Sound.play('kousatendesu.wav') time.sleep(1.2) if x == 1 or x == 3 or x == 4 or x == 6: #test.ver go_straight() if x == 3: while True: us1 = us.value() us2 = us.value() us3 = us.value() line_follow() if (us1 + us2 + us3)/3 < 85: break mr.stop() ml.stop() ball_catch() elif x == 8: time.sleep(1) Sound.play('neraimasu.wav') shoot() Sound.play('unicorn.wav') break