2017a/Member

目次

課題内容

コース

  • 課題内容は次の経路に沿ってライントレースをするロボットを製作することである。
    • E直進
    • F(SOUND_UP)
    • Q一時停止(SOUND_DOWN)&左折
    • R直進(SOUND_UP)
    • S左折(SOUND_UP)
    • G(SOUND_UP)
    • H(SOUND_UP)
    • T一時停止(SOUND_DOWN)&直進
    • T一時停止(SOUND_DOWN)&直進
    • R一時停止(SOUND_DOWN)&左折
    • S直進(SOUND_UP)
    • P左折(SOUND_UP)
    • E一時停止(SOUND_DOWN)&左折
    • A停止(SOUND_DOWN)

ロボットの説明

実際に動いているところ

https://www.youtube.com/watch?v=xUq5ioWZRWA

本体について

EV3上部

今回のロボット製作で注意したことの一つとして、車輪の幅が挙げられる。 というのも、現在の車輪幅に至る前に、現在より広い車輪幅で製作していたところ小回りが 効きにくく、安定性に欠けることが判明したからである。 そこで、車輪幅を狭くし、小回りが効くようにすることで、急カーブを安定して回れるように改善した。

カラーセンサーの位置

EV3裏面

当初、色センサーの位置をタイヤの近くに設置していたが、直角カーブを検知できず、現在の位置に落ち着いた。タイヤと色センサーは適度に離した方が、タイヤの動きが小さくても、色センサーの動きが大きくなって安定することがわかった。

プログラムの説明

インスタンスの作成

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import ev3dev.ev3 as ev3
import time
mr = ev3.LargeMotor("outA") # MotorRight
ml = ev3.LargeMotor("outB") # MotorLeft 
ts = ev3.TouchSensor("in1") #TouchSensor
cs= ev3.ColorSensor("in2")  #ColorSensor 

補足として、MotorRightはロボット右側のモーターであり、これだけを動作させると左折する。MotorLeftはこの逆である。

今回設定した関数

def LineTrace(T)
 while 1:
  if ts.value() == 1:
   break
  if cs.value() >= 38: #白のとき
   ml.run_forever(duty_cycle_sp=60,speed_sp=60)
   mr.run_forever(duty_cycle_sp=60,speed_sp=-20)
   t_1 = time.time()
  elif cs.value() < 38 and cs.value() >= 23 : #白灰のとき
   mr.stop()
   ml.run_forever(duty_cycle_sp=60,speed_sp=60)
   t_1 = time.time()
  elif cs.value() < 23 and cs.value() >= 17:  #灰色のとき
   mr.run_forever(duty_cycle_sp=60,speed_sp=80)
   ml.run_forever(duty_cycle_sp=60,speed_sp=80)
   t_1 = time.time()
  elif cs.value() < 17 and cs.value() >= 10: #黒灰のとき
   ml.stop()
   mr.run_forever(duty_cycle_sp=60,speed_sp=60)
   t_1 = time.time()
  elif cs.value() < 10:  #黒のとき
   mr.run_forever(duty_cycle_sp=60,speed_sp=60)
   ml.run_forever(duty_cycle_sp=60,speed_sp=-20)
   if time.time() - t_1 >= T:
    break

この関数は、ロボットがライントレースを行うための関数である。しかし、実際にたどっているのはラインの左側である。授業で紹介されたように5段階で制御している。というのも、当初、白色、灰色、黒色の3段階で試してみたがうまくいかなかったからである。また、この関数にはライントレースだけではなく、黒色の上に任意の実数T(>0)秒間以上センサーがあった場合、break文を実行してwhileループを抜ける機能が実装されている。

def WhiteTrace(A)
 while 1:
  if ts.value() == 1:
   break
  if cs.value() >= 38: #白のとき
   ml.run_forever(duty_cycle_sp=60,speed_sp=60)
   mr.run_forever(duty_cycle_sp=60,speed_sp=-20)
   if time.time() - t_1 >= T:
    break
  elif cs.value() < 38 and cs.value() >= 23 : #白灰のとき
   mr.stop()
   ml.run_forever(duty_cycle_sp=60,speed_sp=60)
   t_1 = time.time()
  elif cs.value() < 23 and cs.value() >= 17:  #灰色のとき
   mr.run_forever(duty_cycle_sp=60,speed_sp=80)
   ml.run_forever(duty_cycle_sp=60,speed_sp=80)
   t_1 = time.time()
  elif cs.value() < 17 and cs.value() >= 10: #黒灰のとき
   ml.stop()
   mr.run_forever(duty_cycle_sp=60,speed_sp=60)
   t_1 = time.time()
  elif cs.value() < 10:  #黒のとき
   mr.run_forever(duty_cycle_sp=60,speed_sp=60)
   ml.run_forever(duty_cycle_sp=60,speed_sp=-20)
   t_1 = time.time()

