非線形制御の基礎 \def\Mto#1#2{\left(\begin{array}{r}#1 \\ #2\end{array}\right)} \def\Mtt#1#2#3#4{\left(\begin{array}{rr}#1 \\ #3\end{array}\right)} \def\Mso#1#2#3{\left(\begin{array}{r}#1 \\ #2 \\ #3\end{array}\right)} \def\Mss#1#2#3#4#5#6#7#8#9{\left(\begin{array}{rrr}#1 \\ #4 \\ #7 \end{array}\right)} \def\Mqo#1#2#3#4{\left(\begin{array}{r}#1 \\ #2 \\ #3 \\ #4\end{array}\right)} \def\Mqqa#1#2#3#4#5#6#7#8{\left(\begin{array}{rrrr}#1 \\ #5 \\} \def\Mqqb#1#2#3#4#5#6#7#8{#1 \\ #5\end{array}\right)}
ここでは非線型な対象を扱う方法を考えます。

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

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

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

  • 制御対象が非線形
    • 連続な非線形の式で表される(リンク機構、重力など)
    • 不連続な式で表される(摩擦など)
  • 制御手法が非線形
    • 連続非線型な制御則(ニューラルネットなども含む)
    • 不連続な制御(ON/OFF制御<こたつなど)
などに分類できます。

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

非線型なものも、部分的に見れば線形に近似できる。
対象となるシステムに正弦波を入れ、その出力から擬似的に伝達関数化して解析、制御。
2次系(x, dx/dt, d2x/dt2)のシステムで、(x, dx/dt)の挙動をグラフ上で解析。 非線型な要素を、非線型な入力でキャンセルして、線形にするor線形に近づける。
などがあります。

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

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


まず、対象の方程式を立てます。
右図のように、時間dtの間に、質量dMの水が流れ出したとします。この時、エネルギー保存の法則を考えると、

が成り立ちます。解くと

となります。

時間dtで流れ出す水量は、

であり、それよって液面が変化します。

これらより、

という方程式が成り立ちます。これがシステムの微分方程式になりますが、非線形要素である平方根が入っています。

これをある高さh0近辺で液面を一定に保つような制御を行う場合、その近辺に限ってみれば、あまり極端な変化はありません。 そこで、h0近辺で1次式で近似してみます。
まず、平方根部分だけを考えて、
とすると、

なので、
接点:
傾き:
よって、

と、近似できます。
以上より、もとの微分方程式は、

と近似することができます。これは、hに関しての線形な微分方程式なので、これまでの方法で制御することができます。

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

  • 狭い範囲では十分によく使えることが多い
  • 広い範囲の場合には、数区間に区分するなどして線形化
  • 単調ではないシステムでは注意が必要(単調増加、単調減少ではないもの)
という特徴を持ちます。
地球上で動作するものはすべからく重力の影響を受けます。 動作がすべて平面内で完結する場合は、構造的には重力に耐える必要があっても、制御上は重力の影響をほぼ考える必要はありません。 しかし、ロボットの動作が垂直方向の成分も持つとき、重力の影響は馬鹿にならなくなります。
そこで、ここでは、重力の影響を考えてみます。
右図に示すような、ごく単純なアーム状のものを考えます。 根本を回転ジョイントで支えられ、鉛直面内で傾きを制御するような対象です。
各パラメータは
質量m、回転軸回りの慣性モーメントI、回転軸〜重心距離l
重力加速度g、傾き角θ、駆動トルクT
とします。
この対象に作用するトルクは、根本をモータなどで駆動するトルクTと、重力により傾けようとする力mgsinθにその"腕の長さ"をかけた、mglsinθとなるため、運動方程式は、

となります。特別なケースについて考えると、

(真上/真横)
となります。明らかに、腕の傾きで異なる運動方程式となっています。
この対象をPD制御(比例微分制御)してみます。
操作量:
(θr:目標角度)
これを運動方程式に代入すると、

となります。
制御が落ち着いて整定(静定)した状態では、d2e/dt2=0, de/dt=0となるので、

となります。

(1)目標角度θr=0、θ≒0の場合(ほぼ上向き)

となるため、

よって、θ=0となります。(目的通りに制御できる)

(2)目標角度θr=π/2、θ≒π/2の場合(ほぼ真横)

となるため、

となります。π/2は目標角度なので問題ないとして、mgl/KPが余分についてきて、静止状態で誤差が残ります。 これを定常偏差と呼びます。数式上はKPを大きくするほど減少しますが、実際にはKPを大きくしすぎると制御が不安定化するため、限度があります。

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

※定常状態では無視されるのにD制御を敢えて加えていますが、これは実際に本物を制御するときにDが不可欠なためです。Dがないと落ち着かず、発振状態に理論上はなります(摩擦などで適当に落ち着くこともありますが)。 さて、次にPID制御(比例積分微分制御)を適用してみます。
操作量:
(θr:目標角度)
これを運動方程式に代入すると、

となります。
一般に、I制御をいれると、定常偏差が打ち消されます。これは、誤差がある限り積分されて、積分部分が定常偏差を打ち消すように、すなわち、上の(2)の例では、

となって、

で落ち着くためです。
ところが、PID制御の場合は過渡応答(目標変化)時に影響が出ます。

例:θr=π/2→0に急に変化した場合
(1)まず、θr=π/2で誤差0に整定

十分時間が経過した整定時には、

となっています。
(2)目標がθr=0に変化
積分値が変化するよりも十分早く動きが落ち着いたとすると、そのとき、

よって、

となります。
誤差の積分まで完了すると、積分値がゼロとなって最終的にはθ=0となりますが、一時的にずれたところで落ち着くことになります。 そこで、操作量に非線型な要素を加えます。

これを運動方程式に代入すると、

となり、いままでトラブルの元だった重力の成分が消えてなくなります。正確には、キャンセルできるように操作量を計算するわけです。こうなれば、PD制御のみで十分対処可能となります。

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

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

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

たとえば、右図のようなバネマス系の場合、摩擦がなければ、

と単純な式になりますが、動摩擦があるとすると、

というように、運動方向に応じて摩擦力のかかり方はかわります。 また、止まった場合には静止摩擦も考慮する必要があります。

右図に示すような、摩擦があるところの物体の制御の仕方を検討します。
運動方程式は

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

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

(2)摩擦補償
運動状況をもとに、

を操作量とします。つまり、摩擦で目減りする分をあらかじめ加えておきます。
理論的に正確に摩擦をモデル化することは困難ですが、実際にシステムを組んだ状態で測定した値を加えてやるだけでも、動作は劇的に改善する場合があります。
※測定法:PI制御にしておいて動き出す瞬間の操作量を測定する、手動で操作量を調整して動き出すところを調べる、など

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

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

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