メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

Unreal Engine 可視化環境との通信の開始

R2026a

Simulation 3D Message Get ブロックと Simulation 3D Message Set ブロックを使用して Unreal Engine® との通信を設定できます。

ブロックを使用して Unreal Engine と通信するには、Vehicle Dynamics Blockset™ Interface for Unreal Engine Projects サポート パッケージがインストールされていることを確認してください。詳細については、車両運動のシミュレーションのための 3D シーンのカスタマイズを参照してください。

3D 可視化環境でモデルのシミュレーションを実行するには、Simulink® 3D Animation™ が必要です。

次に、以下のワークフロー ステップに従って、Simulink モデルと Unreal Engine 環境を設定し、シミュレーションを実行します。

ワークフロー 説明
データを送受信するための Simulink モデルの設定

Unreal® Editor との間でコーンの位置を送受信するように Simulink の Simulation 3D Message Get ブロックと Simulation 3D Message Set ブロックを構成します。この手順では、エディターと通信するための一般的なワークフローを示します。

Simulation 3D Message Get ブロックおよび Simulation 3D Message Set ブロックで送受信できるデータ型は、double、single、int8、uint8、int16、uint16、int32、uint32、Boolean です。Simulation 3D Actor Transform Set ブロックおよび Simulation 3D Actor Transform Get ブロックで送受信できるのは、single データ型のみです。

データを送受信するための Unreal Engine の設定

C++ のワークフロー: データを送受信するための Unreal Engine の設定

Simulink との間でコーンの位置データを送受信するための Unreal の具体的な C++ のワークフロー。

  • Simulation 3D Message Get は、Unreal Engine 環境の C++ アクター クラスからデータを受信します。この例のワークフローでは、このブロックを使用して Unreal Editor からコーンの位置を受信します。

  • Simulation 3D Message Set は、Unreal Engine の C++ アクター クラスにデータを送信します。この例では、このブロックを使用して Unreal Editor におけるコーンの初期位置を設定します。

このワークフローを実行するには、Unreal Engine での C++ のコーディングに関する知識が必要です。ご使用の環境がUnreal Engine シミュレーション環境の要件と制限に記載されているソフトウェアの最小要件を満たしていることを確認してください。

ブループリントのワークフロー: データを送受信するための Unreal Engine の設定

Simulink のデータを送受信するための Unreal Editor の一般化されたブループリントのワークフロー。

シミュレーションの実行

Simulink モデルと Unreal Editor 環境を設定したら、シミュレーションを実行します。

データを送受信するための Simulink モデルの設定

手順 1: サポート パッケージのインストール

Unreal Engine と Vehicle Dynamics Blockset Interface for Unreal Engine Projects サポート パッケージを既にダウンロードしてインストールしている場合は、次の手順に進みます。

サポート パッケージをインストールして構成するには、車両運動のシミュレーションのための 3D シーンのカスタマイズを参照してください。

サポート パッケージをインストールする前に、ご使用の環境がUnreal Engine シミュレーション環境の要件と制限に記載されているソフトウェアとハードウェアの最小要件を満たしていることを確認してください。

メモ

Unreal Engine は必ず Simulink から起動してください。

手順 2: Simulink モデルの設定

新しい Simulink モデルを開きます。次のようにブロックを接続します。

Simulink model with connected blocks

手順 3: ブロックの構成

次のブロック設定を使用して、Unreal Editor との間でコーンのデータを送受信するようにブロックを構成します。

ブロックパラメーター設定

Constant

  • 定数値 — [-500,10,50]

    Unreal Editor の座標系におけるコーンの初期位置を設定 (単位は cm、左手系、Z が上向きの座標系)

  • ベクトル パラメーターを 1 次元として解釈 — off

  • 出力データ型 — single

