MV-7002:Simulinkとの連成シミュレーション

このチュートリアルでは、MotionSolveとSimulinkとの連成シミュレーションインターフェースを使用し、S-Functionを介してSimulinkからモデルを実行する方法について学習します。MotionSolveでは、プロセス間通信(IPC)手法を使用してSimulinkとの連成シミュレーションが実行されます。

IPC連成シミュレーションでは、2つの独立したプロセスのそれぞれでソルバーが1つ実行され、ソケットを介してこれらのプロセス間でデータが交換されます。

ソフトウェア要件とハードウェア要件

ソフトウェア要件:
  • MotionSolve
  • MATLAB/Simulink(MATLABバージョンR2015a、Simulinkバージョン8.5以降)
注: これより前のバージョンのMATLAB/Simulinkも動作しますが、上記の最小バージョンが検証済みなので、これらのバージョンの使用をお勧めします。
ハードウェア要件:
  • 64ビットCPU搭載で、Windows 7/10以降が稼働しているPC
  • Linux RHEL 6.6またはCentOS 7.2
    注: MATLAB R2019a以降は、Windows 10またはRHEL 7.8が必要。

倒立振り子のコントローラー

カート上に搭載された倒立振り子について考えてみます。振り子はその底部で、回転ジョイントによってカートに拘束されています。カートはX方向にのみ自由に並進します。振り子には初期回転速度が指定されており、それによって底部を中心に回転します。

振り子とカートはどちらも剛体としてモデル化します。Simulinkでモデル化したコントローラーは、倒立振り子を安定した状態にして落下を防止するための制御力をカートに供給します。この制御力は、並進力を介してカートに適用されます。このモデルの設定は以下の図に示すとおりです。


図 1. 倒立振り子モデルの設定
事前設計したコントローラーでは、振り子を直立状態に保持する制御力が生成されます。コントローラーでは、カートの変位と速度とともに振り子の方向と角速度を入力として使用して、振り子を直立状態に保持するうえで必要な力の方向と大きさが計算されます。次の図は、この制御システムのブロック図を示しています。


図 2. コントローラーのブロック図
上記の図にある各値は次のとおりです:
  • θ は、モデル構成からの振り子の角変位です。
  • ω は、振り子の重心を中心とした振り子の角速度です。測定の基準は参照グラウンドフレームです。
  • x は、モデル構成からのカートの並進変位です。測定の基準は参照グラウンドフレームです。
  • x ˙ は、参照グラウンドフレームを基準として測定したカートの並進速度です。
  • R θ は、振り子の角変位から得られた参照信号です。
  • R ω は、振り子の角速度から得られた参照信号です。
  • R x は、カートの並進変位から得られた参照信号です。
  • R x ˙ は、カートの並進速度から得られた参照信号です。

計算した制御力に外乱を与えて、システム応答を評価します。制御力がカートのボディに作用し、カート質量の変位プロファイルと速度プロファイルが制御されます。

この演習では、以下の操作を実行します。
  • Force_Vector_OneBody要素でモデル化した連続コントローラーを備えた倒立振り子モデルを使用することにより、MotionSolveのみでベースラインモデルを解析します(つまり、連成シミュレーションを実行しません)。これらの結果を、次のステップで同等の連成シミュレーションによる結果と比較します。
  • 主にControl_PlantInputエンティティとControl_PlantOutputエンティティを追加することでSimulink連成シミュレーションのプラントとして機能できるように修正した、MotionSolveの倒立振り子モデルを確認します。
  • Simulinkでコントローラーを確認します。
  • 連成シミュレーションを実行して、スタンドアロンのMotionSolveモデルによる結果と、連成シミュレーションのモデルによる結果を比較します。

このシミュレーションを開始する前に、<installation_directory>\tutorials\mv_hv_hg\mbd_modeling\motionsolve\cosimulationフォルダにあるすべてのファイルを作業ディレクトリ(このチュートリアルでは<working directory>と表記します)にコピーしておきます。<altair>は、の製品のインストール先へのフルパスです。

MotionSolveモデルのベースライン解析の実行

このステップでは、単一ボディの作用のみのベクトル荷重(Force_Vector_OneBody)を使って、MotionSolveで制御力をモデル化します。カート上の荷重は次のように計算されます:

