目次

課題

紙コップを運ぶロボットの作成。紙コップを運ぶ精度、早さ、紙コップを積み上げる正確さを競う。

ルール概要

詳細は左のリンクより http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMission3

2016a-mission2.png

EV3班なので、紙コップをA.B,D地点の3か所に2個ずつ、計6個を一か所(交差点Qのある円形部分)に積み上げる。このとき、下からABDABDと積み上げるのが目標だった。

ロボットの形状

1470283492028[1].jpg 1470283493864[1].jpg 1470283500748[1].jpg 1470283505493[1].jpg 車体後部のMediumMotorの回転で前部のアームを開閉してコップを挟んで運ぶ。かわいい。
ColorSensorの位置については課題2のときと同程度の高さにした。
こちらを以下クワガタと表記する
「せっかくあるんだし無限軌道使いたい…使いたくない?」と誰か(じぶん)が発言したために
皆の意見ということで無限軌道を紙コップの持ち上げに利用することとなった。
正直調整に難があると思ったが案の定本番前日までうまく動作したことはあまりなかった。 1470283514906[1].jpg 1470283535085[1].jpg 1470283537739[1].jpg
二つの無限軌道で紙コップを挟み込むようにして持ち上げる。
このとき滑り落ちないように突起を取り付けた。これの幅の調整には数時間要した。
クワガタが正確に紙コップを同じ位置に運んで来れば左右に曲がる必要もないため本体移動用のモーターは一つにした。
持ち上げたコップを下すときに本体正面向かって右下の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点だった。

反省・感想


添付ファイル: file2016a-mission2.png 230件 [詳細] file1470283514906[1].jpg 288件 [詳細] file1470283537739[1].jpg 307件 [詳細] file1470283535085[1].jpg 323件 [詳細] file1470283505493[1].jpg 260件 [詳細] file1470283500748[1].jpg 275件 [詳細] file1470283493864[1].jpg 264件 [詳細] file1470283492028[1].jpg 269件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-08-07 (日) 01:09:44