*課題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') #超音波センサー 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 while us.value()>40: mR.run_forever(duty_cycle_sp=50,speed_sp=-100) mL.run_forever(duty_cycle_sp=50,speed_sp=-100) 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 while us.value()>40: mR.run_forever(duty_cycle_sp=50,speed_sp=-100) mL.run_forever(duty_cycle_sp=50,speed_sp=-100) 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から応用できたため、使用したほうが高い得点を狙えたかもしれない。