チュートリアル:MotionSolveを使用した連成シミュレーション

倒立振り子のマルチボディシステム(MBS)モデルを構築し、制御システムモデルと組み合わせて、この二つのモデルの連成シミュレーションを実行する方法を学習します。

このチュートリアルのファイル

Inverted_Pendulum_Tutorial.scm、Inverted_Pendulum_Tutorial.mdl

チュートリアルで構築するモデルの完成版と、チュートリアルを完了するために必要なすべてのファイルは、次の場所にあります:<installation_directory>/tutorial_models/

連成シミュレーションと前提条件の概要

連成シミュレーションにより、シミュレーション中にMotionSolveマルチボディダイナミクス(MBS)モデルとActivateモデルの間でのコミュニケーションを可能にします。

連成シミュレーションの最適な適用例は、MBSモデル用制御システムの開発です。本チュートリアルでは、倒立振り子向けにそのような制御システムを開発する方法を説明します。

倒立振り子とは、動いている線路上のカートに取り付けたピボットポイントの周りを水平に動く振り子など、ピボットポイントの上方に重心がある振り子のことです。通常の振り子は吊り下げると安定するのに対して倒立振り子は本質的に不安定であるため、真っすぐに保つにはピボットポイントにトルクを与えるか、またはフィードバックシステムの一部としてピボットポイントを水平に動かして能動的にバランスをとる必要があります。

本チュートリアルでは、子供が手の上で棒のバランスをとるのと同じように、カート上で水平に作用する制御力を設計して振り子を直すぐに保つ方法を説明します。倒立振り子は力学と制御理論における代表的な問題であるため、制御方式をテストするためのベンチマークとして使用されます。現実世界での倒立振り子問題の例には、発射時のロケットの姿勢制御やセグウェイ電動車のバランス維持と動きなどがあります。

前提条件

連成シミュレーションを実行するには、HyperWorks MotionSolveソフトウェアをインストールする必要があります。MotionSolveは、複数の分野にわたるシミュレーションにモデリング、解析、可視化、最適化のための強力な機能を提供します。このようなシミュレーションとして、運動学 / 動力学上のシミュレーション、静的 / 準静的シミュレーション、線形シミュレーションと振動のシミュレーション、応力 / 耐久性のシミュレーション、荷重抽出、連成シミュレーション、工数推定、パッケージングのシミュレーションなどがあります。

ソフトウェアパス設定の定義

ローカルおよびリモートの連成シミュレーション方法に必要なMotionSolveおよびその他のソフトウェアへのパスを定義します。

  1. ファイルメニューからプリファレンスボタンを選択します。
    プリファレンスダイアログが開きます。
  2. ダイアログの左側でActivate Pathsのカテゴリを選択します。
  3. プリファレンスごとにインストールパスを入力してApplyをクリックします。
    このプリファレンスに対する処理 入力するパス
    MotionView HyperWorks_install_path/hwdesktop/hw/bin/platform
    MotionSolve HyperWorks_install_path/hwsolvers/motionsolve/bin/platform
    MotionSolve License HyperWorks_install_path/hwsolvers/common/bin/platform
    Python

    Activateインストレーションに含まれるPythonインタープリターのパスを入力します。ただし、MotionSolve インストレーションに含まれるPythonインタープリターを使用する必要がある場合は、以下を入力します。(HyperWorks 2020.1の場合)

    HyperWorks_install_path/Altair/2020.1/hwsolvers/common/python/python3.5/platform

倒立振り子の構築

カート上の倒立振り子のマルチボディシステム(MBS)モデルを構築します。

このモデルを構築するには、MotionViewに関する基本的な知識が必要です。代わりに、Activateインストールファイルのtutorial_modelsディレクトリにあるInverted_Pendulum_Tutorial.mdlという完成済みモデルを読み込んで、このチュートリアルセクションをスキップすることもできます。

MBSモデルのエンティティ

  • 振り子
  • カート
  • 振り子をカートに結び付けるためのロッド
  • カートの動きを水平方向に制限するためのレール
  • カート上に配置された、振り子とカートの間のピボット

形状を構築する

MotionViewソフトウェアを使用して、倒立振り子の形状を作成します。

  1. MotionViewを起動して、新しいモデルを作成します。
  2. 次の名前と位置を使用して、形状の3つのポイントをモデルに追加します:
    ポイント X Y Z
    PivotCenter 300 0 0
    PendulumCenter 350 0 300
    Z-Direction 400 0 600
  3. モデルをInverted_Pendulum.mdlという名前で保存します。