Simulation 3D Scene Configuration

  • シーン ソース — Unreal Editor

  • プロジェクト — プロジェクトのパス

    プロジェクトのパス (例: サポート パッケージのプロジェクト C:\Local\AutoVrtlEnv\AutoVrtlEnv.uproject)

  • Unreal Editor を開く — エディターを開くために選択

Simulation 3D Message Get

  • 信号名、SigName — ConeLocGet

  • データ型、DataType — single

  • メッセージ サイズ、MsgSize — [1 3]

  • サンプル時間 — -1

Simulation 3D Message Set

  • 信号名、SigName — ConeLocSet

  • サンプル時間 — -1

C++ のワークフロー: データを送受信するための Unreal Engine の設定

手順 4: エディター モードで Unreal Editor を開く

  1. Unreal Engine C++ プロジェクトを作成します。TestSim3dGetSet という名前を付けます。C++ プロジェクトを作成する手順については、Unreal Engine での空のプロジェクトの作成を参照してください。

  2. Unreal Editor の [Edit] タブで [Plugins] を選択します。[MathWorks Interface] プラグインのチェックボックスがオンになっていることを確認します。選択されていない場合は、選択します。

  3. Unreal Editor を閉じます。

  4. Visual Studio® を開いていない場合は開きます。

  5. Visual Studio で、TestSim3dGetSet プロジェクトのビルド ファイルに MathWorksSimulation の依存関係を追加します。

    • [ソリューション エクスプローラー] で、プロジェクトのビルド ファイル TestSim3dGetSet.Build.cs はフォルダー ...Games\TestSim3dGetSet\Source\TestSim3dGetSet にあります。

    • ビルド ファイルで、11 行目を編集して MathWorksSimulation 依存関係を追加します。

      PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", 
      "Engine", "InputCore", "EnhancedInput", "MathWorksSimulation"}); 

  6. 変更を保存して TestSim3dGetSet プロジェクトを閉じます。

  7. Visual Studio を閉じます。

  8. モデルで Simulation 3D Scene Configuration ブロックを開きます。

    1. [プロジェクト] を Your_Project_path\TestSim3dGetSet.uproject に設定します。

    2. [Unreal Editor を開く] を選択します。

手順 5: アクター クラスの作成

  1. Unreal Editor の [Content Browser] タブで、[Settings] の下にある [Show Engine Content] と [Show Plugin Content] を選択します。

    Unreal Editor options

    ヒント

    [Content Browser] が Unreal Editor レイアウトにない場合は、[Content Drawer] をクリックして [Content Browser] を表示し、[Dock in Layout] を選択します。

  2. Unreal Editor で、MathWorks Interface C++ classes ディレクトリから [Sim3dActor] を選択します。

    Unreal Editor content browser

    右クリックして [Create C++ class derived from Sim3dActor] を選択します。

    Unreal Editor class actions

  3. 新しい Sim3dActor に SetGetActorLocation という名前を付けます。[Public] を選択します。[Create Class] をクリックします。

  4. Unreal Editor を閉じます。

手順 6: SetGetActorLocation.h を開く

Visual Studio が開き、プロジェクト フォルダーに新しい C++ ファイルが表示されます。

  • SetGetActorLocation.h

  • SetGetActorLocation.cpp

Unreal Editor が閉じていることを確認してください。

Visual Studio でソリューション TestSim3dGetSet をビルドします。

  1. ソリューション エクスプローラーで、Games フォルダーにある [TestSim3dGetSet] を右クリックします。

  2. [ビルド] を選択します。

  3. ソリューションのビルドが完了したら、SetGetActorLocation.h を開きます。ファイルを次のように編集します。

    SetGetActorLocation.h の置換コードは次のとおりです。

    // Copyright 2019-2022 The MathWorks, Inc.
    
    #pragma once
    
    #include "CoreMinimal.h"
    #include "Sim3dActor.h"
    #include "SetGetActorLocation.generated.h"
    
    UCLASS()
    class TESTSIM3DGETSET_API ASetGetActorLocation : public ASim3dActor
    {
    	GENERATED_BODY()
    	
    	void *SignalReader;
    	void *SignalWriter;
    
    public:	
    	// Sets default values for this actor's properties
    	ASetGetActorLocation();
    
    	virtual void Sim3dSetup() override;
    	virtual void Sim3dRelease() override;
    	virtual void Sim3dStep(float DeltaSeconds) override;
    };
    

    メモ

    SetGetActorLocation.h でのクラス名は、プロジェクト名の末尾に _API を追加したものと一致しなければなりません。

