2016年1月3日日曜日

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

せっかく個人用(学生用)のMATLABを買ったので,それを使ってみましょう的な記事.
制御系の研究ではお馴染みの倒立振子のシミュレーションをやってみます.

動画はシミュレーションの様子.
実は,ToolBoxにSimscapeというものがありまして,その中のSimMechanicsではMATLAB上で3Dソリッドモデルを作るだけで物理シミュレーションができたりします.
ただし,今回は普通のSimulinkのみで行います(笑)
やっぱり解析的に色々するには,どちらにしろ運動方程式も立てないといけないので.
大体の場合において,制御をしようと思うと,運動方程式のパラメータから
制御系の設計パラメータを求める必要が出てきます.
そんな理由から,運動方程式を立てて,制御パラメータを決めていく方法で今回は制御系の設計を行います.
まずは倒立振子の運動方程式から.
倒立振子にも色々ありますが,今回は車輪型についてです.
製品では,ヴィストン株式会社のbeuto balancerなどがあります.
下の図のように,車輪と振り子部分から構成されていて,下の車輪が動くことで上の本体のバランスをとって倒立させるというものです.
enter image description here
制御すべきは,本体の位置と角度で,入力は車輪にあるモータへのトルク入力となっています.
つまりは,モータのトルク入力(電流入力)を与えて,倒立振子を倒さずに好きなところに移動させるという制御です.
ここで,θは本体の地面に対する角度,ϕは初期タイヤ角度からの変位量です.
ϕに関しては,ロボットの特性上,角度センサで地面との相対角度を取得して,ロータリーエンコーダでタイヤの回転角度を取得することが多いのでこのような設定としています.
(ロータリーエンコーダでは基本的にプログラム実行時の初期角度からの変化量しか取得できないので.)
この運動方程式の導出方法はいろいろあるかと思いますが,今回はラグランジュ法を使用していきます.
  1. まず,タイヤの回転軸中心(xc,yc)に関しては次の関係が得られます.
    {xc=r(θ+ϕ)˙xc=r(˙θ+˙ϕ)yc=0˙yc=0
  2. 次に,振子部分の重心位置(xp,yp)について,以下の関係が得られます.
    {xp=xc+lsinθ˙xp=r(˙θ+˙ϕ)+l˙θcosθyp=yc+lcosθ˙yp=l˙θsinθ
  3. これらの関係から,振り子部分の並進方向の運動エネルギKp1は,
    Kp1=12m(˙x2p+˙y2p)=12m(r2(˙θ+˙ϕ)2+2lr(˙θ+˙ϕ)˙θcosθ+l2˙θ2cos2θ+l2˙θ2sin2θ)=12m(r2˙θ2+2lr˙θ2cosθ+2lr˙ϕ˙θcosθ+2r2˙θ˙ϕ+r2˙ϕ2+l2˙θ2cos2θ+l2˙θ2sin2θ)
  4. 振り子の回転方向の運動エネルギKp2は,
    Kp2=12Jp˙θ2
  5. タイヤの並進方向の運動エネルギKc1は,
    Kc1=12M(˙x2c+˙y2c)=12M(r2(˙θ+˙ϕ)2)=12Mr2˙θ2+Mr2˙θ˙ϕ+12Mr2˙ϕ2
  6. タイヤの回転方向の運動エネルギKc2は,
    Kc2=12Jc(˙ϕ+˙θ)2
  7. モータ電機子の回転エネルギKc3は以下のように求められます.
    ここで,iはモータの減速比です.
    Kc3=12Jm(i˙ϕ+˙θ)2
よって,系全体の運動エネルギK,位置エネルギU,散逸エネルギFは,以下のように得られます.
K=Kp1+Kp2+Kc1+Kc2+Kc3U=mgyp+MgycF=12c˙ϕ2

ここから,ラグランジアンL=KUを求めます.(長い)
L=KU=12m(r2˙θ2+2r2˙θ˙ϕ+r2˙ϕ2+l2˙θ2cos2θ+l2˙θ2sin2θ)+12Jp˙θ2+12Mr2˙θ2+Mr2˙θ˙ϕ+12Mr2˙ϕ2+12Jc(˙ϕ+˙θ)2+12Jm(i˙ϕ+˙θ)2mglcosθ+mlr˙θ2cosθ+mlr˙ϕ˙θcosθ=12m(r2˙θ2+2r2˙θ˙ϕ+r2˙ϕ2+l2˙θ2cos2θ+l2˙θ2sin2θ)+12Jp˙θ2+12Mr2˙θ2+Mr2˙θ˙ϕ+12Mr2˙ϕ2+12Jc(˙ϕ2+2˙ϕ˙θ+˙θ2)+12Jm(i2˙ϕ2+2i˙ϕ˙θ+˙θ2)mgcosθ+mlr˙θ2cosθ+mlr˙ϕ˙θcosθ

これより,ラグランジアンの変数ごとの偏微分を求めます.
まずは変数ϕについて.
L˙ϕ=mr2˙θ+mr2˙ϕ+Mr2˙θ+Mr2˙ϕ+Jc˙ϕ+Jc˙θ+i2Jm˙ϕ+iJm˙θ+mlr˙θcosθddt(L˙ϕ)=mr2¨θ+mr2¨ϕ+Mr2¨θ+Mr2¨ϕ+Jc¨ϕ+Jc¨θ+i2Jm¨ϕ+iJm¨θ+mlr¨θcosθmlr˙θ2sinθLϕ=0F˙ϕ=c˙ϕ

次に変数θについて.
L˙θ=mr2˙θ+mr2˙ϕ+ml2˙θcos2θ+ml2˙θ2sin2θ+Jp˙θ+Mr2˙θ+Mr2˙ϕ+Jc˙ϕ+Jc˙θ+iJm˙ϕ+Jm˙θ+2mlr˙θcosθ+mlr˙ϕcosθddt(L˙θ)=mr2¨θ+mr2¨ϕ+ml2¨θcos2θ2ml2˙θ2sinθcosθ+ml2¨θsin2θ+2ml2˙θ2cosθsinθ+Jp¨θ+Mr2¨θ+Mr2¨ϕ+Jc¨ϕ+Jc¨θ+iJm¨ϕ+Jm¨θ+2mlr¨θcosθ2mlr˙θ2sinθ+mlr¨ϕcosθmlr˙ϕ˙θsinθLθ=ml2˙θ2cosθsinθ+ml2˙θ2cosθsinθ+mglsinθmlr˙θ2sinθmlr˙ϕ˙θsinθF˙θ=0

これまでにラグランジアンの偏微分が全て求まったので,運動方程式を導出します.
まず,変数ϕについての式から,
((M+m)r2+mlrcosθ+Jc+iJm)¨θmlrsinθ˙θ2+((M+m)2+Jc+i2Jm)¨ϕ+c˙ϕ=au

次に,変数θについての式から,
((M+m)r2+2mlrcosθ+ml2+Jp+Jc+Jm)¨θmlr˙θ2sinθmglsinθ+((M+m)r2+mlrcosθ+Jc+iJm)¨ϕ=0

これで,車輪型倒立振子の運動方程式の導出が完了しました.
ただし,uはモータに流れる電流,aはモータのトルク定数であり,auは入力トルクを表します.
このままでは使い勝手が悪いので,まずは倒立状態(θ0)付近かつ,静止状態(˙θ20)で線形化します.
このとき,sinθθcosθ1です.
{((M+m)r2+mlr+Jc+iJm)¨θ+((M+m)2+Jc+i2Jm)¨ϕ+c˙ϕ=au((M+m)r2+2mlr+ml2+Jp+Jc+Jm)¨θmglθ+((M+m)r2+mlr+Jc+iJm)¨ϕ=0

次に,状態方程式(行列形式)ベースに書き直します.
[α11α12α21α22][¨θ¨ϕ]+[0c00][˙θ˙ϕ]+[00mgl0][θϕ]=[a0]u

ただし,
α11=(M+m)r2+mlr+Jc+iJmα12=(M+m)r2+Jc+i2Jmα21=(M+m)r2+2mlr+ml2+Jp+Jc+Jmα22=(M+m)r2+mlr+Jc+iJm

更に変形して,
[¨θ¨ϕ]=[α11α12α21α22]1[0c00][˙θ˙ϕ][α11α12α21α22]1[00mgl0][θϕ]+[α11α12α21α22]1[a0]u

これらをまとめると,以下の状態方程式が得られます.
[˙θ˙ϕ¨θ¨ϕ]=[00100001[α11α12α21α22]1[00mgl0][α11α12α21α22]1[0c00]][θϕ˙θ˙ϕ]+[00[α11α12α21α22]1[a0]]u

ただし,
m=0.686[kg],M=0.0605[kg],
Jp=3.16×103[kgm2],Jc=5.35×106[kgm2],Jm=1.30×107[kgm2],
l=0.148[m],r=0.02[m],c=1.00×104i=30a=5.4580
次に,制御系の設計について.
今回は単純な状態フィードバックを使用しますが,この場合,全状態変数が観測できる必要があります.
現実には,ロボット本体の角度θとタイヤの角度ϕを測定し,他の2変数は推定することが多いかと思いますが,
シミュレーションですので,ここでは全状態変数が観測可能なものとして扱います.
つまり,状態方程式のCおよびDの項は以下のとおりです.
C=[1000010000100001],D=[0000]

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

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

このように表記した場合,Qの左上からそれぞれ,θϕ˙θ˙ϕに対する重みとなっています.
つまり,車体の角度θを素早くゼロに近づけ,安定化させることを重要視した重み,ということになります.
また,Rは入力に対する重みで,これを大きくすると入力をできるだけ小さく抑えたい,ということに相当します.
(このあたりの記述はあまり正確ではないかもしれません.)
MATLABを使う場合,この最小化は関数として用意されているので,次の記述だけで済みます.
gain = lqr(A, B, Q, R);
このABは状態方程式のA行列とB行列です.
ここから,状態フィードバックの係数がgainとして得られます.
gain = [-6.6700 -0.0447 -1.0000 -0.0583]
初期角度を5 deg.として安定化させ,5秒後にタイヤ4回転分だけ前に進めた時のシミュレーションが以下のようになります.
WheeledInvertedPendulum
しっかりと安定化でき,目標の位置にも追従できていることがわかります.
12秒時点で入力を切っているため,そこからは転倒してしまっています.
トップの動画は,これをProcessingで可視化したものです.
倒立振子の安定化制御はわりと色んな所で見るので試しにやってみた次第です.
近いうちに実機の方にも実装できるといいなあ.

9 件のコメント:

匿名 さんのコメント...

最後のシミュレーションでは、プラントモデルは
θ≒0, θ'≒0の近似を行う前のもので計算していますか?
入力を切ったあとの挙動が、提示されているものと一致しなくて…。

よろしければどの様にモデリングしているのか教えていただければ幸いです。

Hamachi さんのコメント...

匿名さん

はじめまして.Hamachiです.

仰るとおり,シミュレーションは近似前の式で実装しています.
近似後の式を利用すると発散するのでしょうか?

近似の直前に,φに関する式から~と,θに関する式から~という部分がありますが,
シミュレーションではこれを変形して使用しています.

具体的には2式を連立させて,φの2階微分と,θの2階微分について解き,以下の形式にします.

ddφ = Adφ + Bφ + Cdθ + Ddθ
ddθ = Edφ + Fφ + Gdθ + Hdθ

ddφはφの時間に関する2階微分,dφは1階微分,A~Hは定数です.
手動での導出はそれなりに大変なので,私はMaximaなどを使っています.

参考
https://hamachannel.hatenablog.com/entry/2018/01/14/120848#wxMaxima%E3%81%AB%E3%82%88%E3%82%8B%E9%81%8B%E5%8B%95%E6%96%B9%E7%A8%8B%E5%BC%8F%E5%B0%8E%E5%87%BA

2階微分の形式が得られたら,Euler法やRunge-Kutta法で離散近似すると,
非線形システムとしてのシミュレーションができるかと思います.
このときはMATLAB/Simulink標準のDormand-Princeだったように思います.

ご不明点などあればご連絡頂けると夜には落ち着いてご回答できるかと思います.
取り急ぎ,お返事まで.

匿名 さんのコメント...

Hamachiさん

ご返事ありがとうございました.

同じ結果になりました!
このページも参考ページも非常に勉強になりました.

ご対応ありがとうございました.

Hamachi さんのコメント...

匿名さん

解決されたようで良かったです!

Unknown さんのコメント...

Hamachi様

はじめまして、相馬と申します。

制御工学の勉強のために倒立振子を作成しており、
本ページを参考にさせていただいてます。

そこで本記事に関し一点、質問がございます。

「7.モータ電機子の回転~」の式で初めて登場する
「i」とは、何のことを指していますでしょうか。

もし宜しければ、ご回答いただきますと幸いです。

Hamachi さんのコメント...

相馬さん

はじめまして,Hamachiと申します.
あまり上等な記事ではありませんが,見ていただきありがとうございます.

見直してみたところ,たしかにiについて全く言及していませんでした.
ご不便をおかけしております.

iは,モータの減速比を表しています.
モータの軸の回転角度(速度)からタイヤの回転角度(速度)までは,モータに減速比が設定されている場合,i倍になるためです.
回転方向の完成もi倍されるため,このような項が現れています.

ついでにaについても言及していないようでしたのでここで.
回転方向の運動方程式 = au となっていることから,auはトルク(N.m)を表します.
例えばuを電流とすると,aはモータのトルク定数(逆起電力定数)を指すことになります.

分かりづらい説明で恐縮ですが,宜しくお願い致します.

Unknown さんのコメント...

Hamachi様

ご返信いただき、ありがとうございました。

iは減速比なのですね。式全体、それから単位を考えると
無次元量のようなので、納得しました。
auについても、丁度疑問に感じていたところでしたので
助かりました。ありがとうございます。

それと、恐れ入りますが、もう2点。
もし間違いでしたら申し訳ないですが、

①「ここから、ラグランジアンL=~」以下の式において、
-mgcosθとなっている個所は、正しくは-mglcosθでしょうか。
(下の方の式です)

②「これより,ラグランジアンの変数ごとの~」以下の
 「次に変数θについて.」以下の
 「∂L/∂θ・」の式において、(θ・→シートドットと思って下さい)
 4つ目の項がml^2θ・^2sin^2θとなっていますが、正しくは
 ml^2θ・sin^2θでしょうか。
 (真下の時間微分している場合も同様)
 
以上、お手数ですが、ご確認いただけますと助かります。

(学習のため1つ1つ計算したところ、上記を発見して気になりました。
 細かくて申し訳ないです。。)

相馬

Hamachi さんのコメント...

相馬さん

Hamachiです.

いろいろご指摘ありがとうございます.
改めて見直すと穴だらけですね……

①,②について仰る通りです.

①については"l"は後の式で復活しているので恐らく書き忘れです.

②については ∂L/∂dθのところ(dθは時間微分)は間違っていそうです.
ラグランジアンLのところで ( l^2 * θ^2 * cosθ^2 ) + ( l^2 * θ^2 * sinθ^2 ) は簡約化されて ( l^2 * θ^2 ) になるはずなので,そもそも消えていないのが変ですね.

ただ,これを時間微分したもの(d/dt(∂L/∂θ))については合っているような気がします.
( 2 * m * l^2 * dθ^2 * sinθ * cosθ ) は正負で2つ出現し,相殺されるはずです.
実際,上記の簡約化をした後に時間微分をすると,そもそも出現しないことが確認できるかと思います.

実は当時使っていたブログの編集サイトが閉鎖してしまい,修正に時間がかかりそうなのでその点ご容赦いただけると幸いです.

一応,Maximaという数式処理ソフトで計算してみたので,よろしければ参考にご覧ください.
パスワードはHamachiです.
http://whitecats.dip.jp/up/download/1558582929/attach/1558582929.pdf

pdfの基となったMaximaのファイルもありますので,ご入用であればご連絡いただければと思います.

Unknown さんのコメント...

Hamachi様

ご返信いただき、ありがとうございました。

>ただ,これを時間微分したもの(d/dt(∂L/∂θ))については合っているような気がします.

大変失礼致しました。此方でも再計算したところ、上掲の式が正しいことを確認しました。


>実は当時使っていたブログの編集サイトが閉鎖してしまい,修正に時間がかかりそうなので
>その点ご容赦いただけると幸いです.

大丈夫です、正しい式を確認するのが目的でしたし、Hamachi様からの返信でその目的は達成
できましたので。


>一応,Maximaという数式処理ソフトで計算してみたので,よろしければ参考にご覧ください.

ありがとうございます、参考にさせていただきます。


>pdfの基となったMaximaのファイルもありますので,ご入用であればご連絡いただければと思います.

重ね重ね、ありがとうございます。必要になった場合、再度連絡させていただきます。


相馬

コメントを投稿