ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる課題 プラ容器内の玉を1個運べば8点。二つとも運べば20点。 L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。 競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。 競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。 競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。 競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。 競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。 技術点の計算方法 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安: 玉を探し取りにいくまでの動作 (3点) 玉を掴む動作 (3点) 玉をを運ぶ動作 (2点) 玉を容器の中に入れる動作 (2点) 2台のRIS、NXT、EV3の連携の良さ(2点) 自立型のロボットとしての形や動作の美しさ、斬新さ(2点) その他 (3点)
機体の説明を行う。移動用のモーターは機動性を確保するため二個独立している。
トレイを倒すための機構でミディアムモーターを使用している。倒してトレイを傾けて中にあるボールを出す。先端に横方向に棒を付けることで倒したときトレイが予期しない方向に倒れることを防ぐ。
ボールを捉えるための機構でミディアムモーターを使用。赤丸の機構が作動した後これによって玉を確保する。逆回転させることによってボールを打つことも出来る。ブロックはボールをそろえる工夫である。奥を狭めることで複数のピンポン球を安定して確保。
カラーセンサーを二つ使い、精度を良くライントレースをさせる。図のように何もなければ直進、右、左に黒があれば逆方向の左、右に。両方黒なら止まる様になっている。
ev3dev用に書かれたpythonライブラリやsleep関数などを導入する、カラーセンサーを右左で二つ定義、armはトレイを傾けるためのもの、handはボールを回収、確保するためのものである。
#!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep mR = LargeMotor('outC') mL = LargeMotor('outA') csR = ColorSensor('in1') csL = ColorSensor('in2') arm = LargeMotor('outD') hand = MediumMotor('outB')
def migi(a): sleep(1) mR.run_timed(speed_sp=100, time_sp=a, stop_action='brake')
左へ旋回する簡単なプログラム、こうして定義することで楽になる。
def hidari(b): sleep(1) mL.run_timed(speed_sp=100, time_sp=b, stop_action='brake')
左へ旋回する簡単なプログラム
def bihidari(c): mR.run_timed(time_sp=c, speed_sp=100, stop_action='brake') mL.run_timed(time_sp=c, speed_sp=-100, stop_action='brake')
微、左前に行く、ライントレースや微調整に便利である。
def bimigi(d): mR.run_timed(time_sp=d, speed_sp=-100, stop_action='brake') mL.run_timed(time_sp=d, speed_sp=100, stop_action='brake')
左同様
def koutai(e): mR.run_timed(speed_sp=-100, time_sp=e, stop_action='brake') mL.run_timed(speed_sp=-100, time_sp=e, stop_action='brake') def zensin(f): mR.run_timed(speed_sp=100, time_sp=f, stop_action='brake') mL.run_timed(speed_sp=100, time_sp=f, stop_action='brake') sleep(1)
time_spにより時間を指定して前進、後退を行う。
zensin_forever(g): mR.run_forever(speed_sp=g, stop_action='brake') mL.run_forever(speed_sp=g, stop_action='brake')
速度指定して前進させる定義。
def Trace_Method(): while True: if csL.value() >= 15 and csR.value() >= 15: zensin_forever(100) sleep(0.1) elif csL.value() <= 14 and csR.value() >= 15: bihidari(100) sleep(0.1) elif csL.value() >= 15 and csR.value() <= 14: bimigi(100) elif csL.value() >= 15 and csR.value() <= 14: bimigi(100) sleep(0.1) else: mR.stop() mL.stop() sleep(0.1) break
ライントレースの定義。黄丸の図で触れたように何もなければ直進、右、左に黒があれば逆方向の左、右に。両方黒なら止まる様になっている。
#!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep mR = LargeMotor('outC') mL = LargeMotor('outA') csR = ColorSensor('in1') csL = ColorSensor('in2') arm = LargeMotor('outD') hand = MediumMotor('outB') def migi(a): sleep(1) mR.run_timed(speed_sp=-100, time_sp=a, stop_action='brake') def hidari(b): sleep(1) mL.run_timed(speed_sp=-100, time_sp=b, stop_action='brake') def bihidari(c): mR.run_timed(time_sp=c, speed_sp=-100, stop_action='brake') mL.run_timed(time_sp=c, speed_sp=100, stop_action='brake') def bimigi(d): mR.run_timed(time_sp=d, speed_sp=100, stop_action='brake') mL.run_timed(time_sp=d, speed_sp=-100, stop_action='brake') def koutai(e): mR.run_timed(speed_sp=100, time_sp=e, stop_action='brake') mL.run_timed(speed_sp=100, time_sp=e, stop_action='brake') def zensin(f): mR.run_timed(speed_sp=-100, time_sp=f, stop_action='brake') mL.run_timed(speed_sp=-100, time_sp=f, stop_action='brake') sleep(1) def zensin_forever(g): mR.run_forever(speed_sp=-g, stop_action='brake') mL.run_forever(speed_sp=-g, stop_action='brake') def Trace_Method(): while True: if csL.value() >= 15 and csR.value() >= 15: zensin_forever(100) sleep(0.1) elif csL.value() <= 14 and csR.value() >= 15: bihidari(100) sleep(0.1) elif csL.value() >= 15 and csR.value() <= 14: bimigi(100) elif csL.value() >= 15 and csR.value() <= 14: bimigi(100) sleep(0.1) else: mR.stop() mL.stop() sleep(0.1) break
先ほど述べた部分である。
def main(): Trace_Method() sleep(0.1)
ライントレースを行う。元の位置の四角い線を捉えるまで進む(位置M)。
zensin_forever(100) sleep(4) mL.stop() mR.stop() bihidari(1900) sleep(2.1) Trace_Method() sleep(0.1) zensin_forever(100) sleep(0.3) mL.stop() mR.stop()
位置Mから位置Kまで移動する。
arm.reset() sleep(0.1) arm.run_to_rel_pos(position_sp=160, speed_sp=250, stop_action='brake') sleep(3) arm.reset() arm.run_to_rel_pos(position_sp=-160, speed_sp=250, stop_action='brake') hand.reset() sleep(2) arm.reset() arm.run_to_rel_pos(position_sp=160, speed_sp=250, stop_action='brake') sleep(2)
トレイを傾ける。二回傾けることで一回より玉をはじき出す精度を上げる。position_sp=160の値にたどり着くのに苦労した。 speed_sp=250で早く傾けることで玉をはじき出せるようにした。
hand.run_to_rel_pos(position_sp=80, speed_sp=300, stop_action='brake')#'1' sleep(1) arm.reset()
はじき出した玉を回収、arm.reset()で戻しておく、誤作動が減る。
arm.run_to_rel_pos(position_sp=-160, speed_sp=100, stop_action='brake') sleep(3) bihidari(2000) sleep(3) zensin_forever(100) sleep(3) mR.stop() mL.stop() sleep(1)
アームをあげてから回転、移動。もう一枚のステージに移動
Trace_Method() sleep(1) koutai(800) sleep(1) koutai(800) sleep(1) arm.reset()
ゴールのトレイ前に移動(I’)。その後の動作はトレイにボールをいれる動作。
arm.run_to_rel_pos(position_sp=160, speed_sp=120, stop_action='brake') sleep(2) hand.reset() hand.run_to_rel_pos(position_sp=-2000, speed_sp=1000, stop_action='brake') sleep(5) arm.reset() arm.run_to_rel_pos(position_sp=-160, speed_sp=120, stop_action='brake') main()
成功確率が高いとはいえない、ライントレースを少なくしたのに低いのは、ボールを回収する機構にあると感じた。もっと革新的でシンプルものを思いつきたかった。難しい課題で苦労した。