Main Content

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

Unreal Engine シミュレーションのウェイポイントの選択

この例では、3D シミュレーション環境でシーンから一連のウェイポイントを選択し、これらのウェイポイントを追従する車両のパスを可視化する方法を説明します。この環境では、Epic Games® の Unreal Engine® を使用します。

はじめに

Automated Driving Toolbox™ は Simulink® に Unreal Engine シミュレーション環境を統合します。シミュレーション環境に関連した Simulink ブロックは、drivingsim3d ライブラリにあります。これらのブロックにより、以下を行うことができます。

  • シミュレーション環境のさまざまなシーンを選択する。

  • シーンに車両を配置して移動させる。

  • 車両にセンサーを取り付けて設定する。

  • 車両の周囲の環境に基づいてセンサー データをシミュレートする。

この強力なシミュレーション ツールは、自動運転アルゴリズムの開発、テスト、パフォーマンスの確認を行う際に実データを補完するために使用できます。車両モデルとともにこの環境を使用して、知覚から制御に至る自動運転スタック全体が含まれた現実的な閉ループ シミュレーションを実行できます。

この環境を使用する際の最初のステップは、シーンを理解し、目的の車両パスに沿ったウェイポイントを選択することです。このステップは、位置推定アルゴリズムがテスト対象ではないシナリオで特に役立ちます。この例では、この最初のステップに焦点を合わせています。

この例では、次のことを行います。

  • MATLAB® でシーンを可視化する。

  • シーンのパスに沿ってウェイポイントを対話的に選択する。

  • シミュレーション環境を設定する。

  • パスに沿って車両を移動する。

シーンの可視化

まず、MATLAB® でシーンを可視化します。シーンの 2D 上面ビューをイメージに投影して、各シーンを可視化できます。各シーン イメージは、シーンのイメージとワールド座標のピクセル間の関係を記述するクラスimref2dの、対応する 2 次元空間参照オブジェクトをもちます。関数 helperGetSceneImage を使用して、シーン イメージおよび関連付けられた空間参照を取得します。この例では、あらかじめ用意された大型駐車場のシーンを使用しています。カスタム シーンのシーン イメージおよび空間参照を生成するには、代わりに、Create Top-Down Static Map of Unreal Engine Sceneで説明しているプロセスに従ってください。

sceneName = 'LargeParkingLot';
[sceneImage, sceneRef] = helperGetSceneImage(sceneName);

シーンの物理的寸法をよりよく理解するには、変数 sceneRef を調べます。XWorldLimits プロパティおよび YWorldLimits プロパティは、X 方向および Y 方向におけるワールドの範囲を指定します。

sceneRef.XWorldLimits   % (in meters)
ans = 1×2

  -78.6000   72.6000

sceneRef.YWorldLimits   % (in meters)
ans = 1×2

  -77.7000   73.5000

関数 helperShowSceneImage を使用してシーン イメージを可視化します。次の補助関数は、Figure ウィンドウにシーン イメージを表示します。パン ツールとズーム ツールを使用してシーンを探索します。

hScene = figure;
helperShowSceneImage(sceneImage, sceneRef)
title(sceneName)

ウェイポイントの対話的な選択

シーンを探索した後で、一連のウェイポイントを選択して、車両が追従するパスを定義します。このパスを使用してシーン内で車両を移動できます。補助関数 helperSelectSceneWaypoints を使用して、シーン内のウェイポイントを対話的に選択します。

hFig = helperSelectSceneWaypoints(sceneImage, sceneRef);

Figure Draw Scene Waypoints contains an axes object and other objects of type uicontrol. The axes object contains an object of type image.

この補助関数は、選択したシーンが含まれた Figure ウィンドウを開きます。

  • シーンを探索するには、シーン イメージ全体にわたってズームとパンを行います。ズームするには、マウスのスクロール ホイールまたは座標軸ツール バーを使用します。座標軸の端にカーソルを合わせて、その方向にパンします。

  • パスの描画を開始するには、シーンをクリックします。パスは、複数の点で構成されるポリラインとして作成されます。パスの描画を終了するには、ダブルクリックまたは右クリックします。

  • パスの描画が完了したら、[Export to Workspace] をクリックし、MATLAB ワークスペースに変数をエクスポートします。開いたダイアログ ボックスで、[OK] をクリックして、ワークスペースに一連の変数をエクスポートします。