F c a r t = F c o n t r o l + F d i s t 、ここで、

F d i s t は外乱力、

F c o n t r o l = K 1 ( e r r o r θ ) + K ( e r r o r ω ) 2 + K 3 ( e r r o r x ) + K 4 ( e r r o r x ˙ ) は制御力、

K i は各エラー信号に適用されるゲイン

e r r o r は入力シグナル上のエラー(参照値と実際の値との差)

振子の角変位と速度はそれぞれ、式AY()WY()を用いて得ることができます。同様に、カートの並進変位と速度はそれぞれ、式DX()VX()から得られます。

  1. StartメニューからAltair <version> MotionViewを選択します。自身の<working directory>にあるモデルInvertedPendulum_NoCosimulation.mdlを開きます。


    図 3. 倒立振子のMotionSolveモデル

    MotionSolveモデルは、以下のコンポーネントで構成されています:

    成分名 コンポーネントの種類 詳細
    Slider cart 剛体 カートボディ
    Pendulum 剛体 振子ボディ
    Slider Trans Joint 並進ジョイント カートボディとグラウンドの間の並進ジョイント
    Pendulum Rev Joint 回転ジョイント 振子ボディとカートボディの間の回転ジョイント
    制御力 ベクトル荷重 カートボディに適用される制御力
    Output control force 出力リクエスト 制御力をプロットするのに使用するリクエスト
    Output slider displacement 出力リクエスト カートの変位をプロットするのに使用するリクエスト
    Output slider velocity 出力リクエスト カートの速度をプロットするのに使用するリクエスト
    Output pendulum displacement 出力リクエスト このリクエストを用いて振子の変位をプロット
    Output pendulum velocity 出力リクエスト 振子の速度をプロットするのに使用するリクエスト
    Pendulum Rotation Angle ソルバー変数 AY()を介して、振子の回転変位を保管
    Pendulum Angular Velocity ソルバー変数 VY()を介して、振子の回転速度を保管
    Slider Displacement ソルバー変数 DX()を介して、カートの並進変位を保管
    Slider Velocity ソルバー変数 VX()を介して、カートの並進速度を保管
  2. Runパネルで、MotionSolveモデル名としてInvertedPendulum_NoCosimulation.xmlを指定し、Runをクリックします。
    ここで得られた結果が、連成シミュレーションからの結果と比較するためのベースラインとして使用されます。

制御系内のプラントの定義

MotionSolveモデルには、Simulinkモデルへの入出力コネクションを指定するためのメカニズムが必要です。上記で用いられたMotionSolveモデル(XML)はControl_PlantInputおよびControl_PlantOutputモデル要素を含み、これらのコネクションを提供するよう修正されます。本チュートリアルではこの部分は既に行われており、自身の<working directory>からモデルInvertedPendulum_Cosimulation.mdlを開くことによって、それを確認することができます。

このモデルには、2つの追加のモデリングコンポーネントが含まれています:

成分名 コンポーネントの種類 詳細
Plant Input Simulink プラント入力 このControl_PlantInput要素は、MotionSolveモデルへの入力を定義するために使用されます。
Plant Output Simulink プラント出力 このControl_PlantOutput要素は、MotionSolveモデルからの出力を定義するために使用されます。
Control_PlantInput要素は、機構システムまたはプラントへの入力を定義します。このモデルについては、1つのみの入力が“Plant Input Simulink”ソルバーアレー内に定義されます。これは、Simulinkからの制御力を保持するソルバー変数のIDに設定されます。


図 4. MotionSolveへの入力チャンネルの定義
Control_PlantOutput要素は、機械システムまたはプラントからの出力を定義します。このモデルについては、4つの出力が“Plant Output Simulink”ソルバーアレー内に定義されます。これらは、振子の回転角、振子の角速度、カートの変位およびカートの速度です。


図 5. MotionSolveからの出力チャンネルの定義

Control_PlantInputおよびControl_PlantOutput要素を使って指定された入力には、それぞれPINVAL()POUVAL()関数を用いてアクセスすることが可能です。Control_PlantInputおよびControl_PlantOutputはソルバー変数のIDをリストするため、これらの入力および出力変数は、VARVAL()関数を用いてアクセスすることもできます。詳細については、MotionSolveユーザーズガイドをご参照ください。