ボディを追加する

振り子とカートをモデルに追加します。

振り子をカートに結び付けるロッドは、グラフィックとしてのみ含める、質量がゼロのボディです。
  1. ボディエンティティを挿入してCartというラベルを付けます。
  2. このCartでは、CM CoordinatesをPivotCenterポイントに設定します。
  3. 2つ目のボディエンティティを挿入してPendulumというラベルを付けます。
  4. Pendulumでは、CM Coordinatesを PendulumCenterポイントに設定し、Z軸をZDirectionポイントの方向に設定します。
  5. これらのボディについて以下の慣性プロパティを入力します:
    ボディ 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

ジョイントを追加する

回転ジョイントと並進ジョイントをモデルに追加します。

  1. 回転ジョイントを挿入してPendulumPivotというラベルを付け、Connectivityパラメーターを次のように設定します:
  2. 初期条件を次のように設定します:
  3. 並進ジョイントを挿入してCartTranslationというラベルを付け、Connectivityパラメーターを次のように設定します:
  4. 初期条件を次のように設定します:

グラフィックスを追加する

グラフィックスは、アニメーションでのモデルの挙動を理解するために不可欠です。

  1. 円筒グラフィックスを挿入してRailというラベルを付けます。
  2. Connectivityパラメーターで、親ボディをGround Body、原点をGlobal Origin、方向をGlobal Xベクトルにそれぞれ設定します。
  3. プロパティを次のように設定します:
  4. 球体グラフィックスを挿入してPendulumというラベルを付けます。
  5. Connectivityパラメーターで、親ボディをPendulum、原点を PendulumCenterにそれぞれ設定します。
  6. プロパティで半径を20に設定します。
  7. 円筒グラフィックスを挿入してRodというラベルを付けます。
  8. Connectivityパラメーターで、親ボディをPendulum、原点を PendulumCenter、方向を PivotCenterポイントにそれぞれ設定します。
  9. プロパティを次のように設定します:
  10. ボックスグラフィックスを挿入してCartというラベルを付けます。
  11. Connectivityパラメーターで、タイプをCenter、親ボディをCart、原点をPivotCenter、Z軸をベクトルGlobal Z、ZX平面方向をベクトルGlobal Xにそれぞれ設定します。
  12. プロパティを次のように設定します:

荷重を追加する

並進荷重をカートに適用します。

  1. Connectivityタブで荷重frc_0を追加してControl Forceというラベルを付け、Connectivityプロパティを次のように設定します:
  2. Connectivityタブで2つ目の荷重frc_1を追加してPivotTorqueというラベルを付け、Connectivityプロパティを次のように設定します:
  3. ファイル#menucascade-separator名前をつけて保存を選択して、モデルをInverted_Pendulum_Tutorial.mdlという名前で保存します。

MBSモデルの連成シミュレーション向け変更

ソルバー配列やソルバー変数などのMotionViewエンティティを追加することで、基本的なMBSモデルを連成シミュレーション用に変更します。

ソルバー変数には個々のプラント入力値とプラント出力値が含まれています。ソルバー配列では、Activateと通信するためのプラント入力とプラント出力を定義します。

