[[2017a/Member]]
#contents
*課題3 空き缶収集&積み上げロボット [#m61c9551]
空き缶を収集し、ゴールに空き缶をなるべく高く積み上げる
#ref(2017a/Member/nami/Mission3/kadai3.png,100%,課題3)
*ロボットについて [#ka68e832]
#ref(2017a/Member/nami/Mission3/ev3_1.JPG,100%,ev31)
アームは平行四辺形にしてアームを水平にできるようにした。また前に重心がかかりすぎるため、後ろに漬物石(EV3)を設置した。
#ref(2017a/Member/nami/Mission3/ev3_2.JPG,100%,ev32)
#ref(2017a/Member/nami/Mission3/ev3_3.JPG,100%,ev33)
#ref(2017a/Member/nami/Mission3/ev3_4.JPG,100%,ev34)
*プログラミングについて [#de18aaa6]
**プログラム [#v624c815]
 #!/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)
一定の時間缶との距離を旋回しながら測定し、距離が小さくなる都度最小値を更新していき、距離が最小値より大きくなった時をt2とおく。
反対方向に旋回を始め、最小値より小さい値を感知するか、t2を基準とした時間になるまで続ける。
 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')
searchで缶の真正面を向いているため、まっすぐ走って一定の距離まで近づいて、距離を調整して缶をつかんで持ち上げる。
 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')
はじめはcatchと同じ。缶を次の缶の上に置き、、一度放して位置を調節して根本から持ち上げる。
 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)
一個目はcatchなのでループを変えておく。 
 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()
mTのホールドを解く
*結果 [#cf7e96a8]
0点(空き缶が詰めるが枠に入らなかったり、枠に入るが空き缶がつめなかったり)
*反省点 [#yeac5d3f]

やはり今回の一番の問題は時間がなかったという事だと思う4人中1人しか課題��の発表前の調整できる人がいなかったりして、本来ライントレースすればきれいに重ねられると思うが時間がなかったのでその調整でさえできなかった。これからはもっと濃密い計画したいと思う。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS