mcpField
R
roadrunner-scenario-authoring

roadrunner-scenario-authoring

github.com/matlab其他1.2k46 次安装1 天前更新
代码仓库

关于 roadrunner-scenario-authoring

此 MATLAB 技能指导通过 roadrunnerAPI 以编程方式创建 RoadRunner 场景,包括演员、路线、阶段逻辑和验证。适合需要构建或检查驾驶场景的用户,并强调先规划场景交互再编写代码。

主要功能

  1. 01添加车辆、行人和物体演员
  2. 02设置演员位置与道路锚点
  3. 03创建路线和航点
  4. 04构建阶段、条件与动作逻辑
  5. 05验证场景结构

适用场景

  1. 01创建车辆跟随或变道场景
  2. 02设置行人穿越路线
  3. 03配置阶段触发条件与动作
  4. 04运行验证以检查场景结构

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill roadrunner-scenario-authoring

安装后在 Claude Code 中输入/roadrunner-scenario-authoring确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

manifest.yaml
references/
actions-and-conditions.md
asset-catalog.md
collision-utility.md
lane-connectivity.md
physics-first-design.md
routes-and-points.md
scenario-templates.md
scene-awareness.md
scripts/
helperAnalyzeHDMapLanes.m
helperClassifyRoadFeatures.m
helperGetPositionFromHDMap.m
helperPlaceActors.m
helperSceneAwareness.m
helperSurveyLanes.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 步流程:

  1. 将意图解析为时间线
  2. 测量空间参数(查询 HD Map)
  3. 构建参数推导表(展示计算过程)
  4. 验证条件是否会触发
  5. 使用推导出的数值编写代码

向用户展示你的分解结果——说明参与者、位置、速度、触发时机和预期结果。获得确认后再执行代码。

  1. 参与者 — 数量、类型(车辆/行人/物体)和角色(自车、目标、背景、静止)
  2. 位置几何关系 — 决定使用哪种 helperSceneAwareness 类型:
    • 同一车道(ScenarioType="following")— 前车/跟车、超车起始、紧急制动
    • 相邻车道(ScenarioType="cut-in")— 变道、汇入、并排行驶
    • 路径交叉 — 行人穿越、交叉路口冲突
  3. 交互意图 — 决定速度、间距和触发条件的默认值:
    • 冲突/险些碰撞: 距离近、存在速度差,用于测试反应(间隙小、基于距离的触发条件)
    • 协作: 预期安全完成,不发生碰撞(间隙大于等于 30m,使用时间或持续时间触发条件)
    • 相互独立: 参与者之间没有直接交互(背景交通、静止物体)
  4. 机动序列 — 将每种明确的行为变化视为一个阶段:行驶 → 变道 → 制动 → 恢复。每次转换都需要触发条件。
  5. 触发条件选择:
    • 基于距离(LongitudinalDistanceToActorCondition)— 参与者之间必须存在速度差
    • 基于时间(DurationCondition)— 不受速度影响,更简单
    • 仿真时间(SimulationTimeCondition)— 绝对时间,适用于编排好的序列
  6. 安全验证 — 执行之前,验证变道场景不会发生碰撞: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