本モデルでは、下記のコネクションがあります:

  • Plant Input:カートに適用される制御力信号
  • Plant Output:振子の角変位と角速度; カートの並進変位と速度

環境変数の設定

MATLABを使用した連成シミュレーションを正常に実行するには、いくつかの環境変数が必要です。これらは以下のうちのいずれかを使って設定できます:
  • コントロールパネル(Windows)
  • MATLABをコールするシェル / コマンドウィンドウ(Windowsでのsetコマンド、またはLinuxでのexportコマンド)
  • MATLAB内でのsetenv()コマンドの使用

    これらのコマンドを以下に示します:

    環境変数 Windowsシェル Linuxシェル MATLABシェル
    PATH \mypath set PATH=\mypath setenv PATH \mypath setenv('PATH','\mypath')
  1. 以下の環境変数を設定します:
    環境変数 パス - Windows パス - Linux
    NUSOL_DLL_DIR <altair>\hwsolvers\motionsolve\bin\win64 <altair>\hwsolvers\motionsolve\bin\linux64
    RADFLEX_PATH <altair>\hwsolvers\common\bin\win64 <altair>\hwsolvers\common\bin\linux64
    PATH <altair>\hwsolvers\common\bin\win64;%PATH% <altair>\hwsolvers\common\bin\linux64:$PATH
    LD_LIBRARY_PATH - <altair>\hwsolvers\motionsolve\bin\linux64

    <altair>\hwsolvers\common\bin\linux64:$LD_LIBRARY_PATH

    ここで、<altair>は、製品のインストール先へのフルパスです。例えばWindowsでは通常、C:\Program Files\Altair\<version>です。

  2. その他のオプション的な環境変数もモデルに設定することが可能です。これらの環境変数の詳細については、MotionSolveの環境変数の項をご参照ください。

連成シミュレーションのセットアップ

連成シミュレーションを生成するSimulink内の中核的機能は、S-Function(System Function)ブロックです。このブロックは、その挙動を定義するためにS-Functionライブラリ(動的に読み込まれるライブラリ)を必要とします。MotionSolveによってこのライブラリが提供されますが、S-Function側でこのライブラリを検出できる必要があります。MATLAB/SimulinkがS-Functionを検出するのを助けるために、ユーザーは、MATLAB/Simulinkがライブラリの検索に使用するパスのリストにS-Functionの場所を追加する必要があります。

MotionSolveとの連成シミュレーションのためのS-Functionライブラリはmscosimipcと呼ばれています(IPC(TCP/IPソケット)コミュニケーション用)。このファイルは、<installation_directory>\hwsolvers\motionsolve\bin\<platform>にインストールされています。

このファイルの場所は、MATLABのサーチパスに追加し、S-Functionがmscosimipcを使用できるようにする必要があります。

