実践制御 - (2012/03/26 (月) 07:20:40) の編集履歴(バックアップ)
RigidChipsではプログラミング言語Luaを使ってモデルに複雑な動きをさせたり、制御したりすることができます。
ホイールの制御、航空機の制御、ミサイルの制御といろいろありますが、ここではその制御について
Luaで
解説します。
制御概論
「制御」とは「入力と出力を持つシステムにおいてその出力を自由に変化させること」です。
真面目にやると制御工学とか言ってちゃんとした学問になるっぽいけど、ここではRigidChipsでモデルが思い通りに動けばいいやというぐらいでやっていきます。
制御工学の授業とかでは抽象的な制御を扱うらしいので、RigidChipsでの具体的な制御を知っているとその筋に進む人は有利・・・かもしれない。
さて、制御に必要なのは、「
制御対象
」と「
入力
」と「
出力
」で、これに出力を乱す「
外乱
」が加わってややこしい制御を繰り広げます。
飛行機の速度制御を例にすると、飛行機が制御対象、エンジンのPowerが入力、速度が出力、風・重力・機銃の発砲による減速等等が外乱に当たります。
「速度」を
見ながら
「エンジンのPower」をうまく操作して、「飛行機」の「速度」を一定に保つのが速度制御と言うわけです。
このように、出力(速度)の結果を見て入力(エンジンのPower)を変えることを
フィードバック
と言います。
このページで紹介する制御はすべて
フィードバック制御
です。
制御の方法の例を見てみましょう。
ON/OFF制御
誰でも思いつく、シンプルな制御。
身近な例ではトイレの水タンクで、水を流した後タンクに水を入れ続け、一定より水位が上がると浮きが栓を押し、水を止めるという奴です。
制御対象
はトイレのタンク、
入力
はトイレタンクに入れる水、
出力
はトイレタンクの水位で、
「トイレタンクに入れる水」をほどよく調整して「トイレタンクの水位」を一定に保つことが
目的
です。
「トイレタンクの水位」の状態によって「トイレタンクに入れる水」の量を変える、
出力
を
入力
に
フィードバック
しています。
表で動作を表現するとこんな感じです。
対象 | 入力 | 出力 |
タンク | 水道 | 水位 |
- | 出す | 一定以下 |
- | 止める | 一定以上 |
RigidChips的な例ではお手元のBasicをご覧ください。これを
10[m/s]
(36[km/h])
になるように
速度制御してみましょう。
「入力」は勿論WheelのPower変数Engine、速度は-_VZ(0)[m/s](前進でマイナスになるので)になります。
このとき-_VZ(0)を
出力値
、10を
目標値
と呼びます。
対象 | 入力 | 出力 |
Basic | Engine | -_VZ(0) |
- | -2500 | -_VZ(0)<10 |
- | 0 | -_VZ(0)>=10 |
これをプログラム的に表現するなら、
-_VZ(0)が10以下なら、Engineは-2500
そうでなければ、Engineは0
これをLuaにするなら、 if構文 を使って書きます。
if -_VZ(0)<10 then
ENGINE = -2500
else
ENGINE = 0
end
out(0,-_VZ(0))
最後のoutはサービスだから、まず見て落ち着いて欲しい。LuaではVal変数に代入するときは全部大文字である必要があります。
手元のBasicは10[m/s]を保って走っているでしょうか。これが制御というものです。
P制御
スイッチ制御はごく簡単に書けますが、汎用性や実用性に欠けます。
そこで次はP制御(比例制御)について解説します。
例は引き続きBasicです。
P制御とは、出力値と目標値の差のことを
偏差
と呼び、入力を偏差に
比例
させるものです。
入力値 | 出力値 | 目標値 | 偏差 |
Engine | -_VZ(0) | 10 | -_VZ(0)-10 |
これの偏差と入力値を 比例 させるわけですから、Luaで書くと
ENGINE = (-_VZ(0)-10)*500
out(0,-_VZ(0))
このP制御だと、出力値が目標値を通り越したとき、出力値もプラス(後進)になり、Basicを減速させようとします。
このような単純な構文で滑らかな動作とプラスとマイナスどちらにも対応できるのがP制御の魅力です。
また、このLuaでの
*500
の部分を
P係数
(比例係数)と呼びます。
これを変えると挙動がどう変わるか試してみてください。
しかしこのP制御にも弱点があり、Basicが坂道に差し掛かったとき、速度は10[m/s]よりも落ち、制御し切れません。
この坂道、重力がかかることが
外乱
です。
坂道での偏差の増大はP係数を大きくすることで緩和されますが、根本的な解決にはなりません。
なぜなら、偏差がゼロの理想的なBasicの状態では偏差ゼロ=入力値ゼロになり、重力の影響を避けられません。
坂道という外乱がある状態で偏差をゼロにするには、入力値はある程度必要なのです。
しかしこれをP制御では表現できません。どうしたものか・・・