[[2019a/Member]] #contents *課題3 [#jd7a5d28] コース上に置いてあるピンポン球を拾い、カップの中にいれよという課題であった。 *課題2の反省から [#m57ee3dd] 課題2の反省点に、ピンポン球を拾う際ロボットの位置が少しでもずれると拾えなくなってしまうというものがあった。それはピンポン球を拾うアームの許容範囲が狭かった為である。 &ref(2019a/Member/hiroe/Mission3/拾える.png,50%,許容範囲); 許容範囲が狭いとロボットの位置に精密な調整が必要になる。今回の課題は許容範囲を広げた設計にすることを意識した。 *ピンポン球の拾い方、運び方、入れ方 [#m0d41825] ピンポン球の拾うためにつまむ、すくうという方法をとると許容範囲が狭くなってしまう。なのでピンポン球をアームをつかって囲い、そのままロボットが進むことでピンポン球を押して運ぶという方法にした。この方法なら許容範囲がロボットの幅分の広さになる。 &ref(2019a/Member/hiroe/Mission3/hakobu.png,50%,運ぶ); プラ容器に入ったピンポン球は拾う際のアームとは別のアームをつかってプラ容器を傾け、ピンポン球を外に出す事で囲めるようにした。 &ref(2019a/Member/hiroe/Mission3/アーム.png,50%,アーム); 入れるときは囲んだアームを回転させ、ピンポン球を外にはじき出すようにした。 &ref(2019a/Member/hiroe/Mission3/シュート.png,50%,シュート); *ロボット [#r2215c7c] &ref(2019a/Member/hiroe/Mission3/全体.jpg,20%,全体); 2台分のEV3が使えるのでカラーセンサーを2個ミディアムモーターを2個一つの機体に搭載してある。 -アーム &ref(2019a/Member/hiroe/Mission3/aamu.jpg,20%,アーム拡大); アームにはアームに垂直になるように1本棒を付けた。これを付けることで、アームを下ろしたときプラ容器が傾かずに倒れるのでピンポン球がスムーズに外に出て行く -受け皿 &ref(2019a/Member/hiroe/Mission3/sara.jpg,20%,sara); ピンポン球を囲い、運ぶ受け皿は奥にいくほど狭まるようにした。許容範囲を広く取る必要があるので幅は広い方が良いので手前側はロボットの幅だけある。しかし、実際は複数のピンポン球を運ばなくてはいけない。奥まで幅の広いままだとシュートするときにあちこちに飛んでしまう。よって奥の幅を狭め、複数のピンポン球が一列に並ぶようにした。だんだんと狭めていく様にすることで許容範囲の広さを維持したまま複数のピンポン球が一列に並ぶようにした。 &ref(2019a/Member/hiroe/Mission3/飛んでく.png,50%,飛んでく); &ref(2019a/Member/hiroe/Mission3/飛んでかない.png,50%,飛んでかない); &ref(2019a/Member/hiroe/Mission3/きょよ.png,50%,きょよ); *道のり [#hdbfc730] 今回ロボットが進む道のりは以下の通りである。 &ref(2019a/Member/hiroe/Mission3/miti.jpg,50%,道); +直進し直線AMを認識する。 +プラ容器の位置まで前進し左回転する。 +前進し、直線KLの一つ手前の直線を認識する。 +位置を前後微調整し、アームを下ろしピンポン球を囲う。 +左回転し、直線B'C'を認識する。 +位置を前後微調整し、再びアームを下ろしピンポン球を入れる。 *プログラム [#ybbc30b5] **始めに [#r2934aff] -ev3dev用に書かれたpythonライブラリやsleep関数などを導入する。 #!/usr/bin/env python3 from ev3dev.ev3 import * from time import * mR = LargeMotor('outC') mL = LargeMotor('outA') csR = ColorSensor('in1') csL = ColorSensor('in2') arm = LargeMotor('outD') hand = MediumMotor('outB') armがプラ容器を倒すアーム、handがピンポン球を囲むアームを表す。 基本的な関数を定義する。 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') migiで左タイヤを軸に右に回転、hidariで右タイヤを軸に左に回転する。 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') bihidariでロボット中心に左回転、bimigiでロボット中心に右回転する。 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=-00, time_sp=f, stop_action='brake') sleep(1) koutaiで後進、zensinで前進する。 def zensin_forever(g): mR.run_forever(speed_sp=-g, stop_action='brake') mL.run_forever(speed_sp=-g, stop_action='brake') zensin_foreverでstopメゾットが入るまで前進し続ける。 **ライントレース [#yd8674c6] 今回は2台分のEV3が使えるので一台のEV3にカラーセンサーを2つ載せた。両方のカラーセンサーが明るかったら前進、左側のカラーセンサーの範囲が暗くなったら左回転、右側が暗くなったら右回転、両方が暗くなったら交差点にと認識、というようにした。 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) else: mR.stop() mL.stop() sleep(0.1) break 交差点と認識したら別の行程に入るためbreakを入れWhile文から抜ける。 **メインプログラム [#nf0994b1] 「道のり」にある順番通りにプログラムを載せる。 1 直進し直線AMを認識する。 Trace_Method() sleep(0.1) 2 プラ容器の位置まで前進し左回転する。 zensin_forever(100) sleep(4) mL.stop() mR.stop() bihidari(1900) sleep(2.1) 3 前進し、直線KLの一つ手前の直線を認識する。 Trace_Method() sleep(0.1) 4 位置を前後微調整し、アームを下ろしピンポン球を囲う。 zensin_forever(100) sleep(0.3) mL.stop() mR.stop() 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) hand.run_to_rel_pos(position_sp=80, speed_sp=300, stop_action='brake') sleep(1) arm.reset() arm.run_to_rel_pos(position_sp=-160, speed_sp=100, stop_action='brake') sleep(3) プラ容器の中にはピンポン球が2つ入っているので確実に受け皿に入れるために2回アームを上げ下げしている。 5 左回転し、直線B'C'を認識する。 bihidari(2000) sleep(3) zensin_forever(100) sleep(3) mR.stop() mL.stop() sleep(1) Trace_Method() sleep(1) 6 位置を前後微調整し、再びアームを下ろしピンポン球を入れる。 koutai(800) sleep(1) koutai(800) sleep(1) arm.reset() 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') 確実にプラ容器にピンポン球を入れるためhandは高速に何回転もさせている。 *反省 [#f82cfa22] 発表会ではアームを下ろしたときに勢いがつきすぎてピンポン球が受け皿を超えて吹っ飛んでしまった。このようなパターンはこの発表会が初めてであった。課題2の反省からピンポン球を拾う許容範囲を広げることを意識して設計した。ボールを囲むという発想で許容範囲を広げることが出来たがピンポン球がプラ容器からどの様に外へ出て行き受け皿に入るかはアームの位置によってかなり変わってしまいこの点で許容範囲が狭くなってしまった。ある程度ピンポン球が吹っ飛んでも良いように受け皿を縦長にすると許容範囲が横方向だけでなく縦方向にも広げることが出来たと思う。 今日の訪問者数&counter(today);人 昨日の訪問者数&counter(yesterday);人 合計訪問者数&counter(all);人