メインコンテンツ

RoadRunner HD マップを使用したプログラムによる単純な道路の作成

RoadRunner HD マップは、RoadRunner シーン内で高精細度 (HD) のマップ データを表すための道路データ モデルです。このモデルによってシンプルな構造を定義し、車線、車線境界線、車線区分線、および junction を使用して道路のレイアウトを表現します。この例では、RoadRunner HD マップ MATLAB® のオブジェクトおよび関数を使用して単純な道路を作成する方法を説明します。その後、RoadRunner に道路をインポートできます。道路を作成して RoadRunner シーンにインポートする手順は、次のとおりです。

  • MATLAB で HD マップを作成する

  • MATLAB でマップをプロットして、車線および車線境界線の表現を確認する

  • マップを RoadRunner HD マップ(.rrhd) ファイルに書き込む

  • ファイルを RoadRunner にインポートし、RoadRunner HD マップ データをプレビューする

  • インポートされたファイルから RoadRunner シーンを構築する (RoadRunner Scene Builder が必要)。

区分線なしの直線道路の作成

固定幅の道路は、道路の中央位置に対応する一連の "x-y" 座標を使用して定義されます。次の図は、このセクションで作成する区分線なしの直線道路を示しています。また、MATLAB で道路をプロットしてから、バイナリ ファイルに保存します。

roadrunnerHDMap オブジェクトを呼び出して、空の RoadRunner HD マップを作成します。

rrMap = roadrunnerHDMap;

直線道路の中央を、道路の中央を指定する 3 セットの "x-y" 座標を含む 2 次元配列として定義します。また、道路の幅を定義します。

roadCenters = [0 0;0 50;0 100];
roadWidth = 6;

roadrunner.hdmap.LaneBoundary オブジェクトを使用して、道路の左右の境界線を作成します。車線 ID および車線のジオメトリを定義する座標について、車線境界線の情報を指定します。

rrMap.LaneBoundaries(1) = roadrunner.hdmap.LaneBoundary(ID="Left",Geometry=roadCenters-[roadWidth/2 0]);
rrMap.LaneBoundaries(2) = roadrunner.hdmap.LaneBoundary(ID="Right",Geometry=roadCenters+[roadWidth/2 0]);

roadrunner.hdmap.Lane オブジェクトを使用して、道路の車線を作成します。車線 ID、車線のジオメトリを定義する座標、車線通行方向、および車線タイプについて、車線の情報を指定します。

rLane = roadrunner.hdmap.Lane(ID="Lane",Geometry=roadCenters,TravelDirection="Forward",LaneType="Driving");

車線に車線境界線をリンクします。各車線の左右の車線境界線を定義し、車線と車線境界線の間のアライメントを指定します。

leftBoundary(rLane,"Left",Alignment="Forward");
rightBoundary(rLane,"Right",Alignment="Forward");
rrMap.Lanes = rLane;

RoadRunner にインポートする前に、車線中央と車線境界線をプロットして車線と車線境界線をプレビューします。

plot(rrMap);

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Lane Boundaries, Lane Centers.

関数 write を使用して、前の手順でプロットした HD マップをファイルに書き込みます。

write(rrMap,"straightRoad.rrhd");

RoadRunner への HD マップ ファイルのインポートと作成

拡張子が .rrhd の RoadRunner HD マップ ファイルを RoadRunner にインポートする手順、マップをプレビューする手順、およびシーンを構築する手順の詳細については、RoadRunner HD マップを使用したカスタム データのインポートを参照してください。

MATLAB® コマンド ラインから、roadrunner オブジェクトを使用して RoadRunner アプリケーションを開きます。roadrunner オブジェクトを初めて作成する前に、RoadRunner のインストールと RoadRunner のライセンスのアクティベーションを対話的に行う必要があります。詳細については、RoadRunner のインストールとアクティベーションを参照してください。

rrApp = roadrunner(ProjectFolder="C:\RR\MyProject", InstallationFolder="C:\Program Files\RoadRunner R2024a");

または、roadrunnerSetup (Automated Driving Toolbox)関数を使用して、RoadRunner アプリケーションを対話的に起動することもできます。この関数により、RoadRunner を開く際に使用するプロジェクト フォルダーとインストール フォルダーを指定するためのダイアログ ボックスが開きます。

指定したファイルから現在開いているシーンに RoadRunner HD マップ データをインポートして作成します。シーンを構築する前に、RoadRunner Scene Builder のライセンスのアクティベーションを対話的に行う必要があります。

file = fullfile(pwd,"straightRoad.rrhd");
importScene(rrApp,file,"RoadRunner HD Map");

