ロボット制御 – PID制御について

私たちはETロボコンの参加を目指してレゴマインドストームEV3を使ってライントレースを行っています。今回はそこで勉強したPID制御の方法についてざっくりと説明してみます。

■ライントレースとオンオフ制御

まずPID制御の説明の前に、前提となるライントレースとオンオフ制御について説明します。ライントレースは名前の通り線をなぞることですが、今回は白い面の上に引かれた黒い線に沿ってロボットを自律走行させます。線を読み取るためには光センサを使います。光センサは地面に向かって光を当て、その反射光の強さを測定し数値で返します。白色は光を強く反射するため大きい値になり、黒色は反射が弱いため小さい値になります。

この光センサで測定した値を使ってロボットの左右のモーターを動かす強さを決めます。そのための制御方法として使用するのがオンオフ制御です。オンオフ制御では、光センサの値を見て「黒なら右に曲がりながら前進」「白なら左に曲がりながら前進」ということを繰り返します。例えば、光センサで真っ白な部分を読み取った値が「100」、真っ黒な部分の値が「0」だとすると、走行中に読み取った値が中間値の50以上なら白い面の上にいるので左に曲がる、50より小さければ黒い線の上にいるので右に曲がる、という感じです。

ライントレースとオンオフ制御

線にそって進むというだけならこれだけで達成できるのですが、常に左右に曲がるジグザグした無駄な動きになってしまいます。まっすぐな線の上はまっすぐに進むなど、よりスムーズな動きを実現するために、PID制御という制御方法を使います。

■PID制御について

PID制御のPIDとは以下の単語の頭文字です。

  • P … Proportional(比例)
  • I  … Integral(積分)
  • D … Differential(微分)

つまりPID制御とは比例・積分・微分の3つの要素を組み合わせて行う制御方法です。比例・積分・微分は数学で出てくる単語ですが、わからない人は一度勉強すると理解しやすいと思います。私は微分積分がわからなかったのでyoutubeの解説動画などで勉強しました…ただ今回はあまり数式は使わず、それぞれの要素の役割についてまとめたいと思います。

■P制御について

オンオフ制御では光センサの値を白か黒か判定し、一定の強さで左右に曲がりながら進み続けていました。しかし常に一定の強さで左右に曲がっているとどうしても無駄な動きが発生してしまいます。そこで、P制御では光センサの値に目標値を設定し、走行中に測定した値と比べることで左右に曲がる強弱を制御します。ここで設定する目標値について、ライントレースでは白なら左、黒なら右に曲がるというような動きのため、まっすぐ進む場合は白と黒の境界の部分を通ることになります。

例えば、オンオフ制御の時の例と同じように光センサで白い面を測定すると「100」、黒が「0」であれば、中間が「50」。この中間の値が目標値です。真っ白な部分を読み取った場合 100 – 50 = 50 なので50の力で曲がる、白と黒の境界に近い部分の場合   60 – 50 = 10 なので10の力で曲がる、というように目標値から遠い程操作量が大きい操作量を設定するようになります。なおこの計算で求めた値を偏差といいます。

オンオフ制御とP制御

これでだいぶ無駄な動きが無くなったのですが、P制御には2つ欠点があります。1つ目は、境界値に近くなると操作量が弱くなりすぎて、目標値の一歩手前で安定してしまうこと。これをオフセットといいます。2つ目は、境界値から遠くなると操作量が強くなりすぎて、目標値を超えてしまうこと。これをオーバーシュートといいます。一定の操作量だったのを目標との差を見て調整するようにしたら今度は弱くなりすぎたり強くなりすぎるという問題が発生してしまいました。これを解決するためにI制御とD制御を使います。

■I制御について

I制御はP制御の問題点の1つ、オフセットを解決します。

オフセットが発生するのは主にカーブの時です。直線の場合なら境界線に近ければ少し曲がるだけで境界線の上に戻ることができるのですが、モーターの曲がる量よりカーブの曲がる量の方が多いと境界線には戻れずカーブの外側を走ってしまいます。そこでI制御ではP制御での足りない力を補うために偏差を累積し、積分して操作量に加えます。

P制御とPI制御

■D制御について

D制御はP制御の問題点の1つ、オーバーシュートを解決します。

オーバーシュートが発生するのは急にカーブが発生した場合です。P制御ではその時読み取った値しか見ていないので急なカーブの始まりでも、その時目標値に近い値であれば緩やかに曲がり、後に発生する急カーブで大きく曲がる必要が出てきます。それを防ぐために、D制御ではカーブの始まりを検知し、あらかじめ操作量を多くしておきます。カーブの始まりを検知するには「今回の偏差 – 前回の偏差」を求めます。今回と前回に差が発生するということはこれからカーブが始まるということなので、操作量を大きくしてカーブに対応できるようにします。


P制御とPD制御

■まとめ

  • P制御で、現在の位置を見て操作量を調整する。
  • I制御で、それまでの偏差を累積して足りない操作量を補う。
  • D制御で、その後の変化を予測し、予め操作量を足しておく。

がPID制御という方法です。数式がない方が概念としては理解しやすいのでは、と思います。実際にはこれに数式をあてはめたり、操作量を求めるのに必要な定数を設定したりして微調整を行い試行します。その辺りの実装については次の機会にお伝えできれば、と思います。