#contents *課題3:空き缶運搬ロボット [#q6adc595] :フィールドの説明 | --フィールドは課題2で使用した紙を使用する。 --2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。 :基本的なルール | --AまたはA'からスタートする。 --Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。 --開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 (詳しい説明はhttp://yakushi.shinshu-u.ac.jp/robotics/?2018a%2FMission3を参照下さい) *ロボット本体 [#r9b64158] **各部の説明 [#a24d6b77] &ref(2018a/Member/montbell/Mission3/IMG_20180809_205843-934x1663.jpg,20%,Mission3 ); &ref(2018a/Member/montbell/Mission3/IMG_20180809_210114-934x1663.jpg,20%,Mission3 ); &ref(2018a/Member/montbell/Mission3/IMG_20180809_210325-934x1663.jpg,20%,Mission3 ); http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMember%2Fyuya%2FMission3&openfile=DSC_0347.JPG :アーム(写真オレンジ色の箇所)| 缶をつかむ機構。両側の缶を一度に掴むことが出来る。 :エレベータ(写真緑色の箇所)| マジックアームを上下に動かす機構。 :移動ユニット(写真紫色の箇所)| 駆体そのものを移動させるためのモータ。その場での回転も出来る。 :カラーセンサー(2枚目の写真,EV3本体の右) :カラーセンサー(4枚目の写真)| 地面の色を識別する. **アーム [#p9b1f9bd] アームはマジックハンド状で,ミディアムモーターを使用し4つの歯車を回転させ,両端にある大きめの歯車にアーム中央部を固定することでアームを伸縮させる. それと同時にアームの両端にあるハンド部分が閉じることで缶を掴むことが出来る. またハンド部分にゴムが取り付けてあり缶が滑り落ちないようになっている. **エレベータ [#ac97290b] エレベータは缶をアームユニットごと昇降させるための機構である.2つの縦に設置されたキャタピラとそれを回転させるためのモーター,歯車から成り立っている. **移動ユニット [#md5f6037] ラージモーターのついたタイヤが2つ並んでおり,別々に動かせる. **カラーセンサー [#iced5f1e] 地面の色を判別するセンサー。これを使用し円XとYを結ぶ黒い線を認識させる。 *プログラム [#pcc09d09] #!/usr/bin/env python3 from ev3dev.ev3 import * from time import sleep mA = MediumMotor('outA') mH = LargeMotor('outB') mR = LargeMotor('outC') mL = LargeMotor('outD') cs = ColorSensor('in1') cs.mode = 'COL-REFLECT' ロボットを動かすための基本的なプログラムと,モーターやセンサーの定義付け. mA.reset() mH.reset() mR.reset() mL.reset() **関数 [#z99a55f1] def move_position(R,L,s): mR.run_to_rel_pos(position_sp=R, speed_sp=50, stop_action='brake') mL.run_to_rel_pos(position_sp=L, speed_sp=50, stop_action='brake') sleep(s) ロボットを移動させる.R,Lはそれぞれ左右のタイヤを回転させる角度. sはその秒数だけ次の命令の実行を遅らせる(以下の関数でも同じ) def move_arm(x,s): mA.run_to_rel_pos(position_sp=x, speed_sp=100, stop_action='brake') sleep(s) アームを伸縮させる.xはモーターの回転角度=腕の伸び&手の閉じ具合 def move_high(x,s): mH.run_to_rel_pos(position_sp=x, speed_sp=130, stop_action='brake') sleep(s) エレベーターを上下させる.同じくxはモーターの回転角度=エレベーターの変位. def move_straight(): t0 = time.time() while time.time() - t0 < 0.3: mR.run_to_rel_pos(position_sp=20, speed_sp=50, stop_action='brake') mL.run_to_rel_pos(position_sp=20, speed_sp=50, stop_action='brake') if cs.value() >= 75: t0 = time.time() センサーが黒線を認識する( cs.value() >= 75となる)まで前進する. move_position(920,920,18) move_position(180,-180,8) move_position(360,360,10) move_straight() スタート地点からXとYの中点まで移動する.1-3行目は予め定めた距離だけ動かし 4行目によってXとYを結ぶ線で停止する. move_arm(700,6)#その位置から腕を伸ばして下の缶2つを掴み move_position(380,-380,11)#約180度ターンして move_arm(-300,6)#缶を置く move_high(1500,15)#2段目の缶の高さまでアームを上げ move_arm(300,6)#2段目の缶を掴み move_high(800,10)#持ち上げる move_position(-200,200,8)#再び約180度ターンするが今回は途中で一旦止まり move_high(-2300,16)#缶を地面近くまで降ろして move_position(-150,135,8)#ターンを続行 move_arm(-300,6)#缶を離す mA.reset() mH.reset() mR.reset() mL.reset()#モーターをリセット *工夫した点や考察 [#leeb548c] http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMember%2Fyuya%2FMission3&openfile=DSC_0355.JPG 工夫した点は,ロボットが大きいためバランスを崩しがちであったが,写真のモーターとタイヤを重りとして使用し解決した. 今回の課題について:アームの形は「エリアの中点で左右対称の動きをすれば2つのエリアに効率よく缶を置けるのではないか」という発想から生み出され 2つ目のEV3との通信やカラーセンサー以外のセンサーを使用しなかったり缶を積まずに並べた状態でフィニッシュしたのは期末テストなどで全員時間がないため できるだけシンプルにしたいという理由であった. 僕が考えるにこの課題は,早期から到達が困難でない目標を設定しそれに向かって作業を進めたことが勝因である.