2022年5月12日

SPIKE PID制御でライントレース

ロボコンでは滑らかなライントレースを行うことにより、スピードや安定性を向上させることができます。ここではPID制御を使ったライントレースの方法を紹介し、P制御・PID制御を使わない場合と使った場合の動作の比較を行います。

はじめに使用するロボットを用意します。(ここではSPIKEプライム ラージハブを地面と水平になるように組み立ててください。)

ロボット
ロボット
ロボット
ロボット

車体に使用しているハードウェア

  • SPIKEプライム ラージハブ
  • Mモーター×2(E,Aポート)
  • Lモーター(Cポート)
  • カラーセンサー(Fポート)
  • フォースセンサー(Bポート)

本記事内のプログラムの動作は以下のURLより動画で確認することができます。

https://youtu.be/xAdueA7ieiw

◆まずはP制御を行わずに時計回りにライントレースする簡易なプログラムをSPIKEアプリでプログラミングします。

◇プログラム1

プログラム1

簡単なライントレースを行うプログラムを作る場合には、カラーセンサーで路面の明るさをみて、「暗い場合」と「明るい場合」で動きを変えてライントレースを行うのが一般的です。この動作はオンオフ制御と呼ばれています。 ここでは、基本的な動きが分かりやすいように左右のステアリング値を大きく設定しています。このようなシンプルなプログラムでもライントレースは可能ですが、スピードや安定性に欠けます。

ライントレース

◆次にP制御を用いたライントレースをするプログラムをSPIKEアプリでプログラミングします。

◇P制御について

P制御はプログラム1で作成したオンオフ制御を行うプログラムで生じてしまう無駄な動き(ジグザグな動き)を解消するために、比例(Proportional)制御に取り入れ、カラーセンサーの値を用いて左右に曲がる強度を制御します。今回は、カラーセンサーによって黒を検知した時は左に、白を検知したときは右に、中間の値の時はまっすぐ進むように制御します。

◇プログラム2

プログラム2

◇プログラム2について

プログラム1と変わったところは「ずっと」の中の処理です。今回使用するコースの白い部分の反射率は69%、黒い部分の反射率は15%で、69-15=54となり、中間(真っ直ぐ進ませたい値)は54%の反射率になります。

この関係を利用してカラーセンサーの値が54%のときはまっすぐ、15%のときは左に、69%のときは右に進む式を考えます。そうすると、以下のような式で表すことができます。

「反射率」-54=ステアリング値

しかし、このままだと反射率に対してステアリング値が小さく、ロボットが曲がりきりません。そこで、係数を追加することでカラーセンサーの値に対するステアリング値を微調整します。

(「反射率」-54)x(係数)=ステアリング値

係数の値は実際にロボットを動かしてみて調整してみましょう。曲がりすぎるときは係数を減らし、曲がらない時は係数を増やすといいでしょう。

◆次にPID制御を用いたライントレースをするプログラムをSPIKEアプリでプログラミングします。

◇PID制御について

PID制御はプログラム2で用いたP制御に積分(Integral)と微分(Differential)を組み合わせたものです。PID制御では、P制御の問題点であった「曲がりが強すぎたり弱すぎる点」を解決できます。

以下の図にI制御のイメージを示します。
I制御では、目標とのズレの和を積分で表し、ラインとのズレが大きいほど大きく曲がるように制御します。 Iの特性として、反応が遅く働くまで時間がかかる・不安定になる・目標を行きすぎる・目標に届かないのをなくせる、などがあります。

I制御のイメージ I制御のイメージ

また、以下の図にD制御のイメージを示します。
D制御では、「ひとつ前のズレ」とズレの差を出し、差が大きいほど大きく曲がるように制御します。つまり、ズレの差=変化量となります。

D制御のイメージ

プログラム3について

プログラム2に変更を加え、PIDそれぞれの値を変数に格納して整理しています。また、変数「sum」を用意して最終的なステアリング値がSPIKEアプリで確認できるようになっています。 「ずっと」の中では、まず、ひとつ前のズレを「ズレ1変数」に格納します。次に、光センサーの値からズレ0を取得し、「ズレの和」を計算します。続いて、PIDそれぞれの値を計算し、計算したステアリング値をモーターに渡します。

PIDのゲイン調整

以下に、PID制御に必要なゲイン(係数)の調整手順について述べます。なお、ここで紹介する方法は今回のコース・環境・センサーの反射光によって調整した結果の中で、最も安定して走行できたものを載せています。環境によって微調整が必要になります。

  1. I・Dゲインを0にしてPゲインの調整
    直線を走行させた時、オンオフ制御の時のように走行体が左右に揺れない値を探します。この時、今回のコースのように、カーブがキツイ場合にうまく曲がり切らなくても、後から調整するIゲインによってカーブの曲がり具合を調整することができます。
  2. Dゲインを0にしてIゲインの調整
    手順1で調整したPゲインを使い、カーブを曲がり切るようにIゲインの調整を行います。
  3. 手順1・2で調整したPゲイン・Iゲインを使い、Dゲインの調整を行います。 Dゲインの値が大きいと曲がりすぎてしまします。曲がりすぎてしまう場合はDゲインの値を小さくします。
  4. ある程度安定して走るようになってきたら、調整したPIDゲイン値を元として、調整したPゲイン・Dゲインの値を少しずつ変化させ、さらに安定して走る値を見つけるといいです。

スピードを20%から50%へ上げてPID値を調整した結果

スピードを20%から50%へ上げてPID値を調整した結果

※2022/2/24現在最新バージョン(2.0.4)のSPIKEアプリに基づく情報です。
※これらの仕様はアプリのアップデートによって変更される場合があります。

(2022/2/24 現在)