ソルバー変数を追加する

  1. 2つのソルバー変数ControlForce (varname: sv_0)およびPivotTorque (varname: sv_1) を以下のように作成します。
  2. これら2つのソルバー変数を前のセクション荷重を追加するで作成した荷重に接続します。
    ControlForceのTrans Propertiesタブで、次の図のようにFxにExpressionを選択し、f`VARVAL({sv_0.id})`と入力します。この式は、ControlForceを1つ目のソルバー変数sv_0に指定します。この変数は、Activateから送信された制御信号をCartの並進ジョイントに作用する制御荷重として設定します。
  3. varnameが(sv_0)と一致することを確認します。ソルバー変数をExpression Builderから名前で選択し、そのIDを次の図のように入力します:
  4. PivotTorqueのRot PropertiesタブでTyにExpressionを選択し、f`VARVAL({sv_1.id})`と入力します。この式は、PivotTorqueを2つ目のソルバー変数sv_1として設定します。この変数は、Activateから送信された制御信号を振り子の回転に作用するトルクとして指定します。
  5. 3つの追加ソルバー変数であるAngularDeviationAngularRate、およびCartPositionを挿入します。
  6. AngularDeviationにsv_2を入力します。タイプでExpressionを選択して、`RTOD(AY({b_1.cm.idstring}))`と入力します。ここで、b1はPendulumボディのIDです。AY関数は、引数として指定したマーカーのY軸周りの角度(Angle)を返します。この角度の単位はラジアンであるため、RTOD関数を適用してラジアン(Radians)を度に(TODegrees)変換します。
  7. Angular Rateにsv_3と入力します。タイプでExpressionを選択して、`RTOD(WY({b_1.cm.idstring}))`と入力します。ここで、b2はPendulumボディのIDです。
  8. Car Positionにsv_4と入力します。タイプでExpressionを選択して、`DX({b_0.cm.idstring})-300`と入力します。ここで、b1はカートボディのIDです。
  9. 2つのソルバー配列を挿入し、ControlInputPlantOutputというラベルを付けます。
  10. ControlInputソルバー配列は、PivotTorqueとControlForceの両ソルバー変数を含んでいます。プロパティを次のように設定します:
  11. PlantOutputソルバー配列は、AngularDeviation、AngularRate、CartPositionというソルバー変数を含みます。Plant Outputプロパティは次のように設定します:
  12. 適切なソルバー変数名を選択しやすくするために、をクリックすると、次のパネルが表示されます:
  13. モデルをInverted_Pendulum_Tutorial.mdlという名前で保存します。

倒立振り子モデルの検証

MotionSolveでMBSモデルをシミュレートして、このモデルが要求どおりに実行されることを検証します。

  1. Runパネルで、Save and run current modelオプションを選択します。
  2. フォルダアイコンを選択して、MotionSolveモデル(XMLファイル)を保存するためのパスと名前を入力します。任意の名前を指定できますが、MotionViewモデルと同じルート名を使用することをお勧めします。ソルバーの実行には、このXMLファイルが必要です。パスを入力する際は、チュートリアルのデフォルトディレクトリが書き込み不可になっている可能性があるので、必要に応じて、別のディレクトリを指定するか、ディレクトリの書き込み権限を変更します。
  3. Runパネルで、モデルをXMLファイルとして保存します。このファイルはソルバーの実行に使用されるだけでなく、Activateモデルでも使用されます。あるいは、MotionViewの.mdlファイルを実行してInverted_Pendulum_Tutorial.xmlという名前を付けることもできます。
  4. シミュレーションの結果をアニメーション表示してモデルが意図したように動作することを確認し、次のステップに進みます。コントローラーはモデルにまだ接続されていないため、入力される荷重とトルクはゼロです。

制御システムモデルの構築

Activateを使用して制御システムモデルを構築します。

代わりに、Activateインストールファイルのtutorial_modelsディレクトリにあるInverted_Pendulum_Tutorial.scmという完成済みモデルを読み込むこともできます。このモデルを読み込む場合は、Activateモデルのダイアグラムを作成するためのステップをスキップして、ダイアグラムのシミュレーションに進んでください。

制御システムモデルには、以下のブロックが必要です:

ブロック 説明
MotionSolve MotionSolveモデルをActivateモデルに組み込むことを可能にします。
Mux 複数の信号を1つの信号として読み込みます。
Demux 複数の成分を含む信号を読み込んで個々の成分に分解します。
OMLCustomBlock  
Scope データを指定に沿ってプロットします。
Constant コマンド信号を生成します。
PID モデルの頭脳であるコントローラーブロックとして機能します。
Sum 基準信号とフィードバックから誤差を計算します。

