上記動画では、SimulinkとPythonを連携させる4つの主要な活用シナリオが紹介されています。
それぞれのシナリオの要点は以下の通りです。
シナリオ1. PythonアルゴリズムのSimulinkへの統合(共同実行)
Pythonで開発された既存のアルゴリズム(画像処理やコンピュータビジョンなど)をSimulinkに取り込み、仮想システム全体としてシミュレーションするシナリオです。
• 主なツール: Pythonインポーター(R2023a~)、Python Codeブロック(R2025a~)。
• 特徴: 対話的なステップでPython関数をライブラリブロック化でき、コードを書く必要がほぼありません。Pythonクラス内の関数インポートもサポートされています。
• 注意点: シミュレーションでの共同実行が目的であり、この方法ではC/C++コード生成はサポートされていません。
シナリオ2. AIモデル(TensorFlow/PyTorchなど)の統合と実装
データサイエンティストが開発したディープラーニングモデルをSimulinkに取り込み、システム検証やハードウェア実装を行うシナリオです。
• 統合方法:
◦ 共同実行: PythonベースのAIモデルをそのままコールし、挙動を素早く確認できますが、コード生成には非対応です。
◦ モデルインポート: TensorFlowやPyTorchのモデルをMATLABモデルへ変換して取り込みます。これにより、C/C++コード生成が可能になり、モデルベース開発(MBD)の恩恵をフルに受けられます。
• 主なツール: Deep Learning Toolbox、Statistics and Machine Learning Toolbox内の各種予測ブロック(PyTorch/TensorFlow/ONNX/Scikit-learn対応)。
シナリオ3. PythonからのSimulinkモデルの実行
Pythonベースの自動テストフレームワークなどから、Simulinkで作成した動的システムモデル(車両サスペンションモデルなど)を呼び出して実行するシナリオです。
• 主なツール: MATLAB Engine API for Python。
• 特徴: PythonプログラムからMATLABを起動・操作し、変数を受け渡しながらSimulinkのシミュレーション(simコマンドなど)を実行できます。自動テストやパラメータスイープの自動化に有効です。
シナリオ4. SimulinkモデルのPythonパッケージ化とデプロイ
Simulinkで開発したモデルを、MATLABがインストールされていない環境や、Pythonベースの運用環境へデプロイするシナリオです。
• 主なツール: MATLAB Runtime、Simulink Compiler。
• 統合方法:
◦ Simulinkシミュレーションをカプセル化したPythonパッケージの生成。
◦ FMU (Functional Mock-up Unit) としてのパッケージ化。
◦ REST API経由で利用可能なシミュレーションサービスとしての展開。
◦ 生成されたC/C++コードをpybind11等でコールする方法。
これらのシナリオにより、開発者は既存のPython資産を捨てずにSimulinkの強力なシミュレーション・検証環境と組み合わせることが可能になります.
シナリオ3 および シナリオ4 のサンプルにつきましては、以下の MATLAB Central にも公開されております。併せてご参照ください。
補足:Python Codeブロックで使用できるPython プログラム
Python Code ブロック内で使用可能な言語構文、データ構造、制御フロー、動的機能等について、特段の制限はございません。
任意の Python コードを記述することが可能です。
標準ライブラリおよびサードパーティ製モジュールを含め、すべての Python モジュールを import することが可能です。
ただし、NumPy を import する際に、MATLAB と Python 間でライブラリ競合が発生する場合があることが確認されております。
本件は Python Code ブロック以前から存在する既知の事象であり、ドキュメントにも記載されております。
以下のドキュメント内「メモ」に注意事項が記載されておりますので、あわせてご確認ください。
https://jp.mathworks.com/help/simulink/ref_extras/pythoncode.html
Python Code ブロックでは、離散状態(状態保持)を持たせることが可能です。
Ports and Parameters セクションにて、対象シンボルのスコープを persistent に設定することで実現できます。
また、タイムステップ間で保持したいオブジェクトに対応する Simulink 型が存在しない場合は、
Ports and Parametersテーブルにて型を、Python Object に設定することで、Simulink からは不透明なオブジェクトとしてPython クラスを永続化することが可能です。
本内容につきましても、上記ドキュメントの「端子とパラメータのシンボル」 セクションにて説明しておりますので、ご確認頂けます。