はじめに
ADRC(Active Disturbance Rejection Control)は以前から知っていたのですが、最近になって実装を試してみました。
ADRCで特に重要なコンポーネントといえば、やはり 拡張状態オブザーバー(ESO) です。
この記事を書こうと思ったきっかけも、ADRCを実装したことでした。
制御ではESO以外にもさまざまなオブザーバーが使われているので、この機会にまとめて整理してみたいと思います。
代表的なものを挙げると、次の4種類があります。
今回のシリーズでは、以下の4種類を取り上げます。
- 名義逆モデル型外乱オブザーバー(Disturbance Observer, DOB)
- 非線形外乱オブザーバー(Nonlinear Disturbance Observer, NDOB)
- 状態オブザーバーベースの外乱オブザーバー(State-Observer-Based Disturbance Observer, SO-DOB)
- 拡張状態オブザーバー(Extended State Observer, ESO)
名前について、日本語でどう呼ぶのが適切か少し迷っています。 ひとまず本記事では、英語の名称との対応がわかりやすいようにこの呼び方で統一します。
ただし、今回の前篇では、1. 名義逆モデル型DOB と 2. 非線形外乱オブザーバー(NDOB) を取り上げます。
後篇については、以下のリンク先にまとめましたので、興味のある方はぜひご覧ください。
1. 名義逆モデル型外乱オブザーバー(DOB)
1.1 アイデアの出発点
まず、最もシンプルな考え方から始めましょう。
制御対象にモデル化されていない外乱 $d$ が加わっている状況を考えます。
もし外乱 $d$ が分かれば、制御入力でそれを打ち消すことができます。
しかし当然、$d$ は直接測定できません。
そこで発想を変えます。
「プラントの名義モデル(ノミナルモデル)の逆モデルを使って、出力から逆算すれば、実際に加わった入力が分かるのではないか?」 というアイデアです。
具体的にはこうです。
名義モデル(外乱がないときのモデル)の伝達関数を $P_n(s)$ とします。
実際のプラントに制御入力 $u$ を入れて出力 $y$ を得たとき、もしモデルが完全に正しければ $y = P_n(s) u$ のはずです。
しかし実際には外乱 $d$ があるので、$y$ にはその影響が含まれています。
ここで、出力 $y$ に名義モデルの逆 $P_n^{-1}(s)$ を掛けると、
$$
P_n^{-1}(s) \cdot y
$$
が得られます。
外乱がなければこれは元の入力 $u$ に一致するはずですが、外乱があるとずれます。
そのずれが外乱の推定値になるわけです。つまり、
$$
\hat{d} = P_n^{-1}(s) \cdot y - u
$$
として外乱を推定します。
1.2 応用上の課題
1.2.1 逆モデルはそのままでは使えない
1.1 のアイデアはとても直感的ですが、実際にDOBとして使うにはそのままでは難しい場合があります。
その代表的な理由が、名義モデルの逆 $P_n^{-1}(s)$ がプロパーでないことが多い、という点です。
たとえば、名義モデルが
$$
P_n(s) = \frac{b}{s^2 + a_1 s + a_0}
$$
のような厳密にプロパーな伝達関数だとすると、その逆は
$$
P_n^{-1}(s) = \frac{s^2 + a_1 s + a_0}{b}
$$
となります。
このとき、分子の次数が分母の次数を上回るため、この逆モデルはそのままでは実現しにくい形になります。
そこでDOBでは、Qフィルタと呼ばれるローパスフィルタ $Q(s)$ を組み合わせて使います。
これにより、逆モデルを含む推定器全体を実装しやすい形に整えます。
典型的には、$Q(s)$ は次のように置かれます。
$$
Q(s) = \frac{1}{(\tau s + 1)^r}
$$
ここで $\tau$ はフィルタの時定数、$r$ は $Q(s) P_n^{-1}(s)$ がプロパーになるように選ぶ次数です。
このとき、外乱推定値は
$$
\hat{d} = Q(s) P_n^{-1}(s) \cdot y - Q(s) \cdot u
$$
のように構成されます。
1.2.2 MIMOに対応しにくい
SISO(1入力1出力)では、入出力関係はスカラーの伝達関数$Pで表されるため、
名義モデルの逆
$P_n^{-1}(s)$
を考えることも比較的簡単です。
一方、MIMO(多入力多出力)では、入力と出力がそれぞれ複数あるため、入出力関係は以下のような行列で表されます。
たとえば 2 入力 2 出力なら、
\begin{bmatrix}
Y_1(s) \\
Y_2(s)
\end{bmatrix}
=
\begin{bmatrix}
P_{11}(s) & P_{12}(s) \\
P_{21}(s) & P_{22}(s)
\end{bmatrix}
\begin{bmatrix}
U_1(s) \\
U_2(s)
\end{bmatrix}
となります。
ここで、
- $P_{ij}(s)$ は「入力 $j$ が出力 $i$ に与える影響」を表す伝達関数
このように、MIMO では伝達関数 $P(s)$ は 1 つの式ではなく、各要素に伝達関数をもつ伝達関数行列になりますが
SISO のようにその逆を単純に求めればよい、とはなりません。
実際には、逆を取ろうとすると、次のような問題が生じるね。
- 入力数と出力数が一致せず、正方行列にならないことがある
- ある周波数で特異となり(例:$$det(P(jw))=0$$)、逆行列が定義できないことがある
- 非最小位相零点を含みやすいので、求めた逆モデルが不安定になりやすい
- 相互干渉があり、SISO のように独立に扱えない
というような、きれいに逆を取れない場合がいくつありますね。
DOBにはこのほかにも応用上の論点はいくつかありますが、今回は割愛します。
個人的には、細かい話を追うよりも、まずは一度実装してみると感覚がつかみやすいと思っています。
1.3 DOBの構造まとめ
DOBは 「線形・SISOで、名義モデルがある程度分かっている場合」 に有効な手法ですので、
使用上、注意点がたくさんあるので、100%期待通りの結果がでるようになるとは限らないです
2. 非線形外乱オブザーバー(NDOB)
2.1 DOBの限界とNDOBの動機
DOBは周波数領域で設計するため、非線形システムにはそのまま適用できません。
しかし、実際のプラントは多かれ少なかれ非線形性を持っています。
ロボティクスのような本質的に非線形なシステムでは、なおさらです。
そこで登場するのが 非線形外乱オブザーバー(Nonlinear Disturbance Observer, NDOB) です。
NDOBは、時間領域で直接設計する方法であり、非線形システムに対しても適用可能です。
2.2 問題設定
次のような非線形システムを考えます。
$$
\dot{x} = f(x) + g_1(x)u + g_2(x)d
$$
$$
y = h(x)
$$
ここで、
- $x$:状態ベクトル
- $u$:制御入力
- $d$:未知外乱(推定したい対象)
- $f(x)$, $g_1(x)$, $g_2(x)$, $h(x)$:既知の滑らかな関数
$d$ は未知ですが、ゆっくり変化する(あるいは定値に近い)と仮定します。
もう少し正確に言えば、$\dot{d} \approx 0$ 、つまり外乱の時間変化が十分遅いという仮定です。
ここでは時変の外乱への対応は考慮せず、基本的な扱いとして $\dot{d}=0$ の場合を扱います。
不過(とはいえ)、実際にはゆっくり変化する外乱であれば、収束速度をうまく設計することで追従することも可能です。
2.3 アプローチとその問題
まず、外乱の推定値を $\hat{d}$ とおき、推定誤差を
$$
\tilde{d} = \hat{d} - d
$$
と定義します。
推定誤差の動的方程式を考えると、
$$
\dot{\tilde{d}} = \dot{\hat{d}} - \dot{d} = \dot{\hat{d}}
$$
です($\dot{d}=0$ の仮定より)。
ここで、$\tilde{d} \to 0$ に収束させたいので、次のような制御則を考えたくなります。
$$
\dot{\hat{d}} = -l(x) g_2(x) \tilde{d}
$$
導出の詳細:
$$\dot{\tilde d} + k \tilde d = 0$$という一次微分方程式なので、解は
$$\tilde d(t) = \tilde d(0)e^{-kt}$$
です。
$k>0$ なので
$$e^{-kt} \to 0 \qquad (t\to\infty)$$
となり、したがって
$$\tilde d(t) \to 0
\qquad (t\to\infty)$$です。
つまり、この形にできれば推定誤差は指数的に 0 に収束します。
さて、すでに$$\dot{\tilde d} = \dot{\hat d}$$
であることが分かっているので、目標誤差方程式は以下のようになる$$\dot{\tilde d} = -k\tilde d$$
自由度と$g_2$をさらにかけると、上記のようになる
$l(x)$ は正のゲインで、これにより $\tilde{d}$ が指数的に減衰する構造を作ろうとしています。
しかし、ここで問題があります。
右辺に $\tilde{d} = \hat{d} - d$ が含まれていますが、$d$ は未知なので、$\tilde{d}$ そのものを直接計算できません。
2.4 展開
そこで、上の式を展開してみます。
$$
\dot{\tilde{d}} = -l(x) g_2(x) \tilde{d}
$$
$\tilde{d} = \hat{d} - d$ を代入すると、
$$
\dot{\hat{d}} = -l(x) g_2(x)(\hat{d} - d)
$$
$$
= -l(x) g_2(x) \hat{d} + l(x) g_2(x) d
$$
ここで、$g_2(x) d$ は何でしょうか?
元のシステムの式 $\dot{x} = f(x) + g_1(x)u + g_2(x)d$ を見ると、
$$
g_2(x) d = \dot{x} - f(x) - g_1(x) u
$$
と書けます。つまり、$d$ そのものは分からなくても、$g_2(x) d$ は状態 $x$ の微分と既知の項から計算できるのです。
したがって、
$$
\dot{\hat{d}} = -l(x) g_2(x) \hat{d} + l(x)(\dot{x} - f(x) - g_1(x) u)
$$
と書き直せます。
2.5 展開後の残件
上の式で一見うまくいきそうですが、まだ1つ問題があります。
右辺に $\dot{x}$(状態の微分) が含まれています。
$\dot{x}$ を得るには微分器が必要ですが、実際のシステムでは状態にノイズが含まれるため、数値微分は非常にノイズに弱いのです。
そこで、$\dot{x}$ を直接使わずに済む工夫が必要になります。
ここがNDOBの設計で最も巧みな部分です。
2.6 補助変数の導入
次のような補助変数 $p(x)$ を導入します。
$$
p(x) = \int l(x) \dot{x} , dt
$$
つまり、$l(x)\dot{x}$ の積分です。
そして、新しい変数 $z$ を次のように定義します。
$$
z = \hat{d} - p(x)
$$
すると、$\hat{d} = z + p(x)$ と書けます。
先ほどの $\dot{\hat{d}}$ の式を使って $\dot{z}$ を求めてみましょう。
$$
\dot{z} = \dot{\hat{d}} - \dot{p}(x)
$$
ここで $\dot{p}(x) = l(x)\dot{x}$ なので、
$$
\dot{z} = -l(x) g_2(x) \hat{d} + l(x)(\dot{x} - f(x) - g_1(x) u) - l(x)\dot{x}
$$
$l(x)\dot{x}$ の項が見事に打ち消し合い、
$$
\dot{z} = -l(x) g_2(x)(z + p(x)) - l(x)(f(x) + g_1(x)u) + l(x) g_2(x) p(x)
$$
整理すると、
$$
\dot{z} = -l(x) g_2(x) z + l(x)\bigl(-f(x) - g_1(x)u - g_2(x) p(x)\bigr)
$$
そして、
$$
\hat{d} = z + p(x)
$$
です。
ここが重要です。 $\dot{z}$ の式には $\dot{x}$ が一切含まれていません。
右辺は $x$, $u$, $z$, $p(x)$ だけで構成されており、すべて微分なしで計算可能です。
2.7 NDOBのまとめ
DOBとの比較で言えば、NDOBは 「非線形システムで、状態xが測定できる場合」 に適した手法です。
