nuPlan评测

nuPlan Planning Challeng Metricshttps://nuplan-devkit.readthedocs.io/en/latest/metrics_description.html#
nuPlan Planning Challenge分为三个挑战场景:
● Challenge 1: Open-loop;
● Challenge 2: Closed-loop non-reactive agents;
● Challenge 3: Closed-loop reactivate agents;

Requirements
nuPlan参赛者向云端评测平台提交代码,在隐藏的测试集上评估。三项挑战中,有以下规则:
● 每种场景类型都会有一组固定的场景仿真任务,每个场景仿真都会从一个固定的时间点开始;
● 在每一步仿真中,planner都将收到当前时刻以及过去最多2s2s2s的场景信息,包括自车位姿、自车导航路径、其他交通参与者、以及动静态地图信息;
● planner容许的最大计算时间为1s1s1s,超时将中断仿真;
● 每个场景的仿真时间最长为15s15s15s,仿真频率为10hz10hz10hz;
● planner输出轨迹需要包含在global frame下x,y,θx,y,\thetax,y,θ和timestamp,在close-loop中,unPlan使用LQR进行控制在环仿真;
Scenario Selection
场景类型 描述
starting_straight_traffic_light_intersection_traversal 自车起始处于一个交通信号灯控制的交叉路口的直行场景中,且当前未处于停车状态。
high_lateral_acceleration 自车在横向加速度较高(1.5<a<3m/s21.5 < a < 3 m/s^21.5<a<3m/s2)并伴随较大偏航角速度(yaw rate)的情况下移动,但不处于转弯中。
changing_lane 自车开始执行变道操作,切换至相邻车道。
high_magnitude_speed 自车处于高速状态(速度 > 9 m/s),同时加速度较低。
low_magnitude_speed 自车低速行驶(0.3 < 速度 < 1.2 m/s),加速度较低,且未停车。
starting_left_turn 自车起始处于左转穿越交叉路口的场景,且未处于停止状态。
starting_right_turn 自车起始处于右转穿越交叉路口的场景,且未处于停止状态。
stopping_with_lead 自车开始减速(加速度 < -0.6 m/s²,速度 < 0.3 m/s),并且前方有一辆车距离较近(< 6 m)。
following_lane_with_lead 自车以较高速度(> 3.5 m/s)在当前车道行驶,前方同车道上有一辆移动车辆(速度 > 3.5 m/s,纵向距离 < 7.5 m)。
near_multiple_vehicles 自车在运动过程中(速度 > 6 m/s)附近(距离 < 8 m)存在多辆(>6)移动车辆。
traversing_pickup_dropoff 自车正在穿越一个上下客区域,且未处于停车状态。
behind_long_vehicle 自车在一辆较长车辆(长度 > 8 m)后方(纵向距离 3–10 m,同车道内横向距离 < 0.5 m)行驶。
waiting_for_pedestrian_to_cross 自车等待一名行人穿越人行横道(行人与自车距离 < 8 m,预计 1.5 秒内到达交叉区域),自车未停车,行人也不在上下客区域。
stationary_in_traffic 自车处于静止状态,且周围(距离 < 8 m)存在多辆(>6)车辆。
可见,nuPlan的场景设置以城区为主,包含了交叉路口、跟车、变道等复杂场景,而忽略了简单场景,例如无车道路的行驶。
Baselines
nuPlan提供三种Baseline:SimplerPlanner、IDMPlanner、UrbanDriverOpenLoopModel(MLPlanner)。其中,IDMPlanner较多地被用做Baseline。
SimplerPlanner
顾名思义,SimplePlanner 具有非常有限的规划能力。该规划器以恒定速度沿直线进行规划。它唯一的逻辑是:当当前速度超过设定的最大速度(max_velocity)时,执行减速操作。
IDMPlanner
IDMPlanner由Path planning和Longitudinal control(IDM policy)组成。
路径规划使用的是广度优先搜索算法(Breadth-First Search, BFS),用于寻找一条通往任务目标(mission goal)的路径。该路径由一系列车道(lane)和车道连接器(lane connectors)组成,这些连接最终通向包含任务目标的路段(roadblock)。
在此基础上,从所找到的路径中提取出一条基准路径(baseline),并将其作为规划器的参考路径(reference path)使用。
现在规划器已经有了一条参考路径(reference path),接下来需要决定沿着这条路径以多快的速度行驶。为此,它采用了IDM(Intelligent Driver Model)策略。
该策略用于描述在给定与前方目标车辆之间的距离的情况下,规划器应当以什么速度前进。自然地,规划器会选择路径上最接近自己的前方车辆作为参考对象,以此来决定当前的行驶速度。这样可以确保在沿路径前进时保持合理的跟车距离与速度,确保安全性与流畅性。
UrbanDriverOpenLoopModel
UrbanDriverOpenLoopModel 是一个基于机器学习的规划器示例,它使用 MLPlanner 接口实现,作为训练好的学习型规划器的代表。该实现是对 L5Kit 中 “Urban Driver: Learning to Drive from Real-world Demonstrations Using Policy Gradients” 的开环(open-loop)版本的适配,集成进了 nuPlan 框架中。
工作原理:
● 输入处理:模型将矢量化的交通参与者信息和地图信息编码为局部特征描述子(local feature descriptors)。
● 全局注意力机制:这些局部特征被送入一个全局注意力机制,用于生成预测的自车轨迹(ego trajectory)。
● 训练方式:使用模仿学习(imitation learning)对模型进行训练,目标是拟合 nuPlan 数据集中提供的专家轨迹(expert trajectories)。
● 数据增强:训练时对参与体(agents)和专家轨迹进行一定程度的数据增强,以缓解在闭环仿真中出现的数据分布偏移(data distribution drift)问题。
特点:
● 由于是 开环模型,它只在每一步使用当前状态进行预测,不考虑预测结果对未来状态的反馈。
● 该模型为开发者提供了一个端到端学习型规划器的范例,便于基于 nuPlan 框架构建和测试自己的学习型方法。
Metrics
nuPlan中,先以10hz10hz10hz进行15s15s15s的仿真,将仿真过程中的所有数据保存起来(150150150帧),当仿真结束(仿真可能会中断)后,再将保存数据进行评估。并且支持多线程计算。
一些代码实现方式:
● MetricsEngine:测评实现的接口,设置测评结果的文件的读写,各个测评指标的计算等;
● MetricFile和MetricFileKey:测评结果文件保存格式;
● MetricStatistics:测评结果的数据统计格式;
● AbstractMetricBuilder:测评指标的抽象基类,各个不同的测评指标继承此类;
Open-loop
专家轨迹和规划器轨迹以1Hz1Hz1Hz的频率采样,在每个采样时刻,轨迹比较的时域为[3,5,8]s[3,5,8]s[3,5,8]s,规划器要求至少满足1Hz1Hz1Hz运行,输出6s6s6s的规划时域。
Average Displacement Error (ADE) within bound
对于每个采样时间点tit_iti,在接下来 hhh秒内:
ADE(ti)=1N∑j=1N∥x^ti+j−xti+j∥2ADEscenario=1M∑i=1MADE(ti)\text{ADE}(t_i) = \frac{1}{N} \sum_{j=1}^{N} \left\| \hat{\mathbf{x}}_{t_i + j} - \mathbf{x}_{t_i + j} \right\|_2 \\ \text{ADE}_{\text{scenario}} = \frac{1}{M} \sum_{i=1}^{M} \text{ADE}(t_i)ADE(ti)=N1j=1Nx^ti+jxti+j2ADEscenario=M1i=1MADE(ti)
x^ti+j\hat{\mathbf{x}}_{t_i + j}x^ti+j: 规划器在未来第jjj步的位置;
xti+j\mathbf{x}_{t_i + j}xti+j: 专家轨迹的参考位置;
● $|\cdot|_2 $: 欧几里得 L2 距离;
NNN:轨迹比较时域 X 采样频率;[3,5,8]×1[3, 5, 8] \times 1[3,5,8]×1
MMM:整个场景中采样的帧数;
时间轴: t0 t1 t2 t3 …
↓ ↓ ↓
[t0→t0+H] [t1→t1+H] [t2→t2+H] … ← 每段计算ADE
Final Displacement Error (FDE) within bound
对于每个采样时间点tit_iti,FDE定义为:
FDE(ti)=∥x^ti+H−xti+H∥2FDEscenario=1M∑i=1MFDE(ti)\text{FDE}(t_i) = \left\| \hat{\mathbf{x}}_{t_i + H} - \mathbf{x}_{t_i + H} \right\|_2 \\ \text{FDE}_{\text{scenario}} = \frac{1}{M} \sum_{i=1}^{M} \text{FDE}(t_i)FDE(ti)=x^ti+Hxti+H2FDEscenario=M1i=1MFDE(ti)
Miss Rate within bound
对于每个采样时刻tit_iti,定义其最大点对L2L_2L2误差为:
dmax(ti)=max⁡0≤h≤H∥x^ti+h−xti+h∥2d_{\text{max}}(t_i) = \max_{0 \leq h \leq H} \left\| \hat{\mathbf{x}}_{t_i + h} - \mathbf{x}_{t_i + h} \right\|_2dmax(ti)=max0hHx^ti+hxti+h2
若:dmax(ti)>δHd_{\text{max}}(t_i) > \delta_Hdmax(ti)>δH,则认为该时刻是Miss,其中δH\delta_HδH是对应的比较时域的最大允许位移阈值 (δH=0.3m\delta_H = 0.3mδH=0.3m),Miss Rate定义为:
MissRateH=1M∑i=1MMiss(ti)=1M∑i=1M1[dmax(ti)>δH]\text{MissRate}_H = \frac{1}{M} \sum_{i=1}^{M} \text{Miss}(t_i) = \frac{1}{M} \sum_{i=1}^{M} \mathbb{1} \left[ d_{\text{max}}(t_i) > \delta_H \right]MissRateH=M1i=1MMiss(ti)=M1i=1M1[dmax(ti)>δH]
● 1[⋅] 是指示函数,若条件为真则为 1,否则为 0;
H∈{3,5,8}H \in \{3, 5, 8\}H{3,5,8} 是比较时域;
δH\delta_HδH是每个比较时域的最大允许误差;
● 如果所有 horizon 下的 MissRate 都小于 0.3,则指标为 True,否则为 False。
Average Heading Error (AHE) within bound
AHE 在采样时间点tit_iti定义为:
AHE(ti)=1NH∑h=1NH∣θ^ti+h−θti+h∣\text{AHE}(t_i) = \frac{1}{N_H} \sum_{h=1}^{N_H} \left| \hat{\theta}_{t_i + h} - \theta_{t_i + h} \right|AHE(ti)=NH1h=1NHθ^ti+hθti+h
整个场景的 AHE 分数为所有采样时刻的平均值:
AHEHscore=1M∑i=1MAHE(ti)\text{AHE}_H^{\text{score}} = \frac{1}{M} \sum_{i=1}^{M} \text{AHE}(t_i)AHEHscore=M1i=1MAHE(ti)
Final Heading Error (FHE) within bound
对于每个采样时刻tit_iti,在未来HHH秒的预测范围内,规划器与专家在末尾时刻ti+Ht_i + Hti+H的朝向差为:
FHE(ti)=∣θ^ti+H−θti+H∣\text{FHE}(t_i) = \left| \hat{\theta}_{t_i + H} - \theta_{t_i + H} \right|FHE(ti)=θ^ti+Hθti+H
整个场景的 FHE 分数为所有采样时刻的平均值:
FHEHscore=1M∑i=1MFHE(ti)\text{FHE}_H^{\text{score}} = \frac{1}{M} \sum_{i=1}^{M} \text{FHE}(t_i)FHEHscore=M1i=1MFHE(ti)
Metric Comparison Parameters Threshold Visualization
Average Displacement Error (ADE) comparison_horizon = [3, 5, 8] s
comparison_frequency = 1 Hz max_average_l2_error_threshold = 8 m Histogram of:
• Mean ADE (m)
Final Displacement Error (FDE) comparison_horizon = [3, 5, 8] s
comparison_frequency = 1 Hz max_final_l2_error_threshold = 8 m Histogram of:
• Mean FDE (m)
Miss Rate comparison_horizon = [3, 5, 8] s
comparison_frequency = 1 Hz max_displacement_threshold = [6, 8, 16]m
max_miss_rate_threshold = 0.3 Histograms of:
• Miss rate (ratio)
• Boolean: True if miss rate < 0.3 for all horizons
Average Heading Error (AHE) comparison_horizon = [3, 5, 8] s
comparison_frequency = 1 Hz max_average_heading_error_threshold = 0.8 rad Histogram of:
• Mean average heading error (rad)
Final Heading Error (FHE) comparison_horizon = [3, 5, 8] s
comparison_frequency = 1 Hz max_final_heading_error_threshold = 0.8 rad Histogram of:
• Mean final heading error (rad)
代码实现:
● 在计算ADE、FDE时,会加上航向角误差,并考虑了时间折扣系数;
● 阈值在计算得分的时候使用:
给定一个误差指标EEE,阈值为TTT,得分SSS定义为:
S=max⁡(0,1−ET)S = \max(0, 1 - \frac{E}{T})S=max(0,1TE)
S∈[0,1]S \in [0, 1]S[0,1]:越接近 1 表示轨迹质量越高。
Closed-loop
closed-loop中non-reactive agents和reactive agents使用相同的评价指标。
No at-fault Collisions
✅ 定义:
● 碰撞定义:Ego 车体边界(bounding box)与其他 agent 的边界发生几何交叉,即认为发生了碰撞。
● 若一个碰撞持续多帧,仍只算一次,并以首次碰撞帧来计算动能转移。

