MATLAB / Simulink で作ったシミュレーションを Unreal Engine で可視化して遊ぶ 【前編】

# はじめに
MATLAB/Simulinkはモデルの構築・シミュレーションにとても便利だが、可視化が苦手。作ったモデルがシミュレーション中にどう動いているかをリアルタイムで見たいというのがモチベーションとしてあった。
ロジクールのハンコンを持っていたので、バーチャル世界で自動車の運転をすることを目標とした。

実は産業用途や学生向けなどのライセンスでは、Vehicle Dynamics Blockset や Automated Driving Toolbox といったアドオン商品（Toolbox）が提供されていて、簡単に実現できそうだった。
しかし、筆者はHomeライセンスだったため利用不可。ドキュメントも上記を利用したものがほとんどだったので、試行錯誤してようやく実現できた。

書いていくうちに、1つの記事では長くなりすぎて見づらいと感じたので、前後半に分ける。本記事は前編として、各ツールのインストールとMATLAB/Simulink側のセットアップ手順まで。

# 成果物
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/f458c6f1-35a3-83f7-598e-6454bd2d3d4f.gif)

# 準備
## 1. MathWorks製品
Automated Driving Toolbox などでは Unreal Engine (UE) と連携して可視化していたので、同様の手法をとることにした。
前提として以下のToolbox・アドオンが必要になる。
- MATLAB R2023a
 UEとの連携はどんどん開発されてるようなので、最新のバージョンを使う
- Simulink
 シミュレーション環境
- Simulink 3D Animation
 可視化環境の設定をするブロックが含まれる
- Aerospace Blockset
 UEとデータのやり取りをするブロックが含まれる
- Aerospace Blockset Interface for Unreal Engine Projects
 UEとのインターフェースを構築するプラグインが含まれる

## 2. Unreal Engine
また、UE上の環境等を編集・カスタマイズするには以下が必要。
- Unreal Engine 4.27
    MATLABのバージョンに依存する
    [参考リンク-1](#参考リンク)

## 3. Visual Studio (オプション)
UEをC++で編集する場合は、以下も必要。
- Visual Studio 2019
    MATLABのバージョンに依存する

# 手順
手順をすべて書くと長くなるので、つまずいたところを抽出し、その他の手順は参考リンクに任せる。
[準備](#準備)に記載のMATLAB Toolbox, アドオンと、Unreal Engineをインストールしておく。

## Simulink 側
1. MATLABとToolbox, アドオンをインストール
1. Unreal Engineをインストール
1. MATLABを**管理者権限**（を持つアカウント）で起動
1. 以下のコマンドを実行
    ```MATLAB:configure_env.m
    UEProjectPath = "UEのプロジェクトファイルを置きたいパス"; % 例："E:\Unreal\Projects"
    PluginLocationPath = "UEのプラグインを格納するパス" % デフォルトは"C:\Program Files\Epic Games\UE_4.27\Engine\Plugins\MathWorks"
    sim3d.utils.copyExampleSim3dProject(UEProjectPath,...
      PluginDestination=PluginLocationPath, ...
      VerboseOutput=true);
    ```
    [参考リンク-2](#参考リンク)

1. `UEProjectPath`にプロジェクトファイルがコピーされていることを確認
    (コピー元：C:\ProgramData\MATLAB\SupportPackages\R2023a\toolbox\shared\sim3dprojects\spkg\project\AutoVrtlEnv)
1. Simulinkを起動し、必要なブロックを配置する
    例
    ![model_setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/73e04872-a84c-f96a-2c97-51ae29a87fe9.png)
    
1. 各ブロックで入力、プロパティを適切に入力する
    - Simulation 3D Scene Configuration 内の Project は `UEProjectPath`で設定したパスにする
    - Simulation 3D Actor Transform Set にはアクターの位置・回転・拡大率を配列で入力する
    - Simulation 3D Message Set で上記アクター内で動かしたいパーツの情報を配列で入力する
    - Simulation 3D Actor ブロックでUE内にカメラを設置する
    [参考リンク-3~7](#参考リンク)
    [おまけ](#おまけブロックのプロパティ値-参考例)

    :::note warn
    UE4では2次元配列はサポートされていないようなので、1次元で入力する

1. Simulation 3D Scene Configuration から `Unreal Editor を開く` でUEを起動する
1. Pluginの有効化などを行い、UEを上記と同じ方法で再起動する


[後編](https://qiita.com/BParound30/items/e7fa32cd0e19b1bfb0b7)に続く

# 参考リンク
1. [シミュレーション環境の要件](https://jp.mathworks.com/help/driving/ug/3d-visualization-engine-requirements.html?lang=en)
1. [サポートパッケージのインストール](https://jp.mathworks.com/help/driving/ug/install-and-configure-support-package-for-customizing-scenes.html)
1. [SimulinkとUE上でのコ・シミュレーション（動画）](https://www.youtube.com/watch?v=KjIiipCxeD8)
1. [シミュレーションでUEのアクターを操作（動画）](https://www.youtube.com/watch?v=fNd0fVYxkGg&list=PLn8PRpmsu08r6VnOWlQyY1B5kuGRJVRsc&index=20&t=229s)
1. [UE環境とのコミュニケーション](https://jp.mathworks.com/help/vdynblks/ug/get-started-communicating-with-the-unreal-engine-visualization-environment.html?lang=en#mw_d916dea9-c596-4ce0-848c-47d7db9a9650)
1. [カスタムアクターのアニメーション](https://jp.mathworks.com/help/vdynblks/ug/animate-custom-actors-in-the-unreal-editor.html?lang=en)
1. [ジェネリックアクターをUE上に配置](https://jp.mathworks.com/help/sl3d/simulation3dactor.html)


# 【おまけ】ブロックのプロパティ値 参考例
- Simulation 3D Scene Configuration
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/c053a8d6-c15f-6ee9-e494-00ae1b1038a9.png)

- Simulation 3D Actor Transform Set
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/460f9b28-084e-dd2d-7795-945ba67c112b.png)

- Simulation 3D Message Set
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/8219995d-26a7-1aae-4abd-561c1d4feba4.png)

- Simulation 3D Actor
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/7d8c1c8c-eea1-b165-65c0-cb72e7342bce.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3362399/9715b54c-b886-a3d1-4237-484de25ae9c1.png)