これは、以下のいずれかの方法で行うことができます:

  1. メニューオプションを使用:
    1. MATLABメニューからFile > Set Pathを選択します。


      図 6. MATLAB GUIからのパスの追加
    2. ダイアログで、mscosimipcライブラリが含まれるディレクトリを追加します。
      <altair>\hwsolvers\motionsolve\bin\win64
    3. SaveCloseを選択します。
      このプロシージャは永久的に、このディレクトリをMATLAB/Simulinkサーチパスに追加します。
  2. MATLABコマンドを使用:
    1. mscosimipcライブラリが含まれるディレクトリをMATLABサーチパスに追加するには、MATLAB行で次のように入力します:
      addpath('<altair>\hwsolvers\motionsolve\bin\<platform>')
      これは、MATLABを終了するまで有効であり続けます。
      注: .mスクリプトを作成して、このプロセスをより簡単に反復実行できるようにすることもできます。
      例えば、MATLAB.m)スクリプト内のMATLABコマンドを使って、MATLABパスおよび必要な環境変数を設定できます。
      addpath('<altair>\hwsolvers\motionsolve\bin\win64')
      setenv('NUSOL_DLL_DIR','<altair>\hwsolvers\motionsolve\bin\win64')
      setenv('RADFLEX_PATH',['<altair>\hwsolvers\common\bin\win64')
      setenv('PATH',['<altair >\hwsolvers\common\bin\win64;' getenv('PATH')])
    2. Linuxマシンの場合、追加的に次のように入力します;
      setenv('LD_LIBRARY_PATH', '<altair>\hwsolvers\motionsolve\bin\linux64:<altair>\hwsolvers\common\bin\linux64\') 

Simulinkでモデル化されたコントローラーの確認

  1. MATLABウィンドウで、File > Openを選択します。
    Open fileダイアログが表示されます。
  2. 自身の<working directory>からInvertedPendulum_ControlSystem.mdlを選択します。
  3. Openをクリックします。
    連成シミュレーションで使用される制御システムが確認できます。


    図 7. MATLABでの制御システム
  4. モデルには、S-functionブロックが含まれます。S-functionを‘mscosim’と命名します。mscosimという名称のS-functionをダブルクリックします。表示されるダイアログボックス内で、S-functionの名称を‘mscosimipc’に変更します。

    S-function(システム-関数)は、Simulinkによって用意されているブロックの1つで、MotionSolveモデルを表します。これは、Simulink User-Defined Functionsブロックライブラリ内に見つかります。S-Functionを使用すると、入力、出力、状態などを使用した任意の一般的な連立方程式をモデル化できます。この点は、ある程度MotionSolveControl_StateEqnに似ています。詳細については、MATLAB/Simulinkドキュメントをご参照ください。

  5. mscosimipcという名称のS-functionをダブルクリックします。表示されるダイアログ内のS Function Parametersの下で、引用符 ' ' を使って以下のとおり入力します:
    ' InvertedPendulum_Cosimulation.xml', 'InvertedPendulum_Cosimulation.mrf', ''
    3つのパラメータは以下のものです:
    • MotionSolve XMLモデル名
    • 出力MRF名
    • MotionSolveユーザーDLL名(オプション); 使用されない場合、空の引用符('')を入力

連成シミュレーションの繰り返し

  1. Simulation > Startをクリックし、シミュレーションを開始します。
    SimulinkはODE45を使って、Simulinkモデルの解析を行います。ここ以降で、連成シミュレーションが開始し、MotionSolveはポスト処理用の出力.mrfファイルを生成します。
  2. Simulinkモデルでスコープを設定し、結果を表示します。
  3. また、.logファイルをチェックし、MotionSolveでエラーや警告が出されていないことを確認します。


    図 8.

MotionSolveのみでの結果と連成シミュレーション結果の比較

  1. StartメニューからAltair <version> > HyperGraphを選択します。
  2. Build Plotsをクリックします。
  3. ファイルブラウザアイコンをクリックし、InvertedPendulum_NoCosimulation.mrfファイルを読み込みます。これは、MotionSolve自体を実行することによって生成されたベースライン結果でした。
  4. Page Controlsツールバーで、2つの横並びプロットを作成します。


    図 9. 2つのプロットウィンドウの作成
  5. Y-TypeにMarker Displacement、Y RequestにREQ/70000004 Output slider displacement (on Slider cart)、Y ComponentにDXを選択し、カートの並進変位をプロットします:


    図 10. カートの変位をプロット
  6. 左側のウィンドウをクリックし、Applyをクリックします。
  7. Y-TypeにMarker Force、Y RequestにREQ/70000002 Output control force- (on Slider cart)、Y ComponentにFXを選択し、制御力のXコンポーネントをプロットします:


    図 11. カート上の制御力をプロット
  8. ファイルブラウザアイコンをクリックし、InvertedPendulum_Cosimulation.mrfファイルを読み込みます。これは、Simulinkと実行した連成シミュレーション結果でした。
  9. Y-TypeにMarker Displacement、Y RequestにREQ/70000004 Output slider displacement (on Slider cart)、Y ComponentにDXを選択し、左側のウィンドウ内のプロットをオーバーレイさせます:
  10. Y-TypeにMarker Force、Y RequestにREQ/70000002 Output control force- (on Slider cart)、Y ComponentにFXを選択し、右側のウィンドウ内のプロットをオーバーレイさせます:
    下図のように両方の信号が一致しています。


    図 12. 2つのモデル間のカート変位と制御力の比較

    青色のカーブはMotionSolveのみのモデルからの結果を、赤色のカーブは連成シミュレーションからの結果を示しています。