硬性约束

  1. 始终在 ActorActionPhase 和条件对象上设置 .Actor — 绝不要省略
  2. 单个阶段中绝不要添加重复的动作类型 — 改为修改 phase.Actions(1)
  3. 角色演员必须配置路线 — 否则验证会失败
  4. autoAnchor 需要满足邻近条件 — 点必须位于路面 5m 范围内
  5. 距离条件规则 — 只有 "le" 和 "ge" 有效(不能用 "lt"、"gt")
  6. 速度条件规则 — 有效值包括 "eq"、"gt"、"lt"、"ge"、"le"、"ne"
  7. SerialPhase 不能嵌套在 SerialPhase 中 — 请使用 ParallelPhase 作为中间阶段
  8. 距离触发条件需要速度差 — 如果演员以相同速度行驶,间距不会变化
  9. 除非用户明确要求,否则绝不要运行仿真 — 场景创作和仿真是不同的工作流。绝不要仅凭数学计算就声称场景结果(碰撞、险些碰撞);只有仿真才能得出真实结果
  10. 绝不要想当然 — 遇到模糊的提示词时务必先澄清 — 如果用户没有指定速度、距离、时间安排、演员数量、期望结果(碰撞、险些碰撞还是安全)或场景,请先询问,再编写代码。执行前,请向用户展示场景分解和物理分析,供其确认。猜测会导致场景虽能通过验证,实际结果却不符合预期。
  11. 使用 setEndCondition,而非 addEndCondition — 每个阶段只能有一个结束条件
  12. ChangeLaneAction 需要车道跟随模式 — 对需要变道的演员,不要添加路线
  13. 不要在路线点上同时使用 anchorToPoint 和 ForwardOffset — 这会导致验证失败;只能使用 autoAnchor
  14. LaneOffset 可能会将演员放置在路口连接车道上 — 对于变道场景,请使用 HD Map 位置和 autoAnchor 将演员放在已确认的平行车道上,而不要使用 LaneOffset
  15. 绝不要猜测变道方向 — 如果目标是另一个演员所在的车道,请使用 LaneChangeReference="actor" + Direction="same-lane";或者通过叉积计算方向(参见 references/scenario-templates.md)
  16. 并行组的结束条件应设置在 .ParentPhase 上,而不是子阶段上
  17. 放置后请验证 WorldPosition — [0 0 0] 表示锚定静默失败
  18. 没有移除演员的 API — removeActor 不存在;锚定后 WorldPosition 为只读。放置错误时必须调用 newScenario() 并重建。执行前请仔细规划放置位置。
  19. autoAnchor 在车道边界处不可靠 — 查询 HD Map 位置时,请使用 ≥ 0.2 且 ≤ 0.8 的分数。车道起点/终点处有多条车道汇合,autoAnchor 可能会吸附到错误的车道。
  20. 变道安全余量 — 变道时,纵向间距必须大于:lane_change_distance + (closing_rate × maneuver_time) + vehicle_length。在 5 m/s 的接近速度下,变道距离为 20m 时,初始间距至少需要 30m。
  21. 车辆路线段默认采用自由形式 — 为车辆添加航点后,请在每个路线段上设置 seg.Freeform = false,使路线沿道路几何形状行驶。不要对行人路线禁用自由形式 — 行人需要横穿道路,因此需要自由形式路径。
  22. 路径跟随模式下的演员没有碰撞物理效果 — 处于路径跟随模式(带路线)的车辆会彼此穿过。当保险杠间距达到 ≤50mm 时,RoadRunner 会检测到碰撞并终止场景。请根据保险杠间距(而非中心到中心的距离)设计碰撞时间。
  23. 碰撞间距公式 — 使用保险杠间距,而非中心间距:bumper_gap = center_distance - (vehicle1_length/2 + vehicle2_length/2)。时间计算:t_collision = bumper_gap / closing_rate。请考虑车辆从静止状态加速约需 1s(车辆不会瞬间达到目标速度)。
  24. 不支持正面碰撞 — LaneOffset 必须为正值;通过编程 API 无法让两辆车在同一路段上迎面相对。请改用追尾或交叉路径碰撞设计。
  25. 初始间距必须大于触发距离 — 如果演员的初始间距小于触发条件的距离阈值,条件会立即触发,阶段会在预期时间之前推进。
  26. 绝不要在 setEndCondition 上链式赋值属性 — setEndCondition(phase,"Type").Property = N 在 ActorActionPhase 上会失败(仅适用于 InitialPhase)。请始终先保存返回值:c = setEndCondition(phase, "Type"); c.Property = N;。这种两行写法适用于所有阶段类型。
  27. 每个 ActorActionPhase 只能有一个动作 — 每个阶段只调用一次 addAction。唯一例外是 initialPhaseForActor 自动创建的初始阶段。对于并发动作,请使用一个包含多个 ActorActionPhase 子阶段的 ParallelPhase,每个动作对应一个子阶段。
  28. 绝不要使用世界坐标偏移来放置演员 — egoPos + [X, Y, 0] 只适用于与世界坐标轴对齐的道路。对于行人和横穿道路的演员,请始终使用 helperGetPositionFromHDMap 获取位置和航向,然后计算垂直于道路的横穿方向:hdg2D = hdg(1:2)/norm(hdg(1:2)); perpDir = [-hdg2D(2), hdg2D(1), 0];
  29. 路口场景:不要让路线横穿路口各个入口车道 — 在 FourWaySignal、FourWayStop 和 T_Intersection 场景中,通过路线 API 无法将接近车道连接到对向出口车道。请仅使用单入口车道路线(接近车道 → 同一路廊中与其相连的出口车道),或仅使用车道跟随模式。横穿路口的路线无法通过 validate。
  30. 不要过度筛选车道长度 — helperSceneAwareness 的参数是 MinLaneLength(默认值为 30);helperSurveyLanes/helperGetPositionFromHDMap 使用 MinLength。对于路口场景,请使用 30,因为接近车道较短。按以下公式计算所需长度:max_speed × scenario_duration + 20m。在较小场景中使用 80+ 会导致可用车道数量低于预期。

常见的错误属性名称

错误(臆造)正确
RelativeLaneOffsetNumLanesOffset
SimulationTimeSimulationTimeCondition
addEndConditionsetEndCondition
listAssets / getAssetsgetAsset(proj, path, type)
getActors / listActorsrrs.Actors
actor.SpeedinitPhase.Actions(1).Speed
route.addWaypointaddPoint(route, position)
removeActor / deleteActor不存在 — 使用 newScenario()
actor.WorldPosition = ...只读 — 通过 newScenario() 重新放置
cond.ComparisonSimulationTimeCondition 上不存在(只需设置 .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 作为路线航点
LateralOffsetActionChangeLateralOffsetAction(必须使用完整名称)
.Offset(在 ChangeLateralOffsetAction 上).LateralOffset
laneTable.LaneIndexlaneTable.Index(来自 helperSurveyLanes 的列名)
action.Rate使用 .DynamicsDimension = "rate"; .DynamicsValue = N;
setEndCondition(...).Property = Nc = 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)向场景添加 ActorR2025a
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.


评论

支持 Markdown