Activateモデルのダイアグラムの作成

  1. リボンで、ファイル#menucascade-separator新規モデルを選択します。
  2. パレットブラウザからActivate#menucascade-separatorCoSimulationを選択しMotionSolveブロックを現在のダイアグラムにドラッグ&ドロップします。
  3. ダイアグラムで、このMotionSolveブロックをダブルクリックします。表示されたダイアログで以下のブロックプロパティを定義します:
    プロパティ 操作
    XMLまたはMDLの入力ファイル名(XML or MDL input filename) MotionViewの.mdlモデルまたはMotionSolveの.xmlファイルへのパスをコピー&ペーストします。
    MRF出力ファイル名(MRF output filename) 出力マルチボディ結果ファイルへのパスを入力します。
    直接フィードスルー(Direct feedthrough) このオプションのチェックボックスをオフにします。

    直接フィードスルーでは、ブロックの出力がその入力で直接変化するかどうかを定義します。例として、y = K*uによって代数ループが発生するゲインブロックがあります。この結果が望ましくない場合は、このチェックボックスをオフにしてループが終了するようにします。

    NoteColonSymbol 入力モデル(*.mdlまたは*.xml)を読み込むと以下のパラメーターが自動的に入力されます:
    パラメーター 定義値
    入力(Input) / 行数(Row Size) 2という値は、ActivateモデルからMotionSolveモデルに2つの信号が送信されることを示します。これらの信号は、 PivotTorque変数とControlForce変数を含むソルバー配列PlantInputに対応します。
    出力(Output) / 行数(Row Size) 3という値は、MotionSolveモデルが1つのポートから3つの信号を送信することを示します。そのため、Demuxブロックを追加してこれらの信号を分離します。これらの信号は、AngularRate、AngularDeviation、CartPositionという変数を含むソルバー配列ControlOutputに対応します。
  4. パレットブラウザで、Activate#menucascade-separatorMathOperationsからSumブロックをダイアグラムにドラッグ&ドロップします。
  5. パレットブラウザで、Activate#menucascade-separatorRoutingからDemuxブロックとMuxブロックをダイアグラムにドラッグ&ドロップします。
  6. DeMuxブロックをダブルクリックして、ブロックダイアログで、出力数(Number of outputs)として3を入力します。
  7. パレットブラウザで、Activate#menucascade-separatorCustomBlocksからOmlCustomBlockをダイアグラムにドラッグ&ドロップします。
  8. OmlCustomBlockをダブルクリックします。
  9. ブロックダイアログで シミュレーション関数(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度までの振り子角度の測定を扱っています。

    OML関数の詳細については、オンラインヘルプをご参照ください。

  10. パレットブラウザで、Activate#menucascade-separatorSignalViewersから、Scopeブロックを3つダイアグラムにドラッグ&ドロップします。
    これらのScopeブロックは、AngularDeviation、AngularRate、およびCartPositionの応答に対応しています。これらの応答の軸と曲線のプロパティに対するスコープブロックパラメーターを定義します。
  11. パレットブラウザで、Activate#menucascade-separatorDynamicalから、PIDブロックを2つダイアグラムにドラッグ&ドロップします。
  12. 1つ目のPIDブロックを選択します。から、一般#menucascade-separator名前を選択して、PID1_AngularDeviationという名前を入力します。
  13. 2つ目のPIDブロックを選択します。から、一般#menucascade-separator名前を選択して、次の名前を入力します:PID2_CartPosition
  14. PID1_AngularDeviationブロックをダブルクリックして、次のパラメーター値を入力します:
    NoteColonSymbol
    • 比例ゲイン(Proportional Gain)は、誤差信号に定数ゲインKpを掛けます。
    • 積分ゲイン(Integral Gain)は、誤差の合計履歴に積分ゲインKiを掛けます。
    • 微分ゲイン(Derivative Gain)は、誤差の変化率にゲインKdを掛けます。
  15. PID2_CartPositionブロックをダブルクリックします。ダイアログで、次のパラメーターを定義します:
  16. パレットブラウザで、Activate#menucascade-separatorSignalGeneratorsからConstantブロックをダイアグラムにドラッグ&ドロップします。
  17. Constantブロックをダブルクリックします。ダイアログで、定数(Constant)に0と入力します。
  18. Constantブロックを選択して、このブロックをダイアグラムにコピー&ペーストして複製を作成します。
  19. これで、必要なすべてのブロックが配置されました。ダイアグラムにあるブロックを次のように組み立てて結び付けます:
  20. このダイアグラムで実験し、PIDゲインパラメーターを変更してシミュレーションに与える影響をご確認ください。

ダイアグラムのシミュレーション

  1. リボンで、から設定を選択します。
  2. 表示されたダイアログで、シミュレーション時間(Simulation Time)タブを選択します。
  3. 最終時間に7と入力して、シミュレーションが7秒間実行されることを指定します。

    これでモデルが完成し、モデルをシミュレートする準備が完了しました。

  4. リボンでRunを選択します。
    モデルにあるScopeブロックによって、カートのプロットとして角偏差、角速度、およびカート位置が生成されます。
  5. PIDゲインパラメーターを変更して、これらのパラメーターがシミュレーションに与える影響を検証することで、このダイアグラムで疑似実験します。