手順 7: SetGetActorLocation.cpp を開く

SetGetActorLocation.cpp を開き、コードのブロックを置き換えます。

次のコードにより、Simulink ブロック Simulation 3D Message Set と Simulation 3D Message Get のそれぞれの [信号名] パラメーターに対するポインターを設定できます。

// Sets default values
ASetGetActorLocation::ASetGetActorLocation():SignalReader(nullptr), SignalWriter(nullptr)
{
}

次のコードにより、割り当てられたタグ名を使用してシーンでインスタンス化された後に、このアクターのタグ名にアクセスできるようになります。さらに、このコードは、Unreal Editor と Simulink の間のリンクを開始するためにポインター SignalReader と SignalWriter を初期化します。変数は次のブロックの [信号名] パラメーターの値を表します。

  • SignalReaderTag — Simulation 3D Message Set

  • SignalWriterTag — Simulation 3D Message Get

void ASetGetActorLocation::Sim3dSetup()
{
Super::Sim3dSetup();
       if (Tags.Num() != 0) {
              unsigned int numElements = 3;
              FString tagName = Tags.Top().ToString();

              FString SignalReaderTag = tagName;
              SignalReaderTag.Append(TEXT("Set"));
              SignalReader = StartSimulation3DMessageReader(TCHAR_TO_ANSI(*SignalReaderTag), sizeof(float)*numElements);

              FString SignalWriterTag = tagName;
              SignalWriterTag.Append(TEXT("Get"));
              SignalWriter = StartSimulation3DMessageWriter(TCHAR_TO_ANSI(*SignalWriterTag), sizeof(float)*numElements);
              }
}

次のコードは、Simulation 3D Message Set で設定されたデータ値を実行時に Unreal Engine で読み取り、Simulation 3D Message Get に再度書き込む場合に追加します。Unreal Engine では、このデータを使用してアクターの位置の値を設定します。

void ASetGetActorLocation::Sim3dStep(float DeltaSeconds)
{
       unsigned int numElements = 3;
       float array[3];
       int statusR = ReadSimulation3DMessage(SignalReader, sizeof(float)*numElements, array);
       FVector NewLocation;
       NewLocation.X = array[0];
       NewLocation.Y = array[1];
       NewLocation.Z = array[2];
       SetActorLocation(NewLocation);
       float fvector[3] = { NewLocation.X, NewLocation.Y, NewLocation.Z };
       int statusW = WriteSimulation3DMessage(SignalWriter, sizeof(float)*numElements ,fvector);
}

次のコードは、Simulink の停止ボタンを押したときに Unreal Engine が停止するように設定する場合に追加します。このコードにより、ポインター SignalReader と SignalWriter が破棄されます。

void ASetGetActorLocation::Sim3dRelease()
{
       Super::Sim3dRelease();
       if (SignalReader) {
              StopSimulation3DMessageReader(SignalReader);
       }
       SignalReader = nullptr;     

       if (SignalWriter) {
              StopSimulation3DMessageWriter(SignalWriter);
       }
       SignalWriter = nullptr;
}

SetGetActorLocation.cpp の全体の置換コードは次のとおりです。

// Copyright 2019-2022 The MathWorks, Inc.
#include "SetGetActorLocation.h"

// Sets default values
ASetGetActorLocation::ASetGetActorLocation():SignalReader(nullptr), SignalWriter(nullptr)
{
}

