- 追加された行はこの色です。
- 削除された行はこの色です。
*課題2〜ライントレース・空き缶運び〜 [#k849e100]
#contents
**課題内容 [#d5344306]
次のコースの黒い線に沿って動き、350mlの空き缶(黄色で表示)を移動させるロボットを製作せよ。
**コース紹介 [#sabd6b8d]
今回、自分が挑戦するコースは図のようである。
#ref(2018a/Member/yokouchi/Mission2/Inked2018a-mission2_LI.jpg,80%,コース)
もう少し詳しく説明を加える。
+Aをスタート
+Bを右折
+Jで一時停止の後、Yの空き缶をキャッチしてJに戻る
+JからKに向かい、Kを直進
+Lを直進
+Iを左折
+Hで一時停止の後、左折
+Gで一時停止の後、右折
+Fで一時停止の後、右折
+Eを直進
+Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう
+Cで一時停止の後、直進
+Bを直進
+Aで停止
※なお一時停止の指定がある場所は、1秒間停止
**今回使用するロボット [#e3215a92]
今回は、ライントレースが主な動きになってくるため、あまり複雑化しないよう、EV3の基本形に少しだけ手を加えた形にした。
この写真は缶をつかむ部分である。MediumMotorを用いて缶を確実につかむため、二つのアームが連動するようにした。
#ref(2018a/Member/yokouchi/Mission2/WIN_20180719_23_54_54_Pro.jpg,80%,robo)
光センサーの位置はアームの都合上、中央に取り付けることはできなかった。
そのため、左側にあることを意識したプログラミングをしなければならなくなった。一つ目の失敗である。
超音波センサーは、写真の通りアームの中央に取り付けた。超音波センサーは中央に取り付けなければならないため、仕方なく縦向きで取り付けた。
#ref(2018a/Member/yokouchi/Mission2/WIN_20180719_23_55_01_Pro.jpg,80%,arm)
**プログラムの概要 [#meb15068]
***プログラムの導入 [#r727f9d8]
今回、Python言語を用いてプログラミングを行った。
以下は導入部分である。
#!/usr/bin/env python3
from ev3dev.ev3 import *
import time
from time import sleep
ml = LargeMotor('outA') -左駆動輪をmlとおく
mr = LargeMotor('outB') -右駆動輪をmrとおく
arm = MediumMotor('outC') -缶を掴む腕の部分をarmとおく
cs = ColorSensor('in1') -カラーセンサーをcsとおく
us = UltrasonicSensor('in2') -超音波センサーをusとおく
***定義 [#x09aae04]
-まず初めにアームの開閉の動作の定義である。beforeを開く動作、afterを閉じる動作としている。
def before_catch():
def before_catch(): -缶を掴む前、アームを開く
arm.run_forever(speed_sp=-60)
time.sleep(2)
arm.stop()
def after_catch():
def after_catch(): -缶を掴むため、アームを閉じる
arm.run_forever(speed_sp=60)
time.sleep(1.8)
arm.stop()
-続いて、主となるライントレースの部分
def line_trace():
t = time.time()
while time.time() - t < 0.5:
if cs.value() > 50: -白を検知した時、ロボを左に傾け黒を探すようにした
if cs.value() > 50: -白を検知した時、ロボを左に傾け黒を探すようにした。50が上手くいく境目であったので、それを利用し、ライントレースを行った。
ml.run_forever(speed_sp=-40)
mr.run_forever(speed_sp=80)
t = time.time()
else: -黒を検知した時は反対に右に傾け白を探すようにした
else: -黒を検知した時は反対にロボを右に傾け白を探すようにした
ml.run_forever(speed_sp=80)
mr.run_forever(speed_sp=-40)
def curve():
t = time.time()
while time.time() - t < 0.5:
if cs.value() > 50:
ml.run_forever(speed_sp=-20)
mr.run_forever(speed_sp=40)
t = time.time()
else:
ml.run_forever(speed_sp=40)
mr.run_forever(speed_sp=-20)
上のものは、直線用であり、下のものは、曲線用である。
スピードを遅くしたことにより、急なカーブにも対応できた。
-次に交差点で必要な曲がるときの動作
def turn_left():
def turn_left(): -左に曲がる
motor_init()
ml.run_forever(speed_sp=-40)
mr.run_forever(speed_sp=80)
sleep(2)
ml.stop()
mr.stop()
def turn_right():
def turn_right(): -右に曲がる
motor_init()
ml.run_forever(speed_sp=80)
mr.run_forever(speed_sp=-40)
sleep(2)
ml.stop()
mr.stop()
-缶を置くとき
def can_put():
def can_put(): -缶を置く動作。まず、奧場所に近づき、先程のアームを開く動作を入れた。
ml.run_forever(speed_sp=40)
mr.run_forever(speed_sp=40)
sleep(1.2)
before_catch()
ml.run_forever(speed_sp=-40)
mr.run_forever(speed_sp=-40)
sleep(2)
ml.stop()
mr.stop()
-最後に交差点部分である
**交差点部分 [#z0dcfb1f]
def cross():
t = time.time()
while time.time() - t <= 0.3: -何度も試行した結果、黒検知時間が0.3秒以上だとうまく機能したため、採用した。
while time.time() - t <= 0.3: -検知時間が0.3秒よりも短い時→ライントレース続行
line_trace()
if time.time() - t > 0.3: -黒検知時間が0.3秒以上の時、止まらせ次の動作に入らせる。
if time.time() - t > 0.3: -検知時間が0.3秒よりも長い時→ロボを止まらせる
ml.stop()
mr.stop()
sleep(1)
交差点の検知はどうやるのかかなり悩んだ。
しかし、交差点の時には、ジグザグで検知している際、真ん中のクロス部分を検知している時間が長くなることが分かり、それを利用した。試行錯誤の末、検知時間が0.3秒を基準に0.3秒より短いとそのままライントレースを続行、0.3秒より長いと交差点と検知し、その場で止まるようにした。
そして、止まらせることで次の動作に移るようにした。
**反省・感想 [#pe205c04]
今回は前回と違い、プログラミングが主なウエイトを占める課題であった。
交差点の検知の仕方などの工夫する部分など、いかに明瞭でわかりやすいプログラムを書くかが重要であった。
定義を一個一個作っていき、最後にそれらをつなぎ合わせ、うまくよい動作ができた時はかなりの達成感を得た。
また、時間が足りなかったため、関数を定義するところまでしかいけなかったので、とても残念である。もう少し時間に余裕を持ちたい。
しかし、まだ自分として、理解できていない部分、基本が身に付いていないところがあり、かなり時間を要した。また、パートナーとの連携もうまくいかなくかなり迷惑をかけてしまった。申し訳ない。
一番の反省は、プログラミングを甘く見ていたことである。すぐできると見積もっていたが、実際かなり時間がかかり大変だった。次回の課題では、充分な時間をとり取り組むようにしたい。
次の課題は4人組のものなので今回の反省を踏まえつつ、パートナーとの連携をしっかりとしていきたい。