次の図は、RoadRunner Scene Builder を使用して構築されたシーンを示しています。

直線道路への区分線の追加

このセクションでは、前のセクションで作成した直線道路の左右の車線境界線に実線の白い車線区分線を追加します。車線区分線を指定するには、RoadRunner でアセットが必要です。この例では、RoadRunner アセット タイプの一部であるアセットを使用します。これらのアセットは、RoadRunner プロジェクト フォルダーへの相対パスを使用してマップ内に指定されています。

関数 roadrunner.hdmap.RelativeAssetPath を使用して、実線の白い車線区分線アセットへのパスを定義します。

solidWhiteAsset = roadrunner.hdmap.RelativeAssetPath(AssetPath="Assets/Markings/SolidSingleWhite.rrlms");

roadrunner.hdmap.LaneMarking オブジェクトを使用して、直線道路上に実線の白い車線区分線を作成します。車線区分線 ID およびアセットへのパスについて、車線区分線の情報を指定します。

rrMap.LaneMarkings = roadrunner.hdmap.LaneMarking(ID="SolidWhite",AssetPath=solidWhiteAsset);

roadrunner.hdmap.MarkingReference オブジェクトを使用して、車線境界線に適用するための実線の白い区分線のリファレンスを作成します。

markingRefSW = roadrunner.hdmap.MarkingReference(MarkingID=roadrunner.hdmap.Reference(ID="SolidWhite"));

パラメトリック属性を使用して、左右の車線境界線の全長にわたるように、この車線区分線を適用します。

markingSpan = [0 1];
markingAttribSW = roadrunner.hdmap.ParametricAttribution(MarkingReference=markingRefSW,Span=markingSpan);
rrMap.LaneBoundaries(1).ParametricAttributes = markingAttribSW;
rrMap.LaneBoundaries(2).ParametricAttributes = markingAttribSW;

変更された HD マップをファイルに書き込みます。

write(rrMap,"straightRoadWithMarkings.rrhd");

指定したファイルから現在開いているシーンに RoadRunner HD マップ データをインポートして作成します。

file = fullfile(pwd,"straightRoadWithMarkings.rrhd");
importScene(rrApp,file,"RoadRunner HD Map");

次の図は、RoadRunner Scene Builder を使用して構築されたシーンを示しています。

双方向の道路の作成

双方向の道路には、車線通行方向が反対の 2 本の車線があります。実線の黄色い車線区分線によって車線が分離されます。次の図は、このセクションで作成する双方向の直線道路を示しています。前のセクションで使用したのと同じ道路の中央および道路幅を使用します。

roadrunnerHDMap オブジェクトを呼び出して、空の RoadRunner HD マップを作成します。

rrMap = roadrunnerHDMap;

車線および車線境界線を指定します。この例では、値の事前初期化により、マップ内のオブジェクトの数が増加するにつれてパフォーマンスが向上します。

rrMap.Lanes(2,1) = roadrunner.hdmap.Lane();
rrMap.LaneBoundaries(3,1) = roadrunner.hdmap.LaneBoundary();

Lane プロパティの値を割り当てます。関数 deal を使用して、入力リストと出力リストを一致させます。

[rrMap.Lanes.ID] = deal("Lane1","Lane2");
[rrMap.Lanes.Geometry] = deal(roadCenters-[roadWidth/4 0],roadCenters+[roadWidth/4 0]);
[rrMap.Lanes.TravelDirection] = deal("Backward","Forward");
[rrMap.Lanes.LaneType] = deal("Driving");

LaneBoundaries プロパティの値を割り当てます。この例では、中央車線は Lane1Lane2 の間で共有されます。

[rrMap.LaneBoundaries.ID] = deal("Left","Center","Right");
[rrMap.LaneBoundaries.Geometry] = deal(roadCenters-[roadWidth/2 0],...
  roadCenters,roadCenters+[roadWidth/2 0]);

車線に車線境界線をリンクします。各車線の左右の車線境界線を定義し、車線と車線境界線の間のアライメントを指定します。

leftBoundary(rrMap.Lanes(1),"Left",Alignment="Forward");
rightBoundary(rrMap.Lanes(1),"Center",Alignment="Forward");
leftBoundary(rrMap.Lanes(2),"Center",Alignment="Forward");
rightBoundary(rrMap.Lanes(2),"Right",Alignment="Forward");

前に追加した実線の白い区分線に加えて、実線の黄色い区分線を追加します。関数 roadrunner.hdmap.RelativeAssetPath を使用して、実線の黄色い車線区分線アセットへのパスを定義します。

solidYellowAsset = roadrunner.hdmap.RelativeAssetPath(AssetPath="Assets/Markings/SolidSingleYellow.rrlms");