🔁 碰撞后的处理:
● 发生碰撞的目标轨迹(track)将被排除出后续帧的评估指标(如 ADE、FDE 等 open-loop 指标中不再计入)。

📚 碰撞类型分类:
类型 描述
STOPPED_EGO_COLLISION Ego 静止时发生碰撞
STOPPED_TRACK_COLLISION 对方静止时发生碰撞
ACTIVE_FRONT_COLLISION Ego 前保险杠撞到运动中的目标
ACTIVE_REAR_COLLISION 运动中的目标从后方撞到 Ego
ACTIVE_LATERAL_COLLISION Ego 与目标侧向碰撞

⚠️ 判定“责任碰撞”(At-fault)的条件:
以下情况被视为 责任碰撞(at-fault collision),表示规划器存在问题:
类型 条件
STOPPED_TRACK_COLLISION 任意情况
ACTIVE_FRONT_COLLISION 任意情况
ACTIVE_LATERAL_COLLISION 若 Ego 车辆的 footprint 不完全在单一车道或 lane_connector 内(如变道中)
● 其他类型(如 STOPPED_EGO_COLLISION, ACTIVE_REAR_COLLISION)不视为责任碰撞。

💥 碰撞动能计算(用于评估碰撞严重性):
● 在首次碰撞帧,基于 速度的丢失 计算 碰撞动能(Kinetic Energy Loss),表示 Ego 与目标碰撞的强度。
Eego=megomego+magent⋅vego2+vagent2−2vegovagentcos⁡(Δθ)E_{\text{ego}} = \frac{m_{\text{ego}}}{m_{\text{ego}} + m_{\text{agent}}} \cdot \sqrt{v_{\text{ego}}^2 + v_{\text{agent}}^2 - 2v_{\text{ego}} v_{\text{agent}} \cos( \Delta \theta)}Eego=mego+magentmegovego2+vagent22vegovagentcos(Δθ)

