*目次 [#oa213c0e] #contents これまでの課題 [[2018a/Member/montbell/Mission1]] [[2018a/Member/montbell/Mission2]] *課題�供Ф�き缶運搬ロボット [#zc6fa3cf] :フィールドの説明 | --フィールドは課題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を参照下さい) *躯体本体 [#c7ee246c] **設計思想 [#f93bda78] このロボットは躯体を2ヶ所に置かれた缶の中央に配置し、両側の缶をアームを使用し左右対称に動かすことで効率よく缶を運ぶことを狙った。具体的にはマジックアームを使用し躯体の両側の缶を同時に掴む。その缶をマジックアームごと上下に動かし、駆体をその場で回転させることで缶を移動させる。このロボットの利点は一回の動作で2ヶ所の缶を移動できることである。こうすることでプログラムの簡素化を実現した。 --2018.08.15追記分 大まかなロボットの動き &ref(2018a/Member/montbell/Mission3/videotogif_2018.08.14_18.20.43.gif,100%,Mission3 ); &ref(2018a/Member/montbell/Mission3/videotogif_2018.08.14_18.20.43.gif,140%,Mission3 ); **各部名称 [#zef0ca70] &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 ); :マジックアーム(写真オレンジ色の箇所)| 缶をつかむ機構。両側の缶を一度に掴むことが出来る。 :エレベータ(写真緑色の箇所)| マジックアームを上下に動かす機構。 :移動モータ(写真紫色の箇所)| 駆体そのものを移動させるためのモータ。その場での回転も出来る。 **マジックアーム [#n31e6193] 以下の写真の補足はアームが伸びて缶を掴むときの動作を表したものである。 &ref(2018a/Member/montbell/Mission3/IMG_20180811_214028-934x1245.jpg,19%,Mission3 ); &ref(2018a/Member/montbell/Mission3/IMG_20180811_214219-1663x934.jpg,25%,Mission3 ); &ref(2018a/Member/montbell/Mission3/IMG_20180811_214617-934x1663.jpg,14.2%,Mission3 ); 基本的な機構は課題�気�STRIDEのX軸機構と全く同じものである。まずミディアムモータ(紫色の部分)を使用し4つの歯車を回転させる(オレンジ色が駆動歯車)。その歯車のうち両端にある大きめの歯車(水色の矢印)にアーム中央のツメを固定することで蛇腹型のアームの伸縮(緑色の矢印)を行う。それと同時にアームの両端にあるハンド部分が閉じることで缶を掴むことが出来る。STRIDEからの改良点はモータに直接接続している駆動歯車の半径を小さくしたことで強い力で缶を掴むことが出来るようにしたことである。またハンド部分にゴムが取り付けてあり缶が滑り落ちないようになっている。 **エレベータ [#hf6545fd] 以下の写真の補足はマジックアーム下降時の動きを表したものである。 &ref(2018a/Member/montbell/Mission3/IMG_20180811_230514-1395x941.jpg,20%,Mission3 ); &ref(2018a/Member/montbell/Mission3/IMG_20180811_230734-1395x934.jpg,20%,Mission3 ); エレベータは缶をマジックアームごと昇降させるための機構である。主に2つの縦に設置されたキャタピラとそれを回転させるためのモータと歯車から成り立っている。ラージモータに接続した歯車が回転すると(オレンジ色の矢印)噛み合わさった歯車が回転する(水色の矢印)。この内の両端にある2つの大きめの歯車はそれぞれキャタピラの駆動輪に繋がっているため、歯車が回転するとキャタピラも回転する(緑色の矢印)。2つのキャタピラの間にはマジックアーム(赤紫色斜線部)が接続されており、2つのキャタピラが逆回転することでマジックアームが昇降する(オレンジ色の矢印)。この2つのキャタピラは同じ速さで互いに逆向きに回転しなければならないため歯車の個数は偶数個になっている。 **移動モータ [#l57e5b12] &ref(2018a/Member/montbell/Mission3/IMG_20180812_212517-934x936.jpg,25%,Mission3 ); 移動モータはRightMotorとLeftMotorの2つのモータとそれに付随するタイヤから成り立つ非常に基本的な作りである。これと駆体後部についた球型のタイヤのようなもので本体を支えている。工夫としては2つのタイヤの軸が上部のマジックアームの中心軸と重なるようになっているため、2つのモータを逆回転させるとマジックアームの中央を軸として本体が回転する仕組みになっている。これにより本体を180度回転させると缶の位置を本体に対して点対象な地点へ運べるようになった。 **カラーセンサーの取り付け位置について [#f6b3e59f] &ref(2018a/Member/montbell/Mission3/IMG_20180812_205145-471x507.jpg,50%,Mission3 ); &ref(2018a/Member/montbell/Mission3/IMG_20180812_205431.png,50%,Mission3 ); 私たちのロボットは設計上本体を2ヶ所の缶の中央に移動させなければならなかった。そこでカラーセンサを停止位置の基準に使用した。そのためカラーセンサは左上の写真のようにマジックアームの中心軸の本の少し後ろよりにつけられている。このカラーセンサが右上の図に示された位置で反応し本体を停止させることで正確な位置に停止できるようになっている *プログラム [#u1cb30da] **関数...の前に [#f9c77c60] まず次の文章をプログラムしました。各モータなどとの対応は以下の通りです。 --mA マジックアームを動かすミディアムモータ。 --mH キャタピラを動かしマジックアームを昇降させるラージモータ。 --mR 進行方向右側の移動モータを動かすラージモータ。 --mL 進行方向左側の移動モータを動かすラージモータ。 --cs カラーセンサ #!/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() **関数 [#cacd5865] 関数を作成します。 :ロボットを希望する方向へ動かす関数| RとLにRightMotorとLeftMotorの回転角度を代入する。sにはsleepの時間が入る。 RとLに正負が正反対の値を入れるとその場で回転させることが出来る。 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) :マジックアームを動かす関数| xに正の値でアームを伸ばしながら缶をつかむ。sにはsleepの時間が入る。 def move_arm(x,s): mA.run_to_rel_pos(position_sp=x, speed_sp=100, stop_action='brake') sleep(s) :エレベータを動かす関数| xに正の値でマジックアームを上昇させる。sにはsleepの時間が入る。 def move_high(x,s): mH.run_to_rel_pos(position_sp=x, speed_sp=130, stop_action='brake') sleep(s) :黒い線のとこまで直進する関数| カラーセンサの値が75を下回るまで直進を続ける。 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() **実際に走行させるためのプログラム [#w2632049] Aから出発し所定の位置(2ヶ所の缶の中央)まで移動。 (詳しくは「カラーセンサーの取り付け位置について」の二枚目の図にあるオレンジ色で示された本体の位置を参照して下さい) move_position(920,920,18) move_position(180,-180,8) move_position(360,360,10) move_straight() 缶の1段目を掴み6個全てをロボットごと180度旋回させ場所を入れ換える。その後アームを缶から少し離す。 move_arm(700,6) move_position(380,-380,11) move_arm(-300,6) アームの上昇させ缶の2段目を掴む。その後少し高さを上げ缶のツメをはずしたら100度ほど旋回させた後缶を地面に下ろしさらに70度ほど旋回させ所定の円の中に二段目の缶を入れる。この動作の途中で邪魔な一番上の缶が振り落とされる。 --ここで言う缶のツメとは缶を縦に重ねるときにはめる缶の頭についている出っ張りを指す。これにより缶を安定して縦に重ねることができるが、重なった状態の缶の二段目を横に動かすとこのツメが引っ掛かるため一段目の缶を倒してしまう。そのため二段目の缶を動かすときは缶をつかんだ後に少し上げてから動かしている。 move_high(1500,15) move_arm(300,6) move_high(800,10) move_position(-200,200,8) move_high(-2300,16) move_position(-150,135,8) move_arm(-300,6) 後処理 mA.reset() mH.reset() mR.reset() mL.reset() ここまでの動作で2種類それぞれ2つ、計4つの缶が所定の範囲に入ることになる。 *最後に [#yfa546f0] 今回テスト週間と期末レポートが重なったうえ直後に旅行にいってしまったためロボティクスにあまり時間を割くことができなかった。そこで本体を工夫することでプログラムを簡単にすることを目指した。そのため最後のデバックはチームの人にお願いせざるを得なかった。それでも本番である程度は成功させることができ優勝までできたのはとても良かった。しかし確実性のために缶を2つ捨ててしまったのと積むのを諦めてしまったこと、また通信を断念してしまったのでそれなりに悔しい。(当初は通信させるためEV3を二台ロボットに積むつもりで作ったが途中で一台下ろした)もっとデバックの時間がとれれば缶の3段積みも挑戦できたと思う。残念ながらこの授業は終わってしまったがこれを活かしてまたなにかプログラムを作ってみたい。