金宏和實です。Python入門の第4回です。今回はP制御のライントレースです。PはProportional(比例)の頭文字です。
第3回の基本のライントレースでは次のようなif文でステアリングの値を変えました。
if (color_sensor.reflection(port.B) < 50): # 黒い線の上
# ステアリング30で右に。
motor_pair.move(motor_pair.PAIR_1, 30, velocity = 300)
else: # 白いところの上
# ステアリング-30で右に。
motor_pair.move(motor_pair.PAIR_1, -30, velocity = 300)
光センサーの返す値と50を比較して大きければ、黒い線側を向くようにステアリングを30にして、小さければ白いところを向くようにステアリングを-30にしました。
P制御、比例制御というと難しそうに聞こえるかもしれませんが、暗いか明るいかを判断するしきい値である50と光センサーの返す値を引き算して、適当な係数を掛けてやれば、ステアリングの値として使えるんじゃないのという発想です。ですから、プログラムはよりシンプルになります。
from hub import port
import motor_pair, color_sensor, runloop
motor_pair.pair(motor_pair.PAIR_1, port.C, port.D)
async def line_follow_forever():
while (True):
err = 50 - color_sensor.reflection(port.B)
corr = int(err * 0.5)
motor_pair.move(motor_pair.PAIR_1, corr, velocity = 300)
async def main():
await line_follow_forever()
runloop.run(main())
変数errに50と光センサーが返す値の差を代入します。黒い線の上にいれば、errの値は正の値になり、白いところにいれば負の値になります。それに係数0.5を掛けた値をステアリングの値(corr)にします。係数0.5に意味はありません。ちょうど良い感じにライントレースしてくれるように値を調整すれば良いだけです。int(err * 0.5)のint()は計算結果を整数値に変換する関数です。
if文を使うより、簡単なコードになるところがプログラミングの「おもしろみ」です。