厳密微分器


計測される様々な信号の微分値を求めることは,重要である.たとえば,得られるモータのエンコーダの値から速度値を求めることなどが挙げられる.従来法では,時刻t\displaystyleにおけるエンコーダの出力値f(t)\displaystyleに対し,\frac{f(t)-f(t-\delta)}{\delta}\displaystylef'(t)\displaystyleの近似的として制御に利用することが行われてきた.しかし,これではいかに\delta\displaystyleを小さくとっても,必ず求める微分値に誤差が乗る問題点がある.また,\delta\displaystyleを小さくとりすぎると,エンコーダの分解能,数値計算誤差により,十分な分解能の微分値を得ることができない.

近年Levantはこの問題に対し,高次スライディングモード制御の考え方を用いた厳密微分器を提案した.また,中村は厳密微分器が有限時間で整定する条件を明らかにした.

本稿では厳密微分器の紹介を行う.

微分器の定義

ある信号を入力したときの出力が入力信号の微分値と一致するとき,微分器は厳密であるという.

1階の厳密微分器

入力信号f(t):[0,\infty)\to \mathbb{R}\displaystyleC^2\displaystyle級であり,-C\leq f^{(2)}(t)\leq C(C\in \mathbb{R}_{\geq 0})\displaystyleを満たすとする.このとき,1階の厳密微分器は次のシステムである.

(1)    \begin{align*} \dot{x_1}&=x_2-\lambda_1|x_1-f(t)|^{\frac{1}{2}}\sgn(x_1-f(t))\\ \dot{x_2}&=-\lambda_2\sgn(x_1-f(t))\\ y&=x_2\\ \end{align*}

ただし,(x_1,x_2)\in \mathbb{R}^2 \displaystyleは内部状態量,y\in \mathbb{R}\displaystyleは出力であり,f(t)\displaystyleの1階微分値を意味している.(\lambda_1,\lambda_2)\in \mathbb{R}^2 \displaystyleは以下の条件を満たす適当な正の定数である.

(2)    \begin{align*} &\lambda_1>0\\ &\lambda_2>C+\frac{2C^2}{\lambda_1^2} \end{align*}

この時,有限時間で\rho_1,\rho_2\displaystyleは0に整定される.ただし,

(3)    \begin{align*} &\rho_1=x_1-f(t)\\ &\rho_2=x_2-f^{(1)}(t) \end{align*}

である.すなわち,コントローラ内の変数x_1(t),x_2(t)\displaystylef(t),f^{(1)}(t)\displaystyleに収束する.

2階の厳密微分器

入力信号f(t):[0,\infty)\to \mathbb{R}\displaystyleC^3\displaystyle級であり,-C\leq f^{(3)}(t)\leq C(C\in \mathbb{R}_{\geq 0})\displaystyleを満たすとする.このとき,2階の厳密微分器は次のシステムである.

(4)    \begin{align*} \dot{x_1}&=x_2-\lambda_1|x_1-f(t)|^{\frac{2}{3}}\sgn(x_1-f(t))\\ \dot{x_2}&=x_3-\lambda_2|x_1-f(t)|^{\frac{1}{3}}\sgn(x_1-f(t))\\ \dot{x_3}&=-\lambda_3\sgn(x_1-f(t))\\ y_1&=x_2\\ y_2&=x_3 \end{align*}

ただし,(x_1,x_2,x_3)\in \mathbb{R}^3 \displaystyleは内部状態量,(y_1,y_2)\in \mathbb{R}^2\displaystyleは出力であり,y_1\displaystylef(t)\displaystyleの1階微分値,y_2\displaystyleは2回微分値を意味している.(\lambda_1,\lambda_2,\lambda_3)\in \mathbb{R}^3 \displaystyleは以下の条件を満たす適当な正の定数である.

(5)    \begin{align*} &8a\left( \frac{2a}{3\lambda_2}+\frac{b\lambda_1}{3\lambda_2}\right) > 2b^2+2ad^2+3^{\frac{3}{4}}a^{\frac{1}{4}}\frac{b}{\lambda_1}\\ &27\left( \frac{4}{3}a\lambda_1-b\lambda_2-\frac{\lambda_3+C}{\lambda_1}b\right) (d+4(\lambda_3-C))^2 > 4\left( \frac{1}{4b}\left( 2(\frac{2a}{3\lambda_2}+\frac{b\lambda_1}{3\lambda_2})-\frac{b}{\lambda_1}+2d\right)^2+d\lambda_2\right)^3\\ &27\left( \frac{4}{3}a\lambda_1-b\lambda_2-\frac{\lambda_3+C}{\lambda_1}b\right) (d-4(\lambda_3+C))^2 > 4\left( \frac{1}{4b}\left( 2(\frac{2a}{3\lambda_2}+\frac{b\lambda_1}{3\lambda_2})-\frac{b}{\lambda_1}-2d(\lambda_3-C)\right)^2\right)^3\\ &\lambda_1>0\\ &\lambda_2>0\\ &\lambda_3>0 \end{align*}

ただし,a,b,d\in \mathbb{R}は適切に選ぶ定数である.(条件を満たせばどの値を選んでも良い)