👥 责任碰撞分组:
责任碰撞按目标类型分为 3 类统计:
组别 包含内容
VRU(弱势交通参与者) 行人、骑行者等
Vehicle 各类车辆
Object 交通锥、未知物体等

🧮 指标可视化与评分方式:
● 在 NuBoard 中可视化如下统计:
○ 每类目标的责任碰撞数量(count)
○ 每类目标的碰撞动能统计(最小/最大/平均)
● 对 scenario 得分的影响方式:
○ 使用责任碰撞数乘以惩罚因子进行 score 降级。
○ 设定 最大容忍次数阈值:
○ 计算公式:
Score={1,if no at-fault collisions occurmax⁡(0,1−x1T1+1)⋅max⁡(0,1−x2T2+1)⋅max⁡(0,1−x3T3+1),otherwise\text{Score} =\begin{cases}1, & \text{if no at-fault collisions occur} \\ \max\left(0, 1 - \frac{x_1}{T_1 + 1}\right)\cdot\max\left(0, 1 - \frac{x_2}{T_2 + 1}\right)\cdot\max\left(0, 1 - \frac{x_3}{T_3 + 1}\right), & \text{otherwise}\end{cases}Score={1,max(0,1T1+1x1)max(0,1T2+1x2)max(0,1T3+1x3),if no at-fault collisions occurotherwise
x1,x2,x3x_1,x_2,x_3x1,x2,x3: 分别表示与 VRU、vehicle、object的碰撞数量。
T1,T2,T3T_1, T_2, T_3T1,T2,T3:为对应的最大碰撞容忍阈值。
类别 max_violation_threshold
VRU 0(禁止)
Vehicle 0(禁止)
Object 1(最多允许 1 次)

✅ 总结(高阶影响):
该指标对系统规划性能要求极高:
● 规划器必须避免责任碰撞,特别是对 VRU 和车辆 零容忍。
● 变道、绕行、跟车等动作中,需要显著保障位置合规性与速度控制,以规避责任判定条件。
● 若发生责任碰撞,将严重影响 scenario 的综合得分,甚至被完全淘汰。
Drivable area compliance
自动驾驶车辆(Ego)应始终在映射的可行驶区域内行驶。该指标用于检测车辆是否有超出可行驶区域的行为(相关时间序列数据可见于nuboard的scenario标签页)。由于Ego车辆边界框的过度近似,我们允许车辆最大偏离可行驶区域边界的距离为0.3米(max_violation_threshold = 0.3m)。
定义如下:
● 若存在某一时刻,Ego车辆边界框任一角点到最近可行驶区域边界的距离超过阈值,则该指标得分为0;
● 否则,指标得分为1。
该指标以布尔值形式在nuboard的直方图标签页中显示(True表示无违规,False表示存在违规)。该布尔指标作为乘法因子影响整体场景评分。
Scoredrivable_area={1,if max⁡t∈[0,T](dviolation(t))≤δmax0,otherwise\text{Score}_{\text{drivable\_area}} =\begin{cases}1, & \text{if } \max\limits_{t \in [0, T]} \left( d_{\text{violation}}(t) \right) \leq\delta_{\text{max}} \\0, & \text{otherwise}\end{cases}Scoredrivable_area=1,0,if t[0,T]max(dviolation(t))δmaxotherwise
chatgpt给出的代码解析:
✅ 1. 主指标公式:是否远离可行驶区域(Drivable Area Compliance)
定义以下变量:
NNN: 总时间步数 ;
Ci={ci(1),ci(2),ci(3),ci(4)}C_i = \{ c_i^{(1)}, c_i^{(2)},c_i^{(3)},c_i^{(4)} \}Ci={ci(1),ci(2),ci(3),ci(4)}: 第 iii帧 Ego 车辆四个角点的位置(FL, FR, RL, RR) ;
Dlane(c)D_{lane}(c)Dlane(c): 点 ccc 到最近车道中心线或连接线边界的最小距离 ;
Ddrivable(c)D_{drivable}(c)Ddrivable(c): 点ccc到最近可行驶区域的距离 ;
TTT: 距离阈值(max_violation_threshold)
远离可行驶区域的判断公式:
对于任意时刻i∈[1,N]i \in [1, N]i[1,N],如果存在某个角点满足:
ComplianceScore={1,若 ∀i∈[1,N], ∀j∈{1,2,3,4}, Dlane(ci(j))<T 或 Ddrivable(ci(j))<T0,否则\text{ComplianceScore} =\begin{cases}1, & \text{若 } \forall i \in [1, N],\ \forall j \in \{1,2,3,4\},\ D_{\text{lane}}(c_i^{(j)}) < T \text{ 或 }D_{\text{drivable}}(c_i^{(j)}) < T \\0, & \text{否则}\end{cases}ComplianceScore={1,0, i[1,N], j{1,2,3,4}, Dlane(ci(j))<T  Ddrivable(ci(j))<T否则
✅ 2. 辅助指标公式:每一帧角点是否在可行驶区域中(corners_in_drivable_area)
定义:
1in-drivable(c)=1\mathbb{1}_{\text{in-drivable}}(c) =11in-drivable(c)=1 表示角点ccc落在可行驶区域中(包含在 drivable area layer 或其所关联的路线对象中),否则为 0。
那么,角点是否在可行驶区域中用如下指示函数表示:
vi={1,如果 ∀j∈{1,2,3,4}, 1in-drivable(ci(j))=10,否则v_i =\begin{cases}1, & \text{如果 } \forall j \in \{1,2,3,4\},\ \mathbb{1}_{\text{in-drivable}}(c_i^{(j)}) = 1 \\0, & \text{否则}\end{cases}vi={1,0,如果 j{1,2,3,4}, 1in-drivable(ci(j))=1否则
最终结果是一个布尔时间序列:
v=[v1,v2,…,vN]\mathbf{v} = [v_1, v_2, \dots, v_N]v=[v1,v2,,vN]
整体统计值为:
AllCornersInDrivableArea={1,若 ∑i=1Nvi=N0,否则\text{AllCornersInDrivableArea} =\begin{cases}1, & \text{若 } \sum_{i=1}^{N} v_i = N \\0, & \text{否则}\end{cases}AllCornersInDrivableArea={1,0, i=1Nvi=N否则
Driving direction compliance
评估车辆在 1 秒时间窗内沿着当前车道(lane 或 lane connector)的 行驶方向前进。如果 Ego 在此时间段内沿逆向方向移动:
● 超过 2 m(较轻逆行),得分为 0.5;
● 超过 6 m(严重逆行),得分为 0;
● 否则,得分为 1。
需要注意的是:
● 发生换道行为时会重新计算沿车道的前进距离;
问题 解释
为什么是 1 秒 检测瞬时逆行行为,防止突发严重安全问题
为什么不看 15 秒 避免误判掉头、调整等合法行为,防止冗余指标重叠
是否可以做长期累计 可以,建议你增加一个新的 metric 用于“慢性逆行行为”检测
Making progress
一个 布尔型指标(Boolean Metric),用于快速判断自动驾驶车辆是否在执行任务中“有实质性前进”。
项目 描述
名称 Making Progress
类型 布尔型指标
原理 基于自动车沿专家路线的前进比率
判定规则 ratio ≥ 0.2 → 得分 1.0,否则 0.0
作用 用作最终场景分数的乘子,过滤无效场景
代码位置 nuplan/planning/metrics/evaluation_metrics/common/making_progress.py
Time to Collision (TTC) within bound
⏱️指标目的与意义
TTC 衡量如果 Ego 和另一个目标(track)维持当前速度和航向,将在多久后发生碰撞。用来判断有无安全车距,以及是否接近危险状态 。
🔧 计算条件及范围
● 只计算以下类型的 track:
○ Ego 前方行驶的目标
○ 变道时考虑侧向目标;
○ 车道汇流或者路口考虑侧向目标;
● 忽略后方目标
⏳ 预测与求解过程
● 投影时间窗:
○ 时间步长 Δt = 0.1 s
○ 预测时长 T = 3.0 s
● 对每个 track 与 Ego:
a. 按当前速度和航向推算它们未来位置,步长为 Δt;
b. 在各时刻检查它们的 bounding-box(边界框)是否相交;
c. 若相交,记录最早发生的时间 ttt,即 TTC;
● 若未来 TTT 内不相交,定义为TTC=∞TTC=\infinTTC=
📉 得分计算方式
● 对整个场景,收集所有帧的 最小 TTC 值,上限截断为 3.0 s;
● 计算布尔指标:
TTC_within_bound={True,if min⁡(TTC)>0.95 sFalse,otherwise\text{TTC\_within\_bound}=\begin{cases}\text{True}, & \text{if } \min(\text{TTC}) > 0.95\,\text{s} \\\text{False}, & \text{otherwise}\end{cases}TTC_within_bound={True,False,if min(TTC)>0.95sotherwise
即若在任何时刻,TTC 最低值都大于 0.95 s,则标记为通过。
Ego progress along the expert’s route ratio
🧠 背景动机:
在一个自动驾驶场景中,expert 是人类驾驶数据或参考轨迹。为了验证自动驾驶系统(ego)是否在场景中合理地完成任务,我们希望它:
● 朝着 expert 同样的路径前进
● 不要 原地不动或往后开
● 哪怕没有完全完成 expert 的轨迹,也至少要有一定的前进量

📐 指标定义过程:

  1. 获取 expert 路线:
    ○ 提取 expert 在场景中所走的所有 lane 和 lane_connector 构成的路线;
    ○ 注意:这不是地图中任意一条路,而是 expert 实际经过的 lane 路径。
  2. 计算每一帧上的进展(Progress per frame):
    ○ 比较 ego 在某一帧和上一帧之间 沿 expert 路线 baseline 的投影距离变化;
    ○ expert 也做同样的处理;
    ○ 得到每一帧 ego 和 expert 的进展量。
  3. 累计整个场景的进展(Overall Progress):
    ○ 对所有帧的进展量求和,分别得:
    ■ ego_progress:ego 在整个场景中前进的距离;
    ■ expert_progress:expert 同样的前进距离。
  4. 处理异常情况:
    ○ 有些场景中,ego 可能完全静止,由于噪声 ego_progress 可能是个小负值;
    ○ 所以设定 score_progress_threshold = 0.1m,若 ego 的总进展 < -0.1m,则视为无效,记为 ProgressRatio = 0;
    ○ 若 expert 没有路径(比如在停车场),默认 ProgressRatio = 1。
  5. 归一化计算 ratio:
    ProgressRatio=min⁡(1,max⁡(ego_progress,threshold)max⁡(expert_progress,threshold))ProgressRatio=\min(1,\frac{\max(ego\_progress, threshold)}{\max(expert\_progress, threshold)})ProgressRatio=min(1,max(expert_progress,threshold)max(ego_progress,threshold))

✅ 解释这个指标的含义:
● ProgressRatio = 1:ego 和 expert 前进程度相当,说明任务执行良好;
● ProgressRatio = 0:ego 没有实质性前进,或者倒车过多,任务失败;
● 0 < ProgressRatio < 1:ego 有一定前进,但不足 expert 的完整轨迹。

🧮 举个例子:
情况 ego_progress expert_progress Ratio
正常行驶,前进 50 米 50 50 1
停在原地 0 50 0.002 ≈ 0
倒退 0.2 米(大于阈值) -0.2 30 0
expert 在停车场(无路径) 任意值 0 1
与Making progress对比
特征 Ego progress ratio Making progress
指标类型 连续数值(比例) 布尔值(0 或 1)
计算基础 累计的进展比例 进展比例是否超过阈值
作用 衡量前进程度,反映性能差异 “门槛”判断,作为乘子影响最终评分
影响方式 直接反映得分大小 乘子作用,未通过时使场景得分为0
Speed limit compliance
● 目的
评估 ego 车辆是否超速,判断 ego 在每一帧的速度是否超过所在车道或车道连接段(lane_connector)对应的限速。
● 限速获取规则
○ 如果 ego 在普通车道(lane)上,限速直接取该车道的限速值。
○ 如果 ego 在车道连接段(lane_connector)上,限速取该连接段的入口车道和出口车道的最大限速值。
● 超速判定
○ 对每一帧,计算 ego 速度与限速的差值。
○ 如果 ego 速度大于限速,则判定为超速(speed limit violation)。
○ 超速幅度用速度差(m/s)表示。
● 统计内容
○ 超速次数(违反帧数)。
○ 一个布尔值指标:如果整个场景无超速事件,则为 True;否则为 False。
○ 超速的最小值、最大值和均值(单位 m/s)。
○ 计算均值时,会考虑连续超速时间段的长度(duration),确保均值反映超速时长权重。
● 得分计算:
tit_iti: 为第iii帧的时间戳(单位为秒);
viv_ivi: 为第iii帧超速深度(即超速速度差,单位为 m/s,未超速时为 0);
NNN: 总帧数 ;
Δt=1N−1∑i=0N−1(ti+1−ti)\Delta t = \frac{1}{N-1} \sum^{N-1}_{i=0}(t_{i+1} - t_i)Δt=N11i=0N1(ti+1ti):平均时间步长;
T=tN−t1T=t_{N}-t_1T=tNt1:场景中时长;
VmaxV_{max}Vmax:最大超速阈值;
○ 计算超速累计量(违章“损失”):
violation_loss=∑i=1Nvi⋅ΔtVmax⋅Tviolation\_loss=\frac{\sum^{N}_{i=1}v_i \cdot \Delta t}{V_{max} \cdot T}violation_loss=VmaxTi=1NviΔt
○ 计算最终指标分数(分数范围 [0,1],分数越高表示越合规):
score=max⁡(0,1−violation_loss)score=\max(0,1- violation\_loss)score=max(0,1violation_loss)
Comfort
💡 指标目的
衡量自动驾驶车辆轨迹在行驶过程中的舒适性。舒适驾驶意味着车辆的加速度、加加速度(jerk)、航向变化等不会过大,从而提升乘客体验。

📏 评估变量
在整个场景中从轨迹中提取以下物理量的极值(最小或最大):
名称 描述 阈值(经验值)
min_lon_accel 最小纵向加速度(刹车时) -4.05 m/s²
max_lon_accel 最大纵向加速度(加速时) 2.40 m/s²
max_abs_lat_accel 最大横向加速度的绝对值(侧倾) 4.89 m/s²
max_abs_yaw_rate 最大偏航角速度的绝对值(转弯时车头转动快慢) 0.95 rad/s
max_abs_yaw_accel 最大偏航角加速度的绝对值 1.93 rad/s²
max_abs_lon_jerk 最大纵向 jerk(加速变化快慢) 4.13 m/s³
max_abs_mag_jerk 最大 jerk 向量模(全方向 jerk) 8.37 m/s³

✅ 评分判定逻辑
定义布尔值指标 ego_is_comfortable:
ego_is_comfortable={True,if 所有指标在阈值范围内False,otherwiseego\_is\_comfortable=\begin{cases}\text{True}, & \text{if } 所有指标在阈值范围内\\\text{False}, & \text{otherwise}\end{cases}ego_is_comfortable={True,False,if 所有指标在阈值范围内otherwise
换言之,只要任意一个指标超过阈值,则判定为不舒适。

Mean speed(Not used)
轨迹的平均速度。
Displacement error(Not used)
该指标衡量自动驾驶车辆(ego)在整个场景中每个时间点的位置,与专家车辆(expert)在同一时间点的位置之间的 欧几里得距离(L2范数),从而评估轨迹精度。可以配置时间折扣因子。
Displacement error with yaw(Not used)
是在传统位移误差基础上,引入 航向角误差(heading difference) 的改进指标,用于更全面评估自动驾驶轨迹与专家轨迹之间的 位置和朝向一致性。
Errort=∥ptego−ptexpert∥2+w⋅∣θtego−θtexpert∣\text{Error}_t = \left\| \mathbf{p}_t^{\text{ego}} - \mathbf{p}_t^{\text{expert}} \right\|_2 + w \cdot \left| \theta_t^{\text{ego}} -\theta_t^{\text{expert}} \right|Errort=ptegoptexpert2+wθtegoθtexpert
Metric Thresholds Visualization (Histogram)
No at-fault collision - max_violation_threshold_vru = 0

  • max_violation_threshold_vehicle = 0
  • max_violation_threshold_object = 1 - Number of at-fault collisions- Min/Max/Mean collision energy (if exists, unit: m/s)
    Drivable Area Compliance - max_violation_threshold = 0.3 m - Boolean: True
    if no violation > threshold, else False
    Driving Direction Compliance - driving_direction_violation_threshold = 2 m
  • driving_direction_violation_threshold = 6 m
  • time_horizon = 1 s - Driving direction compliance score value histogram
    Making Progress - min_progress_threshold = 0.2 - Boolean: True
    if progress ratio > threshold, else False
    Time To Collision (TTC) Within Bound - time_step_size = 0.1 s
  • time_horizon = 3.0 s
  • least_min_ttc = 0.95 s - Min TTC value (s)- Boolean: True
    if TTC > threshold, else False
    Speed Limit Compliance - max_compliance_threshold = 1.0
  • max_overspeed_value_threshold = 2.23 m/s
    (≈ 5 mph) - Number of speed limit violations- Boolean: True
    if no violation, else False
    Ego Progress Along Expert Route - score_progress_threshold = 0.1 m - Mean per-frame ego progress (m)- Sum of ego progress over time (m)- Ratio of ego progress to expert progress (saturated to [0,1])
    Comfort - min_lon_accel = -4.05 m/s²
  • max_lon_accel = 2.40 m/s²
  • max_abs_lat_accel = 4.89 m/s²
  • max_abs_yaw_accel = 1.93 rad/s²
  • max_abs_yaw_rate = 0.95 rad/s
  • max_abs_lon_jerk = 4.13 m/s³
  • max_abs_mag_jerk = 8.37 m/s³ - Boolean: True
    if all comfort metrics within thresholds, else False
    Displacement Error - discount_factor = 1 - Min / Max / Mean of displacement errors (L2 distance)
    Displacement Error with Yaw - discount_factor = 1
  • heading_diff_weight = 2.5 - Min / Max / Mean of errors combining L2 position and yaw difference
    Final Metric Structure
    Individual metric scores
    ● 每个指标对规划器(planner)的表现打分,分值范围 [0, 1]。
    ● 分数越高表示性能越好。
    ● 分数可以是:
    ○ 布尔型转换(如违反为 False、不违反为 True → 转换为 0 或 1)
    ○ 连续值函数(基于时间、距离、速度等计算的损失函数 → 正则化到 [0,1])
    open-loop
    在Open-loop中,每个场景的规划器轨迹得分是基于一套选定指标计算的,评分机制采用了混合的分层加权平均方法(hybrid hierarchical-weighted average function)。下面是评分流程及对应公式说明:
    📌 评分流程总览
    在每个场景中,按以下逻辑打分:
  1. 检查 Miss Rate 是否合规(这是一个乘子项):
    ○ 若不合规(Miss Rate 超过阈值)→ 该场景得分直接为 0。
    ○ 若合规 → 进入下一步使用加权平均聚合各个指标得分。
  2. 聚合各个指标得分(score ∈ [0,1]):
    ○ 使用预定义的 权重 进行加权平均,得到最终的场景得分。
    📘 具体指标评分与权重表
    Metric Name Score Computation Weight
    Miss Rate Within Bound 若在大于阈值误差(max_displacement_threshold)的时间步占比 > max_miss_rate_threshold→ score = 0,否则 score = 1(作为乘子项使用) NA(乘子)
    Average Displacement Error (ADE) 若 ADE > max_average_l2_error_threshold→ score = 0,否则 score = 1 1
    Final Displacement Error (FDE) 若 FDE > max_final_l2_error_threshold
    → score = 0,否则 score = 1 1
    Average Heading Error (AHE) 若 AHE > max_average_heading_error_threshold→ score = 0,否则 score = 1 2
    Final Heading Error (FHE) 若 FHE > max_final_heading_error_threshold→ score = 0,否则 score = 1 2

closed-loop
🎯 总体评分逻辑(三层结构)
第一层:硬惩罚(Score = 0)
如果满足以下任意条件,则该场景得分为 0:
● 有与车辆或行人/非机动车(VRU)的 at-fault 碰撞
● 与多个物体(如锥桶)发生 at-fault 碰撞
● 超出 drivable area
● 逆向行驶距离 > 6 m
● 前进距离不足(没有 making enough progress)

第二层:中等惩罚(Score = 0.5 × 加权平均)
如果满足以下任意条件:
● 与 一个物体(如锥桶)发生 at-fault 碰撞
● 逆向行驶距离 > 2 m 且 ≤ 6 m

第三层:加权平均得分
如果无上述违反,则为原始加权平均。
Metric 名称 评分公式 权重(用于加权平均)
no_ego_at_fault_collisions Score={0,if there is an at-fault collision with a vehicle or a VRU, or multiple at-fault collisions with objects0.5,if there is an at-fault collision with a single object1,otherwise\text{Score} =\begin{cases}0, & \text{if there is an at-fault collision with a vehicle or a VRU, or multiple at-fault collisions with objects} \\0.5, & \text{if there is an at-fault collision with a single object} \\1, &\text{otherwise}\end{cases}Score=0,0.5,1,if there is an at-fault collision with a vehicle or a VRU, or multiple at-fault collisions with objectsif there is an at-fault collision with a single objectotherwise 乘法因子(非加权项)
drivable_area_compliance Score={0,if any corner of ego’s bounding box is outside the drivable area by more than the threshold1,otherwise\text{Score} =\begin{cases}0, & \text{if any corner of ego’s bounding box is outside the drivable area by more than the threshold} \\1, & \text{otherwise}\end{cases}Score={0,1,if any corner of ego’s bounding box is outside the drivable area by more than the thresholdotherwise 乘法因子(非加权项)
driving_direction_compliance Score={0,if ego drives against the traffic flow more than 6 m0.5,if ego drives against the traffic flow between 2 m and 6 m1,if ego drives against the traffic flow less than or equal to 2 m\text{Score} =\begin{cases}0, & \text{if ego drives against the traffic flow more than 6 m} \\0.5, & \text{if ego drives against the traffic flow between 2 m and 6 m} \\1, & \text{if ego drives against the traffic flow less than or equal to 2 m}\end{cases}Score=0,0.5,1,if ego drives against the traffic flow more than 6 mif ego drives against the traffic flow between 2 m and 6 mif ego drives against the traffic flow less than or equal to 2 m 5
time_to_collision_within_bound Score={0,if minimum TTC<threshold1,otherwise\text{Score} =\begin{cases}0, & \text{if minimum TTC} < \text{threshold} \\1, & \text{otherwise}\end{cases}Score={0,1,if minimum TTC<thresholdotherwise 5
speed_limit_compliance Score=max⁡(0,1−speed_violation_integralmax_overspeed_value_threshold×total_scenario_duration)\text{Score} = \max\left(0, 1 - \frac{\text{speed\_violation\_integral}}{\text{max\_overspeed\_value\_threshold} \times \text{total\_scenario\_duration}} \right)Score=max(0,1max_overspeed_value_threshold×total_scenario_durationspeed_violation_integral) 4
ego_progress_along_expert_route Score={0,if overall_ego_progress<0min⁡(1.0,max⁡(overall_ego_progress,ϵ)max⁡(overall_expert_progress,ϵ)),otherwise\text{Score} = \begin{cases} 0, & \text{if } \text{overall\_ego\_progress} < 0 \\ \min \left(1.0, \frac{\max(\text{overall\_ego\_progress}, \epsilon)}{\max(\text{overall\_expert\_progress}, \epsilon)} \right), & \text{otherwise} \end{cases}Score={0,min(1.0,max(overall_expert_progress,ϵ)max(overall_ego_progress,ϵ)),if overall_ego_progress<0otherwise 5
ego_is_making_progress Score={0,if ego_progress_along_expert_route<min_progress_threshold1,otherwise\text{Score} = \begin{cases} 0, & \text{if } \text{ego\_progress\_along\_expert\_route} < \text{min\_progress\_threshold} \\ 1, & \text{otherwise} \end{cases}Score={0,1,if ego_progress_along_expert_route<min_progress_thresholdotherwise 乘法因子(非加权项)
ego_is_comfortable Score={0,if any comfort metric is outside its threshold bounds1,otherwise\text{Score} = \begin{cases} 0, & \text{if any comfort metric is outside its threshold bounds} \\ 1, & \text{otherwise} \end{cases}Score={0,1,if any comfort metric is outside its threshold boundsotherwise 2
Planner Score in Each Scenario Type
NuPlan 将场景按照类型进行分类,分类依据包括场景中 Ego 车辆、其他交通参与者(agents)及场景环境的特征。对于某一特定场景类型,规划器的得分通过对该类型下所有规划轨迹得分的平均值计算得到。
该类型得分有助于分析规划器在不同场景类型下的表现优劣,特别适用于机器学习(ML)规划器的性能诊断。例如,若某规划器在 50 个属于 ON_INTERSECTION 类型的场景中平均得分为 0.9,而在 60 个属于 ON_PICKUP_DROPOFF 类型的场景中平均得分仅为 0.6,则表明该规划器在乘客上下车区域(PUDO)相关场景的性能尚有提升空间。
通过针对特定场景类型的得分分析,可以有效指导规划器的后续优化和改进策略,从而提升整体驾驶能力的鲁棒性与安全性。
Planner Final Score
规划器的最终得分在0到1之间,反映其在多个场景中的整体表现。得分越高,表示规划质量越好。为了计算最终得分,规划器会在NNN个场景中进行评估,然后将这些场景中规划器的轨迹得分取平均。数学表达式如下:
S=1N∑i=1NsiS = \frac{1}{N} \sum_{i=1}^{N} s_iS=N1i=1Nsi
其中,sis_isi表示规划器在第iii个场景中驱动轨迹的得分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值