void ASetGetActorLocation::Sim3dSetup()
{
Super::Sim3dSetup();
       if (Tags.Num() != 0) {
              unsigned int numElements = 3;
              FString tagName = Tags.Top().ToString();

              FString SignalReaderTag = tagName;
              SignalReaderTag.Append(TEXT("Set"));
              SignalReader = StartSimulation3DMessageReader(TCHAR_TO_ANSI(*SignalReaderTag), sizeof(float)*numElements);

              FString SignalWriterTag = tagName;
              SignalWriterTag.Append(TEXT("Get"));
              SignalWriter = StartSimulation3DMessageWriter(TCHAR_TO_ANSI(*SignalWriterTag), sizeof(float)*numElements);
              }
}

void ASetGetActorLocation::Sim3dStep(float DeltaSeconds)
{
       unsigned int numElements = 3;
       float array[3];
       int statusR = ReadSimulation3DMessage(SignalReader, sizeof(float)*numElements, array);
       FVector NewLocation;
       NewLocation.X = array[0];
       NewLocation.Y = array[1];
       NewLocation.Z = array[2];
       SetActorLocation(NewLocation);
       float fvector[3] = { NewLocation.X, NewLocation.Y, NewLocation.Z };
       int statusW = WriteSimulation3DMessage(SignalWriter, sizeof(float)*numElements ,fvector);
}

void ASetGetActorLocation::Sim3dRelease()
{
       Super::Sim3dRelease();
       if (SignalReader) {
              StopSimulation3DMessageReader(SignalReader);
       }
       SignalReader = nullptr;     

       if (SignalWriter) {
              StopSimulation3DMessageWriter(SignalWriter);
       }
       SignalWriter = nullptr;
}

手順 8: Visual Studio プロジェクトをビルドして Unreal Editor を開く

Visual Studio で、[デバッグ] 、 [デバッグの開始] を選択するか F5 キーを押して TestSim3dGetSet ソリューションを実行します。Unreal Editor が開きます。

メモ

Unreal Editor で、[File] 、 [Save Current Level] をクリックして現在のレベルを保存します。レベルに TestMap という名前を付けます。[Edit] 、 [Project Settings] 、 [Maps&Modes] をクリックして、このレベルを既定のプロジェクト設定として追加します。次に、[Editor Startup Map] と [Game Default Map] の既定値として TestMap を選択します。既定値を保存するには、[Project Settings] を閉じます。

Unreal Editor project settings

手順 9: アクターの配置とチェック

  1. Unreal Editor の [Place Actor] アイコンで、「Set Get Actor Location」を検索して TestMap に配置します。

    Unreal Editor Place Actors tab

  2. [Outliner] タブで、インスタンス化された新しいアクター SetGetActorLocation がリストに表示されることを確認します。

    Unreal Editor World Outliner tab

手順 10: メッシュの追加

手順 9: アクターの配置とチェックで作成したアクターをクリックします。

  1. [Details] パネルで、[Add] をクリックしてアクター SetGetActorLocation にメッシュを追加します。既定のメッシュである Cone を選択します。

    Unreal Editor add component

  2. アクター SetGetActorLocation の [Tags] プロパティを見つけます。[0 Array elements] の横のプラス記号をクリックしてタグを追加します。ConeLoc という名前を付けます。

    Unreal Editor add component

    ヒント

    Simulink と Unreal Engine 環境との通信を確立するため、Simulation 3D Message Get ブロックと Simulation 3D Message Set ブロックで設定された [信号名] パラメーターと一致するように、C++ コードで Get と Set がタグ名に追加されます。

手順 11: コーンの位置の設定

[Details] タブで [Cone] をクリックします。コーンを X = 0.0、Y = 0.0、Z = 0.0 に設定します。さらに、アクターの [Mobility] プロパティを Movable に設定します。

Unreal Editor set cone location

手順 12: 親クラスの設定とシーンの保存

