- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#s97f036e]
#contents
*課題 [#ya29fe4b]
紙コップを運ぶロボットの作成。紙コップを運ぶ精度、早さ、紙コップを積み上げる正確さを競う。
*ルール概要 [#m2dd7852]
詳細は左のリンクより http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3
#ref(./2016a-mission2.png,100%)
紙コップをA.B,D地点の3か所に2個ずつ、計6個を一か所(スタート地点:C地点)に積み上げる。このとき、下からABDABDと積み上げるのが目標だった。
EV3班なので、紙コップをA.B,D地点の3か所に2個ずつ、計6個を一か所(交差点Qのある円形部分)に積み上げる。このとき、下からABDABDと積み上げるのが目標だった。
*ロボットの形状 [#ged2159a]
&ref(./1470283492028[1].jpg,left,25%);
&ref(./1470283493864[1].jpg,right,25%);
&ref(./1470283500748[1].jpg,left,25%);
&ref(./1470283505493[1].jpg,left,25%);
車体後部のMediumMotorの回転で前部のアームを開閉してコップを挟んで運ぶ。かわいい。&br;
ColorSensorの位置については課題2のときと同程度の高さにした。&br;
こちらを以下&color(black,yellow){&size(20){クワガタ};};と表記する&br;
&color(#f9f9f9,#fdfdfd){「せっかくあるんだし無限軌道使いたい…使いたくない?」と&ruby(じぶん){誰か};が発言したために};&br;皆の意見ということで無限軌道を紙コップの持ち上げに利用することとなった。&br;
%%正直調整に難があると思ったが案の定%%本番前日までうまく動作したことはあまりなかった。
&ref(./1470283514906[1].jpg,left,35%);
&ref(./1470283535085[1].jpg,center,20%);
&ref(./1470283537739[1].jpg,right,20%);&br;
二つの無限軌道で紙コップを挟み込むようにして持ち上げる。&br;
このとき滑り落ちないように突起を取り付けた。これの幅の調整には数時間要した。&br;
クワガタが正確に紙コップを同じ位置に運んで来れば左右に曲がる必要もないため本体移動用のモーターは一つにした。&br;
持ち上げたコップを下すときに本体正面向かって右下のLargeMotorを回転させることで無限軌道の張りを弱めるように動かせるようにした。&br;
こちらを&color(black,yellow){&size(20){リフト};};と表記する。
*プログラム [#s31a8d04]
**クワガタのプログラム [#k2274bd9]
***前置き、定義 [#x8ed1f50]
#!/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')
*プログラム [#k2274bd9]
#!/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():
***定義文 [#w7825a38]
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():
def lineleft(): //ラインの左側に沿って進む。csで線上と線外を識別し&br;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):
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():
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():
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)
def toc():
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)
mm.run_forever(duty_cycle_sp=-50)
time.sleep(3.5)
mm.run_forever(duty_cycle_sp=0)
tob()
cross(1000,-13,13)
tob()
***実行したプログラム [#g435b784]
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)
**リフトのプログラム [#w0d49efc]
***前置き、定義 [#n3e216c5]
#!/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')
***定義文 [#h6f730c9]
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()
***実行したプログラム [#g2b0c5cd]
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)
*結果 [#m432ad7c]
46秒でゴールした。
正確にコップを運んでくることができなかった。そのために基本点0点だった。
*反省・感想 [#d170cbbb]
-交差点認識プログラムについて考えるのに時間をかけすぎてしまった。
-traceを改良してもっと早くゴールまでたどり着けるようにしたかった。
-グループの人数が多かったせいで皆で集まれる時間が少なく準備が正直なところ不十分であったと思う。
-プログラムを実際に書くのはそれおぞれ一人の方がいいという判断でそうしたが結果として当日までに完成させることができなかったのでプログラムももう少し皆で協力してできればよかったと思った。
-単純に準備段階での試行回数が少なかったので正確さに欠けたプログラムになってしまった。ライントレースの部分を%%横着して%%短く大雑把なものにしたのが原因だと思う。
-ハードウェアに関しても%%冗談半分で言ったものが採用されてしまい申し訳ない気持ちもあったが%%リフトが移動時に非常に倒れやすかったりEV3本体を当初2台使う予定が必要なくなったにもかかわらず少々高い位置に付きっぱなしになって不安定だった等もっとこだわって作りたかった。
-&size(5){なお自身は主にクワガタのハードウェア製作をしていたので紙コップをはさむところまでは成功したので良かったと思う。};
-pukiwikiの編集にも三度目ということでだいぶ慣れてきて自分の中ではなかなかよくできたと思う。