プログラムでのドライビング シナリオのバリエーションの作成
この例では、"ドライビング シナリオ デザイナー" アプリを使用して作成されたドライビング シナリオのバリエーションをプログラムで作成する方法を説明します。シナリオのバリエーションをプログラムで作成することにより、運転アルゴリズムを複数の条件下で迅速にテストできます。
ドライビング シナリオのバリエーションをプログラムで作成するには、次の手順に従います。
Driving Scenario Designerアプリを使用して、ドライビング シナリオを対話的に作成します。
このシナリオと等価な MATLAB® コードを生成する MATLAB 関数をエクスポートします。
MATLAB エディターで、エクスポートした関数を変更して、元のシナリオのバリエーションを作成します。
関数を呼び出して、シナリオを表す
drivingScenario
オブジェクトを生成します。シナリオ オブジェクトをアプリにインポートして、変更したシナリオをシミュレートするか、追加のシナリオを生成します。あるいは、変更したシナリオを Simulink® でシミュレートするには、Scenario Readerブロックを使用して、オブジェクトを Simulink モデルにインポートします。
次の図は、このワークフローを視覚的に表現したものです。
アプリでのシナリオの作成
"ドライビング シナリオ デザイナー" を使用して、アルゴリズムをテストするドライビング シナリオを対話的に作成します。シナリオの作成の詳細については、Create Driving Scenario Interactively and Generate Synthetic Sensor Dataを参照してください。
この例では、"ドライビング シナリオ デザイナー" アプリから読み込み可能な、プリビルド シナリオの 1 つに基づくドライビング シナリオを使用します。
アプリでシナリオ ファイルを開きます。
drivingScenarioDesigner('LeftTurnScenarioNoSensors.mat')
[実行] をクリックして、シナリオをシミュレートします。このシナリオでは、自車は北へ走行し、交差点をまっすぐ進みます。一方で、交差点の左側から入ってきた車両が左折し、最終的に隣接する車線で自車の前方に来ます。
簡単にするために、このシナリオには、自車に取り付けられたセンサーは含まれていません。
シナリオの MATLAB 関数のエクスポート
シナリオを表示してシミュレートした後に、シナリオを MATLAB コマンド ラインにエクスポートできます。"ドライビング シナリオ デザイナー" アプリのツールストリップから、[エクスポート]、[MATLAB 関数] を選択します。エクスポートされた関数には、アプリで作成されたシナリオの生成に使用する MATLAB コードが含まれています。エクスポートされた関数を開きます。
open LeftTurnScenarioNoSensors.m;
この関数を呼び出すと、シナリオの次の要素が返されます。
scenario
— シナリオの道路とアクター。drivingScenario
オブジェクトとして返されます。egoVehicle
— シナリオで定義されている自車。Vehicle
オブジェクトとして返されます。詳細については、関数vehicle
を参照してください。
シナリオにセンサーが含まれている場合、返される関数には、センサーを生成するための追加コードが含まれます。それらのセンサーを含むシナリオをシミュレートした場合、関数では、それらのセンサーの検出も生成できます。
関数の変更によるシナリオ バリエーションの作成
エクスポートされた MATLAB 関数でコードを変更することにより、単一シナリオの複数のバリエーションを生成できます。一般的なバリエーションの 1 つは、自車をさまざまな速度でテストすることです。エクスポートされた MATLAB 関数では、自車の速度は定数値 10 メートル/秒 (speed = 10
) に設定されています。自車のさまざまな速度を生成するために、速度変数を関数の入力引数に変換できます。エクスポートした関数の変更後のバージョンを含むスクリプトを開きます。
open LeftTurnScenarioNoSensorsModified.m;
変更後の関数は次のようになっています。
egoSpeed
が入力引数として含まれています。定数変数である
speed
が削除されています。自車の軌跡を計算するために、
speed
の代わりにegoSpeed
が使用されています。
次の図は、スクリプトのこれらの変更内容を示しています。
追加のバリエーションを生成するために、次のことを検討します。
車線検出への影響を確認するために、道路および車線のパラメーターを変更
車両の軌跡または開始位置を変更
車両の次元を変更
関数の呼び出しによるプログラムでのシナリオの生成
変更後の関数を使用して、自車が定速 20 メートル/秒で走行する、シナリオのバリエーションを生成します。
scenario = LeftTurnScenarioNoSensorsModified(20) % m/s
scenario = drivingScenario with properties: SampleTime: 0.0400 StopTime: Inf SimulationTime: 0 IsRunning: 1 Actors: [1x2 driving.scenario.Vehicle] Barriers: [0x0 driving.scenario.Barrier] ParkingLots: [0x0 driving.scenario.ParkingLot]
変更後のシナリオのアプリへのインポート
変更された車両を含む変更後のシナリオをアプリにインポートするには、関数 drivingScenarioDesigner
を使用します。drivingScenario
オブジェクトを入力引数として指定します。
drivingScenarioDesigner(scenario)
以前は、もう一方の車両が先に交差点を通過していました。今回は、自車の速度が秒速 10 メートルから 20 メートルに上昇したため、自車が先に交差点を通過します。
アプリで drivingScenario
オブジェクトを処理する場合は、次の点に留意してください。
自車のさまざまな速度を試すには、エクスポートした関数を再度呼び出してから、関数
drivingScenarioDesigner
を使用して新しいdrivingScenario
オブジェクトをインポートします。アプリには、これらのオブジェクトをインポートするためのメニュー オプションは含まれていません。シナリオにセンサーが含まれている場合は、構文
drivingScenarioDesigner(scenario,sensors)
を使用して、シナリオとセンサーの両方を再度開くことができます。アクターの寸法を大きく変更する場合は、アクターの
ClassID
プロパティが、アプリで指定されている [クラス ID] の値に対応することを確認します。たとえば、アプリ内では、自動車の [クラス ID] は1
で、トラックの [クラス ID] は2
です。自動車がトラックの寸法をもつようにプログラムで変更する場合は、その車両のClassID
プロパティを1
(自動車) から2
(トラック) に更新します。
変更後のシナリオの Simulink へのインポート
変更後のシナリオを Simulink モデルにインポートするには、Scenario Readerブロックを使用します。このブロックは道路とアクターを、アプリから保存されたシナリオ ファイル、あるいは MATLAB ワークスペースまたはモデル ワークスペースに保存された drivingScenario
変数から読み取ります。Scenario Reader ブロックをモデルに追加し、次のパラメーターを設定します。
[ドライビング シナリオのソース] を
From workspace
に設定します。[MATLAB またはモデル ワークスペースの変数名] を、ワークスペース内の
drivingScenario
変数の名前に設定します。
Simulink で drivingScenario
オブジェクトを処理する場合は、次の点に留意してください。
[自車のソース] が
Scenario
に設定されている場合、モデルはdrivingScenario
オブジェクトで定義されている自車を使用します。ブロックは、アクターの指定されたActorID
プロパティに基づいて、どのアクターが自車であるかを特定します。このアクターはVehicle
オブジェクトでなければなりません (vehicle
を参照)。指定された自車を変更するには、[自車の ActorID] パラメーターを更新します。出力されるアクターの姿勢をセンサー ブロックに接続する場合は、センサー ブロック内で、アクター プロファイルのソースを指定するためのパラメーターが
From Scenario Reader block
に設定されていることを確認します。このオプションが選択されている場合、センサー ブロックはdrivingScenario
オブジェクトで指定されているアクターから直接アクター プロファイルを取得します。
参考
アプリ
ブロック
- Radar Detection Generator | Vision Detection Generator | Scenario Reader | Lidar Point Cloud Generator