この関数はライントレースを行い、一個目の関数とほぼ同じである。異なっている点は、黒色の上にある時間を検知してbreak文を実行するのではなく、白色の上に任意の時間A(>0)以上あった時break文を実行することである。

この関数を設定した理由としては、直角カーブ(主にH,G)で色センサーがラインをはみ出し、白色しか検知できなかったからである。

プログラム本体

#F
LineTrace(0.3)
ev3.Sound.speak("F")
ml.stop()
 while cs.value() <= 30:
  mr.run_forever(duty_cycle_sp=60,speed_sp=30)
  ml.run_forever(duty_cycle_sp=60,speed_sp=-10)
#Q
LineTrace(0.4)
ev3.Sound.speak("Q")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 30:
 mr.run_forever(duty_cycle_sp=60,speed_sp=30)
 ml.run_forever(duty_cycle_sp=60,speed_sp=-10)
#R
LineTrace(0.3)
ev3.Sound.speak("R")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 30: 
 mr.run_forever(duty_cycle_sp=60,speed_sp=30)
#T1
LineTrace(0.5)
ev3.Sound.speak("T1")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 35:
 mr.run_forever(duty_cycle_sp=60,speed_sp=10)
 ml.run_forever(duty_cycle_sp=60,speed_sp=30)
#T2
LineTrace(0.4)
ev3.Sound.speak("T2")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 20:
 mr.run_forever(duty_cycle_sp=60,speed_sp=30)
 ml.run_forever(duty_cycle_sp=60,speed_sp=10)
#H
WhiteTrace(0.2)
ev3.Sound.speak("H")
#急カーブ
LineTrace(1)
while cs.value() <= 30:
 mr.run_forever(duty_cycle_sp=60,speed_sp=30)
 ml.run_forever(duty_cycle_sp=60,speed_sp=-60)
#G
WhiteTrace(0.8)
mr.stop()
while cs.value() >= 25:
 ml.run_forever(duty_cycle_sp=60,speed_sp=30)
WhiteTrace(0.8)
ev3.Sound.speak("G")
#S
LineTrace(0.6)
ev3.Sound.speak("S")
ml.stop()
while cs.value() <=25:
 mr.run_forever(duty_cycle_sp=60,speed_sp=30)
#P
LineTrace(0.3)
ev3.Sound.speak("P")
ml.stop()
while cs.value() <= 35:
 mr.run_forever(duty_cycle_sp=60,speed_sp=30)
#E
LineTrace(0.5)
ev3.Sound.speak("E")
mr.stop()
ml.stop()
time.sleep(1)
while cs.value() <= 35:
 mr.run_forever(duty_cycle_sp=60,speed_sp=30)
#A
LineTrace(0.5)
while cs.value() <30:
 mr.run_forever(duty_cycle_sp=60,speed_sp=30)
 ml.run_forever(duty_cycle_sp=60,speed_sp=30)
ev3.Sound.speak("A")
mr.stop()
ml.stop()
  • コードのところどころに記述されているLineTrace関数やWhiteTrace関数以外のモーターに関わる命令はロボットの位置調整のために用いられている。

例えば#Qのような一時停止する場合、黒色の上で停止するので次のライントレースを実行する前に灰色あたりにずらさないと、うまく次のライントレースが実行されない。

また、他の例については、#急カーブが挙げられる。今回製作したロボットは、Hのすぐ後に控える急カーブの内側をトレースする。しかしながら、LineTrace関数ではうまくいかなかった。改善策として灰色以下のとき急旋回を行うコードを継ぎ足した。

  • 実際には、交差点や直角カーブの違いを判断しておらず、LineTrace→F地点での作業→LineTrace→Q地点での作業....といった流れで処理している。
  • 補足として、AやPなど名前のある地点に到達した場合、その場所の名前をロボットが音声として出力する。

今回の課題を振り返って

今回の課題を振り返ってみて一番大変だったのは、締め切りが迫ってきている中、T地点付近のトレースがうまくいかず、見直した結果、車輪の幅が広すぎるという結論に至り、ロボットを改造したことである。改造自体はすぐに終わったが、車輪の幅が変わったせいでプログラムに大きな影響が出ていた。というのも、ライントレースの値を見直したり、黒色検知の時間を見直す必要があったあったからである。完成一歩手前での出来事だったのですごく辛かった。一度終えた作業をもう一度、一から行うというののはなかなかのものであった。それもあり、完成した時はとてもうれしかった。 次は、こんなことにならないよう、もっと見通しを立てて製作していかなければならないと思った。


添付ファイル: filesecuredownload.jpg 72件 [詳細] file俯瞰1.JPG 57件 [詳細] file俯瞰.JPG 42件 [詳細] file裏面.JPG 26件 [詳細] file前.JPG 38件 [詳細] file斜め.JPG 20件 [詳細] file後ろ.JPG 24件 [詳細] file横から.JPG 41件 [詳細] fileマップ.png 67件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-07 (金) 16:30:03