*課題3  [#ref7fa70]
#contents
**課題内容 [#b449e8b6]
[[課題3:http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission3]]
**ロボット [#pa4bfb32]
#ref(DSC_0554.JPG)
#ref(DSC_0555.JPG)
#ref(DSC_0556.JPG)
#ref(DSC_0557.JPG)
**プログラム [#w1c633b1]
 #!/usr/bin/python3
 # -*- coding:utf-8 -*-

 import ev3dev.ev3 as ev3
 import time

 mR=ev3.LargeMotor('outA')
 mL=ev3.LargeMotor('outB')
 mT=ev3.LargeMotor('outC')
 mA=ev3.LargeMotor('outD')
 us=ev3.UltrasonicSensor('in1')
 ts=ev3.TouchSensor('in2')
 t1=time.time()
 t2=time.time()
 t3=time.time()
 t4=time.time()
 minimum=10000
 mR=ev3.LargeMotor('outA') #右モーター
 mL=ev3.LargeMotor('outB') #左モーター
 mT=ev3.LargeMotor('outC') #アーム
 mA=ev3.LargeMotor('outD') #ハンド
 us=ev3.UltrasonicSensor('in1') #超音波センサー
 t1=time.time() #缶の探索の片方への旋回時間
 t2=time.time() #探索開始から感知するまでの時間
 minimum=10000 #缶との距離の最小値

 def search():#seach for cans while spinning 
    global t1
    global t2
    global minimum
    while time.time()-t1<5:#search around
        mR.run_forever(duty_cycle_sp=50,speed_sp=-10)
        mL.run_forever(duty_cycle_sp=50,speed_sp=10)
        if minimum>=us.value():#not minimum
            minimum=us.value()
        if minimum<us.value():#minimum
            t2=time.time()
    while time.time()-t1>=5 and time.time()-t1<=5.5+t2 and us.value()>minimum:#research
        mR.run_forever(duty_cycle_sp=50,speed_sp=10)
        mL.run_forever(duty_cycle_sp=50,speed_sp=-10)
        

 def catch():#catch the can
    global t3
    global t4
    t3=time.time()
    while us.value()>40:
        mR.run_forever(duty_cycle_sp=50,speed_sp=-100)
        mL.run_forever(duty_cycle_sp=50,speed_sp=-100)
        t4=time.time()
    else :
        mR.run_timed(time_sp=800,duty_cycle_sp=40,speed_sp=100)
        mL.run_timed(time_sp=800,duty_cycle_sp=40,speed_sp=100)
        time.sleep(1.5)
        mT.run_timed(time_sp=1000,duty_cycle_sp=40,speed_sp=100,stop_action='brake')
        time.sleep(1)
        mA.run_timed(time_sp=2000,duty_cycle_sp=30,speed_sp=100,stop_action='hold')
        time.sleep(2)
        mT.run_timed(time_sp=2000,duty_cycle_sp=40,speed_sp=-100,stop_action='hold')

 def build():#pile the cans
    global t3
    global t4
    t3=time.time()
    while us.value()>40:
        mR.run_forever(duty_cycle_sp=50,speed_sp=-100)
        mL.run_forever(duty_cycle_sp=50,speed_sp=-100)
        t4=time.time()-t3
    else :
        mR.run_timed(time_sp=800,duty_cycle_sp=40,speed_sp=100)
        mL.run_timed(time_sp=800,duty_cycle_sp=40,speed_sp=100)
        time.sleep(1.5)
        mT.run_timed(time_sp=650,duty_cycle_sp=70,speed_sp=40,stop_action='hold')
        time.sleep(1.5)
        mA.run_timed(time_sp=2000,duty_cycle_sp=30,speed_sp=-100,stop_action='hold')
        time.sleep(1.5)
        mR.run_timed(time_sp=1200,duty_cycle_sp=40,speed_sp=100)
        mL.run_timed(time_sp=1200,duty_cycle_sp=40,speed_sp=100)
        time.sleep(1.5)
        mT.run_timed(time_sp=2000,duty_cycle_sp=70,speed_sp=30,stop_action='brake')
        time.sleep(2)
        mA.run_timed(time_sp=2000,duty_cycle_sp=30,speed_sp=100,stop_action='hold')
        time.sleep(2)
        mT.run_timed(time_sp=710,duty_cycle_sp=40,speed_sp=-100,stop_action='hold')

 def end():#get out of the goal
    mR.run_timed(time_sp=1000,duty_cycle_sp=50,speed_sp=200)
    mL.run_timed(time_sp=1000,duty_cycle_sp=50,speed_sp=200)

 for loop in [0]:
    search()
    mR.stop()
    mL.stop()
    time.sleep(2)
    catch()
    time.sleep(2)
    time.sleep(3)

 for loop in [0]:
    t1=time.time()
    search()
    mR.stop()
    mL.stop()
    time.sleep(2)
    build()
    time.sleep(2)

 mR.run_timed(time_sp=3000,duty_cycle_sp=50,speed_sp=-55)
 mL.run_timed(time_sp=3000,duty_cycle_sp=50,speed_sp=-120)
 time.sleep(3)

 mR.run_timed(time_sp=1500,duty_cycle_sp=50,speed_sp=-200)
 mL.run_timed(time_sp=1500,duty_cycle_sp=50,speed_sp=-200)
 time.sleep(3)
 mR.stop()
 mL.stop()

 mA.run_timed(time_sp=1000,duty_cycle_sp=30,speed_sp=-40)
 time.sleep(3)
 mA.run_timed(time_sp=2000,duty_cycle_sp=30,speed_sp=-110,stop_action='brake')
 end()
 time.sleep(2)

 mT.reset()
**結果 [#ecc2fe0c]
一回目:0点 2段目の空き缶を積み上げるところまではいったが、ゴールに入らなかった。~
二回目:0点 一度二段持ち上げるところまでいったものの、下す際に崩れてしまい、どちらもゴールに入らず得点にならなかった。
**反省 [#k180a75a]
ロボット面では缶をつかむアームの部分が傾いていたため、缶を接地して放すと斜めって倒れてしまった。調整が難しく、解決策として少し持ち上げて垂直にして落とすことにしたが、落下の衝撃でタワーが崩れることが少なくなかった。
#ref(DSC_0556.JPG)
プログラム面では缶を探して積むのはサブルーチンで全部対応できたが、缶の地点へ行くのとゴールまで運ぶのはそれぞれの地点で動作を変えなければならないため、時間内では缶2個までが限界だった。
**考察 [#nf861eb6]
 ロボットのアームの傾きを直せていれば安定して缶を積めていたが、今回の0点の一番の要因はゴールに入らなかったことで、ここをrun_timedでより細かく調整しておけばまだましになっただろう。~
 今回は私達の班はライントレースをせずにrun_timedで動作を決定した。EV3では超音波センサーで缶を特定できるため必要なしと考えていたが、缶の場所まで行く動作を課題2から応用できたため、使用したほうが高い得点を狙えたかもしれない。


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