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 的计算流程其实不复杂,但细节容易踩坑。我习惯分四步走:

  1. 时间戳对齐:估计轨迹和真实轨迹的时间戳往往不一致。需要插值或最近邻匹配。
  2. 轨迹对齐:用 Umeyama 算法将估计轨迹与真实轨迹对齐(只做刚体变换,不改变轨迹形状)。
  3. 逐点计算误差:对每个对齐后的时刻,计算位置差的欧几里得距离。
  4. 统计汇总:计算 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 的核心逻辑:

绝对轨迹误差(ATE)知识体系 估计轨迹 真实轨迹 步骤1:时间戳对齐 插值 / 最近邻匹配 步骤2:轨迹对齐 Umeyama 算法 步骤3:逐点计算 欧几里得距离 ATE 误差序列 RMSE 均值 中位数 图:ATE 计算流程与统计指标关系

4.5 工程中的常见问题

最后,分享几个我在项目中遇到的 ATE 相关坑:

  • 轨迹长度不一致:估计轨迹和真实轨迹的帧数不同。我习惯用 evo 的 align 功能自动处理。
  • 坐标系不统一:真实轨迹可能是 ENU 坐标系,估计轨迹可能是相机坐标系。记得先转换。
  • 尺度问题:单目 SLAM 存在尺度模糊。ATE 计算前需要先做尺度对齐。

一句话总结:ATE 是 SLAM 评测的「体检报告」。RMSE 看最差情况,中位数看典型表现,两者结合才能全面评估算法。

好了,关于 ATE 的内容就讲到这里。下一章我们会聊相对轨迹误差(RPE),到时候再对比着看,你会对 SLAM 评测有更深的理解。

可可精品资料库