親クラスを設定します。

  1. Blueprint icon の下の [Open Level Blueprint] をクリックします。

    Unreal Editor blueprint

  2. [Class Settings] を選択します。[Class Options] で、[Parent Class] を Sim 3d Level Script Actor に設定します。

    Unreal Editor class settings

Unreal Editor のシーンを保存します。

手順 13: シミュレーションの実行

シミュレーションを実行します。シミュレーションの実行に進みます。

参照: Simulink のデータを送受信する C++ 関数

Simulink のデータを送受信するには、Sim3dSetup、Sim3dStep、および Sim3dRelease から次の C++ 関数を呼び出します。

ブループリントのワークフロー: データを送受信するための Unreal Engine の設定

手順 4: エディター モードで Unreal Editor を開く

  1. Unreal Engine ブループリント プロジェクトを作成します。プロジェクトに TestSim3dGetSet という名前を付けます。ブループリント プロジェクトを作成する手順については、Unreal Engine での空のプロジェクトの作成を参照してください。

  2. Unreal Editor の [Edit] タブで [Plugins] を選択します。[MathWorks Interface] プラグインが有効になっていることを確認します。無効になっている場合は、有効にして Unreal Editor を再起動し、変更を有効にします。

  3. Unreal Editor を閉じます。

  4. モデルで Simulation 3D Scene Configuration ブロックを開きます。

    1. [プロジェクト] を Your_Project_path\TestSim3dGetSet.uproject に設定します。

    2. [Unreal Editor を開く] を選択します。

Unreal Editor で、[File] 、 [Save Current Level] をクリックして現在のレベルを保存します。レベルに TestMap という名前を付けます。[Edit] 、 [Project Settings] 、 [Maps&Modes] をクリックして、このレベルを既定のプロジェクト設定として追加します。次に、[Editor Startup Map] と [Game Default Map] の既定値として TestMap を選択します。既定値を保存するには、[Project Settings] を閉じます。

Unreal Editor project settings

手順 5: データを受信するためのシーンの構成

Simulation 3D Message Set ブロックを使用するには、Simulink モデルからデータを受信するように Unreal Engine 環境のシーンを構成する必要があります。

  1. Unreal Editor で、Cone アクターをインスタンス化します。

    Unreal Editor place actors tab with cone

  2. [Details] パネルで、アクターの [Mobility] プロパティを Movable に設定します。

    Unreal Editor details tab with mobility property set to movable.

  3. Unreal Editor で、Simulink モデルから受信するデータ型に対応する Sim3DGet アクターをインスタンス化します。次の例は、Unreal Editor の Sim3DGet のデータ型を示しています。Sim 3d Get Float を選択します。

    Unreal Editor Modes tab

  4. [Details] パネルで、Simulation 3D Message Set ブロックの [信号名] パラメーターと一致するアクターのタグ名を指定します。この例では、タグ ConeLocSet を追加します。

  5. [Details] パネルで、[Read Array Float Max Num Elements] を 3 に設定します。

    Unreal Editor Read Array Size

  6. レベル ブループリントに移動します。

  7. 親クラスを設定します。

    1. Blueprint icon の下の [Open Level Blueprint] をクリックします。

      Unreal Editor blueprint

    2. [Class Settings] を選択します。[Class Options] で、[Parent Class] を Sim 3d Level Script Actor に設定します。

      Unreal Editor class settings

    プロジェクトのゲーム モードを Sim3dGameMode に設定します。Unreal Editor のツール バーで [Edit] 、 [Project Settings] 、 [Project] 、 [Maps & Modes] を選択します。Sim3dGameMode を選択します。

  8. グラフを右クリックし、Simulink モデルから受信するデータ型とサイズに基づいて、Sim3DGet アクター クラスのブループリント メソッドを調べます。

    この例では、配列のサイズは 3 です。Unreal Editor の図から、サイズが 3 の float データ型の配列を受信する Sim3dGetFloat アクター クラスのメソッドは Read Vector Float であることがわかります。

    Unreal Editor blueprint connections

    メモ

    読み取る必要のある要素数に応じて、次のいずれかのメソッドを使用します。

    • Read Scalar <DATA_TYPE> — 1 要素を読み取る。

    • Read Vector <DATA_TYPE> — 3 要素ベクトルを 1 つ読み取る。

    • Read Array <DATA_TYPE> — X 要素の配列を 1 つ読み取る。

  9. シーンをコンパイルして保存します。

