【難しい数式は無し】Sliding Mode 制御の概念解説

SlidingModeControlの簡単説明 勉強

こんにちは、アキホです。

 

機械/電気 修士卒で、現在自動車開発に携わっています。

理系ならではの観点から、理論立てて モノ/事 を紹介していきたいと思います。

 

今回は

【難しい数式は無し】Sliding Mode 制御(Sliding Mode Control)の概念に関する解説

です。

 

こんな悩み事を抱えている人向けの記事です。

Sliding Mode Controlってそもそも何なの?

・大学の研究テーマになったけどよくわからない。

・大学の授業にちらっと出てきたけどイマイチわからない。

Sliding Mode Controlのイメージだけでいいからわかりやすく教えて!

・ネットで出てくる内容難しすぎる。。。

・勉強しようにもSliding Mode Controlの本高すぎて買えない。。。

 

記事を読む価値として

Sliding Mode Controlに関してイメージをつかみやすいよう細かい数式は使わず概念を説明します。

 

記事の根拠として

私は2年間Sliding Mode Controlを研究していて、国際論文を出しています。

Keita Akihoの論文

 

前提として、制御理論において、難解な数式は切り離せません。

でも、最終的なイメージが分かってから数式を解くのと、解かないのでは全然違います。

制御は数式を解くのが目標ではなく、制御対象物を目標動作へと導く事が目標なのですから。

 

Sliding Mode Controlはこんな感じ

 

PID制御

Sliding Mode Control

 

では、内容に移っていきます。

Sliding Mode Controlの概念

Sliding Mode Controlは、ある任意の目標関数(超平面 / Sliding Surface)に縛り付ける制御です。

言葉だけを見ると、なんだか難しいですね。実例を使って考えてみましょう!

 

モーターを例にSliding Mode Controlがどんな制御をするのか考えてみましょう!

設計者がこの角度に制御したい!という目標角度Θに対して計測値Θ_meas0にするような目標関数S(超平面 / Sliding Surface)を定義すると

S = Θ – Θ_meas = 0

となります。

 

つまり、

目標関数S=0 に縛り付ける = 設計者が決めた目標値に収束していく

ということになります。

スライディングモードの安定条件 S×S_dot < 0

よく見るリアプノフの安定定理なんて言われてもわからないですよね。。。

私ももっとわかりやすく解説してくれ!!!って何度も思いました。(笑)

 

では、いろいろなところで見る安定条件に付いて、目標関数S上で考えてみましょう!


S>0 領域について

上の領域S>0について考えてみましょう。

この時S_dot(Sの微分です)が、S_dot > 0 の場合どうなるでしょう?

 

傾きが正なわけですから、どんどん増加していきますよね。

つまりS=0から離れて行ってしまうので、この領域においてはS_dot0でなければいけないのです。

 

S<0 領域について

では、下の領域S<0についても同様に考えてみましょう。

この時S_dotの傾きが、S_dot>0の場合、傾きが正なわけですから、S=0に近づいていくことになりますよね。

 

S=0 に縛り付けるためには?

  • Sdot < 0 in S>0 area
  • Sdot > 0 in S<0 area

が条件なわけです。

 

もうわかりましたか??

つまりS のどの領域においてもS×S_dot<0であれば、S=0に向かっていくことになります。

 

だからどの論文でも、

S×S_dot<0 を満たせるような入力u を導出

しているわけなんですよね。

 

入力関数signって?

本記事ではS=0に縛り付けるをキーワードとして出していますよね。

入力は、まさにS=0に縛り付けるためには、どんな値を入れてやればいいのかということになります。

モーターでいうと入力電圧になりますね!

 

縛り付けてやるためには、

S>0 / S<0 で違う入力を用意してあげる必要がありそうですね!

 

そこで、sign関数の出番です!

sign(a) =

  • -1  in  a<0 
  • 1  in  a>0

 

つまり、引数aSにしてあげれば、Sの切り替わり部分で入力を変更できますよね!

 

一般的に

u = u_0 * sign(S)

として入力を定義し、S×S_dot<0を満たすようu_0を算出してやれば、

u_0を出力している限りS×S_dot<0が成り立ち、Sに縛り付けられる。

 

つまり、目標値へと収束させられるわけですね!

 

理論は分かったけど、結局何がいいの?

皆さんPID制御はご存じですか?

現在も産業界で多々使われている制御手法です。

 

例えば先ほどの目標関数を用いると、PIDの入力u_pidは以下のように表現できます。

S = Θ – Θ_meas なので、

u_pid = K1*S + K2*∫S + K3*dS/dt

K1,K2,K3は調整用パラメータ

 

この時冒頭の動画のように手でロボットを押さえつけると、

積分値K2∫S がどんどん大きくなってしまいます。

 

つまり手を離すと、急に大きな入力が与えられるので、暴れてしまう挙動になってしまうのです。。

それに対して、Sliding Mode Controlですと誤差の積分項が入っていませんので、スムーズに目標値に縛り付ける事が出来るのです!

 

じゃあ、デメリットはないの?

もちろんあります。

それはsign関数によるものですね。

 

sign関数は引数として使用しているSの値も符号が変わった瞬間に、変化する関数です。

 

つまり、縛り付けているときにも割と大きな入力 u_0 で拘束しているわけです。

目標関数S(超平面 / Sliding Surface)に着目してみてみると、このように振動してしまうのがデメリットなのですね。

例えば、目標値のΘに縛り付けようとしているが、Θ ± 1°の範囲で振動してしまう。

 

ですが、以下のようにSの符号が切り替わった瞬間に、signの値を変化させられれば

解決できると思いませんか?

 

ただ、現実はそうはいきません。

振動する振幅は抑えられてもとてつもなく強い力 u_0で縛り付けているわけなので、モータに適用するだけでも”ブーーーーーーーー”とすごい振動音が聞こえてきます。(笑)

 

でも動画でそんな音なってないよね?

そうです。

Sliding Mode Controlには対策があります。

 

それはsign関数を使用しないことです。

Tanh関数を使うことでS=0付近の入力値を小さくすることが出来るんです。

具体的に考えてみましょう。

u_sign = u_0 sign(S)

u_tanh = u_0 tanh(S)

としたときに、S0付近の値(今回はS=0.5で考えてみましょう)とすると

u_sign = u_0

u_tanh = 0.48 * u_0

となりますね。

 

つまり、Sに近づくほど入力値を適切にすることが出来るんですね!

 

ただし、これにもデメリットがあります。(四方八方デメリットがありますね。笑)

それはS=0近傍では入力が小さいため、安定しているときの縛り付け能力が小さい事です。

 

つまり

・目標角度に収束していても、弱い力で一瞬目標からずれてしまう

・定常偏差と呼ばれる目標値との差が発生してしまう

 

定常偏差対策としては、PIDのように積分項を入れる事で対策できますが、

結局PIDと変わらないですよね。。

 

巷では、積分項を入れたSliding ModeをSuper Twisting Sliding Mode Controlと呼んでいます。

なんだかかっこいいですね。

 

現実はTanh関数のパラメータ調整が落としどころでしょうね。

 

まとめ

Sliding Mode Controlに関してつらつら書き殴ってみました。

 

結局のところ、メリット/デメリットがありますので万能な制御ではありません。

しかし、今回まとめた内容を抑えたうえで適用すれば、従来の制御手法より品質を向上できるかと思います。

 

では、今回はこんなところで。

 

コメント

タイトルとURLをコピーしました