目次
今回の課題3は前回の課題2で使用したコースを使います。
・紙コップをC地点、D地点にそれぞれ3個(合計6個)置き、C地点に置いた紙コップにはCを、D地点に置いた紙コップにはDを紙コップの底面にマークする
・紙コップは上下どちらにおいてもかまわない
・2台のロボットの場合はA地点とB地点からスタート、一体型の場合はA地点とB地点のいずれかからスタートする
・最終的に黒線で囲まれた輪の中にC地点からの紙コップとD地点からの紙コップを交互に重ねる (下側から数えて奇数番目はC地点からのコップ、偶数番目はD地点からのコップになるようにする)
・紙コップを重ねる場所は、必ずしも目的地点の輪の中でなくてもかまわない
・最終的に紙コップが自力で立っていること、またロボットが紙コップに触れていないこと、ただしスタート時と上下逆になっていてもかまわない
・競技時間はすべてのコップを重ね終わるまで、あるいは審判が続行不能と判断するまで。
・審判の合図の後、5秒以内にロボットをスタートさせ、それ以降はロボットや紙コップに触ってはいけない
・EV3のチームはA,B,Cにそれぞれマークした紙コップをそれぞれ3個置く
・EV3のチームはA,B,C,Dのどこからスタートしてもよいが、別の地点にある合計9個の紙コップを運ぶこと
・紙コップに色を塗ったり文字や絵をかいてもよいが、穴を開けたり故意に変形させてはいけない
・光センサは2セット合わせて2つまで使って良い、その他のセンサや部品はキットに含まれているものだけを使用すること
・1段目の紙コップ3点、2段目の紙コップ6点、・・、n段目のコップ3n点、6段目のコップ18点
・奇数段目にあるDのコップと偶数段目にあるCのコップは0点
・EV3は1段目のAのカップ2点、2段目のBのカップ4点、3段目のCのカップ6点、4段目のAのカップ8点、5段目のBのカップ10点、6段目のCのカップ12点、7段目のAのカップ14点、8段目のBのカップ16点、9段目のCのカップ18点、それ以外は0点
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。 得点の目安:
・スタートしてから紙コップの地点まで移動する速さ、正確さ (2点)
・紙コップをつかむ動作 (3点)
・紙コップをゴールまで運ぶ動作の速さ、正確さ (2点)
・紙コップを重ねる動作 (3点)
・2台のロボットの連携の良さ (3点)
・自立型のロボットとしての形や動作の美しさ、斬新さ (3点)
・ロボコン出場ロボットとしての完成度 (2点)
・その他 (2点)
今回、僕たちEV3の班は、紙コップを回収するロボット1台、回収してきたコップを積み上げるロボット1台、計2台を制作し、課題クリアを目指しました。
全体像はこんな感じです。
基本的には課題2の時に制作したロボットと同じで、課題2のロボットに紙コップを回収するためのアームとモーター、センサーを取り付けたという感じです。
全体像はこんな感じです。
ベルトコンベアには小さなパーツをつけて、紙コップが滑り落ちるのを防ぎ、ベルトコンベアの下が少し開くことにより、紙コップを下に落とすことができるようになっています。
紙コップを積む方法は、前方に置かれた紙コップを積み上げロボットで上にあげて、紙コップの山に持っていき、持ち上げた紙コップの真下に山がくるように持っていったら、ベルトコンベアを開くことで山の上にコップを落とし、積んでいく、という方法です。
基本的には、課題1、課題2でのプログラムを基本としているので簡潔に説明します。
#!/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')
左モーターをml、右モーターをmr、アームを動かすロボットをmm、カラーセンサーをcs、赤外線センサーをdeとしました。
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(): 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 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(): 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(): 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()
少し長いですが、ここでは課題2と同様にライントレースをするプログラムを定義しています。
toa、tob、tocというのは、to'A'、to'B'、to'C'ということで、それぞれ、A、B、Cに向かうプログラムということを表しています。
#!/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)
ここではdefの後に続く英語で分かる通り、ベルトコンベアを回して、つかんだ紙コップを上げたり、下げたり、開いたり、閉じたりすることで積むことができるようにプログラムが定義されています。
結果は失敗でした。
本番では、ロボットがうまく動かず、課題をクリアすることができませんでした。
授業外で班のメンバーで集まり、制作に取り組みましたが、時間が少なく、満足のいくロボットができず、結果として失敗してしましました。
反省点としては、もっと積極的に時間を作って、集まればよかったこと。もう少しうまく役割分担をして、制作に取り掛かればよかったことです。
結果はうまくいきませんでしたが、課題1、2、そして最終課題の課題3を通して学べたことが多かったと思いました。
毎回、時間の少なさ、プログラミング知識少なさ故に苦労を強いられましたが、少人数の班でロボットを作り、プログラミングをすることで、プログラミング能力、コミュニケーション能力など、あるゆる能力を身に着けることができました。
また、プログラミングをする機会があると思うので、その時はこの授業で得た経験と知識を利用しようと思いました。