ロボトレース競技のマシンを作ってみる その10 フィードバック制御(P制御)について考える
こんにちは。そらです。
記事一覧のまとめ、ハードウェア、ファームウェアのデータはこちら。
ハードウェアに関しては改造をそれなりにしたので、データを確認後プッシュしたいと思います。
タイトルの通りP制御の実装について話をしていきたいと思います。有識者には怒られそうですが制御工学の内容にはほとんど触れずP制御の考え方について書きます。間違え等ありましたら指摘していただけると助かります。
制御工学の勉強ではなく、趣味でロボットを動かすときの実装のための勉強の一例として以下を読んでいただければいいなぁと思っています。手書きで線が斜めっていたりしますが多めに見ていただけると助かります。図を書きながらやるとわかりやすいのでおすすめです。
P制御を実装する(フィードバック制御の一種)
目標値と計測値
ロボトレやマイクロマウスでPID制御を行う場合の目標値と計測値について簡単にまとめます。
目標値(target):速度や角速度等、私たちプログラムを書く人が設定して与えるもの。
計測値(measurement):エンコーダやIMU等のセンサーから取得したデータのこと。
PID制御において、目標値から計測値を引いたものは偏差と呼ばれることが多く、偏差に対して出力を設定する。
P制御について
偏差を制御量とする考え方。図で書くと以下のようなイメージです。
この偏差をモーター等に出力として与えると考えます。例えば、目標値の速度が300mm/sec、計測値の速度が0mm/sだとしたとき、偏差は300になります。モーターの出力に300と与えた場合、目標値に追従するには大きすぎる出力、または小さすぎる出力になってしまう可能性が大きいです。そのため、比例ゲインKpを用いてモーターの出力を目標値に対してちょうどよい大きさにするということを行います。
比例ゲインを小さく設定をした場合を考えていきます。
目標値にむかってある一定の傾きで近づいた後は、出力が足りなくて目標値よりもちょっと下のところで追従を続けるという感じです。目標値と計測値の間にある偏差は定常偏差と呼ばれ、定常偏差の分だけ常に追従できていないことになります。これは、I制御(積分制御)を取り入れることで解消が可能になります。
続いて、比例ゲインを大きくしたときのことを考えていきます。
先程とは違い、目標値よりも計測値が大きくなるだけでなく目標値への傾きが大きくなりました。しかし、計測値が目標値よりも大きくなった後に目標値より大きくなったり小さくなったりと振動していることが読み取れます。これは、モーターの出力が大きすぎるがゆえに振動していることが考えられます。
用語になりますが、目標値を計測値が超えてしまうことをオーバーシュートと呼びます。
比例制御を式にすると以下のようになります。
P制御の場合は、式の通り比例で表されるためこのままだと定常偏差がでたり、オーバーシュートした後に振動したりと問題点があるということがわかりました。ただ。式を見る限りプログラムでの実装は簡単そうだということが読み取れます。
P制御の中ででてきた定常偏差や振動をなくすために積分や微分の考え方を使用します。この後、PID制御について簡単に紹介をします。
PID制御について簡単に紹介
制御工学におけるフィードバック制御の一種で、目標値の測定値があれば目標値と測定値の偏差から比例(P)、積分(I)、微分(D)を使用して制御量を生成する方法のことです。先程の比例制御に加えて積分と微分の考えを使用して制御をしていくという形になります。
いくつかメリットとデメリットをいくつかあげたいと思います。
考えられるメリット
- PIDの調整をすれば制御対象の物理的な意味をしっかりとモデル化をしなくともそれなりの結果を得られること
- PIDゲインが直感的であること
- PIDの3つのゲインを調整すればいいので考え方を理解すれば誰でも調整ができること
考えられるデメリット
私がPIDの中の一番のメリットはモデル化をしなくてもそれぞれの結果を得られることだと思っています。ただし、PID制御は一入力-一出力にしか対応していないので多入力-多出力のシステムに対して使えるかといわれると工夫をすれば使えるかな?となります。現代制御の場合は多入力-多出力に対応できますが、制御対象内部の状態を表すためのモデル化がとにかく難しいということが考えられます。。この話は長くなると思うのでこれくらいにしたいと思います。
PID制御に関しては古典制御になるので古典制御の勉強をすれば、理解がより深まると思うので興味を持った方は勉強をしていただければと思います。
実装について
実装の例は以下の通りです。P制御についての最後のほうで紹介した式の通りに実装を行いました。
// global variable or constant varaiable
float kp = 1.0f; // you change parameter
float controlP(float target, float measurement)
{
float error = target - measurement;
return (kp * error);
}
簡単ですね。図を書いてイメージを固めてからこの式を見ると納得がしやすいかもしれないです。
何はともあれ、一度ロボット等で比例制御を試してみるのがいいと思います。
さいごに
P制御について簡単に書いてみました。わかりやすいと少しでも多くの方に思っていただければ嬉しい限りです。PI制御やPD制御についてはこの記事の反響をみて書くかどうかを決めます。
マイクロマウス競技では、フィードフォワード+フィードバック(PID)で制御系を構築していますがロボトレは今のところはフィードバックだけでやっていこうかなと思っています。ライントレースロボットを作るのは2年ぶりなのでライントレースってこんなに難しかったんだと思いながらマシンの調整をしています。
ロボトレの調整中に5Vのレギュレーターが熱々になっていたようでマシンを拾い上げたときに手にやけどをおってしまいました。3Sが悪いのではということで2Sに変えたためマシンのスペックも当初のものとは変わりました。次回あたりで完成したハードウェアと企画時のハードウェアの変化について比べたいと思っています。