关于 roadrunner-scenario-authoring
此 MATLAB 技能指导通过 roadrunnerAPI 以编程方式创建 RoadRunner 场景,包括演员、路线、阶段逻辑和验证。适合需要构建或检查驾驶场景的用户,并强调先规划场景交互再编写代码。
主要功能
- 01添加车辆、行人和物体演员
- 02设置演员位置与道路锚点
- 03创建路线和航点
- 04构建阶段、条件与动作逻辑
- 05验证场景结构
适用场景
- 01创建车辆跟随或变道场景
- 02设置行人穿越路线
- 03配置阶段触发条件与动作
- 04运行验证以检查场景结构
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill roadrunner-scenario-authoring安装后在 Claude Code 中输入/roadrunner-scenario-authoring确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
manifest.yamlreferences/actions-and-conditions.mdasset-catalog.mdcollision-utility.mdlane-connectivity.mdphysics-first-design.mdroutes-and-points.mdscenario-templates.mdscene-awareness.mdscripts/helperAnalyzeHDMapLanes.mhelperClassifyRoadFeatures.mhelperGetPositionFromHDMap.mhelperPlaceActors.mhelperSceneAwareness.mhelperSurveyLanes.m详细介绍
RoadRunner 场景创作
通过 MATLAB 以编程方式创建 RoadRunner 场景:包括参与者、路线、阶段逻辑和验证,全部通过 roadrunnerAPI 完成。
适用场景
- 向 RoadRunner 场景中添加参与者(车辆、行人、物体)
- 为参与者创建路线和路径点
- 构建场景逻辑:阶段、条件、操作
- 编写常见模式:加塞、行人穿行、前车跟随、紧急制动
- 使用基于锚点或 HD Map 的定位方式将参与者放置在道路上
- 在仿真前验证场景结构
不适用场景
- 连接或启动 RoadRunner → 使用
roadrunner-core - 根据录制的传感器数据构建场景 → 使用
matlab-use-scenario-builder - 创作道路几何结构(车道、路口)→ 使用
roadrunner-rrhd-authoring - 导入地图或场景 → 使用
roadrunner-import-scene - 仿真或导出场景 → 使用
roadrunner-scenario-simulating
工作流
1. 确认会话
确认 rrApp 是否存在。如果不存在,请先确认 RoadRunner 已连接(例如,通过 roadrunner-core 或手动连接)。
if ~exist('rrApp', 'var') || ~isvalid(rrApp)
error("No active RoadRunner session. Use the roadrunner-core skill.");
end
路径设置: 调用辅助函数前,请确保脚本目录位于 MATLAB 路径中:
addpath('<path-to-skill>/scripts');
2. 初始化场景
openScene(rrApp, sceneName);
newScenario(rrApp);
rrApi = roadrunnerAPI(rrApp);
rrs = rrApi.Scenario;
phaseLogic = rrs.PhaseLogic;
rrprj = rrApi.Project;
3. 了解场景
放置参与者前,先查看场景以找到有效的车道位置。使用 helperSceneAwareness 脚本进行自动分析,或通过导出 HD Map 手动查询:
sceneInfo = helperSceneAwareness(rrApp, NumActors=2, ScenarioType="cut-in");
如果辅助脚本不可用,请参阅 references/scene-awareness.md,了解手动查询 HD Map 的模式。
4. 添加参与者
选项 A — 批量放置(推荐用于 2 个或更多参与者):
actorSpecs(1) = struct(Name="Ego", AssetPath="Vehicles/Sedan.fbx", ...
AssetType="VehicleAsset", LaneIndex=1, Fraction=0.1, Speed=15);
[actors, report] = helperPlaceActors(rrs, rrprj, phaseLogic, sceneInfo.HDMap, actorSpecs);
ego = actors{1}; % cell array — use curly braces
选项 B — 手动放置:
vehicleAsset = getAsset(rrprj, "Vehicles/Sedan.fbx", "VehicleAsset");
actor = addActor(rrs, vehicleAsset, position);
actor.Name = "Ego";
autoAnchor(actor.InitialPoint); % Snaps to nearest road
放置后检查: 确认 actor.InitialPoint.WorldPosition 不为 [0 0 0]。
可用的车辆/角色路径见 references/asset-catalog.md。
5. 定位参与者(锚定)
选项 A — 有可用的场景锚点:
anchors = getAnchors(rrApp);
% Use remapAnchor for cross-scene portability (not findSceneAnchor)
anchorPt = findSceneAnchor(rrs, anchors(1).Name);
anchorToPoint(actor.InitialPoint, anchorPt);
actor.InitialPoint.ForwardOffset = 20;
actor.InitialPoint.LaneOffset = 1;
选项 B — 没有场景锚点(使用 autoAnchor):
actor = addActor(rrs, asset, approximatePosition);
autoAnchor(actor.InitialPoint); % Must be within 5m of road
选项 C — 相对于另一个参与者:
anchorToPoint(target.InitialPoint, ego.InitialPoint);
target.InitialPoint.ForwardOffset = 30;
target.InitialPoint.LaneOffset = 1;
6. 创建路线(按需)
路线会使参与者进入路径跟随模式。没有路线的参与者会沿着锚定的车道以车道跟随模式行驶。
route = actor.InitialPoint.Route;
fwdPt = addPoint(route, actor.InitialPoint.WorldPosition + [20 0 0]);
autoAnchor(fwdPt);
% For vehicles: disable freeform so route follows road surface
% (Do NOT do this for pedestrians — they need freeform to cross roads)
for i = 1:numel(route.Segments)
route.Segments(i).Freeform = false;
end
需要添加路线的情况:
- 角色/行人参与者——始终需要(否则验证会失败)
- 沿特定路径行驶的车辆(例如,Ego 车辆直行)
- 不需要
ChangeLaneAction的车辆
不应添加路线的情况:
- 需要
ChangeLaneAction的车辆——必须处于车道跟随模式(无路线) - 需要
ChangeLateralOffsetAction的车辆——同样必须处于车道跟随模式
路线点规则:
- 路线点始终使用
autoAnchor——位置必须在距离道路 5m 的范围内 - 路线点不要使用
anchorToPoint+ForwardOffset——这会导致验证失败 - 路线偏移量应保持较小(20m),以确保位于道路上
- 对于路口转弯:使用多个路径点(路口前、路口后、出口),以确保路径平滑
- 添加路线点后,将每个路段的
seg.Freeform = false,以便路线遵循道路几何形状(自由形式路线会忽略路面,可能悬浮在道路上方或下方)
7. 构建阶段逻辑
完整目录见 references/actions-and-conditions.md。
% Get actor's initial phase (auto-created with addActor)
initPhase = initialPhaseForActor(phaseLogic, actor);
% Modify default speed (initial phase already has ChangeSpeedAction)
initPhase.Actions(1).Speed = 20;
% Add sequential phase
nextPhase = addPhaseInSerial(phaseLogic, initPhase, "ActorActionPhase");
nextPhase.Actor = actor; % REQUIRED — never omit
% Set trigger condition on initial phase
cond = setEndCondition(initPhase, "LongitudinalDistanceToActorCondition");
cond.Actor = actor; % REQUIRED
cond.ReferenceActor = otherActor;
cond.Distance = 10;
% Add action to next phase
action = addAction(nextPhase, "ChangeLaneAction");
action.Direction = "left";
多参与者阶段逻辑: 每个参与者的阶段链彼此独立。任何后续还有阶段的阶段都必须设置结束条件——否则该阶段会无限运行,后续阶段永远不会执行。对于多参与者场景,请确保每个有后续阶段的阶段都通过 setEndCondition 设置了适当的结束条件。
8. 验证并报告
validate(rrs);
验证通过后,汇总说明已创建的内容——除非用户明确要求,否则不要运行仿真。
场景分解
强制要求:编写任何代码之前,必须先完成以下步骤 0–1,并向用户展示计划以供确认。 不要跳过此步骤——未经预先分析构建的场景常常会因时机错误、遗漏碰撞或触发条件不可能满足而失败。
步骤 0 — 明确意图: 如果用户的提示在以下任一方面含糊不清,请先询问:
- 参与者的数量和类型
- 预期结果(碰撞、险些碰撞,还是安全完成?)
- 未指定的速度、距离或时间
- 哪个参与者是“自车”,哪个是“目标”
- 使用哪个场景(如果未说明)
步骤 1 — 物理优先设计(定时交互必需): 对于碰撞、险些碰撞、加塞、行人穿越,以及任何要求参与者在特定时间到达同一点的场景,必须先推导运动学参数,再编写代码。请遵循 references/physics-first-design.md 中的完整 5 步流程:
- 将意图解析为时间线
- 测量空间参数(查询 HD Map)
- 构建参数推导表(展示计算过程)
- 验证条件是否会触发
- 使用推导出的数值编写代码
向用户展示你的分解结果——说明参与者、位置、速度、触发时机和预期结果。获得确认后再执行代码。
- 参与者 — 数量、类型(车辆/行人/物体)和角色(自车、目标、背景、静止)
- 位置几何关系 — 决定使用哪种
helperSceneAwareness类型:- 同一车道(
ScenarioType="following")— 前车/跟车、超车起始、紧急制动 - 相邻车道(
ScenarioType="cut-in")— 变道、汇入、并排行驶 - 路径交叉 — 行人穿越、交叉路口冲突
- 同一车道(
- 交互意图 — 决定速度、间距和触发条件的默认值:
- 冲突/险些碰撞: 距离近、存在速度差,用于测试反应(间隙小、基于距离的触发条件)
- 协作: 预期安全完成,不发生碰撞(间隙大于等于 30m,使用时间或持续时间触发条件)
- 相互独立: 参与者之间没有直接交互(背景交通、静止物体)
- 机动序列 — 将每种明确的行为变化视为一个阶段:行驶 → 变道 → 制动 → 恢复。每次转换都需要触发条件。
- 触发条件选择:
- 基于距离(
LongitudinalDistanceToActorCondition)— 参与者之间必须存在速度差 - 基于时间(
DurationCondition)— 不受速度影响,更简单 - 仿真时间(
SimulationTimeCondition)— 绝对时间,适用于编排好的序列
- 基于距离(
- 安全验证 — 执行之前,验证变道场景不会发生碰撞:
required_gap = lane_change_distance + closing_rate × (lane_change_distance / actor_speed) + 5m
场景默认值(由 RoadRunner 自动创建)
调用 newScenario() 时,RoadRunner 会自动创建:
- 一个 CollisionCondition,作为根阶段的失败条件(任何参与者之间的碰撞都会导致场景失败)
- 一个 SimulationTimeCondition(60s),作为根阶段的结束条件
不要重复创建这些条件。要修改默认碰撞条件:
rootPhase = phaseLogic.RootPhase;
% The fail condition already exists — access it directly
% To change the end time:
rootEndCond = setEndCondition(rootPhase, "SimulationTimeCondition");
rootEndCond.Time = 30; % Override default 60s
硬性约束
- 始终在 ActorActionPhase 和条件对象上设置
.Actor— 绝不要省略 - 单个阶段中绝不要添加重复的动作类型 — 改为修改
phase.Actions(1) - 角色演员必须配置路线 — 否则验证会失败
autoAnchor需要满足邻近条件 — 点必须位于路面 5m 范围内- 距离条件规则 — 只有
"le"和"ge"有效(不能用"lt"、"gt") - 速度条件规则 — 有效值包括
"eq"、"gt"、"lt"、"ge"、"le"、"ne" - SerialPhase 不能嵌套在 SerialPhase 中 — 请使用 ParallelPhase 作为中间阶段
- 距离触发条件需要速度差 — 如果演员以相同速度行驶,间距不会变化
- 除非用户明确要求,否则绝不要运行仿真 — 场景创作和仿真是不同的工作流。绝不要仅凭数学计算就声称场景结果(碰撞、险些碰撞);只有仿真才能得出真实结果
- 绝不要想当然 — 遇到模糊的提示词时务必先澄清 — 如果用户没有指定速度、距离、时间安排、演员数量、期望结果(碰撞、险些碰撞还是安全)或场景,请先询问,再编写代码。执行前,请向用户展示场景分解和物理分析,供其确认。猜测会导致场景虽能通过验证,实际结果却不符合预期。
- 使用
setEndCondition,而非addEndCondition— 每个阶段只能有一个结束条件 ChangeLaneAction需要车道跟随模式 — 对需要变道的演员,不要添加路线- 不要在路线点上同时使用
anchorToPoint和ForwardOffset— 这会导致验证失败;只能使用autoAnchor LaneOffset可能会将演员放置在路口连接车道上 — 对于变道场景,请使用 HD Map 位置和autoAnchor将演员放在已确认的平行车道上,而不要使用LaneOffset- 绝不要猜测变道方向 — 如果目标是另一个演员所在的车道,请使用
LaneChangeReference="actor"+Direction="same-lane";或者通过叉积计算方向(参见references/scenario-templates.md) - 并行组的结束条件应设置在
.ParentPhase上,而不是子阶段上 - 放置后请验证 WorldPosition —
[0 0 0]表示锚定静默失败 - 没有移除演员的 API —
removeActor不存在;锚定后WorldPosition为只读。放置错误时必须调用newScenario()并重建。执行前请仔细规划放置位置。 autoAnchor在车道边界处不可靠 — 查询 HD Map 位置时,请使用 ≥ 0.2 且 ≤ 0.8 的分数。车道起点/终点处有多条车道汇合,autoAnchor可能会吸附到错误的车道。- 变道安全余量 — 变道时,纵向间距必须大于:
lane_change_distance + (closing_rate × maneuver_time) + vehicle_length。在 5 m/s 的接近速度下,变道距离为 20m 时,初始间距至少需要 30m。 - 车辆路线段默认采用自由形式 — 为车辆添加航点后,请在每个路线段上设置
seg.Freeform = false,使路线沿道路几何形状行驶。不要对行人路线禁用自由形式 — 行人需要横穿道路,因此需要自由形式路径。 - 路径跟随模式下的演员没有碰撞物理效果 — 处于路径跟随模式(带路线)的车辆会彼此穿过。当保险杠间距达到 ≤50mm 时,RoadRunner 会检测到碰撞并终止场景。请根据保险杠间距(而非中心到中心的距离)设计碰撞时间。
- 碰撞间距公式 — 使用保险杠间距,而非中心间距:
bumper_gap = center_distance - (vehicle1_length/2 + vehicle2_length/2)。时间计算:t_collision = bumper_gap / closing_rate。请考虑车辆从静止状态加速约需 1s(车辆不会瞬间达到目标速度)。 - 不支持正面碰撞 —
LaneOffset必须为正值;通过编程 API 无法让两辆车在同一路段上迎面相对。请改用追尾或交叉路径碰撞设计。 - 初始间距必须大于触发距离 — 如果演员的初始间距小于触发条件的距离阈值,条件会立即触发,阶段会在预期时间之前推进。
- 绝不要在
setEndCondition上链式赋值属性 —setEndCondition(phase,"Type").Property = N在ActorActionPhase上会失败(仅适用于InitialPhase)。请始终先保存返回值:c = setEndCondition(phase, "Type"); c.Property = N;。这种两行写法适用于所有阶段类型。 - 每个
ActorActionPhase只能有一个动作 — 每个阶段只调用一次addAction。唯一例外是initialPhaseForActor自动创建的初始阶段。对于并发动作,请使用一个包含多个ActorActionPhase子阶段的ParallelPhase,每个动作对应一个子阶段。 - 绝不要使用世界坐标偏移来放置演员 —
egoPos + [X, Y, 0]只适用于与世界坐标轴对齐的道路。对于行人和横穿道路的演员,请始终使用helperGetPositionFromHDMap获取位置和航向,然后计算垂直于道路的横穿方向:hdg2D = hdg(1:2)/norm(hdg(1:2)); perpDir = [-hdg2D(2), hdg2D(1), 0]; - 路口场景:不要让路线横穿路口各个入口车道 — 在
FourWaySignal、FourWayStop和T_Intersection场景中,通过路线 API 无法将接近车道连接到对向出口车道。请仅使用单入口车道路线(接近车道 → 同一路廊中与其相连的出口车道),或仅使用车道跟随模式。横穿路口的路线无法通过validate。 - 不要过度筛选车道长度 —
helperSceneAwareness的参数是MinLaneLength(默认值为 30);helperSurveyLanes/helperGetPositionFromHDMap使用MinLength。对于路口场景,请使用 30,因为接近车道较短。按以下公式计算所需长度:max_speed × scenario_duration + 20m。在较小场景中使用 80+ 会导致可用车道数量低于预期。
常见的错误属性名称
| 错误(臆造) | 正确 |
|---|---|
RelativeLaneOffset | NumLanesOffset |
SimulationTime | SimulationTimeCondition |
addEndCondition | setEndCondition |
listAssets / getAssets | getAsset(proj, path, type) |
getActors / listActors | rrs.Actors |
actor.Speed | initPhase.Actions(1).Speed |
route.addWaypoint | addPoint(route, position) |
removeActor / deleteActor | 不存在 — 使用 newScenario() |
actor.WorldPosition = ... | 只读 — 通过 newScenario() 重新放置 |
cond.Comparison | SimulationTimeCondition 上不存在(只需设置 .Time) |
rrApp.ProjectFolder | 不是公共属性 — 使用 status(rrApp) |
DistanceType = "gap" | 使用 "space"(空间距离)或 "time"(时间间隔) |
ConstraintType = "acceleration" | 使用 "asset"、"custom" 或 "none" |
PhaseState = "completed" | 使用 "end"(有效值:"idle"、"start"、"run"、"end") |
MeasureDistance = "euclidean" | 使用 "lane" 或 "actor" |
"MovableObjects/..." | 使用 "Props/TrafficControl/..." 和 "MovableObjectAsset" 类型 |
syncAction.TargetPoint = actor.InitialPoint | 共享引用陷阱 — 使用独立的 Point 作为路线航点 |
LateralOffsetAction | ChangeLateralOffsetAction(必须使用完整名称) |
.Offset(在 ChangeLateralOffsetAction 上) | .LateralOffset |
laneTable.LaneIndex | laneTable.Index(来自 helperSurveyLanes 的列名) |
action.Rate | 使用 .DynamicsDimension = "rate"; .DynamicsValue = N; |
setEndCondition(...).Property = N | c = setEndCondition(...); c.Property = N;(两行模式) |
MinLength(在 helperSceneAwareness 上) | MinLaneLength — 只有较低层级的辅助函数使用 MinLength |
"text" + status(rrApp) | status(rrApp) 返回一个结构体 — 使用 s = status(rrApp); s.Scene.Filename |
helperPlaceActors 返回的 actors(i) | actors{i} — 返回 cell 数组,使用花括号索引 |
关键函数
| 函数 | 用途 | 版本 |
|---|---|---|
roadrunnerAPI(rrApp) | 创建创作 API 句柄 | R2025a |
addActor(rrs, asset, pos) | 向场景添加 Actor | R2025a |
getAsset(proj, path, type) | 按路径加载资源 | R2025a |
autoAnchor(point) | 将点吸附到最近的道路 | R2025a |
anchorToPoint(pt, anchor) | 将点锚定到参考对象 | R2025a |
addPoint(route, pos) | 向路线添加航点 | R2025a |
initialPhaseForActor(logic, actor) | 获取 Actor 的初始化阶段 | R2025a |
addPhaseInSerial(logic, phase, type) | 添加顺序阶段 | R2025a |
addPhaseInParallel(logic, phase, type) | 添加并行阶段 | R2025a |
setEndCondition(phase, type) | 设置阶段触发条件 | R2025a |
addAction(phase, type) | 添加行为操作 | R2025a |
validate(rrs) | 检查场景有效性 | R2025a |
validate(rrs, ObjectRoot=obj) | 验证特定对象(阶段、Actor、路线) | R2025a |
findActions(phase, type) | 查找阶段中指定类型的操作 | R2025a |
createAsset(proj, path, type) | 创建新资源(车辆、角色、行为) | R2025a |
getAnchors(rrApp) | 列出场景锚点 | R2024a |
getAsset 和 "CharacterAsset" | 加载行人资源 | R2025a |
Actor 移动模式
| 模式 | 触发条件 | 行为 | 兼容的操作 |
|---|---|---|---|
| 车道跟随 | 没有路线航点 | 按设定速度沿锚定车道行驶 | ChangeLaneAction、ChangeLateralOffsetAction |
| 路径跟随 | 有路线航点 | 沿航点路径行驶 | ChangeSpeedAction、ChangeLongitudinalDistanceAction |
- 设置了速度但没有路线的车辆会自动沿所在车道行驶
ChangeLaneAction仅在车道跟随模式下有效(无路线时)- 角色/行人 Actor 始终需要路线(否则验证会失败)
约定
- **坐标系:**Z 轴向上,世界空间位置使用
[X Y Z] - **资源路径:**使用相对于项目 Assets 文件夹的准确路径(例如
"Vehicles/Sedan.fbx") - **文件后缀:**磁盘上显示为
.fbx_rrx,API 使用.fbx;磁盘上显示为.rrchar_rrx,API 使用.rrchar - **速度单位:**始终使用米每秒(m/s)
- **Actor 命名:**使用描述性名称(
"Ego"、"TargetVehicle"、"Pedestrian1") - 默认场景:
ScenarioBasic.rrscene(310 条前向车道,ScenarioStart 锚点) - 交叉路口场景:
FourWaySignal、FourWayStop、T_Intersection - **用户确认(强制):**编写代码前,先说明场景计划(Actor、位置、速度、时间安排、预期结果),并取得用户确认。如果任何参数存在歧义,都要提问,绝不猜测。这是避免返工最重要的约定。
脚本
将这些辅助脚本部署到用户的 MATLAB 路径中,用于自动场景分析和批量放置。它们相互依赖:helperSceneAwareness 会调用 helperSurveyLanes 和 helperGetPositionFromHDMap。
| 脚本 | 用途 | 适用时机 |
|---|---|---|
scripts/helperSceneAwareness.m | 导出 HD Map、调查车道、分类道路特征、推荐放置位置 | 放置 Actor 前的第一步——提供位置、车道上下文和特征分类 |
scripts/helperSurveyLanes.m | 按类型、方向和长度筛选/排序车道 | 需要车道几何数据但不需要完整场景分析时 |
scripts/helperGetPositionFromHDMap.m | 沿车道进行弧长插值、查询最近点 | 需要获取车道上特定比例位置的精确坐标时 |
scripts/helperPlaceActors.m | 批量放置、锚定、设置速度并验证多个 Actor | 放置 2 个或更多 Actor 时——自动完成手动添加/锚定/验证流程 |
scripts/helperClassifyRoadFeatures.m | 基于高程对道路特征进行分类(桥梁、地面、匝道) | 由 helperSceneAwareness 内部调用;也可直接调用以查询自定义特征 |
使用模式:
% 1. Run scene awareness to get lane data and recommended positions
sceneInfo = helperSceneAwareness(rrApp, NumActors=2, ScenarioType="cut-in");
% 2. Define actor specs (do NOT pre-initialize with actorSpecs=[])
actorSpecs(1) = struct(Name="Ego", AssetPath="Vehicles/Sedan.fbx", ...
AssetType="VehicleAsset", LaneIndex=1, Fraction=0.1, Speed=15);
actorSpecs(2) = struct(Name="Target", AssetPath="Vehicles/Sedan.fbx", ...
AssetType="VehicleAsset", LaneIndex=2, Fraction=0.2, Speed=20);
% 3. Batch place and verify (actors is a cell array)
[actors, report] = helperPlaceActors(rrs, rrprj, phaseLogic, sceneInfo.HDMap, actorSpecs);
assert(report.AllValid, "Placement failed: " + report.Summary);
ego = actors{1}; target = actors{2}; % curly braces required
场景特征识别
对于具有多个高程层级(桥梁、高架路、地下通道)的场景,使用 RoadFeature 参数指定目标道路结构:
% Place actors specifically on the bridge deck
sceneInfo = helperSceneAwareness(rrApp, NumActors=2, ScenarioType="following", ...
RoadFeature="bridge");
% LaneIndex=1 now refers to the longest BRIDGE lane, not the longest overall lane
actorSpecs(1) = struct(Name="Leader", AssetPath="Vehicles/Sedan.fbx", ...
AssetType="VehicleAsset", LaneIndex=1, Fraction=0.3, Speed=15, ...
FilterLaneIDs=sceneInfo.FilteredLaneIDs);
可用特征标签:"bridge"、"ground"、"ramp"、"overpass"
适用 RoadFeature 的情况:
- 用户提到“在桥上”“在桥下”“在匝道上”或“在高架路上”
- 场景有多个高程层级(桥梁、高速公路互通立交)
- 默认放置选中了错误的道路层级(Actor 的高程不符合预期)
**当 RoadFeature=""(默认值)时:**摘要会显示所有检测到的特征,以便你询问用户具体指的是哪一个:
Road features detected:
bridge: 10 lanes, total 700m, connected path 192m, elevation 7.9-8.6m
ground: 3 lanes, total 490m, connected path 165m, elevation 2.4-2.8m
支持特征识别的放置输出字段:
sceneInfo.RoadFeatures——完整的特征分类结构体sceneInfo.FilteredLaneIDs——与指定特征匹配的车道 ID(传递给actorSpecs.FilterLaneIDs)sceneInfo.LaneNetwork——来自helperAnalyzeHDMapLanes的完整车道连通关系
RoadRunner 内置辅助脚本
RoadRunner 在 <RoadRunner-Install>/Tools/MATLAB/api/scenario/common 中提供示例辅助脚本(例如 helperAddCutInAndSlowCar、helperAddPedestrian)。这些脚本使用 anchorToPoint + LaneOffset 放置 Actor。
**适合使用内置辅助脚本的情况:**车道清晰分隔的简单场景(直路、已知布局)。
**更适合使用本技能所述方法的情况:**有交叉路口、布局复杂或几何结构未知的场景——LaneOffset 可能会将 Actor 放置到不支持变道的交叉路口连接车道上。HD Map 位置 + autoAnchor 可在任何场景中可靠工作。
内置辅助脚本中的关键模式:ChangeLaneAction 支持 LaneChangeReference="actor" 和 Direction="same-lane"——Actor 会自动移至参考 Actor 所在的车道,无需计算方向叉积。用法请参阅 references/scenario-templates.md 的 Cut-In 部分。
参考资料
references/actions-and-conditions.md— 所有动作类型、条件类型及其属性和有效值的完整目录。构建阶段逻辑时请查阅。references/routes-and-points.md— 完整的 Point 属性、RouteSegment 配置、基于时间的轨迹以及路线只读属性。需要精确定位、设置轨迹时间或配置曲线时请查阅。references/collision-utility.md— CollisionUtility 的配置,用于分析特定参与者对之间的碰撞。设置碰撞监控时请查阅。references/asset-catalog.md— 可用的车辆和角色资源路径及其命名约定。添加参与者时请查阅。references/scene-awareness.md— 当 helperSceneAwareness 不可用时,用于查询车道几何的 HD Map 导出模式。在未知场景中放置参与者时请查阅。references/lane-connectivity.md— 车道网络拓扑、道路要素分类以及连通路径查询。在特定道路要素(桥梁、匝道)上放置参与者,或需要车道连通信息时请查阅。references/scenario-templates.md— 切入、行人穿越、跟车、紧急制动的测试代码模式。构建特定类型的场景时请查阅。references/physics-first-design.md— 编写代码前进行的运动学分析:先推导速度、间距和时间安排。用于碰撞、险些碰撞或定时交互场景时请查阅。
版权所有 2026 The MathWorks, Inc.