課題3 

課題内容

課題3

ロボット

DSC_0554.JPG

 EV3班は部品の少なさとmqttの不調でロボットを2つにすることにメリットがあまりなかったため、一つの機体に統合した。方針は超音波センサーを用いて缶を探知し、ハンドとアームで積み上げることで同意に至った。

DSC_0555.JPG

 写真のアームを曲げ伸ばしすることで缶を上げ下げする。その際重心が大きく前に偏るため、後部にEV3を余分に配置した。アームの形は何度も変更を経て、モーターの活用効率や安定性を鑑みてこの平行四辺形のアームに決定した。

DSC_0556.JPG
DSC_0557.JPG

 アームは数段積めるように縦に長くしている。

プログラム

#!/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')

 searchで缶の真正面を向いているため、まっすぐ走って一定の距離まで近づいて、距離を調整して缶をつかんで持ち上げる。

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')

 はじめはcatchと同じ。缶を次の缶の上に置き、、一度放して位置を調節して根本から持ち上げる。

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)

 一個目はcatchなのでループを変えておく。 

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()

 mTのホールドを解く

結果

 一回目:0点 2段目の空き缶を積み上げるところまではいったが、ゴールに入らなかった。
 二回目:0点 一度2段持ち上げるところまでいったものの、下す際に崩れてしまい、どちらもゴールに入らず得点にならなかった。

反省

 ロボット面では缶をつかむアームの部分が傾いていたため、缶を接地して放すと斜めって倒れてしまった。調整が難しく、解決策として少し持ち上げて垂直にして落とすことにしたが、落下の衝撃でタワーが崩れることが少なくなかった。

DSC_0556_2.jpg

 プログラム面では缶を探して積むのはサブルーチンで全部対応できたが、缶の地点へ行くのとゴールまで運ぶのはそれぞれの地点で動作を変えなければならないため、時間内では缶2個までが限界だった。

考察

 ロボットのアームの傾きを直せていれば安定して缶を積めていたが、今回の0点の一番の要因はゴールに入らなかったことで、ここをrun_timedでより細かく調整しておけばまだましになっただろう。
 今回は私達の班はライントレースをせずにrun_timedで動作を決定した。EV3では超音波センサーで缶を特定できるため必要なしと考えていたが、缶の場所まで行く動作を課題2から応用できたため、使用したほうが高い得点を狙えたかもしれない。
 for文を用いたため、ループの回数で一個目とそれ以降をif分岐で分けるときれいになっただろう。


添付ファイル: fileDSC_0557.JPG 241件 [詳細] fileDSC_0556_2.jpg 223件 [詳細] fileDSC_0556.JPG 252件 [詳細] fileDSC_0555.JPG 303件 [詳細] fileDSC_0554.JPG 278件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-14 (月) 23:52:39