二輪倒立振子の制御シミュレーション

32 views (last 30 days)
tomohiro kuwano
tomohiro kuwano on 22 May 2019
Answered: Hiroumi Mita on 14 Jun 2019
初めまして
現在、独立2輪型倒立振子のシミュレーションをするために
「simscape multibody」を使ってシミュレーション環境を作っています。
大まかな組み立てを以下に示します。
  1. ワールド座標系に地面モデルを剛結合
  2. ロボットの車軸中心にワールドを平行移動する用の座標系を作成
  3. ロボットの姿勢変化を表す座標系を作成
  4. ワールド座標系と2で作った座標系を「Planar Joint」で結ぶ
  5. 2で作った座標系と3で作った座標系を「Revolute Joint」で結ぶ
  6. 3で作った座標系とロボットのボディを剛結合する
  7. ロボットの両輪を「Revolute Joint」でボディに結ぶ
ロボットのワールド上の平行移動は、車輪の角速度とボディの姿勢変化(角速度)を基にPlanar Jointに入力しています。
ここでロボットの挙動を確かめるために、車輪への入力を0(角速度=0)にした状態でどのような動きをみせるか確認しました。
するとロボットは前方へ倒れ、1回転した後にその勢いを残したままもう1回転…。回転は止まらず、勢いもどんどん増していく。
といった挙動を見せました。
ロボットと地面の衝突は考えていないので、お互いが衝突しないのは構わないのですが、
回転が止まらずに勢いが増していくことの原因とそれを防ぐための対策が思いつかず困っています。
なにか解決策はありますでしょうか。
simulinkのデータは下記のgithubにおいてあります。
よろしくお願いします。

Answers (3)

Norihiro Kobayashi
Norihiro Kobayashi on 22 May 2019
はじめまして、モデルしっかりとは確認できておらず恐縮ですが、みたところ、タイヤ、BodyそれぞれのRevolute Jointの角度から並進、回転を計算しているようですが、この計算式が想定外の動作が起きていると予想されます。
Bodyの回転を0にすると前進が回避できることだけは確認を致しました。
タイヤの摩擦などを直接モデリングしにくいため、今回のようなモデルを構築頂いていると理解しましたが、
もしかすると、こちらのライブラリをお使い頂くとより簡単にモデリングが可能かもしれません。
以上ご参考になりましたら幸いです。
  1 Comment
tomohiro kuwano
tomohiro kuwano on 25 May 2019
返信が遅れてしまい申し訳ありません。
現在のモデルにかかっている力は-z方向への重力のみになっています。
現実の物理法則では、この重力以外にも駆動による作用反作用の力(慣性力など)がロボットに影響を与えるものと認識しており、今回の挙動を見る限り、お勧めしていただいたライブラリのような「接触による外力」は関係ないような気がします。

Sign in to comment.


Hiroumi Mita
Hiroumi Mita on 5 Jun 2019
>ロボットと地面の衝突は考えていないので、お互いが衝突しないのは構わないのですが、
>回転が止まらずに勢いが増していくことの原因とそれを防ぐための対策が思いつかず困っています。
>なにか解決策はありますでしょうか。
このシステムにおいて、
linear_model.mを実行すると、このシステムの伝達関数が得られます。
このシステムのzpk表現の伝達関数は
zpk_P = zpk(ss_P)
zpk_P =
-57.466 (s+3.418) (s^2 - 5.081s + 17.36)
----------------------------------------
s (s-5.974) (s+5.974) (s+27.64)
となり、s=5.974(>0)は、指数発散極となるので、システムは発散します。
もし、例えば、この発散が重力に負けてだんだん弱まるようにするのであれば
ロボットの本体の回転軸に、粘性摩擦(-C*dθ/dt)のような回転エネルギーを
減少させる力学要素をモデルに加えればよいと思います。
さて、このシステムは上記のように、現状は指数発散極を持つので
動きが発散するのは当然です。上記は、物理モデル的にシステムのふるまいがあるところで止まるようにするわけです。
別の方法としては、
状態フィードバック制御をかけて、フィード制御がかけられた閉ループの
極を安定側(複素平面の虚軸から見て右側)に移動させられれば
、システムは安定になるわけです。これが、いわゆる倒立振り子の制御です。
最終的にはそうされたいのだろうと推測しますが、もし、そうなら次のように
すこしずつ進めることをお勧めします。
まず、
#1. 本体だけのモデルを線形化して、状態フィードバック設計
倒立できることを確認
#2. #1.ができたら、
本体+タイヤのモデルを線形化して、状態フィードバック設計
倒立できることを確認
  1 Comment
tomohiro kuwano
tomohiro kuwano on 9 Jun 2019
返信ありがとうございます。
>このシステムにおいて、linear_model.mを実行すると、このシステムの伝達関数が得られます。
>s=5.974(>0)は、指数発散極となるので、システムは発散します。
>このシステムは上記のように、現状は指数発散極を持つので動きが発散するのは当然です。
まず初めに申し上げておきますと、
  • linear_model.mは自分が車輪型倒立振子を数学モデル化したもの
  • simscapeで表現した倒立振子モデルは手元にあるロボットをMATLAB上で再現したもの(制御系はまだ組んでない)
です。
linear_model.mの中には既に粘性摩擦による散逸エネルギーの項を含めています。ご指摘していただいたように指数発散極が出てしまってますが、状態フィードバックを組むことによって(解析上は)ロボットの姿勢角を制御することに成功しました。
次に、MATLAB simscapeで倒立振子を再現すれば制御系の実験ができると思い、色々調べながら再現していてぶつかった問題が本スレッドの問題になります。
前置きが長くなってしまいましたが、
指摘していただいた後に自分の組んだSimscapeモデルを見直したところ、ロボットの姿勢を表すRevolute Jointに粘性摩擦が加えられてないことに気づきました。確かにここが諸悪の根源だと思います。
粘性摩擦をsimscape上で表現する方法はわかりませんが、その辺を調べてみようと思います。参考になる資料などあれば教えていただきたく思います。

Sign in to comment.


Hiroumi Mita
Hiroumi Mita on 14 Jun 2019
最も簡単な方法なら、
Revolute JointのBlock Parameterに
Internal; Mechanicsがあります。
そこで、
#1.Spring Stiffness (バネ剛性)
#2. Damping Coefficient (ダンピング係数)
という2つのパラメータがあります。
#1. はRevolute Jointの回転軸回りの回転バネの固さ
#2. はRevolute Jointの回転軸回りの粘性係数
を示します。#2. に適当な値を入れれば回転粘性の特性を持たせることができます。

Products


Release

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!