4、绝对轨迹误差(ATE):从定义到工程实践
各位同学,今天我们来聊聊绝对轨迹误差(ATE)。
说实话,ATE 是 SLAM 评测里最常用的指标之一。我入行那会儿,第一次跑完 ORB-SLAM,看着终端里蹦出来的 ATE 数值,说实话有点懵——这数字到底代表什么?0.1 米算好还是 0.5 米算好?
嗯,今天我们就把它彻底讲清楚。
4.1 ATE 的定义:一句话讲明白
绝对轨迹误差,英文全称 Absolute Trajectory Error,简称 ATE。
说白了,它就是估计轨迹和真实轨迹之间的位置偏差。你想想看,我们跑 SLAM 算法,输出了一条轨迹。但真实轨迹呢?通常由高精度设备(比如动捕系统、激光跟踪仪)提供。ATE 就是衡量这两条轨迹在每一时刻的「距离差」。
数学上,对于第 i 个时刻,ATE 定义为:
ATE_i = || P_est_i - P_gt_i ||
其中:
- P_est_i:算法估计的位姿(通常是平移部分)
- P_gt_i:真实位姿(Ground Truth)
- ||·||:欧几里得范数,也就是直线距离
这里有个关键点:ATE 只考虑平移误差,不考虑旋转误差。为什么?因为在实际工程中,位置精度往往比姿态精度更敏感。我在做 AGV 导航时深有体会——姿态偏个几度可能还能走,但位置偏了 10 厘米,车就撞墙了。
重要提醒:ATE 计算前,必须将估计轨迹和真实轨迹对齐。因为它们的坐标系原点可能不同。常用的对齐方法是 Umeyama 算法(最小二乘刚体变换)。
4.2 计算流程:手把手带你走一遍
ATE 的计算流程其实不复杂,但细节容易踩坑。我习惯分四步走:
- 时间戳对齐:估计轨迹和真实轨迹的时间戳往往不一致。需要插值或最近邻匹配。
- 轨迹对齐:用 Umeyama 算法将估计轨迹与真实轨迹对齐(只做刚体变换,不改变轨迹形状)。
- 逐点计算误差:对每个对齐后的时刻,计算位置差的欧几里得距离。
- 统计汇总:计算 RMSE、均值、中位数等统计量。
下面是一个 Python 示例,我用 evo 工具包的习惯写法:
import numpy as np
from evo.core import metrics
# 假设 traj_est 和 traj_gt 是 Nx4x4 的变换矩阵
# 或者 Nx7 的 [x, y, z, qx, qy, qz, qw]
# 创建 ATE 指标对象
ate_metric = metrics.ATE()
# 计算误差
ate_metric.process_data(traj_est, traj_gt)
# 获取结果
rmse = ate_metric.get_statistic('rmse')
mean = ate_metric.get_statistic('mean')
median = ate_metric.get_statistic('median')
print(f"ATE RMSE: {rmse:.4f} m")
print(f"ATE Mean: {mean:.4f} m")
print(f"ATE Median: {median:.4f} m")
我的小技巧:如果你自己实现,记得先检查轨迹长度是否一致。我曾经因为一个轨迹少了最后 10 帧,算出来的 RMSE 差了 30%。
4.3 RMSE 与均值、中位数:到底该看哪个?
很多初学者拿到 ATE 结果,只看 RMSE。这其实是个误区。
我们来看看这三个指标的区别:
| 指标 | 含义 | 特点 |
|---|---|---|
| RMSE | 均方根误差 | 对大误差敏感,能反映最差情况 |
| 均值 | 平均误差 | 反映整体水平,但容易被极端值拉偏 |
| 中位数 | 中间位置的误差 | 鲁棒性强,不受少数大误差影响 |
我个人习惯这样用:
- 看整体性能:先看 RMSE。如果 RMSE 比均值大很多,说明存在明显的「坏点」。
- 看典型表现:看中位数。中位数能告诉你「大部分时间算法表现如何」。
- 看稳定性:比较 RMSE 和均值。差值越大,说明轨迹越不稳定。
举个例子:
- 场景 A:RMSE=0.12m,均值=0.10m,中位数=0.09m → 算法稳定,偶尔有小波动
- 场景 B:RMSE=0.35m,均值=0.15m,中位数=0.11m → 算法大部分时间不错,但偶尔有大漂移
场景 B 的情况,我在做长走廊 SLAM 时遇到过。算法在直道部分表现很好,但一到拐角就漂移。这时候只看 RMSE 会误判,中位数反而更真实。
避坑指南:我曾经在评估一个 VIO 算法时,发现 RMSE 高达 0.8 米,但中位数只有 0.15 米。后来一查,原来是算法在初始化阶段有 3 秒钟的剧烈抖动。如果只看 RMSE,我差点就把这个算法否定了。
4.4 知识体系:一张图看懂 ATE
下面我用一张 SVG 图来总结 ATE 的核心逻辑:
4.5 工程中的常见问题
最后,分享几个我在项目中遇到的 ATE 相关坑:
- 轨迹长度不一致:估计轨迹和真实轨迹的帧数不同。我习惯用 evo 的
align功能自动处理。 - 坐标系不统一:真实轨迹可能是 ENU 坐标系,估计轨迹可能是相机坐标系。记得先转换。
- 尺度问题:单目 SLAM 存在尺度模糊。ATE 计算前需要先做尺度对齐。
一句话总结:ATE 是 SLAM 评测的「体检报告」。RMSE 看最差情况,中位数看典型表现,两者结合才能全面评估算法。
好了,关于 ATE 的内容就讲到这里。下一章我们会聊相对轨迹误差(RPE),到时候再对比着看,你会对 SLAM 评测有更深的理解。