MotionSolveを使用した連成シミュレーション
Tutorial Level: Advanced 倒立振り子のマルチボディシステム(MBS)モデルを構築し、制御システムモデルと組み合わせて、この二つのモデルの連成シミュレーションを実行する方法を学習します。
このチュートリアルのファイル
Inverted_Pendulum_Tutorial.scm、Inverted_Pendulum_Tutorial.mdl
連成シミュレーションと前提条件の概要
連成シミュレーションにより、シミュレーション中にMotionSolveマルチボディダイナミクス(MBS)モデルとTwin Activateモデルの間でのコミュニケーションを可能にします。
連成シミュレーションの最適な適用例は、MBSモデル用制御システムの開発です。本チュートリアルでは、倒立振り子向けにそのような制御システムを開発する方法を説明します。
倒立振り子とは、動いている線路上のカートに取り付けたピボットポイントの周りを水平に動く振り子など、ピボットポイントの上方に重心がある振り子のことです。通常の振り子は吊り下げると安定するのに対して倒立振り子は本質的に不安定であるため、真っすぐに保つにはピボットポイントにトルクを与えるか、またはフィードバックシステムの一部としてピボットポイントを水平に動かして能動的にバランスをとる必要があります。
本チュートリアルでは、子供が手の上で棒のバランスをとるのと同じように、カート上で水平に作用する制御力を設計して振り子を直すぐに保つ方法を説明します。倒立振り子は力学と制御理論における代表的な問題であるため、制御方式をテストするためのベンチマークとして使用されます。現実世界での倒立振り子問題の例には、発射時のロケットの姿勢制御やセグウェイ電動車のバランス維持と動きなどがあります。
前提条件
連成シミュレーションを実行するには、HyperWorks MotionSolveソフトウェアをインストールする必要があります。MotionSolveは、複数の分野にわたるシミュレーションにモデリング、解析、可視化、最適化のための強力な機能を提供します。このようなシミュレーションとして、運動学 / 動力学上のシミュレーション、静的 / 準静的シミュレーション、線形シミュレーションと振動のシミュレーション、応力 / 耐久性のシミュレーション、荷重抽出、連成シミュレーション、工数推定、パッケージングのシミュレーションなどがあります。
ソフトウェアパス設定の定義
ローカルおよびリモートの連成シミュレーション方法に必要なMotionSolveおよびその他のソフトウェアへのパスを定義します。
-
ファイルメニューからプリファレンスボタンを選択します。
プリファレンスダイアログが開きます。
-
ダイアログの左側のカラムで、Twin ActivatePathsのカテゴリを選択します。
-
プリファレンスごとにインストールパスを入力して適用をクリックします。
プリファレンス パス MotionView <HyperWorks_install_path>/hwdesktop/hw/bin/platform MotionSolve <HyperWorks_install_path>/hwsolvers/motionsolve/bin/platform MotionSolve License (Radflex) <HyperWorks_install_path>/hwsolvers/common/bin/platform Python (HyperWorks 2021の場合)。<HyperWorks_install_path>/common/python/python3.5/platform
(HyperWorks 2020の場合)。<HyperWorks install_dir>/hwdesktop/common/python/python3.5/platform
倒立振り子の構築
カート上の倒立振り子のマルチボディシステム(MBS)モデルを構築します。
MBSモデルのエンティティ
- 振り子
- カート
- 振り子をカートに結び付けるためのロッド
- カートの動きを水平方向に制限するためのレール
- カート上に配置された、振り子とカートの間のピボット
形状を構築する
MotionViewソフトウェアを使用して、倒立振り子の形状を作成します。
- MotionViewを起動して、新しいモデルを作成します。
-
次の名前と位置を使用して、形状の3つのポイントをモデルに追加します:
ポイント X Y Z PivotCenter 300 0 0 PendulumCenter 350 0 300 Z-Direction 400 0 600 - モデルをInverted_Pendulum.mdlという名前で保存します。
ボディを追加する
振り子とカートをモデルに追加します。
- ボディエンティティを挿入してCartというラベルを付けます。
- このCartでは、CM CoordinatesをPivotCenterポイントに設定します。
- 2つ目のボディエンティティを挿入してPendulumというラベルを付けます。
- Pendulumでは、CM Coordinatesを PendulumCenterポイントに設定し、Z軸をZDirectionポイントの方向に設定します。
-
これらのボディについて以下の慣性プロパティを入力します:
ボディ ID 質量(kg) Ixx (kg-mm^2) Iyy (kg-mm^2) Izz (kg-mm^2) Cart b_0 0.45 100 100 100 Pendulum b_1 0.2 32 32 32
ジョイントを追加する
回転ジョイントと並進ジョイントをモデルに追加します。
-
回転ジョイントを挿入してPendulumPivotというラベルを付け、Connectivityパラメーターを次のように設定します:
-
初期条件を次のように設定します:
-
並進ジョイントを挿入してCartTranslationというラベルを付け、Connectivityパラメーターを次のように設定します:
-
初期条件を次のように設定します:
グラフィックスを追加する
グラフィックスは、アニメーションでのモデルの挙動を理解するために不可欠です。
- 円筒グラフィックスを挿入してRailというラベルを付けます。
- Connectivityパラメーターで、親ボディをGround Body、原点をGlobal Origin、方向をGlobal Xベクトルにそれぞれ設定します。
-
プロパティを次のように設定します:
- 球体グラフィックスを挿入してPendulumというラベルを付けます。
- Connectivityパラメーターで、親ボディをPendulum、原点を PendulumCenterにそれぞれ設定します。
- プロパティで半径を20に設定します。
- 円筒グラフィックスを挿入してRodというラベルを付けます。
- Connectivityパラメーターで、親ボディをPendulum、原点を PendulumCenter、方向を PivotCenterポイントにそれぞれ設定します。
-
プロパティを次のように設定します:
- ボックスグラフィックスを挿入してCartというラベルを付けます。
-
Connectivityパラメーターで、タイプをCenter、親ボディをCart、原点をPivotCenter、Z軸をベクトルGlobal Z、ZX平面方向をベクトルGlobal Xにそれぞれ設定します。
-
プロパティを次のように設定します:
荷重を追加する
並進荷重をカートに適用します。
-
Connectivityタブで荷重frc_0を追加してControl Forceというラベルを付け、Connectivityプロパティを次のように設定します:
-
Connectivityタブで2つ目の荷重frc_1を追加してPivotTorqueというラベルを付け、Connectivityプロパティを次のように設定します:
-
Inverted_Pendulum_Tutorial.mdlという名前で保存します。
を選択して、モデルを
MBSモデルの連成シミュレーション向け変更
ソルバー配列やソルバー変数などのMotionViewエンティティを追加することで、基本的なMBSモデルを連成シミュレーション用に変更します。
ソルバー変数を追加する
-
2つのソルバー変数ControlForce (varname: sv_0)およびPivotTorque (varname: sv_1) を以下のように作成します。
-
これら2つのソルバー変数を前のセクション荷重を追加するで作成した荷重に接続します。
ControlForceのTrans Propertiesタブで、次の図のようにFxにExpressionを選択し、fに`VARVAL({sv_0.id})`と入力します。この式は、ControlForceを1つ目のソルバー変数sv_0に指定します。この変数は、Twin Activateから送信された制御信号をCartの並進ジョイントに作用する制御荷重として設定します。
-
varnameが(sv_0)と一致することを確認します。ソルバー変数をExpression Builderから名前で選択し、そのIDを次の図のように入力します:
-
PivotTorqueのRot PropertiesタブでTyにExpressionを選択し、fに`VARVAL({sv_1.id})`と入力します。この式は、PivotTorqueを2つ目のソルバー変数sv_1として設定します。この変数は、Twin Activateから送信された制御信号を振り子の回転に作用するトルクとして指定します。
- 3つの追加ソルバー変数であるAngularDeviation、AngularRate、およびCartPositionを挿入します。
-
AngularDeviationにsv_2を入力します。タイプでExpressionを選択して、
`RTOD(AY({b_1.cm.idstring}))`
と入力します。ここで、b1
はPendulumボディのIDです。AY
関数は、引数として指定したマーカーのY
軸周りの角度(A
ngle)を返します。この角度の単位はラジアンであるため、RTOD
関数を適用してラジアン(R
adians)を度に(TO
D
egrees)変換します。 -
Angular Rateにsv_3と入力します。タイプでExpressionを選択して、
`RTOD(WY({b_1.cm.idstring}))`
と入力します。ここで、b2
はPendulumボディのIDです。 -
Car Positionにsv_4と入力します。タイプでExpressionを選択して、
`DX({b_0.cm.idstring})-300`
と入力します。ここで、b1
はカートボディのIDです。 -
2つのソルバー配列を挿入し、ControlInput、PlantOutputというラベルを付けます。
-
ControlInputソルバー配列は、PivotTorqueとControlForceの両ソルバー変数を含んでいます。プロパティを次のように設定します:
-
PlantOutputソルバー配列は、AngularDeviation、AngularRate、CartPositionというソルバー変数を含みます。Plant Outputプロパティは次のように設定します:
-
適切なソルバー変数名を選択しやすくするために、
をクリックすると、次のパネルが表示されます:
- モデルをInverted_Pendulum_Tutorial.mdlという名前で保存します。
倒立振り子モデルの検証
MotionSolveでMBSモデルをシミュレートして、このモデルが要求どおりに実行されることを検証します。
- Runパネルで、Save and run current modelオプションを選択します。
- フォルダアイコンを選択して、MotionSolveモデル(XMLファイル)を保存するためのパスと名前を入力します。任意の名前を指定できますが、MotionViewモデルと同じルート名を使用することをお勧めします。ソルバーの実行には、このXMLファイルが必要です。パスを入力する際は、チュートリアルのデフォルトディレクトリが書き込み不可になっている可能性があるので、必要に応じて、別のディレクトリを指定するか、ディレクトリの書き込み権限を変更します。
-
Runパネルで、モデルをXMLファイルとして保存します。このファイルはソルバーの実行に使用されるだけでなく、Twin Activateモデルでも使用されます。あるいは、MotionViewの.mdlファイルを実行してInverted_Pendulum_Tutorial.xmlという名前を付けることもできます。
-
シミュレーションの結果をアニメーション表示してモデルが意図したように動作することを確認し、次のステップに進みます。コントローラーはモデルにまだ接続されていないため、入力される荷重とトルクはゼロです。
制御システムモデルの構築
Twin Activateを使用して制御システムモデルを構築します。
制御システムモデルには、以下のブロックが必要です:
ブロック | 説明 |
---|---|
MotionSolve | MotionSolveモデルをTwin Activateモデルに組み込むことを可能にします。 |
Mux | 複数の信号を1つの信号として読み込みます。 |
Demux | 複数の成分を含む信号を読み込んで個々の成分に分解します。 |
OMLCustomBlock | |
Scope | データを指定に沿ってプロットします。 |
Constant | コマンド信号を生成します。 |
PID | モデルの頭脳であるコントローラーブロックとして機能します。 |
Sum | 基準信号とフィードバックから誤差を計算します。 |
Twin Activateモデルのダイアグラムの作成
- リボンで、 を選択します。
- パレットブラウザからMotionSolveブロックを現在のダイアグラムにドラッグ&ドロップします。 を選択し
-
ダイアグラムで、このMotionSolveブロックをダブルクリックします。表示されたダイアログで以下のブロックプロパティを定義します:
プロパティ 操作 XMLまたはMDLの入力ファイル名(XML or MDL input filename) MotionViewの.mdlモデルまたはMotionSolveの.xmlファイルへのパスをコピー&ペーストします。 MRF出力ファイル名(MRF output filename) 出力マルチボディ結果ファイルへのパスを入力します。 直接フィードスルー(Direct feedthrough) このオプションのチェックボックスをオフにします。 直接フィードスルーでは、ブロックの出力がその入力で直接変化するかどうかを定義します。例として、y = K*uによって代数ループが発生するゲインブロックがあります。この結果が望ましくない場合は、このチェックボックスをオフにしてループが終了するようにします。
注: 入力モデル(*.mdlまたは*.xml)を読み込むと以下のパラメーターが自動的に入力されます:パラメーター 定義値 入力(Input) / 行数(Row Size) 2という値は、Twin ActivateモデルからMotionSolveモデルに2つの信号が送信されることを示します。これらの信号は、 PivotTorque変数とControlForce変数を含むソルバー配列PlantInputに対応します。 出力(Output) / 行数(Row Size) 3という値は、MotionSolveモデルが1つのポートから3つの信号を送信することを示します。そのため、Demuxブロックを追加してこれらの信号を分離します。これらの信号は、AngularRate、AngularDeviation、CartPositionという変数を含むソルバー配列ControlOutputに対応します。 - パレットブラウザで、Sumブロックをダイアグラムにドラッグ&ドロップします。 から
- パレットブラウザで、DemuxブロックとMuxブロックをダイアグラムにドラッグ&ドロップします。 から
- DeMuxブロックをダブルクリックして、ブロックダイアログで、出力数(Number of outputs)として3を入力します。
-
以下のいずれかを行ってください:
- 180ºから180ºの間の角度を制限する関数を含むスーパーブロックを作成します。以下に例を示します。
- 別の方法として、OmlCustomBlockを追加します。ブロックダイアログボックスで、SimFunctionタブを選択し、Function Codeに以下の関数を入力します:
function OmlBlockFunction(block,flag)
angle=vssGetInPortData(block,1);
if flag==vssBlockOutputUpdateFlag
x= mod(angle(1),360);
if(x>180)
x=-360+x;
end
vssSetOutPortData(block,1,x,vssGetOutputDataType(block,1));
end
end
- 180ºから180ºの間の角度を制限する関数を含むスーパーブロックを作成します。以下に例を示します。
-
パレットブラウザで、Scopeブロックを3つダイアグラムにドラッグ&ドロップします。
から、これらのScopeブロックは、AngularDeviation、AngularRate、およびCartPositionの応答に対応しています。これらの応答の軸と曲線のプロパティに対するスコープブロックパラメーターを定義します。
- パレットブラウザで、PIDブロックを2つダイアグラムにドラッグ&ドロップします。 から、
- 1つ目のPIDブロックを選択します。Property Editorから、 を選択して、PID1_AngularDeviationという名前を入力します。
- 2つ目のPIDブロックを選択します。Property Editorから、 を選択して、次の名前を入力します:PID2_CartPosition
-
PID1_AngularDeviationブロックをダブルクリックして、次のパラメーター値を入力します:
注:
- 比例ゲイン(Proportional Gain)は、誤差信号に定数ゲインKpを掛けます。
- 積分ゲイン(Integral Gain)は、誤差の合計履歴に積分ゲインKiを掛けます。
- 微分ゲイン(Derivative Gain)は、誤差の変化率にゲインKdを掛けます。
-
PID2_CartPositionブロックをダブルクリックします。ダイアログで、次のパラメーターを定義します:
- パレットブラウザで、Constantブロックをダイアグラムにドラッグ&ドロップします。 から
- Constantブロックをダブルクリックします。ダイアログで、定数(Constant)に0と入力します。
- Constantブロックを選択して、このブロックをダイアグラムにコピー&ペーストして複製を作成します。
-
これで、必要なすべてのブロックが配置されました。ダイアグラムにあるブロックを次のように組み立てて結び付けます:
- このダイアグラムで実験し、PIDゲインパラメーターを変更してシミュレーションに与える影響をご確認ください。
ダイアグラムのシミュレーション
-
リボンでを選択します。
- 表示されたダイアログで、シミュレーション時間(Simulation Time)タブを選択します。
-
最終時間に7と入力して、シミュレーションが7秒間実行されることを指定します。
これでモデルが完成し、モデルをシミュレートする準備が完了しました。
-
リボンでRunを選択します。
モデルにあるScopeブロックによって、カートのプロットとして角偏差、角速度、およびカート位置が生成されます。 - PIDゲインパラメーターを変更して、これらのパラメーターがシミュレーションに与える影響を検証することで、このダイアグラムで疑似実験します。