[[2017a/Member]] *目次 [#gcd37d29] #contents *課題内容 [#cdefc364] 下記url課題3のページを参照 http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission3 *ロボットの説明 [#ja8bf9ae] **ロボット全体 [#naad3d18] #ref(2017a/Member/irin/Mission3/各部の説明.jpg,100%,下げ時); 上図が積み上げ用アームを下げた時、下図が上げた時 #ref(2017a/Member/irin/Mission3/上げ時.JPG,100%,上げ時); -缶をつかむ用のアームは、根元のモーターが回転するとことで開閉する。 -缶を積む用のアームは上下することで、缶を積むことができる。 -超音波センサーは前方の缶を検知するために設置した。 -レールは、缶をつかむとき、ずれない様にするため設置した。 **アーム部分の説明 [#g0b31468] #ref(2017a/Member/irin/Mission3/アーム.png,100%,アーム); 缶をつかむ用のアームは左右で、可動する部分と稼動しない部分で分かれているので、缶を持つ際は挟み込むように持つ。 **積む動作について [#wc1296ae] #ref(2017a/Member/irin/Mission3/積む動作.JPG,100%,手書きの図); 上の図のように缶を持ち上げてから直進し、次の缶の上まで持ってきた後、アームを放し缶を置くことで、缶を積み上げることができる。 また、この時ガイドが横ずれ防止の為に働いている。 **その他の部分 [#vc6d96ce] -2台ev3が搭載されているが、上の一台は実際には動作しておらず、おもりとして機能している。というのも、積む用のアームを下げると重心が前方に偏り、タイヤが浮くという問題があったため、おもりを採用した。また、おもりを採用することで問題は解決された。 -当初は2台に分けてmqttを用いるつもりだったが、2台に分けることで逆に難しくなってしまった。そこで、話し合いを進めていった結果、ev3一台で製作したほうが、部品との兼ね合いもよく簡単だという結論に至ったため、今回mqttは使用しなかった。 *プログラムの説明 [#g6975e47] #!/usr/bin/python3 # -*- coding:utf-8 -*- -モジュールのインポート import ev3dev.ev3 as ev3 import time -インスタンスと変数の作成 mR=ev3.LargeMotor('outA') #右モーター mL=ev3.LargeMotor('outB') #左モーター mT=ev3.LargeMotor('outC') #アーム mA=ev3.LargeMotor('outD') #ハンド us=ev3.UltrasonicSensor('in1') #超音波センサー t1=time.time() #缶の探索の片方への旋回時間 t2=time.time() #探索開始から感知するまでの時間 minimum=10000 #缶との距離の最小値 -超音波センサーを用いて缶を発見する関数 def search():#seach for cans while spinning global t1 global t2 global minimum while time.time()-t1<5:#search around mR.run_forever(duty_cycle_sp=50,speed_sp=-10) mL.run_forever(duty_cycle_sp=50,speed_sp=10) if minimum>=us.value():#not minimum minimum=us.value() if minimum<us.value():#minimum t2=time.time() while time.time()-t1>=5 and time.time()-t1<=5.5+t2 and us.value()>minimum:#research mR.run_forever(duty_cycle_sp=50,speed_sp=10) mL.run_forever(duty_cycle_sp=50,speed_sp=-10) 一定時間旋回し、缶との最小値を更新し続ける。また、距離が最小値より大きくなったときをt2とし、反対方向に旋回し、最小値より小さい値を検知するか、t2を基準とした時間になるまで継続する。 -缶まで走り回収する関数 def catch():#catch the can while us.value()>40: mR.run_forever(duty_cycle_sp=50,speed_sp=-100) mL.run_forever(duty_cycle_sp=50,speed_sp=-100) else : mR.run_timed(time_sp=800,duty_cycle_sp=40,speed_sp=100) mL.run_timed(time_sp=800,duty_cycle_sp=40,speed_sp=100) time.sleep(1.5) mT.run_timed(time_sp=1000,duty_cycle_sp=40,speed_sp=100,stop_action='brake') time.sleep(1) mA.run_timed(time_sp=2000,duty_cycle_sp=30,speed_sp=100,stop_action='hold') time.sleep(2) mT.run_timed(time_sp=2000,duty_cycle_sp=40,speed_sp=-100,stop_action='hold') 缶を発見した後に実行するので、これを実行した時ロボットは缶の方向を向いている。 この関数は、ロボットを直進させ、缶との距離が設定した値以下になると停止し、その場で缶を掴んで持ち上げる。 -缶を積む関数 def build():#pile the cans while us.value()>40: mR.run_forever(duty_cycle_sp=50,speed_sp=-100) mL.run_forever(duty_cycle_sp=50,speed_sp=-100) else : mR.run_timed(time_sp=800,duty_cycle_sp=40,speed_sp=100) mL.run_timed(time_sp=800,duty_cycle_sp=40,speed_sp=100) time.sleep(1.5) mT.run_timed(time_sp=650,duty_cycle_sp=70,speed_sp=40,stop_action='hold') time.sleep(1.5) mA.run_timed(time_sp=2000,duty_cycle_sp=30,speed_sp=-100,stop_action='hold') time.sleep(1.5) mR.run_timed(time_sp=1200,duty_cycle_sp=40,speed_sp=100) mL.run_timed(time_sp=1200,duty_cycle_sp=40,speed_sp=100) time.sleep(1.5) mT.run_timed(time_sp=2000,duty_cycle_sp=70,speed_sp=30,stop_action='brake') time.sleep(2) mA.run_timed(time_sp=2000,duty_cycle_sp=30,speed_sp=100,stop_action='hold') time.sleep(2) mT.run_timed(time_sp=710,duty_cycle_sp=40,speed_sp=-100,stop_action='hold') 缶を掴んで持ち上げた状態のまま、次の缶の近くまで走行し、次の缶の上に置く。 その後、一回放して、下の段を掴んで持ち上げる。 -ゴールからロボットを出す関数 def end():#get out of the goal mR.run_timed(time_sp=1000,duty_cycle_sp=50,speed_sp=200) mL.run_timed(time_sp=1000,duty_cycle_sp=50,speed_sp=200) -一個目の缶を掴む for loop in [0]: search() mR.stop() mL.stop() time.sleep(2) catch() time.sleep(2) -2個目の缶を掴んで積む for loop in [0]: t1=time.time() search() mR.stop() mL.stop() time.sleep(2) build() time.sleep(2) -ゴールまで缶を持ったまま走る mR.run_timed(time_sp=3000,duty_cycle_sp=50,speed_sp=-55) mL.run_timed(time_sp=3000,duty_cycle_sp=50,speed_sp=-120) time.sleep(3) mR.run_timed(time_sp=1500,duty_cycle_sp=50,speed_sp=-200) mL.run_timed(time_sp=1500,duty_cycle_sp=50,speed_sp=-200) time.sleep(3) mR.stop() mL.stop() -缶を降ろして置く mA.run_timed(time_sp=1000,duty_cycle_sp=30,speed_sp=-40) time.sleep(3) mA.run_timed(time_sp=2000,duty_cycle_sp=30,speed_sp=-110,stop_action='brake') end() time.sleep(2) mT.reset() *今回の課題を振り返って [#m917d763] **結果 [#hf593ad2] 一回目は2段積むことに成功したが、ぎりぎりゴールに入っていなかった。 2回目は崩れてしまって積めなかった。 **反省 [#w8238fd1] #ref(2017a/Member/irin/Mission3/傾き.jpg,70%,アームの傾き); 積むのが安定しなかった原因として、アームの傾きが挙げられる。直そうと試行錯誤したが、動かすたび他の部分に不具合が見られ、そこの部分の改善に手間取って間に合わなかった。 積むのが安定しなかった原因として、アームの傾きが挙げられる。上図のように下げた時に床と垂直でないため、缶が傾いてしまうので、置いたとき崩れやすくなってしまう。直そうと試行錯誤したが、動かすたび他の部分に不具合が見られ、そこの部分の改善に手間取って間に合わなかった。 また、ロボットの仕組みがなかなか決まらず、製作時間がカツカツになってしまった。 授業を振り返ってみて、時間はかかるし大変だったが、それ以上に楽しかった。また、コンピューター制御と言っても人がプログラミングしたものなので過信するのはやめようと思ったし、スケジューリングの大切さを学んだ。