目次

課題

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

ルール概要

詳細は左のリンクより 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点だった。

反省・感想

  • グループの人数が多かったせいで皆で集まれる時間が少なく準備が正直なところ不十分であったと思う。
  • プログラムを実際に書くのはそれおぞれ一人の方がいいという判断でそうしたが結果として当日までに完成させることができなかったのでプログラムももう少し皆で協力してできればよかったと思った。
  • 単純に準備段階での試行回数が少なかったので正確さに欠けたプログラムになってしまった。ライントレースの部分を横着して短く大雑把なものにしたのが原因だと思う。
  • ハードウェアに関しても冗談半分で言ったものが採用されてしまい申し訳ない気持ちもあったがリフトが移動時に非常に倒れやすかったりEV3本体を当初2台使う予定が必要なくなったにもかかわらず少々高い位置に付きっぱなしになって不安定だった等もっとこだわって作りたかった。
  • なお自身は主にクワガタのハードウェア製作をしていたので紙コップをはさむところまでは成功したので良かったと思う。
  • pukiwikiの編集にも三度目ということでだいぶ慣れてきて自分の中ではなかなかよくできたと思う。

添付ファイル: file2016a-mission2.png 126件 [詳細] file1470283514906[1].jpg 142件 [詳細] file1470283537739[1].jpg 138件 [詳細] file1470283535085[1].jpg 159件 [詳細] file1470283505493[1].jpg 127件 [詳細] file1470283500748[1].jpg 146件 [詳細] file1470283493864[1].jpg 140件 [詳細] file1470283492028[1].jpg 134件 [詳細]

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