以下のデータが MATLAB 変数としてワークスペースにエクスポートされます。

  • ウェイポイント: 各要素にワールド座標のウェイポイント (x,y)"M" 行 2 列の行列を含む cell 配列。cell 配列の各要素は、異なるパスからのウェイポイントに対応します。

  • パスの姿勢: 各要素に各ウェイポイントの姿勢を含む姿勢 (x,y,θ)"M" 行 3 列の行列を含む cell 配列。x および y はメートル単位で指定します。θ は度単位で指定します。

% Load variables to workspace if they do not exist
if exist('refPoses', 'var')==0 || exist('wayPoints', 'var')==0
    
    % Load MAT-file containing preselected waypoints
    data = load('waypointsLargeParkingLot');
    data = data.waypointsLargeParkingLot;
    
    % Assign to caller workspace
    assignin('caller', 'wayPoints', {data.waypoints});
    assignin('caller', 'refPoses', {data.refPoses});
end

エクスポートされた変数には、一連のウェイポイント (wayPoints) および一連の姿勢 (refPoses) が含まれるようになります。関数smoothPathSplineを使用して、一連の姿勢を C2 連続のパスに変換します。

numPoses = size(refPoses{1}, 1);

refDirections  = ones(numPoses,1);   % Forward-only motion
numSmoothPoses = 20 * numPoses;      % Increase this to increase the number of returned poses

[smoothRefPoses,~,cumLengths] = smoothPathSpline(refPoses{1}, refDirections, numSmoothPoses);

モデルおよびシミュレーション環境の設定

VisualizeVehiclePathIn3DSimulation Simulink モデルを開きます。このモデルは、Simulation 3D Scene Configurationブロックを使用して目的のシーンを選択します。この例では、Large Parking Lotシーンを使用します。Simulation 3D Scene Configuration ブロックは、環境を設定して、Simulink とシミュレーション環境間の通信を確立します。

if ~ispc
    error(['3D Simulation is only supported on Microsoft', char(174), ' Windows', char(174), '.']);
end

modelName = 'VisualizeVehiclePathIn3DSimulation';
open_system(modelName);
snapnow;

パスに沿った車両の移動

Simulation 3D Vehicle with Ground Followingブロックを使用し、シーン内で車両を配置して移動させます。モデルは、From Workspace (Simulink)ブロックを使用してワークスペースからの変数 refPosesXrefPosesY、および refPosesT を受け入れるように設定されます。newRefPosesxy、および θ を別個の時系列に分けます。モデルは、これらのワークスペース変数を読み取って車両の位置を更新します。

% Configure the model to stop simulation at 5 seconds.
simStopTime = 5;
set_param(gcs, 'StopTime', num2str(simStopTime));

% Create a constant velocity profile by generating a time vector
% proportional to the cumulative path length.
timeVector = normalize(cumLengths, 'range', [0, simStopTime]);

% Create variables required by the Simulink model.
refPosesX = [timeVector, smoothRefPoses(:,1)];
refPosesY = [timeVector, smoothRefPoses(:,2)];
refPosesT = [timeVector, smoothRefPoses(:,3)];

モデルをシミュレートするときに、シミュレーション環境を初期化するために数秒間必要です。この初期化が完了すると、シミュレーション環境の可視化のための別のウィンドウが開きます。以下のイメージは、シミュレーション環境のウィンドウのスナップショットです。

シミュレーションを実行します。Figure ウィンドウのプロットに、車両がシミュレーション環境内を移動するパスが表示されます。

sim(modelName);

% Close the model and figure windows.
close(hFig)
close_system(modelName)   
close(hScene)

参考

ブロック

関数

関連するトピック