roadrunner.hdmap.LaneMarking オブジェクトを使用して、直線道路上に実線の黄色い車線区分線を作成します。車線区分線 ID およびアセットへのパスについて、車線区分線の情報を指定します。

rrMap.LaneMarkings(2,1) = roadrunner.hdmap.LaneMarking();
[rrMap.LaneMarkings.ID] = deal("SolidWhite","SolidYellow");
[rrMap.LaneMarkings.AssetPath] = deal(solidWhiteAsset,solidYellowAsset);

白い区分線を車線エッジの車線境界線に割り当てて、黄色い区分線を中央の車線境界線に割り当てます。これらの区分線は、境界線の全長にわたります。

markingRefSY = roadrunner.hdmap.MarkingReference(MarkingID=roadrunner.hdmap.Reference(ID="SolidYellow"));
markingAttribSY = roadrunner.hdmap.ParametricAttribution(MarkingReference=markingRefSY,Span=markingSpan);
[rrMap.LaneBoundaries.ParametricAttributes] = deal(markingAttribSW,markingAttribSY,markingAttribSW);

車線中央と車線境界線をプロットします。

plot(rrMap)

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Lane Boundaries, Lane Centers.

HD マップをファイルに書き込みます。

write(rrMap,"twoWayRoad.rrhd");

指定したファイルから現在開いているシーンに RoadRunner HD マップ データをインポートして作成します。

file = fullfile(pwd,"twoWayRoad.rrhd");
importScene(rrApp,file,"RoadRunner HD Map");

次の図は、RoadRunner Scene Builder を使用して構築されたシーンを示しています。

一方通行の道路への車線の追加

このセクションでは、一方通行の道路に車線を追加します。破線の白い区分線を使用して、進行方向が同じ 2 つの車線を分離します。一方通行の道路に車線を追加するには、1 本の車線を車線の左エッジから 2 本に分割する必要があります。このためには、車線を分割する RoadRunner HD マップ内に追加の車線と車線境界線を作成する必要があります。次の図は、一方通行の道路に追加する車線を示しています。

roadrunnerHDMap オブジェクトを呼び出して、空の RoadRunner HD マップを作成します。

rrMap = roadrunnerHDMap;

車線および車線境界線を指定します。

rrMap.Lanes(5,1) = roadrunner.hdmap.Lane();
rrMap.LaneBoundaries(8,1) = roadrunner.hdmap.LaneBoundary();

車線グループおよび車線区分線を指定します。

rrMap.LaneGroups(3,1) = roadrunner.hdmap.LaneGroup();
rrMap.LaneMarkings(3,1) = roadrunner.hdmap.LaneMarking();

Lane プロパティの値を割り当てます。Lane1Lane4Lane5 に分割し、移行に Lane2Lane3 を使用します。

[rrMap.Lanes.ID] = deal("Lane1","Lane2","Lane3","Lane4","Lane5");
[rrMap.Lanes.Geometry] = deal([0 -20;0 0;0 20;],[0 20;0 40;0 60;],[0 20;-3 40;-6 60],[-6 60;-6 80;-6 100],[0 60;0 80;0 100]);
[rrMap.Lanes.TravelDirection] = deal("Forward");
[rrMap.Lanes.LaneType] = deal("Driving");

LaneBoundaries プロパティの値を割り当てます。Lane3 は、その右の境界線を Left2 で表される Lane2 と共有します。

[rrMap.LaneBoundaries.ID] = deal("Left1","Right1","Left2","Right2","Left3","Left4","Center4","Right4");
[rrMap.LaneBoundaries.Geometry] = deal([-3 -20;-3 0;-3 20],[3 -20;3 0;3 20],[-3 20;-3 40;-3 60;],...
        [3 20;3 40;3 60],[-3 20;-6 40;-9 60],[-9 60;-9 80;-9 100],[-3 60;-3 80;-3 100],[3 60;3 80;3 100]);

車線に車線境界線をリンクします。各車線の左右の車線境界線を定義し、車線と車線境界線の間のアライメントを指定します。

leftBoundary(rrMap.Lanes(1),"Left1",Alignment="Forward");
rightBoundary(rrMap.Lanes(1),"Right1",Alignment="Forward");
leftBoundary(rrMap.Lanes(2),"Left2",Alignment="Forward");
rightBoundary(rrMap.Lanes(2),"Right2",Alignment="Forward");
leftBoundary(rrMap.Lanes(3),"Left3",Alignment="Forward");
rightBoundary(rrMap.Lanes(3),"Left2",Alignment="Forward");
leftBoundary(rrMap.Lanes(4),"Left4",Alignment="Forward");
rightBoundary(rrMap.Lanes(4),"Center4",Alignment="Forward");
leftBoundary(rrMap.Lanes(5),"Center4",Alignment="Forward");
rightBoundary(rrMap.Lanes(5),"Right4",Alignment="Forward");

