Roadrunner Import Scene
MathWorksOfficialCreated by MathWorks
- Skill
- Tool integration
- Software development
- BSD-2-Clause
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured workflow for importing map data into RoadRunner. It enforces strict file-staging requirements, ensuring files are copied into the project directory before processing. It includes mandatory enforcement gates to validate file formats, project connectivity, and map topology—such as detecting closed-loop networks or existing junction data—to configure build options like asphalt detection and junction preservation correctly. The skill is designed to work with an existing RoadRunner application handle, focusing on scene creation, data loading, and saving.
What it does
- Creates a fresh RoadRunner scene to ensure a clean import environment.
- Copies source map files into the active project folder as a mandatory staging step.
- Imports RoadRunner HD Map (.rrhd) and OpenDRIVE (.xodr) files.
- Performs automated topology analysis to determine optimal build settings.
- Configures advanced build options including bridge detection and junction preservation.
- Saves the imported scene using the source filename.
When to use it
- When you need to import .rrhd or .xodr files into a RoadRunner project.
- When verifying the visual results of map conversions, such as Lanelet2-to-RRHD.
- When you need to ensure build options like asphalt surface generation are correctly applied based on map topology.
- When you require a repeatable, scripted process for scene setup and map verification.
Advantages
- Ensures project consistency by enforcing file-staging rules.
- Prevents common errors through mandatory pre-import enforcement gates.
- Automates complex build configurations based on map content analysis.
- Reduces manual configuration errors for junction and bridge detection.
Usage examples
- “Import my map file 'city_center.rrhd' into the current RoadRunner project.”
- The agent will verify the project connection, copy 'city_center.rrhd' to the project folder, analyze the map for junctions and closed loops, set appropriate build options, and import the scene.
- “Load 'highway_test.xodr' into RoadRunner.”
- The agent will create a new scene, stage the OpenDRIVE file, and execute the import process with standard OpenDRIVE settings.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/matlab/roadrunner-import-scene/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip roadrunner-import-scene.zip -d .agents/skills
Documentation by MathWorks
RoadRunner Scene Import
Import map files into a RoadRunner scene for visualization, verification, and building.
When to Use
Importing a
.rrhdfile into RoadRunner for visual verificationImporting an OpenDRIVE
.xodrfile into RoadRunnerVerifying converted maps after Lanelet2-to-RRHD or other conversions
Configuring build options (asphalt surfaces, bridge detection, junction preservation)
When NOT to Use
Launching RoadRunner or managing projects — use
roadrunner-coreBuilding RRHD map content — use
roadrunner-rrhd-authoringConverting Lanelet2 to RRHD — use
roadrunner-convert-lanelet2-to-rrhdLooking up asset paths — use
roadrunner-asset-mapping
Key Rules
Always write to .m files when executing code. Never put multi-line MATLAB code directly in
evaluate_matlab_code. Write to a.mfile, run withrun_matlab_file, edit on error. Exception: if the user asks to "show the pattern" or says "do not execute", show code inline without writing files.Requires
rrAppfromroadrunner-core. Do not launch or connect to RoadRunner in this skill. IfrrAppdoes not exist, invokeroadrunner-corefirst.Always copy file to project folder. Use
status(rrApp).Project.Filenameandcopyfile()explicitly in every import workflow — never omit or hide behind a variable.Always set
bridgeOpts.IsEnabled = trueexplicitly. Never rely on constructor defaults for bridge auto-detection.Run enforcement gates before
importScene. File location, extension, and build-option checks are mandatory.Load before Build by default. Use
ImportStep="Load"unless user explicitly requests a full build.NEVER hardcode
DetectAsphaltSurfaces = truefor converted maps. Always inspect the RRHD for closed-loop topology first. Closed-loop networks (most Lanelet2 conversions) MUST useDetectAsphaltSurfaces = false— asphalt detection fills the interior of loops.ALWAYS preserve junctions when they exist. If
tempMap.Junctionsis non-empty, you MUST setoverlapOpts.IsEnabled = true,overlapOpts.PreserveJunctionLanes = true, andoverlapOpts.PreserveJunctionShape = true. Never rely on RoadRunner's auto-detection to re-infer junctions — it discards authored geometry.
Prerequisites
A valid
rrApphandle must exist (produced byroadrunner-coreskill)A RoadRunner project must be open
If
rrAppdoes not exist, invokeroadrunner-corefirst to launch and connect
Connection, launching, and project lifecycle are owned by roadrunner-core. This skill assumes rrApp is already available.
Import Workflow
Step 1: Create a Fresh Scene
Always create a new scene before importing to avoid stale data:
newScene(rrApp);Step 2: Copy File to Project (MANDATORY — always show explicitly)
RoadRunner requires imported files to be inside the project folder. You MUST always include this exact pattern in your generated code — never assume the file is already there or hide it behind a variable:
st = status(rrApp);
projectFolder = st.Project.Filename;
[~, fileName, ext] = fileparts(sourceFile);
destFile = fullfile(projectFolder, fileName + ext);
copyfile(sourceFile, destFile);NEVER omit the copyfile() call or the status(rrApp).Project.Filename lookup. Even if you define a destFile variable elsewhere, you MUST show both the project path retrieval and the copy operation explicitly in every import workflow.
Step 3: Import the Map
RoadRunner HD Map (.rrhd)
Load only (inspect RRHD view before build):
importOpts = roadrunnerHDMapImportOptions;
importOpts.ImportStep = "Load";
importScene(rrApp, destFile, "RoadRunner HD Map", importOpts);Full import with build (use conditional logic — NEVER hardcode asphalt/junction settings):
Do NOT copy a fixed template. Always use the "Conditional Build Options" section below to determine the correct settings based on RRHD content. The enforcement gate will reject hardcoded DetectAsphaltSurfaces = true for RRHD files.
IMPORTANT: When enabling bridge auto-detection, you MUST always write bridgeOpts.IsEnabled = true explicitly. Do NOT rely on the constructor default — the line must appear in the generated code.
Conditional Build Options (MANDATORY — apply based on map content)
Inspect the RRHD content before choosing build options. The following rules determine when to enable/disable specific settings:
| Condition | Action | Reason |
|---|---|---|
No Junctions in RRHD (empty or zero) | Set overlapOpts.IsEnabled = false | Without explicit junction definitions, overlap detection uses only geometry and produces incorrect groupings |
| Closed-loop road network (lanes form rings) | Set buildOpts.DetectAsphaltSurfaces = false | Asphalt detection fills interior of closed loops, creating unwanted surface polygons |
Explicit Junctions present in RRHD | Set overlapOpts.PreserveJunctionLanes = true and overlapOpts.PreserveJunctionShape = true | Preserves authored junction geometry and lane connectivity instead of re-inferring from geometry |
Example: Import with junction-aware options:
importOpts = roadrunnerHDMapImportOptions;
buildOpts = roadrunnerHDMapBuildOptions;
buildOpts.ClearSceneOfExistingData = true;
% Read RRHD to inspect content before build
tempMap = roadrunnerHDMap;
read(tempMap, destFile);
% Conditional: asphalt surfaces
hasClosedLoops = false; % Detect from lane topology (any lane chain forming a cycle)
if hasClosedLoops
buildOpts.DetectAsphaltSurfaces = false;
else
buildOpts.DetectAsphaltSurfaces = true;
end
% Conditional: overlap groups / junctions
overlapOpts = enableOverlapGroupsOptions;
if isempty(tempMap.Junctions) || numel(tempMap.Junctions) == 0
overlapOpts.IsEnabled = false;
else
overlapOpts.IsEnabled = true;
overlapOpts.PreserveJunctionLanes = true;
overlapOpts.PreserveJunctionShape = true;
end
buildOpts.EnableOverlapGroupsOptions = overlapOpts;
bridgeOpts = autoDetectBridgesOptions;
bridgeOpts.IsEnabled = true;
buildOpts.AutoDetectBridgesOptions = bridgeOpts;
importOpts.BuildOptions = buildOpts;
importScene(rrApp, destFile, "RoadRunner HD Map", importOpts);OpenDRIVE (.xodr)
importOpts = openDriveImportOptions;
importOpts.ImportSignals = true;
importOpts.ImportObjects = true;
importScene(rrApp, destFile, "OpenDRIVE", importOpts);Step 4: Save the Scene
[~, sceneName] = fileparts(sourceFile);
saveScene(rrApp, sceneName);Import Options Reference
roadrunnerHDMapImportOptions
| Property | Description |
|---|---|
ImportStep | "Load" (RRHD view only) or "Unspecified" (full load+build) |
LoadOptions | roadrunnerHDMapLoadOptions — offset, projection |
BuildOptions | roadrunnerHDMapBuildOptions — build configuration |
roadrunnerHDMapBuildOptions
| Property | Description | Default |
|---|---|---|
ClearSceneOfExistingData | Remove existing scene content | auto |
DetectAsphaltSurfaces | Generate road surfaces | auto |
FitCrossSections | Fit lane cross sections | auto |
CurvatureBlend | Curvature blending factor | auto |
UseLaneGroups | Group lanes for editing (R2024a+) | auto |
CombineTransitionLanes | Merge transition lanes (R2025a+) | auto |
AutoDetectBridgesOptions | autoDetectBridgesOptions object | auto |
EnableOverlapGroupsOptions | enableOverlapGroupsOptions object (junctions) | auto |
FixUnrealisticRoadElevation | Correct elevation jumps from HD sources | auto |
FixInconsistentLaneConnections | Remove physically unrealistic lane links | auto |
enableOverlapGroupsOptions
| Property | Description | Default |
|---|---|---|
IsEnabled | Use junction location info (false = geometric overlaps) | auto |
PreserveJunctionLanes | Keep original junction lanes from imported map | auto |
PreserveJunctionShape | Keep junction polygon geometry from imported map | auto |
GroupName | Name of the overlap group | auto |
openDriveImportOptions
| Property | Description |
|---|---|
ImportSignals | Import traffic signals |
ImportObjects | Import static objects |
LaneOptions | Lane conversion settings |
Offset | Scene position offset |
Projection | Geospatial projection |
ImportRegion | Region filter (R2024a+) |
Supported Formats
| Format Name | File Type | Since |
|---|---|---|
"RoadRunner HD Map" | .rrhd | R2022b |
"OpenDRIVE" | .xodr | R2022a |
"HERE HD Map" | (catalog) | R2024a |
"TomTom HD Map" | (catalog) | R2024b |
Default Behavior
When the user asks to "import a map" or "load into RoadRunner":
Ensure
rrAppexists (invokeroadrunner-coreif not)Create a new scene (clean slate)
Copy file to project Assets folder
Import with Load only (
ImportStep="Load") so user can verify RRHD viewSave the scene with the filename as scene name
Only perform a full build (with BuildOptions) when the user explicitly asks to build or the RRHD view has been verified.
When building, always inspect the RRHD content first and apply the conditional build options from the "Conditional Build Options" section above. Never use fixed/hardcoded build options without checking map content.
Key Functions
| Function | Purpose |
|---|---|
newScene(rrApp) | Create fresh scene (clean slate) |
status(rrApp) | Get project info (.Project.Filename) |
importScene(rrApp, file, format, opts) | Import map file into scene |
saveScene(rrApp, name) | Save current scene |
roadrunnerHDMapImportOptions | Create import options (set ImportStep, BuildOptions) |
roadrunnerHDMapBuildOptions | Create build options (asphalt, bridges, junctions) |
autoDetectBridgesOptions | Bridge detection settings (IsEnabled) |
enableOverlapGroupsOptions | Junction preservation (PreserveJunctionLanes, PreserveJunctionShape) |
openDriveImportOptions | OpenDRIVE-specific import options |
Enforcement Gate (MANDATORY — run before import)
You MUST execute these checks before calling importScene. Do NOT skip.
%% --- ENFORCEMENT: RoadRunner is connected ---
try
st = status(rrApp);
assert(~isempty(st.Project.Filename), 'No project open');
fprintf('RoadRunner connected, project: %s\n', st.Project.Filename);
catch
error('RoadRunner:NotConnected', ...
'No RoadRunner instance connected. Run the Connection Strategy block first.');
end
%% --- ENFORCEMENT: File is inside project folder ---
projectFolder = st.Project.Filename;
assert(startsWith(destFile, projectFolder) || isfile(destFile), ...
'Import file must be inside the project folder. Copy it first.');
fprintf('File location check: PASS\n');
%% --- ENFORCEMENT: File extension matches format ---
[~, ~, ext] = fileparts(destFile);
if formatName == "RoadRunner HD Map"
assert(ext == ".rrhd", 'Expected .rrhd file for RoadRunner HD Map format');
elseif formatName == "OpenDRIVE"
assert(ext == ".xodr", 'Expected .xodr file for OpenDRIVE format');
end
fprintf('Format check: PASS\n');
%% --- ENFORCEMENT: Build options match RRHD content (MANDATORY for .rrhd) ---
if ext == ".rrhd"
tempMap = roadrunnerHDMap;
read(tempMap, destFile);
% Junction preservation check
if ~isempty(tempMap.Junctions) && numel(tempMap.Junctions) > 0
assert(exist('overlapOpts','var') == 1 && overlapOpts.IsEnabled == true ...
&& overlapOpts.PreserveJunctionLanes == true ...
&& overlapOpts.PreserveJunctionShape == true, ...
'RRHD has %d junctions — you MUST enable PreserveJunctionLanes and PreserveJunctionShape.', ...
numel(tempMap.Junctions));
fprintf('Junction preservation check: PASS (%d junctions preserved)\n', numel(tempMap.Junctions));
end
% Closed-loop / asphalt check — detect topology cycles (multi-lane or self-loop)
hasClosedLoop = false;
lanes = tempMap.Lanes;
nLanes = numel(lanes);
laneIDs = cell(1, nLanes);
for li2 = 1:nLanes, laneIDs{li2} = char(lanes(li2).ID); end
laneIDSet = containers.Map(laneIDs, num2cell(1:nLanes));
% BFS from each lane: if we revisit a lane, there's a cycle
visited = false(1, numel(lanes));
for startIdx = 1:numel(lanes)
if visited(startIdx), continue; end
queue = startIdx; seen = false(1, numel(lanes)); seen(startIdx) = true;
while ~isempty(queue)
ci = queue(1); queue(1) = [];
visited(ci) = true;
succs = lanes(ci).Successors;
for si = 1:numel(succs)
sid = char(succs(si).Reference.ID);
if laneIDSet.isKey(sid)
ni = laneIDSet(sid);
if ni == startIdx
hasClosedLoop = true; break;
end
if ~seen(ni), seen(ni) = true; queue(end+1) = ni; end
end
end
if hasClosedLoop, break; end
end
if hasClosedLoop, break; end
end
if hasClosedLoop
assert(buildOpts.DetectAsphaltSurfaces == false, ...
'DetectAsphaltSurfaces must be false for closed-loop maps (fills interior). Set it explicitly.');
fprintf('Asphalt detection check: PASS (disabled for closed-loop)\n');
else
fprintf('Asphalt detection check: PASS (no closed-loop detected)\n');
end
endConventions
Always specify format name string exactly:
"RoadRunner HD Map","OpenDRIVE"Use
SOSform for IIR stability (BuildOptions handles this internally)Show all file-staging code explicitly (
status,fileparts,fullfile,copyfile)Use
tiledlayout/nexttilefor multi-panel figures (notsubplot)Pin
destFileto the project folder path — never use temp or relative paths for import
Copyright 2026 The MathWorks, Inc.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- LICENSELicence file added by AutoGineer1.4 KiB
- SKILL.md14.3 KiB
- manifest.yaml515 B
SKILL.md
RoadRunner Scene Import
Import map files into a RoadRunner scene for visualization, verification, and building.
When to Use
Importing a
.rrhdfile into RoadRunner for visual verificationImporting an OpenDRIVE
.xodrfile into RoadRunnerVerifying converted maps after Lanelet2-to-RRHD or other conversions
Configuring build options (asphalt surfaces, bridge detection, junction preservation)
When NOT to Use
Launching RoadRunner or managing projects — use
roadrunner-coreBuilding RRHD map content — use
roadrunner-rrhd-authoringConverting Lanelet2 to RRHD — use
roadrunner-convert-lanelet2-to-rrhdLooking up asset paths — use
roadrunner-asset-mapping
Key Rules
Always write to .m files when executing code. Never put multi-line MATLAB code directly in
evaluate_matlab_code. Write to a.mfile, run withrun_matlab_file, edit on error. Exception: if the user asks to "show the pattern" or says "do not execute", show code inline without writing files.Requires
rrAppfromroadrunner-core. Do not launch or connect to RoadRunner in this skill. IfrrAppdoes not exist, invokeroadrunner-corefirst.Always copy file to project folder. Use
status(rrApp).Project.Filenameandcopyfile()explicitly in every import workflow — never omit or hide behind a variable.Always set
bridgeOpts.IsEnabled = trueexplicitly. Never rely on constructor defaults for bridge auto-detection.Run enforcement gates before
importScene. File location, extension, and build-option checks are mandatory.Load before Build by default. Use
ImportStep="Load"unless user explicitly requests a full build.NEVER hardcode
DetectAsphaltSurfaces = truefor converted maps. Always inspect the RRHD for closed-loop topology first. Closed-loop networks (most Lanelet2 conversions) MUST useDetectAsphaltSurfaces = false— asphalt detection fills the interior of loops.ALWAYS preserve junctions when they exist. If
tempMap.Junctionsis non-empty, you MUST setoverlapOpts.IsEnabled = true,overlapOpts.PreserveJunctionLanes = true, andoverlapOpts.PreserveJunctionShape = true. Never rely on RoadRunner's auto-detection to re-infer junctions — it discards authored geometry.
Prerequisites
A valid
rrApphandle must exist (produced byroadrunner-coreskill)A RoadRunner project must be open
If
rrAppdoes not exist, invokeroadrunner-corefirst to launch and connect
Connection, launching, and project lifecycle are owned by roadrunner-core. This skill assumes rrApp is already available.
Import Workflow
Step 1: Create a Fresh Scene
Always create a new scene before importing to avoid stale data:
newScene(rrApp);Step 2: Copy File to Project (MANDATORY — always show explicitly)
RoadRunner requires imported files to be inside the project folder. You MUST always include this exact pattern in your generated code — never assume the file is already there or hide it behind a variable:
st = status(rrApp);
projectFolder = st.Project.Filename;
[~, fileName, ext] = fileparts(sourceFile);
destFile = fullfile(projectFolder, fileName + ext);
copyfile(sourceFile, destFile);NEVER omit the copyfile() call or the status(rrApp).Project.Filename lookup. Even if you define a destFile variable elsewhere, you MUST show both the project path retrieval and the copy operation explicitly in every import workflow.
Step 3: Import the Map
RoadRunner HD Map (.rrhd)
Load only (inspect RRHD view before build):
importOpts = roadrunnerHDMapImportOptions;
importOpts.ImportStep = "Load";
importScene(rrApp, destFile, "RoadRunner HD Map", importOpts);Full import with build (use conditional logic — NEVER hardcode asphalt/junction settings):
Do NOT copy a fixed template. Always use the "Conditional Build Options" section below to determine the correct settings based on RRHD content. The enforcement gate will reject hardcoded DetectAsphaltSurfaces = true for RRHD files.
IMPORTANT: When enabling bridge auto-detection, you MUST always write bridgeOpts.IsEnabled = true explicitly. Do NOT rely on the constructor default — the line must appear in the generated code.
Conditional Build Options (MANDATORY — apply based on map content)
Inspect the RRHD content before choosing build options. The following rules determine when to enable/disable specific settings:
| Condition | Action | Reason |
|---|---|---|
No Junctions in RRHD (empty or zero) | Set overlapOpts.IsEnabled = false | Without explicit junction definitions, overlap detection uses only geometry and produces incorrect groupings |
| Closed-loop road network (lanes form rings) | Set buildOpts.DetectAsphaltSurfaces = false | Asphalt detection fills interior of closed loops, creating unwanted surface polygons |
Explicit Junctions present in RRHD | Set overlapOpts.PreserveJunctionLanes = true and overlapOpts.PreserveJunctionShape = true | Preserves authored junction geometry and lane connectivity instead of re-inferring from geometry |
Example: Import with junction-aware options:
importOpts = roadrunnerHDMapImportOptions;
buildOpts = roadrunnerHDMapBuildOptions;
buildOpts.ClearSceneOfExistingData = true;
% Read RRHD to inspect content before build
tempMap = roadrunnerHDMap;
read(tempMap, destFile);
% Conditional: asphalt surfaces
hasClosedLoops = false; % Detect from lane topology (any lane chain forming a cycle)
if hasClosedLoops
buildOpts.DetectAsphaltSurfaces = false;
else
buildOpts.DetectAsphaltSurfaces = true;
end
% Conditional: overlap groups / junctions
overlapOpts = enableOverlapGroupsOptions;
if isempty(tempMap.Junctions) || numel(tempMap.Junctions) == 0
overlapOpts.IsEnabled = false;
else
overlapOpts.IsEnabled = true;
overlapOpts.PreserveJunctionLanes = true;
overlapOpts.PreserveJunctionShape = true;
end
buildOpts.EnableOverlapGroupsOptions = overlapOpts;
bridgeOpts = autoDetectBridgesOptions;
bridgeOpts.IsEnabled = true;
buildOpts.AutoDetectBridgesOptions = bridgeOpts;
importOpts.BuildOptions = buildOpts;
importScene(rrApp, destFile, "RoadRunner HD Map", importOpts);OpenDRIVE (.xodr)
importOpts = openDriveImportOptions;
importOpts.ImportSignals = true;
importOpts.ImportObjects = true;
importScene(rrApp, destFile, "OpenDRIVE", importOpts);Step 4: Save the Scene
[~, sceneName] = fileparts(sourceFile);
saveScene(rrApp, sceneName);Import Options Reference
roadrunnerHDMapImportOptions
| Property | Description |
|---|---|
ImportStep | "Load" (RRHD view only) or "Unspecified" (full load+build) |
LoadOptions | roadrunnerHDMapLoadOptions — offset, projection |
BuildOptions | roadrunnerHDMapBuildOptions — build configuration |
roadrunnerHDMapBuildOptions
| Property | Description | Default |
|---|---|---|
ClearSceneOfExistingData | Remove existing scene content | auto |
DetectAsphaltSurfaces | Generate road surfaces | auto |
FitCrossSections | Fit lane cross sections | auto |
CurvatureBlend | Curvature blending factor | auto |
UseLaneGroups | Group lanes for editing (R2024a+) | auto |
CombineTransitionLanes | Merge transition lanes (R2025a+) | auto |
AutoDetectBridgesOptions | autoDetectBridgesOptions object | auto |
EnableOverlapGroupsOptions | enableOverlapGroupsOptions object (junctions) | auto |
FixUnrealisticRoadElevation | Correct elevation jumps from HD sources | auto |
FixInconsistentLaneConnections | Remove physically unrealistic lane links | auto |
enableOverlapGroupsOptions
| Property | Description | Default |
|---|---|---|
IsEnabled | Use junction location info (false = geometric overlaps) | auto |
PreserveJunctionLanes | Keep original junction lanes from imported map | auto |
PreserveJunctionShape | Keep junction polygon geometry from imported map | auto |
GroupName | Name of the overlap group | auto |
openDriveImportOptions
| Property | Description |
|---|---|
ImportSignals | Import traffic signals |
ImportObjects | Import static objects |
LaneOptions | Lane conversion settings |
Offset | Scene position offset |
Projection | Geospatial projection |
ImportRegion | Region filter (R2024a+) |
Supported Formats
| Format Name | File Type | Since |
|---|---|---|
"RoadRunner HD Map" | .rrhd | R2022b |
"OpenDRIVE" | .xodr | R2022a |
"HERE HD Map" | (catalog) | R2024a |
"TomTom HD Map" | (catalog) | R2024b |
Default Behavior
When the user asks to "import a map" or "load into RoadRunner":
Ensure
rrAppexists (invokeroadrunner-coreif not)Create a new scene (clean slate)
Copy file to project Assets folder
Import with Load only (
ImportStep="Load") so user can verify RRHD viewSave the scene with the filename as scene name
Only perform a full build (with BuildOptions) when the user explicitly asks to build or the RRHD view has been verified.
When building, always inspect the RRHD content first and apply the conditional build options from the "Conditional Build Options" section above. Never use fixed/hardcoded build options without checking map content.
Key Functions
| Function | Purpose |
|---|---|
newScene(rrApp) | Create fresh scene (clean slate) |
status(rrApp) | Get project info (.Project.Filename) |
importScene(rrApp, file, format, opts) | Import map file into scene |
saveScene(rrApp, name) | Save current scene |
roadrunnerHDMapImportOptions | Create import options (set ImportStep, BuildOptions) |
roadrunnerHDMapBuildOptions | Create build options (asphalt, bridges, junctions) |
autoDetectBridgesOptions | Bridge detection settings (IsEnabled) |
enableOverlapGroupsOptions | Junction preservation (PreserveJunctionLanes, PreserveJunctionShape) |
openDriveImportOptions | OpenDRIVE-specific import options |
Enforcement Gate (MANDATORY — run before import)
You MUST execute these checks before calling importScene. Do NOT skip.
%% --- ENFORCEMENT: RoadRunner is connected ---
try
st = status(rrApp);
assert(~isempty(st.Project.Filename), 'No project open');
fprintf('RoadRunner connected, project: %s\n', st.Project.Filename);
catch
error('RoadRunner:NotConnected', ...
'No RoadRunner instance connected. Run the Connection Strategy block first.');
end
%% --- ENFORCEMENT: File is inside project folder ---
projectFolder = st.Project.Filename;
assert(startsWith(destFile, projectFolder) || isfile(destFile), ...
'Import file must be inside the project folder. Copy it first.');
fprintf('File location check: PASS\n');
%% --- ENFORCEMENT: File extension matches format ---
[~, ~, ext] = fileparts(destFile);
if formatName == "RoadRunner HD Map"
assert(ext == ".rrhd", 'Expected .rrhd file for RoadRunner HD Map format');
elseif formatName == "OpenDRIVE"
assert(ext == ".xodr", 'Expected .xodr file for OpenDRIVE format');
end
fprintf('Format check: PASS\n');
%% --- ENFORCEMENT: Build options match RRHD content (MANDATORY for .rrhd) ---
if ext == ".rrhd"
tempMap = roadrunnerHDMap;
read(tempMap, destFile);
% Junction preservation check
if ~isempty(tempMap.Junctions) && numel(tempMap.Junctions) > 0
assert(exist('overlapOpts','var') == 1 && overlapOpts.IsEnabled == true ...
&& overlapOpts.PreserveJunctionLanes == true ...
&& overlapOpts.PreserveJunctionShape == true, ...
'RRHD has %d junctions — you MUST enable PreserveJunctionLanes and PreserveJunctionShape.', ...
numel(tempMap.Junctions));
fprintf('Junction preservation check: PASS (%d junctions preserved)\n', numel(tempMap.Junctions));
end
% Closed-loop / asphalt check — detect topology cycles (multi-lane or self-loop)
hasClosedLoop = false;
lanes = tempMap.Lanes;
nLanes = numel(lanes);
laneIDs = cell(1, nLanes);
for li2 = 1:nLanes, laneIDs{li2} = char(lanes(li2).ID); end
laneIDSet = containers.Map(laneIDs, num2cell(1:nLanes));
% BFS from each lane: if we revisit a lane, there's a cycle
visited = false(1, numel(lanes));
for startIdx = 1:numel(lanes)
if visited(startIdx), continue; end
queue = startIdx; seen = false(1, numel(lanes)); seen(startIdx) = true;
while ~isempty(queue)
ci = queue(1); queue(1) = [];
visited(ci) = true;
succs = lanes(ci).Successors;
for si = 1:numel(succs)
sid = char(succs(si).Reference.ID);
if laneIDSet.isKey(sid)
ni = laneIDSet(sid);
if ni == startIdx
hasClosedLoop = true; break;
end
if ~seen(ni), seen(ni) = true; queue(end+1) = ni; end
end
end
if hasClosedLoop, break; end
end
if hasClosedLoop, break; end
end
if hasClosedLoop
assert(buildOpts.DetectAsphaltSurfaces == false, ...
'DetectAsphaltSurfaces must be false for closed-loop maps (fills interior). Set it explicitly.');
fprintf('Asphalt detection check: PASS (disabled for closed-loop)\n');
else
fprintf('Asphalt detection check: PASS (no closed-loop detected)\n');
end
endConventions
Always specify format name string exactly:
"RoadRunner HD Map","OpenDRIVE"Use
SOSform for IIR stability (BuildOptions handles this internally)Show all file-staging code explicitly (
status,fileparts,fullfile,copyfile)Use
tiledlayout/nexttilefor multi-panel figures (notsubplot)Pin
destFileto the project folder path — never use temp or relative paths for import
Copyright 2026 The MathWorks, Inc.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- MathWorks
- Publisher
- MathWorks (Official)
- Source
- matlab/matlab-agentic-toolkit · skills-catalog/automotive/roadrunner-import-scene · commit 2a7f215
- Licence
- BSD 2-Clause License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.md)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by MathWorks or MathWorks.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download roadrunner-import-scene.zip