roadrunner-rrhd-authoring について
roadrunner-rrhd-authoring は、MATLAB の roadrunnerHDMap API で RRHD 地図エンティティを構築するスキルです。地図コンバーターの開発者や合成・カスタム地図の作成者向けに、再利用可能なジオメトリアルゴリズムと検証手順を提供します。
主な機能
- 01車線・境界・交差点などの構築
- 02位置合わせと中心線生成のアルゴリズム
- 03端点スナップと閉ループ分割
- 04検証済み RRHD API プロパティの参照
- 05書き込み前の形状・空間ルール検証
活用シーン
- 01合成道路地図を一から作成
- 02変換データを RRHD に組み立て
- 03道路標示・標識・駐車場の追加
- 04RRHD 構築エラーの調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill roadrunner-rrhd-authoringインストール後、Claude Code で/roadrunner-rrhd-authoringを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreferences/alignmentRules.mdapiReference.mddeduplicateBoundaries.mdjunctionPolygon.mdleftGapFilter.mdorthogonalSplit.mdresolveHeights.mdsnapEndpoints.mdsplitClosedGeometry.mdsynthesizeCenterLine.mdvalidateMap.mdscripts/detectAlignment.mresolveHeightConflicts.msnapConnectedEndpoints.mvalidateRRHD.m詳細
RRHD 作成スキル
MATLAB の roadrunnerHDMap API を使用して、RoadRunner HD Map(.rrhd)エンティティを直接構築します。合成シーン、変換済みマップデータ、カスタム形式など、あらゆるソースから RRHD を構築するための汎用的な構成要素を提供します。
使用する場面
- RRHD マップをゼロから構築する場合(合成シーン、テスト用道路)
- 変換済みマップデータ(Lanelet2、HERE、NDS、OpenDRIVE、カスタム形式)から RRHD エンティティを組み立てる場合
- 再利用可能なジオメトリアルゴリズムが必要な場合:アラインメント検出、中心線の合成、ジャンクションポリゴン、端点のスナップ、閉ループの分割
- HD Map にレーン、境界線、区画線、ジャンクション、標識、バリア、駐車場を追加する場合
- 検証済みの
roadrunner.hdmap.*クラス/プロパティのリファレンスと構築パターンが必要な場合 - RRHD の構築エラー(プロパティ名の誤り、アラインメントの問題)をデバッグする場合
マップ変換パイプラインでの役割
このスキルは、あらゆるコンバータースキルから呼び出される、形式に依存しない RRHD 構築パターンを提供します。
| 再利用可能な構成要素 | リファレンス | 使用するコンバーター |
|---|---|---|
| アラインメント検出(Forward/Backward) | alignmentRules.md | 共有/対向境界線を扱うすべてのコンバーター |
| 中心線の合成(再サンプリング+平均) | synthesizeCenterLine.md | 境界線のペアからレーンを導出するすべてのコンバーター |
| ジャンクションポリゴンの構築 | junctionPolygon.md | トポロジーからジャンクションを推定するすべてのコンバーター |
| 閉ループの分割 | splitClosedGeometry.md、orthogonalSplit.md | 円形/楕円形の道路を扱うすべてのコンバーター |
| 左側ギャップのトポロジーフィルター | leftGapFilter.md | ノード照合されたトポロジーを扱うすべてのコンバーター |
| 端点のスナップ | snapEndpoints.md | トポロジー接続を扱うすべてのコンバーター |
| 高さの競合解決 | resolveHeights.md | 重なり合うレーンを扱うすべてのコンバーター |
| 境界線の重複除去 | deduplicateBoundaries.md | ソースに共有/対向境界線があるすべてのコンバーター |
| RRHD オブジェクト API パターン | apiReference.md | roadrunner.hdmap.* オブジェクトを構築するすべてのコード |
| 検証ゲート | validateMap.md | write() の前に実行するすべてのコンバーター |
スキルの境界
このスキルが担当する内容(形式に依存しない RRHD 構築):
| 担当範囲 | 説明 |
|---|---|
roadrunner.hdmap.* API | クラス/プロパティのリファレンス、コンストラクターパターン、型ルール |
| ジオメトリアルゴリズム | アラインメント、中心線、再サンプリング、直交分割、スナップ |
| ジャンクションポリゴン | 外周境界線のトレース、boundary()、convhull の手法 |
| 検証/適用 | 空間チェック、アラインメント検証、ジオメトリの次元 |
| エンティティ構築 | レーン、境界線、区画線、ジャンクション、バリア、標識、信号、駐車場 |
| インポートオプション | roadrunnerHDMapImportOptions、構築オプション、橋の検出 |
コンバータースキルが担当する内容(ソース形式固有):
| 担当範囲 | 説明 |
|---|---|
| ソースの解析 | XML/protobuf/JSON の読み込み、ノード/ウェイ/リレーションの抽出 |
| 座標投影 | 緯度/経度 → ENU、map_projector_info.yaml、local_x/local_y |
| トポロジーの抽出 | ノード照合、対向方向フィルター、左側ギャップフィルター |
| ジャンクションの検出 | タグに基づく BFS クラスタリング、フォールバックのファンイン/ファンアウト、レーンの追加 |
| セマンティックマッピング | ソースのサブタイプ → RRHD LaneType、区画線アセット、標識コード |
| 網羅性の確認と完全性 | すべての要素をスキャンし、未マッピング要素を報告し、要素が欠落しないようにする |
判断ルール:
- 「この RRHD オブジェクトをどう構築するか?」 → RRHD 作成スキル
- 「ソース形式からこれをどう抽出するか?」 → コンバータースキル
使用しない場合
- Lanelet2 の .osm ファイルを変換する場合 —
roadrunner-convert-lanelet2-to-rrhdを使用してください(このスキルを呼び出します) - マーキング/標識/バリアのアセットパスを調べる場合 —
roadrunner-asset-mappingを使用してください - 完成した .rrhd を RoadRunner にインポートする場合 —
roadrunner-import-sceneを使用してください - 既存の RoadRunner シーンを対話的に編集する場合(このスキルが書き込むのは .rrhd ファイルであり、シーン編集ではありません)
主なルール
- コードを実行するときは、必ず .m ファイルに書き込んでください。 複数行の MATLAB コードを
evaluate_matlab_codeに直接記述しないでください。.m ファイルに書き込み、run_matlab_fileで実行し、エラーが発生したら編集してください。例外:ユーザーが「パターンを示して」と依頼した場合、または「実行しないで」と指示した場合は、ファイルに書き込まず、コードをインラインで示してください。 - タスクに必要な特定のリファレンスだけを読み込んでください — 最初にすべてのリファレンスを読まないでください。プロパティを調べる場合は apiReference.md を使用し、その他のリファレンスは直接関係する場合にのみ参照してください。
- ユーザーが依頼したものだけを作成してください。 明示的な依頼がない限り、余分なレーン、交差点、オブジェクトを追加しないでください。
rrMap = roadrunnerHDMap;を最初に記述してください — これにより、roadrunner.hdmap.*を使用する前に名前空間が読み込まれます。- 作成してから代入するパターン — コンストラクター引数を渡さないでください(
RelativeAssetPathとAlignedReferenceは除きます)。 - 型付きの空配列 —
[]ではなくClassName.emptyを使用してください。 - すべてのジオメトリを Nx3 にしてください — Z 列を必ず含めてください(平面の場合のデフォルトは 0 です)。
write()の前に適用チェックを実行してください — アライメント、空間、ジオメトリのチェックは必須です。- トラックマップ(閉ループの楕円/サーキット): トポロジを省略し(Predecessors/Successors なし)、マーキング属性を省略し(ParametricAttribution なし)、Z の段差を省略してください。自然な標高のみを使用してください。references/orthogonalSplit.md を参照してください。
重要な API ルール
roadrunner.hdmap.* クラスを使用する前に、必ず roadrunnerHDMap オブジェクトを作成してください(名前空間の遅延読み込み):
rrMap = roadrunnerHDMap; % REQUIRED — loads the namespace
作成してから代入するパターン — コンストラクター引数を渡さないでください(2 つのクラスでは Name=Value を使用できます):
ref = roadrunner.hdmap.Reference;
ref.ID = "myID"; % assign after creation
Name=Value コンストラクター — Name=Value を受け付けるのは RelativeAssetPath と AlignedReference のみです:
rap = roadrunner.hdmap.RelativeAssetPath(AssetPath="Assets/Markings/StopLine.rrlms");
ar = roadrunner.hdmap.AlignedReference(Reference=ref, Alignment="Forward");
% WRONG: positional args error with "A name is expected"
型付きの空配列 — 型付きプロパティに [] を使用しないでください:
lane.Predecessors = roadrunner.hdmap.AlignedReference.empty; % CORRECT
lane.Predecessors = []; % WRONG: "Value must be of type AlignedReference"
検証済みプロパティ名(R2025a以降)
検証済みのクラス/プロパティの完全な一覧は、references/apiReference.md を参照してください。主な注意点は次のとおりです。
| よくある間違い | 正しい記述 |
|---|---|
LeftBoundary | LeftLaneBoundary |
RightBoundary | RightLaneBoundary |
Speed | Value(int32) |
Unit = "KPH" | VelocityUnit = "Kph" |
ParametricAttrib | ParametricAttribution |
pa.Value = mr | pa.MarkingReference = mr |
pa.StartFraction/EndFraction | pa.Span = [0 1](double array) |
JunctionPhase / Phase(直接指定) | Configurations(ネストされた.Phasesを持つJunctionConfiguration array) |
roadrunnerHDMap("file.rrhd") | rrMap = roadrunnerHDMap; read(rrMap, "file.rrhd") |
| Nx2のジオメトリ | Nx3のジオメトリ(必ずZ列を含めます) |
cm.CurveMarkingTypeID | cm.MarkingTypeReference |
b.BarrierTypeID | b.BarrierTypeReference |
s.SignTypeID | s.SignTypeReference |
s.BoundingBox | s.Geometry(GeoOrientedBoundingBoxを受け取ります) |
bb.Position | bb.Center(1x3 double) |
bb.Orientation | bb.GeoOrientation([h,p,r] double array) |
pg.OuterRing | pg.ExteriorRing(Nx3 double) |
bt.AssetPath | bt.ExtrusionPath(BarrierTypeの場合のみ) |
roadrunner.hdmap.GeoOrientation | クラスではありません — [h,p,r] double arrayを直接使用します |
Lane.Predecessors = [] | Lane.Predecessors = roadrunner.hdmap.AlignedReference.empty |
lb.ParametricAttributes = [] | クリアできません — マーキングがない場合は代入を省略します |
RelativeAssetPath("path") | RelativeAssetPath(AssetPath="path") — Name=Valueが必要です |
AlignedReference(ref, "Fwd") | AlignedReference(Reference=ref, Alignment="Forward") |
Junction.Geometry = polygon | Junction.Geometry = multiPolygon(MultiPolygonでラップします) |
MarkingReference.MarkingID = 5 | MarkingReference.MarkingID = ref(数値ではなくReferenceオブジェクト) |
SpeedLimit.Velocity | SpeedLimit.Value(int32)+ .VelocityUnit = "Kph" |
合成シーンの構築
車線幅とジオメトリ
標準的な車線幅:3.7m(米国の高速道路)。車線中心線の方向に対して垂直にオフセットし、境界の位置を計算します。
隣接車線間で共有する境界
隣接する車線は、必ず境界ジオメトリを共有する必要があります。 車線Nの右境界は、車線N+1の左境界と同じオブジェクトです。N車線の場合、境界はN+1個作成します。
LB_0 (left edge)
───────────────────
│ Lane_1 │ left=LB_0(Fwd), right=LB_1(Fwd)
───────────────────
LB_1 (shared)
───────────────────
│ Lane_2 │ left=LB_1(Fwd), right=LB_2(Fwd)
───────────────────
LB_2 (right edge)
アラインメントのルール
ルールの詳細、図、緑色の路面のデバッグ方法については、references/alignmentRules.md を参照してください。
アラインメントは、境界ジオメトリの方向と車線ジオメトリの方向との関係を指定します。
- 同じ方向 →
"Forward" - 逆方向 →
"Backward"
使用するアルゴリズム:
- マップ変換(Lanelet2のロールなど、変換元から左右がわかっている場合)→ 以下のdpベースの方法
- 合成シーン(ジオメトリから左右を判定する必要がある場合)→ references/alignmentRules.md に記載されている複数サンプルによる空間検証
dpベースのアルゴリズム(変換用 — 左右はすでに判明している場合):
lDir = leftPts(end,:) - leftPts(1,:);
rDir = rightPts(end,:) - rightPts(1,:);
dp = dot(lDir(1:2)/(norm(lDir(1:2))+1e-10), rDir(1:2)/(norm(rDir(1:2))+1e-10));
if dp >= -0.3
% Normal: both boundaries go same direction
leftAlign = "Forward"; rightAlign = "Forward";
else
% Opposing boundaries: use proximity to determine which is backward
d_ls_re = norm(leftPts(1,1:2) - rightPts(end,1:2));
d_ls_rs = norm(leftPts(1,1:2) - rightPts(1,1:2));
if d_ls_re < d_ls_rs
leftAlign = "Forward"; rightAlign = "Backward";
else
leftAlign = "Backward"; rightAlign = "Forward";
end
end
-0.3のしきい値(0ではありません)は、境界にわずかな曲率があり、小さな負の内積が生じても実際には逆方向ではない車線に対応するためのものです。
左右の空間検証(合成シーンで左右を検証する必要がある場合):
nSamples = min(5, size(centerGeom,1)-1);
sampleIdx = round(linspace(2, size(centerGeom,1)-1, nSamples));
leftOnLeft = 0;
for si = 1:numel(sampleIdx)
idx = sampleIdx(si);
localTan = centerGeom(min(idx+1,end),1:2) - centerGeom(max(idx-1,1),1:2);
localTan = localTan / norm(localTan);
localLeftN = [-localTan(2), localTan(1)];
distsL = vecnorm(leftBndGeom(:,1:2) - centerGeom(idx,1:2), 2, 2);
[~, closestL] = min(distsL);
toBndL = leftBndGeom(closestL,1:2) - centerGeom(idx,1:2);
if dot(toBndL, localLeftN) > 0, leftOnLeft = leftOnLeft + 1; end
end
assert(leftOnLeft >= numel(sampleIdx)/2, ...
'Left boundary is spatially on the RIGHT — swap boundaries or fix assignment');
アラインメントが間違っている場合、または左右を入れ替えた場合、路面ではなく芝生が緑色に表示されます。
標準マーキングアセット
| マーキングID | アセットパス |
|---|---|
SolidSingleWhite | Assets/Markings/SolidSingleWhite.rrlms |
DashedSingleWhite | Assets/Markings/DashedSingleWhite.rrlms |
SolidDoubleYellow | Assets/Markings/SolidDoubleYellow.rrlms |
DashedSolidYellow | Assets/Markings/DashedSolidYellow.rrlms |
SolidDashedYellow | Assets/Markings/SolidDashedYellow.rrlms |
複数車線道路のレシピ
- N 本の車線中心線を計算します(
laneWidth間隔で均等に配置) - N+1 本の境界線を計算します(道路端と各車線ペアの間)
- 共有境界を割り当てます。同じ方向の場合、車線 i は
left=LB_(i-1)、right=LB_iを使用します。対向車線では left/right を入れ替えます(運転者から見た左側は中央ではなく道路端側です) - 内積によって向きを検出します(車線と同じ方向に進む境界は Forward、逆方向に進む境界は Backward)
- 区画線を適用します(道路端:
SolidSingleWhite、中央分離帯:SolidDoubleYellow、車線境界:DashedSingleWhite) - トポロジーを接続します(複数のセグメントがある場合は、pred/succ で接続)
- マップを組み立てて書き込みます
変換済みマップのみの追加手順(合成シーンではスキップします):
- 左側ギャップのトポロジーフィルター — references/leftGapFilter.md を参照
- 接続された端点のスナップ — scripts/snapConnectedEndpoints.m を参照
- 高さの競合の解決 — scripts/resolveHeightConflicts.m を参照
- 境界の重複排除 — references/deduplicateBoundaries.md を参照
2 車線道路の完全な例
rrMap = roadrunnerHDMap;
w = 3.7;
% Lane Markings
lm1 = roadrunner.hdmap.LaneMarking; lm1.ID = "SolidWhite";
rap1 = roadrunner.hdmap.RelativeAssetPath; rap1.AssetPath = "Assets/Markings/SolidSingleWhite.rrlms";
lm1.AssetPath = rap1;
lm2 = roadrunner.hdmap.LaneMarking; lm2.ID = "DashedWhite";
rap2 = roadrunner.hdmap.RelativeAssetPath; rap2.AssetPath = "Assets/Markings/DashedSingleWhite.rrlms";
lm2.AssetPath = rap2;
% Boundaries (3 for 2 lanes)
lb = roadrunner.hdmap.LaneBoundary;
lb(2) = roadrunner.hdmap.LaneBoundary;
lb(3) = roadrunner.hdmap.LaneBoundary;
lb(1).ID = "LB_0"; lb(1).Geometry = [0 w 0; 100 w 0];
lb(2).ID = "LB_1"; lb(2).Geometry = [0 0 0; 100 0 0];
lb(3).ID = "LB_2"; lb(3).Geometry = [0 -w 0; 100 -w 0];
% Markings on boundaries
for i = [1 3] % solid on edges
pa = roadrunner.hdmap.ParametricAttribution; pa.Span = [0 1];
ref = roadrunner.hdmap.Reference; ref.ID = "SolidWhite";
mr = roadrunner.hdmap.MarkingReference; mr.MarkingID = ref; mr.FlipLaterally = false;
pa.MarkingReference = mr;
lb(i).ParametricAttributes = pa;
end
pa = roadrunner.hdmap.ParametricAttribution; pa.Span = [0 1];
ref = roadrunner.hdmap.Reference; ref.ID = "DashedWhite";
mr = roadrunner.hdmap.MarkingReference; mr.MarkingID = ref; mr.FlipLaterally = false;
pa.MarkingReference = mr;
lb(2).ParametricAttributes = pa;
% Lanes
ln = roadrunner.hdmap.Lane;
ln(2) = roadrunner.hdmap.Lane;
ln(1).ID = "Lane_1"; ln(1).Geometry = [0 w/2 0; 100 w/2 0];
ln(1).TravelDirection = "Forward"; ln(1).LaneType = "Driving";
ln(2).ID = "Lane_2"; ln(2).Geometry = [0 -w/2 0; 100 -w/2 0];
ln(2).TravelDirection = "Forward"; ln(2).LaneType = "Driving";
% Assign boundaries with alignment
bndIDs = ["LB_0","LB_1","LB_2"];
for i = 1:2
arL = roadrunner.hdmap.AlignedReference;
refL = roadrunner.hdmap.Reference; refL.ID = bndIDs(i);
arL.Reference = refL; arL.Alignment = "Forward";
ln(i).LeftLaneBoundary = arL;
arR = roadrunner.hdmap.AlignedReference;
refR = roadrunner.hdmap.Reference; refR.ID = bndIDs(i+1);
arR.Reference = refR; arR.Alignment = "Forward";
ln(i).RightLaneBoundary = arR;
end
% Assemble and write
rrMap.Lanes = ln;
rrMap.LaneBoundaries = lb;
rrMap.LaneMarkings = [lm1 lm2];
write(rrMap, "two_lane_road.rrhd");
適用前の必須チェック(write() の前に必ず実施)
複数車線のマップを書き込む前に、この検証ブロックを実行してください。省略しないでください。いずれかのチェックが失敗した場合は、write() に進む前に問題を修正してください(適切な後処理手順を実行します)。
%% --- ENFORCEMENT: Topology — no excessive connections (left-gap filter applied) ---
lanes = rrMap.Lanes;
nExcessiveJunc = 0;
for i = 1:numel(lanes)
nConn = numel(lanes(i).Predecessors) + numel(lanes(i).Successors);
if nConn > 4 % junction lanes should have at most ~4 (multi-lane merge/diverge)
nExcessiveJunc = nExcessiveJunc + 1;
end
end
if nExcessiveJunc > 0
warning('TOPOLOGY WARNING: %d lanes have >4 connections — run left-gap filter (references/leftGapFilter.md)', nExcessiveJunc);
end
fprintf('Topology check: %d lanes with >4 connections\n', nExcessiveJunc);
%% --- ENFORCEMENT: Alignment computed (not all Forward) ---
if numel(lanes) > 2
nFwd = 0; nBwd = 0;
for i = 1:numel(lanes)
if lanes(i).LeftLaneBoundary.Alignment == "Forward", nFwd = nFwd+1;
else, nBwd = nBwd+1; end
if lanes(i).RightLaneBoundary.Alignment == "Forward", nFwd = nFwd+1;
else, nBwd = nBwd+1; end
end
assert(nBwd > 0 || numel(lanes) <= 2, ...
'ALIGNMENT ERROR: All boundaries Forward for %d lanes — compute dot product per lane.', numel(lanes));
fprintf('Alignment: %d Forward, %d Backward — OK\n', nFwd, nBwd);
end
%% --- ENFORCEMENT: Left boundary spatially on left ---
bnds = rrMap.LaneBoundaries;
bndMap = containers.Map;
for i = 1:numel(bnds), bndMap(bnds(i).ID) = bnds(i).Geometry; end
nBadSide = 0;
for i = 1:numel(lanes)
lGeom = lanes(i).Geometry;
lDir = lGeom(end,1:2) - lGeom(1,1:2);
lDir = lDir / norm(lDir);
leftN = [-lDir(2), lDir(1)];
leftBndID = lanes(i).LeftLaneBoundary.Reference.ID;
if bndMap.isKey(leftBndID)
leftBndGeom = bndMap(leftBndID);
toBnd = mean(leftBndGeom(:,1:2)) - mean(lGeom(:,1:2));
if dot(toBnd, leftN) < 0, nBadSide = nBadSide + 1; end
end
end
assert(nBadSide == 0, ...
'SPATIAL ERROR: %d lanes have left boundary on wrong side — fix alignment algorithm.', nBadSide);
fprintf('Spatial left-side check: PASS\n');
%% --- ENFORCEMENT: Geometry is Nx3 ---
bnds = rrMap.LaneBoundaries;
for i = 1:numel(bnds)
assert(size(bnds(i).Geometry, 2) == 3, ...
'Boundary %s geometry must be Nx3 (got Nx%d)', bnds(i).ID, size(bnds(i).Geometry,2));
end
fprintf('Geometry dimensions: PASS\n');
%% --- ENFORCEMENT: GeoReference set ---
assert(any(rrMap.GeoReference ~= 0), 'GeoReference is [0,0] — set lat/lon origin');
fprintf('GeoReference: PASS\n');
%% --- ENFORCEMENT: No duplicate boundaries (deduplication applied) ---
bnds = rrMap.LaneBoundaries;
nDupBnd = 0;
for i = 1:numel(bnds)
for j = i+1:numel(bnds)
g1 = bnds(i).Geometry; g2 = bnds(j).Geometry;
if size(g1,1) ~= size(g2,1), continue; end
if max(vecnorm(g1 - flipud(g2), 2, 2)) < 0.001
nDupBnd = nDupBnd + 1; break;
end
end
if nDupBnd > 5, break; end % early exit for performance
end
if nDupBnd > 0
warning('DEDUP WARNING: Found reversed-duplicate boundaries — run deduplicateBoundaries (references/deduplicateBoundaries.md)');
end
fprintf('Boundary deduplication check: %d duplicates found\n', nDupBnd);
後処理(必須 — write() の前に順番どおりに実行)
左側ギャップのトポロジーフィルター(変換済みマップでは必須)
共有境界の端点ノードが原因で生じる誤った predecessor/successor 接続を削除します。複数の後続(または先行)を持つ各車線について、左境界のギャップを計算します。いずれかの接続のギャップが 3m 未満で、ほかの接続が 3m を超える場合、離れている接続を削除します。これを行わないと、交差点の車線に通常の 2〜4 倍の接続が設定されます。 references/leftGapFilter.md を参照してください。
端点のスナップ
接続された車線(pred/succ)について、後続車線の始点を先行車線の終点にスナップします。scripts/snapConnectedEndpoints.m と references/snapEndpoints.md を参照してください。
高さの競合の解決
同じ Z 座標にある、重なり合っていて接続されていない車線は、芝生のアーティファクトを引き起こします。グラフ彩色を使用して Z レベルを割り当てます。scripts/resolveHeightConflicts.m と references/resolveHeights.md を参照してください。
境界の重複排除(変換済みマップでは必須)
対向車線に別々の境界オブジェクトを割り当てるソース形式(Lanelet2、HERE、NDS など)から構築する場合、すべての境界ペアを調べ、ジオメトリが同一(順方向または逆方向で、許容誤差 1mm 以内)かどうかを確認します。重複を統合し、向きを反転したアラインメントで車線参照を更新します。この手順を行わないと、共有境界の区画線が二重に描画されます。 references/deduplicateBoundaries.md を参照してください。
その他のエンティティタイプ
すべてのエンティティクラス(Signs、Signals、Barriers、Parking、CurveMarkings、StencilMarkings、StaticObjects、LaneGroups)については、references/apiReference.md のクラス/プロパティ表を参照してください。タスク別の主な参照先:
| タスク | 参照先 |
|---|---|
| 交差点ポリゴンの構築 | references/junctionPolygon.md |
| ジオメトリアルゴリズム(分割、再サンプリング、中心線) | references/orthogonalSplit.md、references/splitClosedGeometry.md、references/synthesizeCenterLine.md |
| 後処理(重複排除、フィルター、スナップ、高さ) | references/deduplicateBoundaries.md、references/leftGapFilter.md、references/snapEndpoints.md、references/resolveHeights.md |
| write() の前の検証 | references/validateMap.md |
主な機能
| 機能 | 目的 |
|---|---|
roadrunnerHDMap | HD Map オブジェクトを作成します(名前空間を読み込みます) |
read(rrMap, file) | 既存の .rrhd ファイルを読み込みます |
write(rrMap, file) | HD Map を .rrhd ファイルに書き込みます |
roadrunner.hdmap.Lane | レーンエンティティ(Geometry、TravelDirection、LaneType) |
roadrunner.hdmap.LaneBoundary | 境界エンティティ(Geometry、ParametricAttributes) |
roadrunner.hdmap.LaneMarking | マーキング定義(ID、AssetPath) |
roadrunner.hdmap.Junction | ジャンクション領域(Geometry は MultiPolygon) |
roadrunner.hdmap.AlignedReference | アラインメントを含む参照(Name=Value コンストラクター) |
roadrunner.hdmap.RelativeAssetPath | アセットパスのラッパー(Name=Value コンストラクター) |
roadrunner.hdmap.ParametricAttribution | マーキングの配置(Span、MarkingReference) |
既知の制限事項
- SignalTypes/Signals は MATLAB での RRHD の書き込み/読み込み後も保持されますが、RoadRunner はシーンのインポート時に警告なしで無視します。そのため、信号は RoadRunner のシーンに表示されません
- RoadRunner は自己閉鎖レーンをレンダリングできません。N 方向直交アルゴリズムを使って分割してください(references/orthogonalSplit.md を参照)
- Geometry は常に Nx3 である必要があります(平坦な場合は Z=0 を含めてください)
- トラックマップ(閉ループのオーバル)の場合は、トポロジー(Predecessors/Successors)、Z の隆起、マーキング属性(ParametricAttribution)を省略してください。orthogonalSplit.md の「トラック固有のガイダンス」を参照してください
規約
roadrunner.hdmap.*オブジェクトには、常に作成してから代入するパターンを使用してくださいRelativeAssetPath(AssetPath="...")とAlignedReference(Reference=ref, Alignment="...")を使用してください。Name=Value のみを指定します- 型付きの空配列には
ClassName.emptyを使用し、[]は使用しないでください - すべての Geometry は Z 列を含む Nx3 です(平坦な地形ではデフォルトで 0)
- 境界を共有する場合は、経路ごとにオブジェクトを 1 つ作成し、複数のレーンから異なるアラインメントで参照します
Copyright 2026 The MathWorks, Inc.