先行車線と後続車線の関係についての情報を定義し、車線間のアライメントを指定します。

rrMap.Lanes(3).Successors = roadrunner.hdmap.AlignedReference(Reference=roadrunner.hdmap.Reference(ID="Lane4"),Alignment="Forward");
rrMap.Lanes(3).Predecessors = roadrunner.hdmap.AlignedReference(Reference=roadrunner.hdmap.Reference(ID="Lane1"),Alignment="Forward");
rrMap.Lanes(2).Successors = roadrunner.hdmap.AlignedReference(Reference=roadrunner.hdmap.Reference(ID="Lane5"),Alignment="Forward");
rrMap.Lanes(2).Predecessors = roadrunner.hdmap.AlignedReference(Reference=roadrunner.hdmap.Reference(ID="Lane1"),Alignment="Forward");
rrMap.Lanes(1).Successors = roadrunner.hdmap.AlignedReference(Reference=roadrunner.hdmap.Reference(ID="Lane2"),Alignment="Forward");
rrMap.Lanes(1).Successors(2,1) = roadrunner.hdmap.AlignedReference(Reference=roadrunner.hdmap.Reference(ID="Lane3"),Alignment="Forward");
rrMap.Lanes(4).Predecessors = roadrunner.hdmap.AlignedReference(Reference=roadrunner.hdmap.Reference(ID="Lane3"),Alignment="Forward");
rrMap.Lanes(5).Predecessors = roadrunner.hdmap.AlignedReference(Reference=roadrunner.hdmap.Reference(ID="Lane2"),Alignment="Forward");

前に追加した実線の白い区分線と黄色い区分線に加えて、破線の白い区分線を追加します。関数 roadrunner.hdmap.RelativeAssetPath を使用して、破線の白い車線区分線アセットへのパスを定義します。

dashedWhiteAsset = roadrunner.hdmap.RelativeAssetPath(AssetPath="Assets/Markings/DashedSingleWhite.rrlms");

roadrunner.hdmap.LaneMarking オブジェクトを使用して、道路上に破線の白い車線区分線を作成します。

rrMap.LaneMarkings(3,1) = roadrunner.hdmap.LaneMarking();
[rrMap.LaneMarkings.ID] = deal("SolidWhite","SolidYellow","DashedWhite");
[rrMap.LaneMarkings.AssetPath] = deal(solidWhiteAsset,solidYellowAsset,dashedWhiteAsset);

パラメトリック属性を使用して、車線区分線を割り当てます。

markingRefDW = roadrunner.hdmap.MarkingReference(MarkingID=roadrunner.hdmap.Reference(ID="DashedWhite"));
markingAttribDW = roadrunner.hdmap.ParametricAttribution(MarkingReference=markingRefDW,Span=markingSpan);
[rrMap.LaneBoundaries.ParametricAttributes] = deal(markingAttribSY,markingAttribSW,markingAttribDW,markingAttribSW,...
    markingAttribSY,markingAttribSY,markingAttribDW,markingAttribSW);

車線中央と車線境界線をプロットします。

plot(rrMap)

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Lane Boundaries, Lane Centers.

HD マップをファイルに書き込みます。

write(rrMap,"laneAdd.rrhd");

ユーザーは、インポート オプションおよび構築オプションの使用時に、現在のプロジェクトのアセット フォルダーに HD マップ ファイルをコピーする必要があります。

copyfile("laneAdd.rrhd", "C:\RR\MyProject\Assets");

マップを読み込む RoadRunner HD マップ インポート オプションを作成します。

importOptions = roadrunnerHDMapImportOptions(ImportStep="Load"); 

指定したファイルから現在開いているシーンに RoadRunner HD マップ データを読み込みます。

file = fullfile("C:\RR\MyProject\Assets","laneAdd.rrhd");
importScene(rrApp,file,"RoadRunner HD Map",importOptions);

マップを作成する RoadRunner HD マップ構築オプションを作成します。

buildOptions = roadrunnerHDMapBuildOptions(DetectAsphaltSurfaces=true);

指定したファイルから現在開いているシーンに RoadRunner HD マップ データを構築します。

buildScene(rrApp,"RoadRunner HD Map",buildOptions);

次の図は、RoadRunner Scene Builder を使用して構築されたシーンを示しています。

参考

|

トピック