みなさん,こんにちは
おかしょです.
このブログでは以前からPID制御に関する情報を公開してきました.
それは現在開発中の二輪型倒立振子ロボットをPIDで制御をするためです.
一通りPID制御の確認が済んだので,この記事では線形化した二輪型倒立振子にPID制御を適応した場合どのような応答を示すのか,数値シミュレーションを行った結果を報告します.
この記事を読むと以下のようなことがわかる・できるようになります.
- 倒立振子の制御方法
- PID制御のゲイン決定方法
- 倒立振子をPIDで制御した数値シミュレーションの結果
この記事を読む前に
この記事では二輪型倒立振子をPID制御器で制御をするシミュレーションを行います.その際にPID制御器のゲイン決定は以下の記事で解説している極配置法で決定しています.
ゲイン決定方法を詳しく知りたい方は,以下の記事を先に読んでおくことをおすすめします.
PID制御とは
PID制御というのは比例・積分・微分の3つの要素を有する制御器のことを言います.
この制御器はかなり古くから知られていて,多くのロボットで実際に利用されている制御器です.
この制御器が広く使用される理由は,その構造の簡便さにあります.
世の中には非常にたくさんの種類の制御器が存在しますが,環境の変化やさまざまな問題に対処しようとすればするほど制御器の構造が複雑になってしまいがちです.
しかし,このPID制御器はたった3つの要素で構成されているにもかかわらず,ゲインの調整次第で十分な性能を発揮することが可能となります.
この制御器のブロック線図はこのようになります.
目標値と現在の状態量との差を取り,それにPID制御器を掛けることによって制御入力を決定します.
このPID制御の欠点を上げるとすれば,ゲインの調整によってはシステムが安定な状態にはならないことがあります.
そのため,ゲインの調整は慎重に行う必要があります.
今回のような数値シミュレーションの場合は,いろいろなゲインを試して,応答を見ながら調整していけばいいのですが,実際のロボットの場合はシステムの状態が乱れると故障する恐れがあるのでそうもいきません.
このゲインの調整方法については以下で解説します.
PID制御のプログラム
先程も述べたようにPID制御器の構造は非常に単純です.
そのため,プログラムを書くのも簡単です.
比例動作によって求められる制御入力\(u_P\)は以下のようなプログラムで求められます.
$$ u_P = e \cdot K_P $$
ここで,\(e\)は目標値と出力の差を表します.
微分動作による制御入力\(u_D\)は
$$ u_D = \frac{e(i)-e(i-1)}{dt} K_D $$
となります.\(dt\)というのサンプリング時間を表します.
最後に積分動作は以下のように求められます.
$$ u_I = \{e(i)+e(i-1)\}\frac{dt}{2} K_I $$
ここでは積分法として台形則を利用しました.
PIDゲインの決定方法
冒頭でも言いましたが,PID制御器のゲインは極配置法によって決定します.
極配置法でゲインを求めるにはシステムの伝達関数が必要になります.
二輪型倒立振子の伝達関数はこちらの記事で求めているので,そちらを参照してください.以前の記事にもあるように二輪型倒立振子の伝達関数は分母多項式が3次になるので,極配置法によって求める方法はこちらの記事で解説しているものと同じになります.
3次のシステムの伝達関数に制御器の伝達関数を代入して極を指定したシステムと係数比較をすると以下の式が求められます.
\begin{eqnarray}
\left\{
\begin{array}{l}
1+K_D b_2 = 1 \\
a_2+K_P b_2+K_D b_1 = – (s_1+s_2+s_3+s_4) \\
a_1+K_I b_2+K_P b_1+K_D b_0 = s_1 s_2+s_2 s_3 +s_3 s_4+s_1 s_3+s_1 s_4+s_2 s_4\\
a_0+K_I b_1+K_P b_0 = –(s_1 s_2 s_3+s_1 s_2 s_4+s_2 s_3 s_4+s_1 s_3 s_4)\\
K_I b_0 = s_1 s_2 s_3 s_4
\end{array}
\right.
\end{eqnarray}
ここで,3次の伝達関数は以下としました.
\begin{eqnarray}
G(s) = \frac{b_2 s^2 +b_1 s +b_0}{s^3+a_2 s^2+a_1 s+a_0}
\end{eqnarray}
二輪型倒立振子の伝達関数に対応させると,係数は以下のようになります.
\begin{eqnarray}
\left\{
\begin{array}{l}
b_2 = 0 \\
b_1 = b_4 \\
b_0 = a_42 b_2-a_22 b_4 \\
a_2 = -(a_22+a_44) \\
a_1 = a_22 a_44-a_24 a_42-a_43 \\
a_0 = a_22 a_43-a_23a_42 \\
\end{array}
\right.
\end{eqnarray}
この記事から読んでいる方は係数が具体的にどのような物理量を表しているのかわからないと思います.そのような方は以下の運動方程式の導出をしている記事から読んでいってください.
上記のように係数を置くことで,極配置法によって係数比較をした式は以下のように書き換えることができます.
\begin{eqnarray}
\left\{
\begin{array}{l}
a_2+K_D b_1 = – (s_1+s_2+s_3+s_4) \\
a_1+K_P b_1+K_D b_0 = s_1 s_2+s_2 s_3 +s_3 s_4+s_1 s_3+s_1 s_4+s_2 s_4\\
a_0+K_I b_1+K_P b_0 = –(s_1 s_2 s_3+s_1 s_2 s_4+s_2 s_3 s_4+s_1 s_3 s_4)\\
K_I b_0 = s_1 s_2 s_3 s_4
\end{array}
\right.
\end{eqnarray}
これらの式を利用してゲインを求めるのですが,注意が必要です.求めたいゲインは3つなのに対して数式が4つあります.そのため,この中から3つの式を選んでゲインを求める必要があります.
ここで,二輪型倒立振子では\(b_0\)の値は0になります.したがって,一番下の式を用いて\(K_I\)を求めようとすると分母が0になってしまうので,上の3式を用いてゲインを求めることにします.このようにするとゲインは以下の式で求めることができます.
\begin{eqnarray}
\left\{
\begin{array}{l}
K_D = \frac{- (s_1+s_2+s_3+s_4)-a_2}{b_1} \\
K_P = \frac{ s_1 s_2+s_2 s_3 +s_3 s_4+s_1 s_3+s_1 s_4+s_2 s_4-a_1-K_D b_0}{b_1} \\
K_I = \frac{–(s_1 s_2 s_3+s_1 s_2 s_4+s_2 s_3 s_4+s_1 s_3 s_4)-a_0- K_P b_0}{b_1}
\end{array}
\right.
\end{eqnarray}
今回の数値シミュレーションでは極の位置を\(-5 \pm i,\ -2,\ -20\)としてゲインを求めました.
その結果,\(K_P=3.472,\ K_I=-27.145,\ K_D=0.7145\)となりました.
数値シミュレーション結果
数値シミュレーションでは倒立振子の初期角度を0.1radとして行いました.
その結果,振子の角度の時間履歴は以下のようになりました.
この図を見ると,特に乱れることなく振子の角度を安定化できていることがわかります.
しかし,次の図を見てみましょう.
この図はタイヤの回転角度の時間履歴になるのですが,振子の角度が安定化した後も回転をし続けています.これはつまり,倒立振子ロボットが移動し続けることを表しています.
私はこの倒立振子ロボットの実験を机の上で行う予定なのですが,この数値シミュレーションの結果通りなのであれば,すぐに机から落ちてしまうことが予想されます.
数値シミュ―ションでこのようなことになってしまう原因として考えられるのはI制御です.定常偏差がなくなったにもかかわらず倒立振子ロボットが移動を続けるのは,積分器によって誤差を積分しているからです.
この積分器には初期状態での誤差も含まれているため,定常偏差がなくなってもこの誤差の積分は0になることはありません.
そのため,常に入力が発生してしまい倒立振子ロボットが移動を続けます.これを解消するにはI制御をやめればいいと思うかもしれませんが,I制御をなくしてしまうと定常偏差が生じるため振子の安定化が難しくなってしまいます.
倒立振子ロボットの移動を止めるには現代制御で制御をする必要があります.
古典制御では1入力1出力のものしか制御できませんが,現代制御の場合は多入力多出力のものを制御することができます.つまり,振子の角度とタイヤの回転角を同時に制御することが可能となります.
まとめ
この記事では線形化した倒立振子をPID制御器で安定化させる数値シミュレーションの結果を報告しました.
その結果,振子を安定化させることには成功しましたが倒立振子ロボットの移動を止めることはできませんでした.
倒立振子の移動を止めるには現代制御を利用する必要があるのですが,そのためにはタイヤの回転角度を知る必要があります.
現在作成してある倒立振子ロボットではタイヤの回転角を知ることが出ないので,現代制御を適用することができません.
そこで,現在の倒立振子ロボットにはこのままPID制御器を適用してみたいと思います.
続けて読む
倒立振ロボットを開発していて,最終的には以下の記事で紹介しているようにゲインの調整などをパソコンのキーボードで行えるようにしたいと考えています.
Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.
それでは最後まで読んでいただきありがとうございました.
コメント