[[2018a/MemberOnly]] *課題3〜空き缶運搬ロボット〜 [#k866a1ea] **課題の説明 [#vb3368b9] フィールドの説明 #ref(2018a/Member/yokouchi/Mission3/2018a-mission2.png,75%,フィールド) -フィールドは課題2で使用した紙を使用する。 -2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。 -空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。 ルール -競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 -図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 -Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。 -開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 -競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 -途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 基本得点の計算方法 -運んだ空き缶の数×3点 -空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。 -円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。 -間違った円内に空き缶を置いた場合は、1個につき1点減点。 -間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点 技術点の計算方法 -以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安: -空き缶を探し取りにいくまでの動作 (3点) -空き缶を掴む動作 (3点) -空き缶を運ぶ動作 (2点) -空き缶を置く動作 (2点) -空き缶を積む動作 (3点) -2台のRCXまたはNXT、EV3の連携の良さ(2点) -自立型のロボットとしての形や動作の美しさ、斬新さ(2点) -その他 (3点) *チームの戦略 [#s80a1f95] 今回の課題を取り組むにあたり、自由度が高いため、様々な戦略を立てることが出来た。 その中からいかに高得点を取ることが出来るかを意識し、以下のような戦略で挑むことにした。 +缶の積み下ろしは一つずつ。 +おろした缶を色別に仕分けする。 +それぞれの缶を指定の場所に運搬する。 +運搬、そして積み下ろしができるようなアームの制作。 *今回使用するロボットの説明 [#mf88ec37] **ロボットの全体像 [#zd0c30da] 正面から見たとき #ref(2018a/Member/yokouchi/Mission3/figure_robot_1.JPG,60%,全体) 背面から見たとき #ref(2018a/Member/yokouchi/Mission3/DSC_0296.png,50%,背面) **缶を掴む部分 [#w557d5e8] #ref(2018a/Member/yokouchi/Mission3/DSC_0295.png,50%,アーム1) この缶を掴む部分で重要なことは、まず、持つ部分の間隔をできる限り狭くすること。そして、缶を運ぶため、運べる形のアームを付けるという、二つの点が重要となる。 そのため、このアームの奥の方を掴む部分、手前を運ぶ部分となるようにした。 また工夫した点として、缶がずれないようアームにゴム製のパーツを付けることで移動時の缶のずれを軽減した。 **ロボットの缶を操作する部分 [#dd7ea41d] #ref(2018a/Member/yokouchi/Mission3/DSC_0294.png,50%,アーム) #ref(2018a/Member/yokouchi/Mission3/DSC_0298.png,50%,beruto ) ベルトコンベアの要領を用い、中央にあるアーム部分を上下させることで缶の上げ下げを可能にした。ぐらつきで缶が落下することがあり、いかに缶をブレさせずに動作できるかがポイントであったため、ベルトの中に4つの歯車を入れ滑らかに動作できるようにした。 *実際ロボットが缶を持っている様子 [#j75ce356] #ref(2018a/Member/yokouchi/Mission3/DSC_0288.png,50%,jisasi) 実際にプログラミングをし、このロボが缶を掴むとこのようになる。 手前のアームでは重心が前にいきアンバランスになってしまうため、奥の方のモータで持たせるようにしている。 *プログラムの説明 [#c0e71179] **プログラムの導入 [#zb56a854] 今回は前回同様、python言語を用いた。 以下は定義までの導入である。 #!/usr/bin/env python3 from ev3dev.ev3 import * -EV3を扱うモジュールをインポート from time import sleep -timeモジュールからsleep関数をインポート us1 = UltrasonicSensor('in1') -1端子側の超音波センサー(正面)をus1とおく us2 = UltrasonicSensor('in3') -3端子側の超音波センサー(側面)をus2とおく mL = LargeMotor('outA') -A端子側の移動用モーターをmLとおく mR = LargeMotor('outB') -B端子側の移動用モーターをmRとおく mA = MediumMotor('outC') -C端子側のアーム開閉用モーターをmAとおく mLif = LargeMotor('outD') -D端子側の無限軌道制御用モーターをmLifとおく また以下は、アームの上下をする際に用いるmLifの回転角度の値を一時的に置いたものである。 lif2 = 250 -ある缶から一個上の缶までアームが上昇するためのmLifの回転角度値 lif3 = 495 -ある缶から二個上の缶までアームが上昇するためのmLifの回転角度値 dow3 = -520 -ある缶から二個下の缶までアームが降下するためのmLifの回転角度値 dow2 = -280 -ある缶から一個下の缶までアームが降下するためのmLifの回転角度値 **定義 [#h7a6dbb7] ***ロボットの移動時に使うもの [#t1ee32b3] def motor_init(): -各モーターをリセットする mL.reset() mR.reset() mLif.reset() def turn(t): -右回りを正とし,指定角度 t だけ移動用モータが回転,車体が旋回する mL.run_to_rel_pos(position_sp=t,speed_sp=60,stop_action='brake') mR.run_to_rel_pos(position_sp=-t,speed_sp=60,stop_action='brake') sleep(3) def run_for_back_pos(t): -指定角度 t だけ移動用モーターが回転,車体が前進または後退する motor_init() mL.run_to_rel_pos(position_sp=t,speed_sp=60,stop_action='hold') mR.run_to_rel_pos(position_sp=t,speed_sp=60,stop_action='hold') sleep(1) def run_adjust(t): -上述定義を用いて,前進または後退の調整 run_for_back_pos(t) ***アームの開閉時に扱うもの [#j7d91d1d] def arm_open(): -アームを開く mA.reset() mA.run_to_rel_pos(position_sp=-20,speed_sp=20,stop_action='hold') sleep(2) def arm_close(): -アームを閉じる mA.reset() mA.run_to_rel_pos(position_sp=50,speed_sp=50,stop_action='hold') sleep(2) def arm_adjust(t): -アーム開閉時に調整のために用いる(mAの回転角度をtとおく) mA.reset() mA.run_to_rel_pos(position_sp=t,speed_sp=50,stop_action='hold') sleep(1) ***アームの上下移動時 [#z1f87ba1] def lift_can2(): -アームが,ある缶から一個上の缶まで上昇する motor_init() mLif.run_to_rel_pos(position_sp=lif2,speed_sp=80,stop_action='hold') sleep(3) def lift_can3(): -ある缶から二個上の缶まで上昇する motor_init() mLif.run_to_rel_pos(position_sp=lif3,speed_sp=80,stop_action='hold') sleep(6) def down_can2(): -ある缶から一個下の缶まで降下する motor_init() mLif.run_to_rel_pos(position_sp=dow2,speed_sp=75,stop_action='hold') sleep(5) def down_can3(): -ある缶から二個下の缶目で降下する motor_init() mLif.run_to_rel_pos(position_sp=dow3,speed_sp=75,stop_action='hold') sleep(6) def lift_adjust(t): -上述に定義した値以外で昇降を調整(mLifの回転角度を t とおく) motor_init() mLif.run_to_rel_pos(position_sp=t,speed_sp=60,stop_action='hold') sleep(3) def can_approach(): -缶の積み降ろしの前に,缶を見つけ,缶と適切な距離を取ってつかむ motor_init() while us1.value() > 70: -缶との距離が一定値超の時,前進して缶に接近 mL.run_forever(speed_sp=80) mR.run_forever(speed_sp=80) run_for_back_pos(80) -一定の距離まで近づいたら,そこから缶に適切な距離まで近づく sleep(2) def turn_can_search(le,s): -前方にある缶を探して旋回 motor_init() while us1.value() > le: mL.run_forever(speed_sp=50*s) mR.run_forever(speed_sp=-50*s) ***はじめの移動 [#m58a5289] def start(): -スターティングポイントよりB地点に向かい,右へ方向転換 motor_init() run_for_back_pos(600) -↓で旋回して缶の正面になるよう,適当な位置まで前進 sleep(8) turn(165) -缶の正面を向くよう旋回 sleep(2) turn(20) -旋回して缶を見つける準備に入る turn_can_search(250,-1)-左回りに旋回して缶を探す turn(-5) -方向修正 ***缶の積み下ろし&運搬時に扱うもの [#l6f3908e] def lift_down_can3_can2(): -三段目の缶と二段目の缶をアームでつかんで降ろす motor_init() lift_can3() -三段目の缶まで移動 arm_close() -アームを閉じる lift_adjust(45) -移動の際に下の缶を引っ掛けないように缶を少し持ち上げる run_adjust(-100) -後退 sleep(2) turn(-110) -左へ旋回 down_can3() -缶をとりあえず降ろす lift_adjust(-40) -最下点まで降ろすよう調整 arm_open() -アームを開いて缶をリリース run_for_back_pos(250) -左斜め前方まで押して移動 sleep(3.5) lift_can3() -移動の際に缶を引っ掛けないよう予め上げておく lift_adjust(45) run_for_back_pos(-250) -積まれた缶の前まで下がる sleep(3.5) turn(110) -缶の正面へ旋回 arm_adjust(-10) -アームを少し開く(確実に缶がキャッチできるように) down_can2() -二段目の缶までアームを降ろす run_adjust(113) -缶の手前まで接近 sleep(2.5) arm_close() -アームを閉じて缶をキャッチ lift_adjust(45) -缶を少し持ち上げる run_for_back_pos(-90) -少し後退 ←この時二段目の缶はサークルから外れるように turn(110) -右へ旋回 ← down_can2() -缶を降ろす arm_open() -アームを開いて缶をリリース lift_can2() -アームを上げとく(↓collect_can1_can3()へ) def collect_can1_can3(): -三段目と左斜め前方に移した一段目(二つの同種の缶)をまとめる motor_init() turn(-115) -二段目を降ろしてアームを上げた後,三段目の正面を向く down_can2() -二段目にあったアームを三段目まで降ろす run_adjust(110) -三段目の缶がアームの中に入るよう前進 sleep(1.5) arm_close() -アームを閉じて缶をキャッチ run_for_back_pos(-320) -後退 sleep(6) lift_can3() -缶をキャッチしたまま上げて,超音波センサーの視界を確保 turn_can_search(300,-1) -最初に移した缶を探し,左回りに旋回 down_can3() -缶を最下点まで降ろす arm_open() -アームを開いて缶をリリース arm_adjust(-10) -二つの缶が入るようにアームをある程度開いておく run_for_back_pos(500) -アームの中に二つの缶が入るまで適当な距離を前進 sleep(6) arm_adjust(20) -アームを閉じて缶をまとめる(緩めに閉じるので離脱可能)