2016年1月3日日曜日

倒立振子シミュレーション(MATLAB/Simulink)

せっかく個人用(学生用)のMATLABを買ったので,それを使ってみましょう的な記事.

制御系の研究ではお馴染みの倒立振子のシミュレーションをやってみます.

動画はシミュレーションの様子.

実は,ToolBoxにSimscapeというものがありまして,その中のSimMechanicsではMATLAB上で3Dソリッドモデルを作るだけで物理シミュレーションができたりします.

ただし,今回は普通のSimulinkのみで行います(笑)

やっぱり解析的に色々するには,どちらにしろ運動方程式も立てないといけないので.
大体の場合において,制御をしようと思うと,運動方程式のパラメータから
制御系の設計パラメータを求める必要が出てきます.
そんな理由から,運動方程式を立てて,制御パラメータを決めていく方法で今回は制御系の設計を行います.

まずは倒立振子の運動方程式から.

倒立振子にも色々ありますが,今回は車輪型についてです.
製品では,ヴィストン株式会社のbeuto balancerなどがあります.

下の図のように,車輪と振り子部分から構成されていて,下の車輪が動くことで上の本体のバランスをとって倒立させるというものです.

enter image description here

制御すべきは,本体の位置と角度で,入力は車輪にあるモータへのトルク入力となっています.
つまりは,モータのトルク入力(電流入力)を与えて,倒立振子を倒さずに好きなところに移動させるという制御です.

ここで,は本体の地面に対する角度,は初期タイヤ角度からの変位量です.
に関しては,ロボットの特性上,角度センサで地面との相対角度を取得して,ロータリーエンコーダでタイヤの回転角度を取得することが多いのでこのような設定としています.
(ロータリーエンコーダでは基本的にプログラム実行時の初期角度からの変化量しか取得できないので.)

この運動方程式の導出方法はいろいろあるかと思いますが,今回はラグランジュ法を使用していきます.

  1. まず,タイヤの回転軸中心に関しては次の関係が得られます.

  2. 次に,振子部分の重心位置について,以下の関係が得られます.

  3. これらの関係から,振り子部分の並進方向の運動エネルギは,

  4. 振り子の回転方向の運動エネルギは,

  5. タイヤの並進方向の運動エネルギは,

  6. タイヤの回転方向の運動エネルギは,

  7. モータ電機子の回転エネルギは以下のように求められます.

よって,系全体の運動エネルギ,位置エネルギ,散逸エネルギは,以下のように得られます.

ここから,ラグランジアンを求めます.(長い)

これより,ラグランジアンの変数ごとの偏微分を求めます.

まずは変数について.

次に変数について.

これまでにラグランジアンの偏微分が全て求まったので,運動方程式を導出します.

まず,変数についての式から,

次に,変数についての式から,

これで,車輪型倒立振子の運動方程式の導出が完了しました.

このままでは使い勝手が悪いので,まずは倒立状態付近かつ,静止状態で線形化します.
このとき,です.

次に,状態方程式(行列形式)ベースに書き直します.


ただし,

更に変形して,

これらをまとめると,以下の状態方程式が得られます.

ただし,
[kg],[kg],
[kgm],[kgm],[kgm],
[m],[m],

次に,制御系の設計について.

今回は単純な状態フィードバックを使用しますが,この場合,全状態変数が観測できる必要があります.
現実には,ロボット本体の角度とタイヤの角度を測定し,他の2変数は推定することが多いかと思いますが,
シミュレーションですので,ここでは全状態変数が観測可能なものとして扱います.

つまり,状態方程式のおよびの項は以下のとおりです.

状態フィードバックの係数は,最適制御で行います.
最適制御では,各状態変数と入力に対する「重み」を設定して,以下の評価関数が最小となるような状態フィードバックの係数を求めます.

状態変数に対する重みは,入力に対する重みはで表すことが多いかと思います.
今回は,例として以下のを設定しました.

このように表記した場合,の左上からそれぞれ,に対する重みとなっています.
つまり,車体の角度を素早くゼロに近づけ,安定化させることを重要視した重み,ということになります.

また,は入力に対する重みで,これを大きくすると入力をできるだけ小さく抑えたい,ということに相当します.
(このあたりの記述はあまり正確ではないかもしれません.)

MATLABを使う場合,この最小化は関数として用意されているので,次の記述だけで済みます.

gain = lqr(A, B, Q, R);

このは状態方程式の行列と行列です.
ここから,状態フィードバックの係数がgainとして得られます.

gain = [-6.6700 -0.0447 -1.0000 -0.0583]

初期角度を5 deg.として安定化させ,5秒後にタイヤ4回転分だけ前に進めた時のシミュレーションが以下のようになります.

WheeledInvertedPendulum

しっかりと安定化でき,目標の位置にも追従できていることがわかります.
12秒時点で入力を切っているため,そこからは転倒してしまっています.

トップの動画は,これをProcessingで可視化したものです.

倒立振子の安定化制御はわりと色んな所で見るので試しにやってみた次第です.
近いうちに実機の方にも実装できるといいなあ.

0 件のコメント:

コメントを投稿