目次

課題

課題内容

  • 今回の課題はミッション通り、下図の通り黒い線に沿って、350mlの空き缶を移動させるロボットを作ることである。
    2018a-mission2.png
  • ミッションとは下記のとおりである。(私は第一コースを選択した。)
    • Aをスタート
    • Bを直進
    • Cで一時停止の後、直進
    • Dで一時停止の後、Xの空き缶をキャッチしてD地点に戻る
    • DからEに向かい、Eを直進
    • Fを左折
    • Gで一時停止の後、左折
    • Hで一時停止の後、右折
    • Iで一時停止の後、右折
    • Lを直進
    • Kを直進
    • Jで一時停止の後、空き缶をYに置きてJに戻りBに向かう
    • Bで一時停止の後、左折
    • Aで停止
    • (一時停止の指定がある場所は、1秒間停止すること)

ロボットについて

ロボット全体

s_IMG_0381.jpg

センサーの位置

どの位置が一番よいか試行錯誤した結果、中央付近にセンサーがあったほうがミッションを達成しやすそうだったので中央に設置した。

s_IMG_0383.jpg

アーム

空き缶を置いた後、ロボットが空き缶に当たらないようにするため、最大限にアームを上げることにより、ほぼロボットと一体となるように作った。

s_IMG_0382.jpg

プログラムについて

valueの値を細かく設定することにより、急カーブでも曲がれるようにプログラムした。 下の画像でどの位置でどの程度のvalue値が出るのかを説明する。

robo.png

ロボットはは赤矢印のように進んでいく。青矢印のぶん進むとロボットが交差点と認識し止まる。

2.png

モジュールとインスタンス設定

#!/usr/bin/env python3
from ev3dev.ev3 import *
import ev3dev.ev3 as ev3
import time

arm = ev3.MediumMotor('outC') #アーム
mr = ev3.LargeMotor('outD')  #右のタイヤ
ml = ev3.LargeMotor('outA')  #左のタイヤ
cs = ev3.ColorSensor('in1')  #カラーセンサー

定義

  • モーターのリセット
    def mi():
        ml.reset()
        mr.reset()
        arm.reset()
  • ライントレース
    value値を細かく設定しているので急カーブでも(外側なら)これで曲がることができる。
    左からライントレースさせるプログラム
    def lf():
        mi()
        t0 = time.time()
        while time.time()-t0 < 0.38:
            if cs.value() > 70:
                mr.run_forever(speed_sp=-100)
                ml.run_forever(speed_sp=100)
                t0 = time.time()
            elif cs.value() > 60:
                mr.run_forever(speed_sp=-80)
                ml.run_forever(speed_sp=200)
                t0 = time.time()
            elif cs.value() > 50:
                mr.run_forever(speed_sp=300)
                ml.run_forever(speed_sp=300)
            elif cs.value() > 40:
                mr.run_forever(speed_sp=200)
                ml.run_forever(speed_sp=-80)
                t0 = time.time()
            else:
                mr.run_forever(speed_sp=100)
                ml.run_forever(speed_sp=-100)
    右からライントレースさせるプログラム
    def rf():
        mi()
        t0 = time.time()
        while time.time()-t0 < 0.38:
            if cs.value() > 70:
                mr.run_forever(speed_sp=100)
                ml.run_forever(speed_sp=-100)
                t0 = time.time()
            elif cs.value() > 60:
                mr.run_forever(speed_sp=200)
                ml.run_forever(speed_sp=-80)
                t0 = time.time()
            elif cs.value() > 50:
                mr.run_forever(speed_sp=300)
                ml.run_forever(speed_sp=300)
            elif cs.value() > 40:
                mr.run_forever(speed_sp=-80)
                ml.run_forever(speed_sp=200)
                t0 = time.time()
            else:
                mr.run_forever(speed_sp=-100)
                ml.run_forever(speed_sp=100)
  • 一秒間静止するプログラム
    def wait():
        mi()
        mr.run_forever(speed_sp=0)
        ml.run_forever(speed_sp=0)
        time.sleep(1)
  • 前進させるプログラム
    def gost(t):
        mi()
        mr.run_timed(time_sp=t, speed_sp=300, stop_action='brake')
        ml.run_timed(time_sp=t, speed_sp=300, stop_action='brake')
        sleep(1)
  • 位置を右にずらすプログラム
    def tr(t):
        mi()
        mr.run_timed(time_sp=t, speed_sp=-200, stop_action='brake')
        ml.run_timed(time_sp=t, speed_sp=200, stop_action='brake')
        sleep(1)
  • 位置を左にずらすプログラム
    def tr(t):
        mi()
        mr.run_timed(time_sp=t, speed_sp=200, stop_action='brake')
        ml.run_timed(time_sp=t, speed_sp=-200, stop_action='brake')
        sleep(1)
  • アームを下げる
    def af(t):
        mi()
        arm.run_timed(time_sp=t, speed_sp=-300, stop_action='brake')
        sleep(1)
  • アームを上げる
    def ab(t):
        mi()
        arm.run_timed(time_sp=t, speed_sp=300, stop_action='brake')
        sleep(1)

プログラムの全容

gost(700)      #Aから出発
lf()           #AからCまでライントレース
wait()     #Cで一秒停止
gost(200)      #tr()も含めて直進する命令
tr(200)
lf()           #Cからライントレース
wait()         #Dで一秒停止
tr(150)        #空き缶をつかむため少し戻る
am(550)        #空き缶をつかむ
lf()           #DからEを直進するための命令
gost(100)
tr(100)
lf()           #EからGまでこれで進む
wait()         #Gで一秒停止
rf()           #ここからHまで右からライントレース
wait()         #Hで一秒停止
rf()           #Iまで進む
wait()         #Iで一秒停止
rf()           #IからJまで直進するための命令
gost(100)
tl(100)
rf()
gost(100)
tl(100)
rf()
wait()         #Jで一秒停止
tl(1050)       #Yに空き缶を置くため旋回させる
ab(550)        #アームを上げる
tl(1050)       #その場で180°旋回させるとロボットが空き缶に当たってしまうので
gost(150)      #少し前進させた後 
tl(500)        #左からライントレースできる位置にする
lf()
wait()         #Bで一秒停止
lf()
tr(200)    #交差点と認識してlf()は終了するのでその後少し右に戻して
gost(700)      #前進させる

まとめ

点Eなどの円と直線の交わる場所ではご認識が多く、またアームの範囲が狭いので、うまく缶をつかんでくれないなどの欠点がある。さらに、GからHにかけての急カーブでは内側を回ることがほとんどできなかった。このため、成功確率は極めて低い状況であった。
次の課題では十分な時間をかけて成功させたい。


添付ファイル: file2.png 5件 [詳細] filerobo.png 6件 [詳細] files_IMG_0383.jpg 9件 [詳細] files_IMG_0382.jpg 7件 [詳細] files_IMG_0381.jpg 7件 [詳細] files_IMG_0380 (1).jpg 3件 [詳細] file2018a-mission2.png 6件 [詳細]

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