MV-7002:Simulinkとの連成シミュレーション
チュートリアルレベル:上級 このチュートリアルでは、MotionSolveとSimulinkとの連成シミュレーションインターフェースを使用し、S-Functionを介してSimulinkからモデルを実行する方法について学習します。MotionSolveでは、プロセス間通信(IPC)手法を使用してSimulinkとの連成シミュレーションが実行されます。
IPC連成シミュレーションでは、2つの独立したプロセスのそれぞれでソルバーが1つ実行され、ソケットを介してこれらのプロセス間でデータが交換されます。
- MotionSolve
- MATLAB バージョンR2017b(9.3)以降
- Simulinkバージョン2017b(9.0)またはそれ以降
- platform support guidelinesに従ってください。
- hardware recommendations and certificationsのガイドラインに従ってください。
- MATLAB R2019a以降は、Windows 10またはRHEL 7.8が必要。
カート上に搭載された倒立振り子について考えてみます。振り子はその底部で、回転ジョイントによってカートに拘束されています。カートはX方向にのみ自由に並進します。振り子には初期回転速度が指定されており、それによって底部を中心に回転します。

- は、モデル構成からの振り子の角変位です。
- は、振り子の重心を中心とした振り子の角速度です。測定の基準は参照グラウンドフレームです。
- は、モデル構成からのカートの並進変位です。測定の基準は参照グラウンドフレームです。
- は、参照グラウンドフレームを基準として測定したカートの並進速度です。
- は、振り子の角変位から得られた参照信号です。
- は、振り子の角速度から得られた参照信号です。
- は、カートの並進変位から得られた参照信号です。
- は、カートの並進速度から得られた参照信号です。
計算した制御力に外乱を与えて、システム応答を評価します。制御力がカートのボディに作用し、カート質量の変位プロファイルと速度プロファイルが制御されます。
- Force_Vector_OneBody要素でモデル化した連続コントローラーを備えた倒立振り子モデルを使用することにより、MotionSolveのみでベースラインモデルを解析します(つまり、連成シミュレーションを実行しません)。これらの結果を、次のステップで同等の連成シミュレーションによる結果と比較します。
- 主にControl_PlantInputエンティティとControl_PlantOutputエンティティを追加することでSimulink連成シミュレーションのプラントとして機能できるように修正した、MotionSolveの倒立振り子モデルを確認します。
- Simulinkでコントローラーを確認します。
- 連成シミュレーションを実行して、スタンドアロンのMotionSolveモデルによる結果と、連成シミュレーションのモデルによる結果を比較します。
このシミュレーションを開始する前に、<installation_directory>\tutorials\mv_hv_hg\mbd_modeling\motionsolve\cosimulationフォルダにあるすべてのファイルを作業ディレクトリ(このチュートリアルでは<作業ディレクトリ>と表記します)にコピーしておきます。<altair>は、の製品のインストール先へのフルパスです。
MotionSolveモデルのベースライン解析の実行
このステップでは、単一ボディの作用のみのベクトル荷重(Force_Vector_OneBody)を使って、MotionSolveで制御力をモデル化します。カート上の荷重は次のように計算されます:
、ここで、
は外乱力、
は制御力、
は各エラー信号に適用されるゲイン
は入力シグナル上のエラー(参照値と実際の値との差)
振子の角変位と速度はそれぞれ、式AY()とWY()を用いて得ることができます。同様に、カートの並進変位と速度はそれぞれ、式DX()とVX()から得られます。
-
Startメニューから<作業ディレクトリ>にあるモデル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()を介して、カートの並進速度を保管 -
Runパネルで、MotionSolveモデル名としてInvertedPendulum_NoCosimulation.xmlを指定し、Runをクリックします。
ここで得られた結果が、連成シミュレーションからの結果と比較するためのベースラインとして使用されます。
制御系内のプラントの定義
MotionSolveモデルには、Simulinkモデルへの入出力コネクションを指定するためのメカニズムが必要です。上記で用いられたMotionSolveモデル(XML)はControl_PlantInputおよびControl_PlantOutputモデル要素を含み、これらのコネクションを提供するよう修正されます。本チュートリアルではこの部分は既に行われており、自身の<作業ディレクトリ>からモデルInvertedPendulum_Cosimulation.mdlを開くことによって、それを確認することができます。
このモデルには、2つの追加のモデリングコンポーネントが含まれています:
成分名 | コンポーネントの種類 | 詳細 |
---|---|---|
Plant Input Simulink | プラント入力 | このControl_PlantInput要素は、MotionSolveモデルへの入力を定義するために使用されます。 |
Plant Output Simulink | プラント出力 | このControl_PlantOutput要素は、MotionSolveモデルからの出力を定義するために使用されます。 |