この時,有限時間で\rho_1,\rho_2,\rho_3\displaystyleは0に整定される.ただし,

(6)    \begin{align*} &\rho_1=x_1-f(t)\\ &\rho_2=x_2-f^{(1)}(t)\\ &\rho_3=x_3-f^{(2)}(t) \end{align*}

である.すなわち,コントローラ内の変数x_1(t),x_2(t),x_3(t)\displaystylef(t),f^{(1)}(t),f^{(2)}(t)\displaystyleに収束する.

実装

システムは連続だが,実機は離散コントローラである.そのため,微分方程式の離散化が必要になる.本稿ではオイラー法を採用する.(ルンゲクッタ法だとうまくいかない.微分方程式がC^\infty\displaystyleでない点に注意)この離散化によって,パラメータチューニングが必要となる.(離散化によって引き起こされた誤差を許容範囲に収めるパラメータを求める必要がある)

パラメータチューニング

厳密微分器はパラメータ\lambda_1,\lambda_2\displaystyleを設定する必要がある.また,どの程度時間の刻み幅を細かくするか決定する必要がある.
これについてはある程度事前にシミュレーションで結果を確認しておくと,調整がしやすい.

まず,本稿では加速度を8000mm/sec/secのマウスを考える.すなわち,-8000<=f^{(2)}(t)<=8000\displaystyleの場合を考える.このような加速度を持つ信号に対し,厳密微分器が動作する時間の刻み幅,\lambda_1,\lambda_2\displaystyleの値を探す.ただし,10の3乗の値が出てくるとパラメータ調整がやりにくい.
厳密微分器は同次システムであり線形システムではなく,単位系の変換に使った定数がそのままパラメータの定数に乗るとは限らないからだ.(パラメータチューニングのおおよその勘が他に生かしにくい)

そこで,本稿では8m/sec/secのように,メートル系でパラメータ調整を行う.実機に実装する場合はメートル系で調整したパラメータを使用する単位系に変換して使えばよい.

さて,ワーストケースの信号を想定してシミュレーション行う.すなわち,f(t)=8\frac{t^2}{2}\displaystyleを考える.(-8<=f^{(2)}(t)<=8\displaystyleを満たしている)この信号に対し,以下のプログラムでシミュレーションを行い,lambda1,lambda2,dtを調整する.まず,プログラムを実行後,result.txtが生成される.次に,この中身を見て,厳密微分器の出力値(x1,x2)と真値(f(nowt),f1(nowt))を比較する.dtを粗くとると,x2がf1(nowt)に一定のバイアスをもって遅れて追従しているように見える.これに対してはdtを一定以上細かくとると,この問題は解消される.
lambda1,lambda2を小さく取っても問題は軽減されるが,lambda1,lambda2に課せられている条件を破らないように注意しよう.

以下の図はシミュレート結果をプロットしたものである.有限時間で微分値が真値に整定されていることがわかる.
Genmitsu

単位系の変換

以下のような単位変換を行うことを考える.

(7)    \begin{align*} \tilde{x}_1&=kx_1\\ \tilde{x}_2&=kx_2\\ \tilde{f}(t)&=kf(t) \end{align*}

ただし,k>0は単位変換定数.これはたとえばk=1000の場合,メートル系からミリメートル系へ単位系を変更することを意味している.以下のように\tilde{x}_1,\tilde{x}_2\displaystyleの時間微分が求まる.

(8)    \begin{align*} \dot{\tilde{x}}_1&=\tilde{x}_2-\sqrt{k}\lambda_1|\tilde{x}_1-\tilde{f}(t)|^{\frac{1}{2}}\sgn(\tilde{x}_1-\tilde{f}(t))\\ \dot{\tilde{x}}_2&=-k\lambda_2\sgn(\tilde{x}_1-\tilde{f}(t)) \end{align*}

よって,単位変換後は以下のように定数\tilde{\lambda}_1,\tilde{\lambda}_2\displaystyleをとればよい.

(9)    \begin{align*} \tilde{\lambda}_1&=\sqrt{k}\lambda_1\\ \tilde{\lambda}_2&=k\lambda_2 \end{align*}

実装

1サンプルあたりのエンコーダの増減値が1か0になるほど,高速で割り込みを回す必要がある.そうでないなら,差分で微分を取った方が良いだろう.

1割込ごとに,微分方程式をオイラー法でシミュレートする.微分方程式の右辺の計算には,浮動小数点のルート演算がはいる.そのため,浮動演算ユニットがついているマイコンでなければ実装は厳しい.具体的にいえば,SH7147に実装は無理.STM32f103RFなら実装できる.

最大加速度Cを大きくとると,\lambda_2の値が大きくなり,計測可能な速度の量子化幅が荒くなる.

そのため,低速・中速・高速域それぞれでパラメータを別に用意すると良いだろう.

参考文献

  • 中村文一 博士論文
  • A. Levant: Universal SISO sliding-mode controllers with finite-time convergence, IEEE trans. on Auto. Contr., 46-9, 1447/1451(2001).

外部リンク