紙コップを運ぶロボットの作成。紙コップを運ぶ精度、早さ、紙コップを積み上げる正確さを競う。
詳細は左のリンクより http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3
EV3班なので、紙コップをA.B,D地点の3か所に2個ずつ、計6個を一か所(交差点Qのある円形部分)に積み上げる。このとき、下からABDABDと積み上げるのが目標だった。
車体後部のMediumMotorの回転で前部のアームを開閉してコップを挟んで運ぶ。かわいい。
ColorSensorの位置については課題2のときと同程度の高さにした。
こちらを以下クワガタと表記する
「せっかくあるんだし無限軌道使いたい…使いたくない?」と
皆の意見ということで無限軌道を紙コップの持ち上げに利用することとなった。
正直調整に難があると思ったが案の定本番前日までうまく動作したことはあまりなかった。
二つの無限軌道で紙コップを挟み込むようにして持ち上げる。
このとき滑り落ちないように突起を取り付けた。これの幅の調整には数時間要した。
クワガタが正確に紙コップを同じ位置に運んで来れば左右に曲がる必要もないため本体移動用のモーターは一つにした。
持ち上げたコップを下すときに本体正面向かって右下のLargeMotorを回転させることで無限軌道の張りを弱めるように動かせるようにした。
こちらをリフトと表記する。
#!/usr/bin/python import ev3dev.ev3 as ev3 import time ml = ev3.LargeMotor('outB') mr = ev3.LargeMotor('outA') mm = ev3.MediumMotor('outC') cs = ev3.ColorSensor('in1') de = ev3.InfraredSensor('in2')
def catch(): //紙コップをはさむ。
while de.value() < 50: if de.value() < 10: ml.run_forever(duty_cycle_sp=0) mr.run_forever(duty_cycle_sp=0) mm.run_forever(duty_cycle_sp=50) time.sleep(4) mm.run_forever(duty_cycle_sp=0) ml.run_forever(duty_cycle_sp=-20) mr.run_forever(duty_cycle_sp=-20) time.sleep(1.5) ml.run_forever(duty_cycle_sp=0) mr.run_forever(duty_cycle_sp=0) ml.run_forever(duty_cycle_sp=-50) mr.run_forever(duty_cycle_sp=50) time.sleep(1.6) ml.run_forever(duty_cycle_sp=0) mr.run_forever(duty_cycle_sp=0) else: ml.run_forever(duty_cycle_sp=15) mr.run_forever(duty_cycle_sp=15)
def lineleft(): //ラインの左側に沿って進む。csで線上と線外を識別し
0.35秒以上線上にいたとき交差点に入ったと判断しサブルーチンを終了する。左折動作につながる。
t0 = time.time() while time.time() - t0 < 0.35: if cs.value () > 50 : mr.run_forever(duty_cycle_sp=-30) ml.run_forever(duty_cycle_sp=60) t0 = time.time() else: mr.run_forever(duty_cycle_sp=60) ml.run_forever(duty_cycle_sp=-30)
def lineright(): //同様にラインの右側に沿って進む。右折動作につながる。
t0 = time.time() while time.time() - t0 < 0.35: if cs.value () > 50 : mr.run_forever(duty_cycle_sp=60) ml.run_forever(duty_cycle_sp=-30) t0 = time.time() else: mr.run_forever(duty_cycle_sp=-30) ml.run_forever(duty_cycle_sp=60)
def cross(t,dl,dr): //任意の距離走行する。交差点を曲がるために用いた。
mr.run_forever(duty_cycle_sp=dr) ml.run_forever(duty_cycle_sp=dl) time.sleep(t/1000) ml.stop() mr.stop()
def toa(): //C地点からA地点に向かい、紙コップをつかんでC地点に戻る
lineright() cross(1000,-17,17) cross(1000,30,-30) cross(1000,10,10) lineright() cross(1000,-20,20) cross(1000,13,13) lineright() cross(1000,-20,20) cross(1000,13,13) catch() lineright() cross(1000,0,0) cross(1000,17,-17) cross(1000,13,13) lineright() cross(1000,0,0) cross(1000,-22,22) cross(1000,0,0) lineright() cross(1000,0,0) cross(1000,-25,25) mm.run_forever(duty_cycle_sp=-50) time.sleep(3) mm.run_forever(duty_cycle_sp=0) cross(1000,-30,-30) cross(1500,-50,50)
def tod(): //C地点からD地点へ向かい、紙コップをつかんでC地点に戻る
lineright() cross(1000,-20,20) cross(1000,13,13) lineright() cross(1000,0,0) cross(1000,-18,18) cross(1000,0,0) catch() cross(1400,30,-30) lineright() cross(1000,0,0) cross(1000,-20,20) cross(1000,10,10) lineright() cross(1000,0,0) cross(1000,-25,25) mm.run_forever(duty_cycle_sp=-50) time.sleep(3) mm.run_forever(duty_cycle_sp=0) cross(1000,-30,-30) cross(2000,-40,40)
def tob(): //C地点からB地点に向かい、紙コップをつかんでC地点に戻る
lineleft() cross(1000,-10,10) lineright() cross(1000,-20,20) cross(1000,13,13) lineright() cross(1000,-20,20) cross(1000,13,13) lineright() cross(1000,0,0) cross(1000,-17,17) cross(1000,0,0) catch() lineleft() cross(1000,20,-20) cross(1000,13,13) lineleft() cross(1000,20,-20) cross(1000,40,13) lineright() cross(1000,0,0) cross(1000,36,-36) lineright() cross(1000,0,0) cross(1000,-20,20) mm.run_forever(duty_cycle_sp=-50) time.sleep(3) mm.run_forever(duty_cycle_sp=0) cross(1000,-30,-30)
mm.run_forever(duty_cycle_sp=-50) time.sleep(3.5) mm.run_forever(duty_cycle_sp=0) //アームを開く tod() tob() toa() tod() tob() toa() tod() tob() toa() time.sleep(30) //C地点に集めた紙コップをつかみ、ライントレースをして紙コップをQ地点の円の中まで運ぶ。 lineleft() cross(1000,20,-20) cross(1000,13,13) lineleft() cross(1000,20,-20) cross(1000,13,13) cross(1000,-30,-30) ml.run_forever(duty_cycle_sp=25) mr.run_forever(duty_cycle_sp=20) time.sleep(1) ml.run_forever(duty_cycle_sp=0) mr.run_forever(duty_cycle_sp=0)
#!/usr/bin/python import ev3dev.ev3 as ev3 import time m1 = ev3.LargeMotor('outA') m2 = ev3.MediumMotor('outB') m3 = ev3.MediumMotor('outC') m4 = ev3.LargeMotor('outD') us = ev3.UltrasonicSensor('in1')
def search(p): 置かれた紙コップを認識する。
t0 = time.time() while time.time() - t0 < 0.001: if us.value() > p: m4.run_forever(duty_cycle_sp=50) t0 = time.time() else: m4.stop()
def bring(x,y): 置かれた紙コップの元まで近寄る、元の位置に戻る
m4.run_forever(duty_cycle_sp=x) time.sleep(y) m4.stop()
def close(): //無限軌道を張る
m1.run_forever(duty_cycle_sp=-37.5) time.sleep(0.32) m1.stop()
def up(): //無限軌道を動かし紙コップを持ち上げる
m3.run_forever(duty_cycle_sp=-50) m2.run_forever(duty_cycle_sp=50) time.sleep(2.25) m2.stop() m3.stop()
def down(): //同様に紙コップを降ろす
m3.run_forever(duty_cycle_sp=50) m2.run_forever(duty_cycle_sp=-50) time.sleep(1.5) m2.stop() m3.stop()
def open(a,b): //無限軌道のの張りを弱くし紙コップを落とす
m1.run_forever(duty_cycle_sp=a) time.sleep(b) m1.stop()
search(60) bring(45,0.2) close() up() search(60) open(20,0.275) bring(45,0.2) down() open(27.5,0.325) bring(-40,7.5)
正確にコップを運んでくることができなかった。そのために基本点0点だった。