Control_PlantInputおよびControl_PlantOutput要素を使って指定された入力には、それぞれPINVAL()、POUVAL()関数を用いてアクセスすることが可能です。Control_PlantInputおよびControl_PlantOutputはソルバー変数のIDをリストするため、これらの入力および出力変数は、VARVAL()関数を用いてアクセスすることもできます。詳細については、MotionSolveユーザーズガイドをご参照ください。
本モデルでは、下記のコネクションがあります:
- Plant Input:カートに適用される制御力信号
- Plant Output:振子の角変位と角速度; カートの並進変位と速度
環境変数の設定
- コントロールパネル(Windows)
- MATLABをコールするシェル / コマンドウィンドウ(Windowsでのsetコマンド、またはLinuxでのexportコマンド)
- MATLAB内でのsetenv()コマンドの使用
これらのコマンドを以下に示します:
環境変数 値 Windowsシェル Linuxシェル MATLABシェル PATH \mypath set PATH=\mypath export PATH \mypath setenv('PATH','\mypath')
-
以下の環境変数を設定します:
環境変数 パス - Windows パス - Linux NUSOL_DLL_DIR <INSTALL_DIR>\hwsolvers\motionsolve\bin\win64 <INSTALL_DIR>\hwsolvers\motionsolve\bin\linux64 RADFLEX_PATH <INSTALL_DIR>\hwsolvers\common\bin\win64 <INSTALL_DIR>\hwsolvers\common\bin\linux64 PATH <INSTALL_DIR>\hwsolvers\motionsolve\bin\win64;%PATH% <INSTALL_DIR>\hwsolvers\motionsolve\bin\linux64:$PATH LD_LIBRARY_PATH - <INSTALL_DIR>\hwsolvers\motionsolve\bin\linux64 <INSTALL_DIR>\hwsolvers\common\bin\linux64:$LD_LIBRARY_PATH
ここで、<INSTALL_DIR>は、製品のインストール先へのフルパスです。例えばWindowsでは通常、C:\Program Files\Altair\<version>です。
- その他のオプション的な環境変数もモデルに設定することが可能です。これらの環境変数の詳細については、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ソケット)コミュニケーション用)。このファイルは、<INSTALL_DIR>\hwsolvers\motionsolve\bin\<platform>にインストールされています。
このファイルの場所は、MATLABのサーチパスに追加し、S-Functionがmscosimipc
を使用できるようにする必要があります。
これは、以下のいずれかの方法で行うことができます:
-
メニューオプションを使用:
-
MATLABコマンドを使用:
Simulinkでモデル化されたコントローラーの確認
-
MATLABウィンドウで、 を選択します。
Open fileダイアログが表示されます。
- 自身の<作業ディレクトリ>からInvertedPendulum_ControlSystem.mdlを選択します。
-
Openをクリックします。
連成シミュレーションで使用される制御システムが確認できます。
図 7. MATLABでの制御システム
-
モデルには、S-functionブロックが含まれます。S-functionを‘mscosim’と命名します。mscosimという名称のS-functionをダブルクリックします。表示されるダイアログボックス内で、S-functionの名称を‘mscosimipc’に変更します。
S-function(システム-関数)は、Simulinkによって用意されているブロックの1つで、MotionSolveモデルを表します。これは、Simulink User-Defined Functionsブロックライブラリ内に見つかります。S-Functionを使用すると、入力、出力、状態などを使用した任意の一般的な連立方程式をモデル化できます。この点は、ある程度MotionSolveのControl_StateEqnに似ています。詳細については、MATLAB/Simulinkドキュメントをご参照ください。
-
mscosimipcという名称のS-functionをダブルクリックします。表示されるダイアログ内のS Function Parametersの下で、引用符 ' ' を使って以下のとおり入力します:
'InvertedPendulum_Cosimulation.xml', 'InvertedPendulum_Cosimulation.mrf', ''
3つのパラメータは以下のものです:- MotionSolve
XMLモデル名。重要: S-functionを保存して閉じる前に、入力XMLファイルは有効で、MATLAB'の現在のフォルダーになければなりません。 これを行わないと、MATLABとSimulinkが予期せず終了することがあります。
- 出力MRF名
- MotionSolveユーザーDLL名(オプション); 使用されない場合、空の引用符('')を入力
- MotionSolve
XMLモデル名。
連成シミュレーションの実行
-
をクリックし、シミュレーションを開始します。SimulinkはODE45を使って、Simulinkモデルの解析を行います。ここ以降で、連成シミュレーションが開始し、MotionSolveはポスト処理用の出力.mrfファイルを生成します。
- Simulinkモデルでスコープを設定し、結果を表示します。
-
また、.logファイルをチェックし、MotionSolveでエラーや警告が出されていないことを確認します。
図 8.
MotionSolveのみでの結果と連成シミュレーション結果の比較
- Startメニューから を選択します。
-
Build Plots
をクリックします。
- ファイルブラウザアイコンをクリックし、InvertedPendulum_NoCosimulation.mrfファイルを読み込みます。これは、MotionSolve自体を実行することによって生成されたベースライン結果でした。
-
Page Controlsツールバーで、2つの横並びプロットを作成します。
図 9. 2つのプロットウィンドウの作成
-
Y-TypeにMarker Displacement、Y RequestにREQ/70000004 Output slider displacement (on Slider
cart)、Y ComponentにDXを選択し、カートの並進変位をプロットします:
図 10. カートの変位をプロット
- 左側のウィンドウをクリックし、Applyをクリックします。
-
Y-TypeにMarker Force、Y RequestにREQ/70000002
Output control force- (on Slider cart)、Y ComponentにFXを選択し、制御力のXコンポーネントをプロットします:
図 11. カート上の制御力をプロット
- ファイルブラウザアイコンをクリックし、InvertedPendulum_Cosimulation.mrfファイルを読み込みます。これは、Simulinkと実行した連成シミュレーション結果でした。
- Y-TypeにMarker Displacement、Y RequestにREQ/70000004 Output slider displacement (on Slider cart)、Y ComponentにDXを選択し、左側のウィンドウ内のプロットをオーバーレイさせます:
-
Y-TypeにMarker Force、Y RequestにREQ/70000002
Output control force- (on Slider cart)、Y ComponentにFXを選択し、右側のウィンドウ内のプロットをオーバーレイさせます:
下図のように両方の信号が一致しています。
図 12. 2つのモデル間のカート変位と制御力の比較
青色のカーブはMotionSolveのみのモデルからの結果を、赤色のカーブは連成シミュレーションからの結果を示しています。
Simulinkとのリモート連成シミュレーション
Machine "A" | Machine "B" |
---|---|
MATLAB/SimulinkとMotionSolve、Windows 64-bit | MotionSolve、Windows 64-bit |
MATLAB/SimulinkとMotionSolve、Windows 64-bit | MotionSolve、Linux 64-bit |
MATLAB/SimulinkとMotionSolve、Linux 64-bit | MotionSolve、Windows 64-bit |
MATLAB/SimulinkとMotionSolve、Linux 64-bit | MotionSolve、Linux 64-bit |
Simulinkから連成シミュレーションを開始する際、いくつかのMotionSolveバイナリファイルがSimulinkにより読み込まれます。このためには、Simulinkが存在するマシン上にMotionSolveが追加インストールされている必要があります。また、このMotionSolveのインストレーションは、Simulinkと同じプラットフォームタイプでなければなりません。例えば、Linux上のSimulinkとWindows上のMotionSolveとの間でIPC連成シミュレーションを行うには、Simulinkソフトウェアがインストールされている同じマシンにMotionSolve Linuxバージョンが必要になります。

環境変数 | WindowsまたはLinuxのパス |
---|---|
MS_SERVER_IP_ADDRESS | Machine “B”のIPアドレス |
前にステップ3で定義した環境変数に加え、ネットワーク上のMachine “B”を指すMachine “A”上の追加環境変数を定義します。
連成シミュレーションを実行します。
-
Machine “B”のシェルプロンプトで、“msdaemon 22903”コマンドを実行します。
このコマンドは、MotionSolve XMLが存在する作業ディレクトリから実行します。このコマンドで、MotionSolveを“listening”モードでセットアップしたことになります。Simulinkからシミュレーションが開始されると、連成シミュレーションが始まります。
-
Machine “A”上で
をクリックし、連成シミュレーションを開始します。Simulinkは、MotionSolveとの接続の確立を試み、連成シミュレーションを開始します。これにより、ポスト処理用の*.mrf出力ファイルが生成されます。
- SimulinkモデルでScopesを設定し、結果を表示します。
-
また、.logファイルをチェックし、MotionSolveでエラーや警告が出されていないことを確認します。
注: MotionSolveのライセンスは、Machine Bにのみ必要です。