目次

#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

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS