2025年10月31日

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

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

◆ コースを自作する

今回は比例微分制御(PD制御)を使ったライントレースロボットを作ります。
ロボットは前回と同じですが、持ちやすいように「取っ手」を追加しています。

比例微分制御は比例制御(P制御)と微分制御(D制御)の2つを組み合わせたものです。微分制御が得意としているのは、急激に曲がるようなラインのトレースです。そこで、普通のコースを使わず、オリジナルのコースを作ります
フリーソフトの「OpenOffice Draw」を使ってコースを描きます。ラインの太さは2cm。用紙のサイズはA3にしました。
コースを描いたら「印刷」をメニュー選択して、pdfファイルで出力します。筆者はA3サイズのプリンターを持っていないので、「ネットプリント」で印刷しました。pdfファイルをネットプリントのWebサイト(https://www.printing.ne.jp/)で登録したら、コンビニ(セブンイレブン)でコピー機にプリント番号を入力すると印刷することができます。印刷代は20円でした。

微分制御は効果がわかりにくいです。そこで「見える化」するため、前回に作ったプログラムを改造して、「正しくラインをトレースできているかのスコア表示」を追加しました(linetrace5.llsp3)。

プログラムを実行すると、コンソールに結果が表示されます。 「score」はスコアの平均値です。ラインの中心を走ることができたらスコアは100点です。ラインの中心からズレたら、その絶対値の4倍を減点します。4倍という値には根拠はなくて、点数にメリハリを付けるために大きくしました。
「score_count」はスコアの測定回数です。このプログラムでは1ループごとにスコアを測定しているので、測定回数とループ回数は同じです。 ループ回数は約7000回です。 1ループ=約1ミリ秒なので、コース1周の走行タイムは約7秒(7000÷1000)です。計算時間を考慮していないので少し誤差が生じます。
このプログラムでは1周=850mmと設定しているので、7000÷850=約8.23です。ロボットが1mm進むたびにラインを8回以上読み取っているという計算になります。


◆ 微分制御

比例制御では「反射光の差」に比例ゲインを掛けることでパワーを算出しています。反射光の差とは、中心のラインからセンサーがズレている値のことです。中心を走っている場合、反射光の差は「0」です。
一方、微分制御では反射光の差の「一定時間あたりの変化量」によってパワーを算出します。比例制御には無かった「時間」の要素があるのがポイントです。これによって、急激なラインの変化でもトレースすることができます。変化量の算出方法は様々ですが、ここでは「1ループ前の反射光の差」と「現在の反射光の差」の差から求めることにします。1ループの周期は約1ミリ秒です。

先ほど作ったプログラムに微分制御を追加してみました(linetrace6.llsp3)。
プログラムが長くなってしまいましたので、部分的に紹介します。 赤いワクで囲んだ部分が微分制御です。 変数「d_gain」には微分ゲインを格納します。

微分ゲインの適切な値がわかりません。そこで、少しずつ微分ゲインを増やしてスコアを測定してみました。結果は次の通りです。
《微分ゲインが0の場合》
score:36
score_count:7018

《微分ゲインが500の場合》
score:40
score_count:7006

《微分ゲインが1000の場合》
score:41
score_count:7005

《微分ゲインが2000の場合》
score:41
score_count:6970

変化が微妙です。思ったよりもスコアが上がってくれません。 ほとんど比例制御でトレースできてしまうので、微分制御の活躍が少ないと考えられます。比例制御が主役で、微分制御は補助的に存在しています。 微分ゲインを増やすとscore_count(測定回数=走行タイム)がわずかながら少なくなっています。このプログラムではモーターの基本的な速度を固定していて、片方のモーターを速めたら、そのぶんもう片方が遅くなるという仕組みなので、走行タイムは変化しないはずです。なぜ速くゴールできるようになるのかが不明です。ライントレースの性能が上がって、無駄な走りが減った結果、タイムが縮んでいるのでしょうか?

念のため、本当に微分制御が機能しているのかを確認するためのプログラムを作ってみました(linetrace7.llsp3)。 1ループごとに「反射光の差の変化量」を比較して、最大値を求めます。コースを1周したら、最大値を表示します。
実行した結果、微分ゲインが0だった場合と比べて、微分ゲインを増やすと、反射光の差の変化量が減少しています。 ラインの急激な変化でもトレースできている=微分制御が機能していると判断することができます。ループの周期が短いせいもありますが、変化量の値が思ったよりも小さすぎます。1ループ前だけではなくて、3ループくらい累積すると良いのかもしれません。

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

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