倒立振子の制御を古典制御で行ってみます。情報は徐々に足していきます。
手のひらに傘を乗せてバランスを取る遊びをしたことはありませんか?倒立振子はまさにその状態を単純化(モデル化)したものです。
セグウェイの人に乗った状態がその例の一つで、人の重心移動に対して、うまくバランスをとり続けています。
今回は、そんな倒立振子をJavascriptを用いてシミュレーションしてみましょう。
方法
- 倒立振子の数式化
- 制御則の設計
- シミュレーション
数式化(モデル化)
まずは、倒立振子を数式で表してみます。ちなみにWikipediaに詳しく書いてあります。
最終的には、線形化を経て以下の方程式を得ることができます。
\begin{eqnarray}
x_{0,n+1}=x_{0,n} – \mu \frac{\partial{J}}{\partial{x_0}} = x_{0,n} + 4\mu\epsilon(x-x_0) \\
y_{0,n+1} = y_{0,n} – \mu \frac{\partial{J}}{\partial{y_0}} = y_{0,n} + 4\mu\epsilon(y-y_0)\\
z_{0,n+1} = z_{0,n} – \mu \frac{\partial{J}}{\partial{z_0}} = z_{0,n} + 4\mu\epsilon(z-z_0)\\
r_{n+1} = r_{n} – \mu \frac{\partial{J}}{\partial{r}} = r_{n} – 4\mu\epsilon{r}
\end{eqnarray}
制御則の設計
制御則とは、力の加え方のルールです。傘のイメージから、制御則を作ってみましょう。
傘のバランスを取る遊びでは、傘が傾いた方に手を動かすと、うまくバランスを取り続けることができます。
また、傾け過ぎるとバランスを取りづらくなりますよね。
したがって、以下の2つの要素が必要そうです。
- 傾きが小さくなるように力を加える。
- 少し傾いたら、傾いた方向に力を加える。
また、急に動かすのも操作するのが難しくなってしまいますよね。ですから、
- あまり早く動かさないようにする
これも必要そうです。これらを式で表現すると、以下の式が得られます。
ここに現れるkは係数で、「ゲイン」と呼ばれます。シミュレーションしながら、ゲインの値の大小を調整することで、バランスを取れるようにしましょう。