手順 6: データを送信するためのシーンの構成

Simulink モデルにデータを送信するように Unreal Engine 環境のシーンを構成するには、次を行います。

  1. Unreal Editor で、Simulink モデルに送信するデータ型に対応する Sim3DSet アクターをインスタンス化します。次の例は、Unreal Editor の Sim3DSet のデータ型を示しています。Sim 3d Set Float を選択します。

    Unreal Editor Modes tab

  2. Simulation 3D Message Get ブロックの [信号名] パラメーターと一致するアクターのタグ名を指定します。この例では、タグ ConeLocGet を追加します。[Write Array Float Max Num Element] を 3 に設定します。

  3. レベル ブループリントに移動します。

  4. Simulation 3D Message Get ブロックの [データ型] パラメーターと [メッセージ サイズ] パラメーターで指定されたデータ型とサイズに基づいて、Sim3DSet アクター クラスのブループリント メソッドを調べます。

    この例では、配列のサイズは 3 です。Unreal Editor の図から、サイズが 3 の float データ型の配列を送信する Sim3DSetFloat アクター クラスのメソッドは Write Vector Float であることがわかります。

    Unreal Editor blueprint connections

    メモ

    書き込む必要のある要素数に応じて、次のいずれかのメソッドを使用します。

    • Write Scalar <DATA_TYPE> — 1 要素を書き込む。

    • Write Vector <DATA_TYPE> — 3 要素ベクトルを 1 つ書き込む。

    • Write Array <DATA_TYPE> — X 要素の配列を 1 つ書き込む。

  5. シーンをコンパイルして保存します。

手順 7: ブループリントの作成

Unreal Editor で、Get アクターと Set アクターを接続するレベル ブループリントを開きます。

レベル ブループリントで、たとえば次のように接続します。

Unreal Editor blueprint connections

メモ

Simulink と Unreal Editor は、Event Sim 3d step イベントでデータを交換します。Event Sim 3d step イベントは Tick イベントによってトリガーされ、レベル ブループリントと Simulink モデルが同期されます。

手順 8: シミュレーションの実行

シミュレーションを実行します。シミュレーションの実行に進みます。

シミュレーションの実行

Simulink モデルと Unreal Editor 環境を構成したら、シミュレーションを実行できます。

シミュレーションを実行します。

  1. Simulink モデルで [実行] をクリックします。

    Unreal Editor で開かれるプロジェクトがシーンのソースであるため、シミュレーションは開始されません。

  2. Simulink の [診断ビューアー] ウィンドウに次のメッセージが表示されていることを確認します。

    In the Simulation 3D Scene Configuration block, you set the scene source to 'Unreal Editor'. In Unreal Editor, select 'Play' to view the scene.

    これは、Simulink が Unreal Engine 3D 環境でアクターおよび他のアセットをインスタンス化したことを示す確認のメッセージです。

  3. Unreal Editor で [Play] をクリックします。Unreal Editor で現在開いているシーンでシミュレーションが実行されます。

実行時に Simulink モデルで Constant ブロックの値を変更して、Unreal Editor 環境で対応するコーンの位置の変化を確認することもできます。

送受信できるデータ型は、double、single、int8、uint8、int16、uint16、int32、uint32、boolean です。手順 7: SetGetActorLocation.cpp を開くのコードは、Simulink から single データ型の値 (または float の値) を読み取ります。

参考

| | | | | |

トピック

外部の Web サイト