目次

課題

今回の課題は黒い線の上をトレースする「ライントレーサー」と呼ばれるロボットを作り、以下のコースを辿らせる。

A地点から出発 → Lでピンポン玉をキャッチ → Mでボールをゴールにシュート! → ロボ本体がゴールイン!

map.png

黒線をトレースする方法はいろいろあるが、センサー一つでとなるとかなり限られてくると思う。
そこで今回自分がとった方法は「黒い部分の量で判別する」方法である。
だが、結論から言うとこの方法は(少なくとも自分の力量では)上手くいかない

この方法を試そうとしている人がいるのなら、自分の反省から改善点を見つけ出し、素晴らしい解決策を考えてほしい。

ロボットの機構・仕組み

zentai2.png

これがロボットの全体像。

前からコンピュータ部分を縦にして使ってみたかったので、このようになった。
しかし、カッコ良くはなったが、重心の調整が難しくなったのでもうやらない。

 Д蹈椒奪箸魄榮阿気擦襪燭瓩離癲璽拭次フィールドを縦横無尽に駆け回る!
◆Ч線をスキャンするためのセンサー。ライントレースの要。
:ボールを捕まえるためのアーム。凄まじいパワーでボールを捕まえる!

 О榮哀癲璽拭

idou.jpg

何の面白みのない説明書通りの移動モーター。
左右が独立していて、その場で回転、曲がったりもできる。
バランスをとるために中間部分にベアリングがついてる。

◆Дラーセンサー

sensa.png

上でかいたように今回使う方法は黒い部分の量による判定である。
なので、カラーセンサーを少し高めの位置に付け、広い範囲をスキャンさせるようにしてある。

sensapos.jpg

センサーは本体を回して黒線を見つけるために、二つのモーターより少し前に付けた。

:アーム

arm.jpg

ミディアムモーターで床スレスレに付けた棒を動かす。
反時計回りでボールを掴み、素早く時計回りで弾く。

プログラム

インポートと接続のなにか

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

mR = LargeMotor('outA')~
mL = LargeMotor('outC')~
cs = ColorSensor('in2')~
mA = MediumMotor('outD')~

特になし

よく使う動作の定義

def migi(a):
        sleep(1)
        mR.run_timed(speed_sp=100, time_sp=a, stop_action='brake')

def hidari(b):
        sleep(1)
        mL.run_timed(speed_sp=100, time_sp=b, stop_action='brake')

右、左へ曲がる

def bihidari(c):
        mR.run_timed(time_sp=c, speed_sp=100, stop_action='brake')
        mL.run_timed(time_sp=c, speed_sp=-100, stop_action='brake')

def bimigi(d):
        mR.run_timed(time_sp=d, speed_sp=-100, stop_action='brake')
        mL.run_timed(time_sp=d, speed_sp=100, stop_action='brake')

右、左へ本体が回転

def koutai(e):
        mR.run_timed(speed_sp=-100, time_sp=e, stop_action='brake')
        mL.run_timed(speed_sp=-100, time_sp=e, stop_action='brake')

def zensin(f):
        mR.run_timed(speed_sp=100, time_sp=f, stop_action='brake')
        mL.run_timed(speed_sp=100, time_sp=f, stop_action='brake')
        sleep(1)

時間を指定して前進、後退。

def zensin_forever(g):
        mR.run_forever(speed_sp=g, stop_action='brake')
        mL.run_forever(speed_sp=g, stop_action='brake')

速さを指定して前進。

ライントレースのコアとなるプログラム

n = 1
q = 1

def Trace_Method():
        while True:
                if 4 <= cs.value() <= 5:
                        zensin_forever(100)
                if 4 <= cs.value() <= 5:
                        zensin_forever(100)
                        sleep(0.01)
                elif cs.value() >= 6:
                        q = 0
                        while cs.value() >= 6:
                                i = 0
                                while cs.value() >= 6 and i <= 3*q:
                                        bimigi(150)
                                        sleep(0.1)
                                        i += 1
                                i = 0
                                while cs.value() >=6 and i <= 6*q+1:
                                        bihidari(150)
                                        sleep(0.1)
                                        i += 1
                                i = 0
                                while cs.value() >=6 and i <= 3*q:
                                        bimigi(150)
                                        sleep(0.1)
                                        i += 1
                                q += 1

                elif cs.value() <= 3:
                        mL.stop()
                        mR.stop()
                        break

本体を動かし、黒線を探すためのメソッド。 ややこしいのでざっくりと説明すると、扇形に動き、黒線を見つけられなければ、より大きな扇形で動く。これを繰り返す。
一見簡単な動きに思えるがこれを実現するのは大変だった。

各交差点での動作

map_kai1.png


def main():
        Trace_Method()
        print(1)
        sleep(1)
        zensin(2500)


        Trace_Method()
        print(2)
        sleep(1)
        zensin(1000)
        sleep(0.5)
        bimigi(500)
        sleep(0.5)

        Trace_Method()
        print(3)
        sleep(1)
        bimigi(1000)
        sleep(1.3)
        zensin(1500)

        Trace_Method()
        print(4)
        sleep(1)
        bimigi(1000)
        sleep(1)
        zensin(500)

        Trace_Method()
        print(5)
        Trace_Method()
        print(5)
        sleep(1)
        bimigi(1000)
        sleep(1)
        zensin(500)

        Trace_Method()
        print(6)
        sleep(1)
        bihidari(500)
        sleep(1)
        zensin(1000)

        Trace_Method()
        print(7)
        sleep(1)
        bihidari(1000)
        sleep(0.5)
        zensin(1000)

        Trace_Method()
        print(8)
        sleep(1)
        bimigi(500)
        sleep(0.5)
        zensin(1000)

        Trace_Method()
        print(9)
        sleep(1)
        bihidari(500)
        sleep(1)
        zensin(500)
        bihidari(750)
        sleep(1)
        zensin(2000)

        Trace_Method()
        sleep(1)
        bihidari(1500)
        sleep(1.7)
        zensin(2300)
        sleep(2.3)
        sleep(1)
        sleep(2.3)
        sleep(1)
        mA.reset()
        mA.run_to_rel_pos(position_sp=-30,speed_sp=100,stop_action='brake')
        sleep(1)
        bimigi(3000)
        sleep(2.7)
        zensin(2500)
        sleep(1)

問題及びその反省

判定を黒の多さで判別するということは、自作したコースの線の太さや濃さが全て均等じゃなければいけないということ。
カーブはどうしてもマジックで書かなければならないので、どうしても人間の力ではすべて均等というのは難しい。
ので、判定ミスが多かった。
結論、この方法は良くない。


添付ファイル: filemap_kai1.png 8件 [詳細] filemap_kai.png 5件 [詳細] filesensapos.jpg 10件 [詳細] filearm.jpg 11件 [詳細] fileidou.jpg 10件 [詳細] filesensa.png 16件 [詳細] filezentai2.png 12件 [詳細] filemap.png 16件 [詳細] file2019a-mission2.png 10件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-10 (土) 17:26:06