2018a/MemberOnly

課題3〜空き缶運搬ロボット〜

課題の説明

 フィールドの説明

フィールド
  • フィールドは課題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点)

チームの戦略

今回の課題を取り組むにあたり、自由度が高いため、様々な戦略を立てることが出来た。 その中からいかに高得点を取ることが出来るかを意識し、以下のような戦略で挑むことにした。

  1. 缶の積み下ろしは一つずつ。
  2. おろした缶を色別に仕分けする。
  3. それぞれの缶を指定の場所に運搬する。
  4. 運搬、そして積み下ろしができるようなアームの制作。

今回使用するロボットの説明

ロボットの全体像

正面から見たとき

全体

背面から見たとき

背面

缶を掴む部分

アーム1

この缶を掴む部分で重要なことは、まず、持つ部分の間隔をできる限り狭くすること。そして、缶を運ぶため、運べる形のアームを付けるという、二つの点が重要となる。 そのため、このアームの奥の方を掴む部分、手前を運ぶ部分となるようにした。 また工夫した点として、缶がずれないようアームにゴム製のパーツを付けることで移動時の缶のずれを軽減した。

ロボットの缶を操作する部分

アーム
beruto

ベルトコンベアの要領を用い、中央にあるアーム部分を上下させることで缶の上げ下げを可能にした。ぐらつきで缶が落下することがあり、いかに缶をブレさせずに動作できるかがポイントであったため、ベルトの中に4つの歯車を入れ滑らかに動作できるようにした。

実際ロボットが缶を持っている様子

jisasi

実際にプログラミングをし、このロボが缶を掴むとこのようになる。 手前のアームでは重心が前にいきアンバランスになってしまうため、奥の方のモータで持たせるようにしている。

プログラムの説明

プログラムの導入

今回は前回同様、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の回転角度値

定義

ロボットの移動時に使うもの

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)

アームの開閉時に扱うもの

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)

アームの上下移動時

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)

はじめの移動

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)               -方向修正

缶の積み下ろし&運搬時に扱うもの

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)             -アームを閉じて缶をまとめる(緩めに閉じるので離脱可能)

添付ファイル: fileDSC_0288.png 4件 [詳細] fileDSC_0298.png 4件 [詳細] fileDSC_0295.png 4件 [詳細] fileDSC_0296.png 5件 [詳細] fileDSC_0296.JPG 3件 [詳細] filefigure_robot_1.JPG 5件 [詳細] fileDSCPDC_0000_BURST20180806173415582.JPG 1件 [詳細] fileDSC_0294.png [詳細] file2018a-mission2.png 3件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-19 (日) 13:28:01 (113d)