2025年9月30日

026-1.SPIKEプライム Python入門(SPIKE App3)-第4回「比例制御を使ったライントレースロボット」

この記事では「レゴ エデュケーションSPIKEプライム(以下、SPIKE)」と専用アプリ(SPIKEアプリ)を使った、Pythonのプログラミング方法について紹介します。原稿執筆時点のSPIKEアプリの最新バージョンは3.5.1です。(文/松原拓也)

◆ ライントレースの動作原理

ライントレースロボットを作ります。必要なパーツはモーター2個とカラーセンサーとラージハブです。モーターはポートEとポートFに接続します。カラーセンサーはポートAに接続します。カラーセンサーは名前に「カラー」とありますが、今回は反射光モードで使いますので、色は読み取りません。
ラインが描かれたコースも必要です。ここではアフレルが販売しているオーバルコースを使うことにします。ラインの太さは2cmです。

ライントレースの動作原理を図にしてみました。
カラーセンサーを2個使えば、ラインの中心を走らせることができますが、ここではポートを節約して、カラーセンサー1個で済ませます。 カラーセンサー1個の場合、白色と黒色の境界を走ります
カラーセンサーに対して床面の黒色が右側にあるか左側にあるかで処理が変わってきますが、ここでは右側にします。 反射光が少ない場合はラインに近すぎるので、左へ曲がります。逆に反射光が多い場合はラインに遠すぎるので、右へ曲がります。この処理を繰り返します。

反射光の量に対してロボットの進行方向をリニアに反映させます。これを比例制御(P制御)と呼びます。

シンプルなライントレースのプログラムを作ってみました(linetrace1.llsp3)。 変数「p_gain」が比例ゲインです。この値が少なすぎるとコースアウトしてしまいます。値が大きすぎると進行方向が安定せず、ふらついてしまいます。
前回はロボットの移動に「move_for_degree」関数使っていましたが、今回は「move_tank」関数を使っています。

ロボットをラインの上に置きます。この時、カラーセンサーが床面の黒色と白色の中間の位置にあるようにします。
プログラムを実行すると、ラインをトレースしながら走ります。ロボットは走りっぱなしです。 モーターの角速度を180度/秒と設定したので、ロボットの移動速度は約8.8cm/秒となる計算です


◆ プログラムを改良する

先ほどのプログラムを改良します。コースを一周したら止まるプログラムです(linetrace2.llsp3)。 目標となる距離は変数「length_end」に格納します。
現在の走行距離は変数「length_now」に格納します。単位はmm(ミリメートル)です。 左右のモーターの相対位置を平均して、その値から距離を算出しています。

「ライントレースの処理」と「走行距離を算出する処理」を分離したプログラムです(linetrace3.llsp3)。非同期処理を使って並列的に動かします。
分離することで処理の内容を確認しやすくします。ウエイト時間を調節すると、処理の負担を偏らせることができます。たとえば、ライントレースに処理を専念させたい場合には距離測定側のウエイト時間を長くします。

モーターペアを使わずに自前でPWM制御を行った場合のプログラムです(linetrace4.llsp3)。モーターペアを使うと、自動的にモーターの回転速度に合わせてパワーが制御されてしまいます。この制御を無効化して、純粋な比例制御を行います。
プログラムを実行すると、ラインをトレースします。速度制御を無くすことで、ラインの変化に素早く反応できるようになったはずなのですが、特に変化は感じられません。

プログラムを実行中の様子

当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。