非線形制御の基礎

[| ]  最終更新: 2011/02/10 19:32:26

非線形

ここでは非線型な対象を扱う方法を考えます。

古典制御、これまで扱った現代制御理論とも、対象は線形です。線形というのはたとえば

などの性質を持つ物です。単純な対象は線形なことも多いのですが、実際に制御対象にしたいものは非線形なことが一般的です。 運動方程式に三角関数が入ったらそれでもう非線形なので、たとえば、回転関節をもつロボットなどは非線形な対象の例です。

非線形がからむ制御としては、

などに分類できます。

これらに対する一般的な対処法としては、

などがあります。

線形化

水位と流量 右の図に示すような、タンクの液面の高さの制御をすることを考えます。

タンクの液面の変動は、流れ出す水量によって決まりますが、この流れ出す水量が高さと非線型な関係を持ちます(直感的に考えて、深いほうが流量は多くなる)。
タンク断面積:A
パイプ断面積:B
水面高さ:h
流速:v
時間流量:q


水位と流量 まず、対象の方程式を立てます。
右図のように、時間dtの間に、質量dMの水が流れ出したとします。この時、エネルギー保存の法則を考えると、
dMgh=(1/2)dMv^2
が成り立ちます。解くと
v^2=2gh,~~~ v=\sqrt{2gh}
となります。

時間dtで流れ出す水量は、
dV=-qdt=-Bvdt=-B\sqrt{2gh}dt
であり、それよって液面が変化します。
dV=Adh
これらより、
dh=-\frac{B}{A}\sqrt{2gh}dt\nonumber\\\frac{dh}{dt}=-\frac{B}{A}\sqrt{2gh}
という方程式が成り立ちます。これがシステムの微分方程式になりますが、非線形要素である平方根が入っています。

水位と流量 これをある高さh0近辺で液面を一定に保つような制御を行う場合、その近辺に限ってみれば、あまり極端な変化はありません。 そこで、h0近辺で1次式で近似してみます。
まず、平方根部分だけを考えて、 f(h)=\sqrt{2gh}
とすると、
\frac{df}{dh}=\sqrt{2g}\frac{1}{2\sqrt{h}}=\sqrt{\frac{g}{2h}}
なので、
接点:(h_0,\sqrt{2gh_0})
傾き:\sqrt{\frac{g}{2h_0}}
よって、
\sqrt{2gh}\simeq\sqrt{2gh_0}+\sqrt{\frac{g}{2h_0}}(h-h_0)
と、近似できます。
以上より、もとの微分方程式は、
\frac{dh}{dt}\simeq-\frac{B}{A}\left(\sqrt{2gh_0}+\sqrt{\frac{g}{2h_0}}(h-h_0)\right)
と近似することができます。これは、hに関しての線形な微分方程式なので、これまでの方法で制御することができます。

以上のように、非線型なシステムでも、関心を持つところを限れば、線形とみなすことができます。

という特徴を持ちます。

重力補償

地球上で動作するものはすべからく重力の影響を受けます。 動作がすべて平面内で完結する場合は、構造的には重力に耐える必要があっても、制御上は重力の影響をほぼ考える必要はありません。 しかし、ロボットの動作が垂直方向の成分も持つとき、重力の影響は馬鹿にならなくなります。
そこで、ここでは、重力の影響を考えてみます。

制御対象のモデル

