t-hom’s diary

主にVBAネタを扱っているブログです。

LEGO Mindstorm EV3 ライントレースボット P制御(比例制御)をやってみた

今回はライントレースボットのP制御をやってみた。
最終的にやりたいPID制御のうち、Pの部分である。

このPはPropotional(比例しているという意味)の略である。

ライントレースボットの場合はカラーセンサーで反射値を読み取るので、その値が目標値から遠いほど操作量を増やすという処理を行う。

今回は操作量を左右旋回の際に片側のタイヤの回転数をどれくらい上げるかという係数に設定した。-1.0~1.0の範囲に収まるようにしたのでプラスの場合は左タイヤを、マイナスの場合は右タイヤを加速させ、実際の加速量は通常スピードの5倍に操作量の絶対値を掛けあわせたものとした。マイナス値をうまく扱えないか思案してみたが眠いせいか妙案が浮かばず断念。

前回の記事で紹介したライントレースボットはオンオフ制御といって目標値を上回るか下回るかしか見てなかったので直線であってとも首を振りながらの走行だったが、P制御の場合は割とまっすぐ進める。

実際に動かしてみたのがこちら。
youtube.com

おそっ!

でもP制御だけだと速度を上げた時にオーバーシュートによってカーブで簡単に脱線してしまうのでこれくらいが限界だった。
直線で加速するなど工夫すればよくなりそうだけど、オーバーシュートするというデメリットがあった方がこのあとのPI制御・PD制御のありがたみが分かりそうなので、とりあえずはこのまま次の学習に進もうと思う。

コード

import time
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
                                 InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile

# This program requires LEGO EV3 MicroPython v2.0 or higher.
# Click "Open user guide" on the EV3 extension tab for more information.

# Create your objects here.
ev3 = EV3Brick()


# Write your program here.
ev3.speaker.beep()

a_motor = Motor(Port.A)
d_motor = Motor(Port.D)
cs = ColorSensor(Port.S1)
a_motor.reset_angle(0)
d_motor.reset_angle(0)

KP = 0.02
SPEED = 36*2

a_motor.run(SPEED)
d_motor.run(SPEED)

while True:
    u = (50.0 - cs.reflection()) * KP
    print(u)
    if u > 0:
        a_motor.run(SPEED*5*abs(u))
        d_motor.run(SPEED)
    if u <= 0:
        a_motor.run(SPEED)
        d_motor.run(SPEED*5*abs(u))

以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。