1自由度アーム 右図に示すような、ごく単純なアーム状のものを考えます。 根本を回転ジョイントで支えられ、鉛直面内で傾きを制御するような対象です。
各パラメータは
質量m、回転軸回りの慣性モーメントI、回転軸〜重心距離l
重力加速度g、傾き角θ、駆動トルクT
とします。
この対象に作用するトルクは、根本をモータなどで駆動するトルクTと、重力により傾けようとする力mgsinθにその"腕の長さ"をかけた、mglsinθとなるため、運動方程式は、
I\ddot{\theta}=T+mgl\sin\theta
となります。特別なケースについて考えると、
\left\{\begin{array}{ll}I\ddot{\theta}=T&(\theta=0)\\I\ddot{\theta}=T+mgl&(\theta=\pi/2)\end{array}\right.
(真上/真横)
となります。明らかに、腕の傾きで異なる運動方程式となっています。

PD制御を適用する

この対象をPD制御(比例微分制御)してみます。
操作量:
T=K_Pe+K_D\dot{e},~~~e=\theta_r-\theta(θr:目標角度)
これを運動方程式に代入すると、
I\ddot{\theta}=K_Pe+K_D\dot{e}+mgl\sin\theta
となります。
制御が落ち着いて整定(静定)した状態では、d2e/dt2=0, de/dt=0となるので、
0=K_Pe+mgl\sin\theta
となります。

(1)目標角度θr=0、θ≒0の場合(ほぼ上向き)
0=-K_P\theta+mgl\theta,~~~(\sin\theta\sim\theta)
となるため、
(K_P-mgl)\theta=0
よって、θ=0となります。(目的通りに制御できる)

(2)目標角度θr=π/2、θ≒π/2の場合(ほぼ真横)
0=K_P(\pi/2-\theta)+mgl,~~~(\sin\theta\sim 1)
となるため、
\theta=\pi/2+\frac{1}{K_P}mgl
となります。π/2は目標角度なので問題ないとして、mgl/KPが余分についてきて、静止状態で誤差が残ります。 これを定常偏差と呼びます。数式上はKPを大きくするほど減少しますが、実際にはKPを大きくしすぎると制御が不安定化するため、限度があります。

つまり、PD制御では狙い通りには制御できません。

※定常状態では無視されるのにD制御を敢えて加えていますが、これは実際に本物を制御するときにDが不可欠なためです。Dがないと落ち着かず、発振状態に理論上はなります(摩擦などで適当に落ち着くこともありますが)。

PID制御を適用する

さて、次にPID制御(比例積分微分制御)を適用してみます。
操作量:
T=K_Pe+K_D\dot{e}+K_I\int edt,~~~e=\theta_r-\theta(θr:目標角度)
これを運動方程式に代入すると、
I\ddot{\theta}=K_Pe+K_D\dot{e}+K_I\int edt+mgl\sin\theta
となります。
一般に、I制御をいれると、定常偏差が打ち消されます。これは、誤差がある限り積分されて、積分部分が定常偏差を打ち消すように、すなわち、上の(2)の例では、
K_I\int edt=-mgl
となって、
0=K_P(\pi/2-\theta)+(-mgl)+mgl
で落ち着くためです。
ところが、PID制御の場合は過渡応答(目標変化)時に影響が出ます。

例:θr=π/2→0に急に変化した場合
(1)まず、θr=π/2で誤差0に整定
K_Pe+K_D\dot{e}+K_I\int edt+mgl=K_I\int edt+mgl=0
十分時間が経過した整定時には、
K_I\int edt=-mgl
となっています。
(2)目標がθr=0に変化
積分値が変化するよりも十分早く動きが落ち着いたとすると、そのとき、
K_Pe+K_D\dot{e}+K_I\int edt+mgl\theta=K_P(-\theta)+K_I\int edt+mgl\theta=0
よって、
\theta=-\frac{1}{K_P-mgl}K_I\int edt\sim-\frac{1}{K_P-mgl}mgl
となります。
誤差の積分まで完了すると、積分値がゼロとなって最終的にはθ=0となりますが、一時的にずれたところで落ち着くことになります。

重力補償を適用する

そこで、操作量に非線型な要素を加えます。
T=K_Pe+K_D\dot{e}+(-mgl\sin\theta)
これを運動方程式に代入すると、
I\ddot{\theta}=K_Pe+K_D\dot{e}+(-mgl\sin\theta)+mgl\sin\theta=K_Pe+K_D\dot{e}
となり、いままでトラブルの元だった重力の成分が消えてなくなります。正確には、キャンセルできるように操作量を計算するわけです。こうなれば、PD制御のみで十分対処可能となります。

重力補償はこのように、腕状のものに非常に効果的に働きます。計算は、ロボットの姿勢のみですむため、それほどやっかいでもありません。もちろん、対象のモデルがわかっていることが前提ですが、多少ずれても致命的なことにはならず、多少Iを加えておくと残った誤差も消すことができます(全部Iでやるのにくらべて、上述の問題はおきにくくなる)。

なお、実際にこのようなメカをつくると、モータに対する負荷が大きくなり、結果的にモータが大きくなって、さらに質量が増えて、、、と悪循環が生じます。そこで、今回のような制御の上での重力補償に加えて、バネを含む機構を加えて多くをキャンセルする目的の、重力補償機構というものも存在します。


摩擦補償

バネマス系と摩擦 実際にものを作ると対処しなければならないややこしいものに、摩擦があります。

たとえば、右図のようなバネマス系の場合、摩擦がなければ、
m\ddot{x}=-kx
と単純な式になりますが、動摩擦があるとすると、
\left\{\begin{array}{ll}m\ddot{x}=-kx-\mu mg&\dot{x}>0\\m\ddot{x}=-kx+\mu mg&\dot{x}<0\end{array}\right.
というように、運動方向に応じて摩擦力のかかり方はかわります。 また、止まった場合には静止摩擦も考慮する必要があります。

摩擦のある物体運動 右図に示すような、摩擦があるところの物体の制御の仕方を検討します。
運動方程式は
\left\{\begin{array}{ll}m\ddot{x}=f-F&\dot{x}>0~~or~~\dot{x}=0\rightarrow >0\\m\ddot{x}=f+F&\dot{x}<0~~or~~\dot{x}=0\rightarrow <0\end{array}\right.
となります。ここで、fは物体の運動のために作用させる力、Fは摩擦力です。 後ろの条件で、前者は運動中、後者は静止から運動開始、つまり止まっているものを動かそうという静摩擦への対応です。ちなみに、止まっている場合には、上式でf-F≧0、下式でf+F≦0です(摩擦力で走り出すことはない)。
不感帯 おおざっぱに図示すると、右図のようになります。力をかけても加速せず、ある程度力をかけると、摩擦力を振り切るのに十分になって加速を開始する、という感じです。このように、操作しても結果が出ない部分を不感帯といいます。
この対象の制御を考えます。

(1)PID制御
積分項によって、目標に達する前に停止すると、誤差積分値が蓄積するため、いつかは静止摩擦力を振り切って動き出します。 しかし、一般に静止摩擦力よりも動摩擦力が小さいため、一旦動き出すと、目標を通りすぎてからP制御によって停止し、また同じことを繰り返します。そのため、なかなか目標地点に到達しません。

(2)摩擦補償
運動状況をもとに、
\left\{\begin{array}{l}f'=f+F\\f'=f-F\end{array}\right.
を操作量とします。つまり、摩擦で目減りする分をあらかじめ加えておきます。
理論的に正確に摩擦をモデル化することは困難ですが、実際にシステムを組んだ状態で測定した値を加えてやるだけでも、動作は劇的に改善する場合があります。
※測定法:PI制御にしておいて動き出す瞬間の操作量を測定する、手動で操作量を調整して動き出すところを調べる、など

摩擦補償は、重力補償に比べるとぴたりとはまることはあまりありません。 ただ、重力の場合にはあくまで連続的なのに対して、摩擦は不連続でもあるため、経験上、いやなトラブルが多くありました。 そのときに、おおざっぱに上式のような補償を加えてやると、それだけで改善が見られました。


まとめ

世の中は線形なものより非線型なもののほうが多いと言えます。 すべてに対処することは無理で、線形化や補償を考えるためのモデル化も困難な場合がよくあります。 ただ、おおざっぱでもここで説明したような細工をすると、改善することが多いため、アイデアとして覚えておくといいと思います。

このページ、ここで終了。



熊谷正朗 [→連絡]
東北学院大学 工学部 機械知能工学科 RDE
[| ]