第4章 评估工具evo:安装配置与基本使用

做SLAM定位的,手里没个趁手的评估工具,就像木匠没带刨子——活能干,但干不漂亮。今天要聊的evo,就是我这些年用得最顺手的轨迹评估工具。没有之一。

说实话,我刚入行那会儿,评估轨迹全靠自己写脚本。算个ATE(绝对轨迹误差)要折腾半天,画个图还得调matplotlib参数。后来发现了evo,嗯,真香。

4.1 evo是什么?为什么选它?

evo是一个专门用于SLAM轨迹评估的开源工具。它支持多种数据格式,能算各种误差指标,还能一键出图。说白了,就是帮你回答三个问题:

  • 你的定位到底准不准?
  • 漂移有多大?
  • 哪个算法更好?

我个人习惯用evo来做算法对比。比如你同时跑了ORB-SLAM3和VINS-Fusion,想看看谁更靠谱。用evo,几分钟就能出结果,不用自己写一堆重复代码。

核心能力一览:

  • 支持TUM、KITTI、EuRoC三种主流格式
  • 计算ATE、RPE等关键指标
  • 自动对齐轨迹(时间戳对齐、位姿对齐)
  • 可视化:轨迹图、误差图、箱线图

4.2 安装与配置

安装evo其实很简单。我建议直接用pip装,省心。

# 基础安装
pip install evo

# 如果要用到全部功能(比如绘图增强)
pip install evo --upgrade
pip install matplotlib seaborn

装完之后,验证一下:

evo_ape --help

如果能看到帮助信息,说明装好了。

小提示:我建议在虚拟环境里装evo。因为evo依赖的numpy、matplotlib版本可能和你其他项目冲突。我曾经因为版本问题折腾了一下午,后来老老实实用venv隔离了。

如果你用的是ROS,还可以装evo的ROS扩展:

pip install evo[ros]

这样可以直接读取rosbag里的轨迹话题,非常方便。

4.3 轨迹文件格式

做评估之前,得先搞清楚你的轨迹数据是什么格式。evo支持三种主流格式,我分别说一下。

4.3.1 TUM格式

TUM格式来自慕尼黑工业大学。它的特点是:每行一个位姿,包含时间戳和7维四元数。

# 格式:timestamp tx ty tz qx qy qz qw
1403636579.647200 1.0445 0.1245 0.0123 0.7045 -0.0123 0.7098 0.0023
1403636579.648200 1.0446 0.1246 0.0124 0.7046 -0.0124 0.7099 0.0024

这种格式在学术界很常见。ORB-SLAM、DVO等经典算法都输出TUM格式。

注意:TUM格式的时间戳单位是秒。我遇到过有人把毫秒当秒传进去,结果轨迹对不上,误差大得离谱。检查一下你的时间戳单位。

4.3.2 KITTI格式

KITTI格式来自自动驾驶数据集。它没有时间戳,只有位姿矩阵。

# 格式:3x4变换矩阵(12个数字)
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0

每行12个数字,组成一个3x4的变换矩阵。注意,KITTI格式没有时间戳,所以不能做时间戳对齐。

我在做自动驾驶项目时经常用KITTI格式。它的好处是数据紧凑,但缺点也很明显——没法处理时间戳漂移的问题。

4.3.3 EuRoC格式

EuRoC格式来自ETH的无人机数据集。它和TUM类似,但多了一个协方差矩阵。

# 格式:timestamp tx ty tz qx qy qz qw 协方差(可选)
1403636579.647200 1.0445 0.1245 0.0123 0.7045 -0.0123 0.7098 0.0023 0.01 0.0 0.0 0.0 0.0 0.0

协方差矩阵可以用来评估位姿的不确定性。不过说实话,大部分SLAM算法输出的协方差都不太准,我一般直接忽略。

4.4 基本命令使用

evo的核心命令就几个,我一个个说。

4.4.1 绝对轨迹误差(ATE)

ATE衡量的是估计轨迹和真值轨迹之间的整体偏差。说白了,就是看你的轨迹整体上偏了多少。

# 计算ATE
evo_ape tum groundtruth.txt estimated.txt -a

# 输出结果并画图
evo_ape tum groundtruth.txt estimated.txt -a --plot --plot_mode xyz

-a参数表示自动对齐轨迹。这个很重要,因为你的估计轨迹和真值轨迹可能不在同一个坐标系下。

输出示例:

APE w.r.t. translation part (m)
       max: 0.4523
      mean: 0.2134
    median: 0.1987
       min: 0.0234
       rmse: 0.2456
       sse: 12.3456
       std: 0.1123

我一般主要看rmse和mean。rmse对大的误差更敏感,能反映出偶尔的跳变。

4.4.2 相对位姿误差(RPE)

RPE衡量的是局部漂移。它计算的是每隔一定距离或时间,轨迹的局部偏差。

# 计算RPE,每隔1米计算一次
evo_rpe tum groundtruth.txt estimated.txt -d 1.0 -a

# 每隔100帧计算一次
evo_rpe tum groundtruth.txt estimated.txt -d 100 --delta_unit f -a

RPE能反映出你的算法在局部有没有抖动。比如VIO算法在快速转弯时,RPE往往会变大。

我的经验:评估VIO算法时,我习惯同时看ATE和RPE。ATE反映整体漂移,RPE反映局部抖动。如果ATE小但RPE大,说明算法整体还行但局部不稳定,可能是IMU标定有问题。

4.4.3 轨迹可视化

光看数字不够直观,还得画图。evo的绘图功能很强大。

# 画轨迹图
evo_traj tum estimated.txt --ref=groundtruth.txt -a --plot_mode=xyz

# 同时画多条轨迹对比
evo_traj tum est1.txt est2.txt --ref=groundtruth.txt -a --plot_mode=xyz

这个功能我经常用。比如对比ORB-SLAM3和VINS-Fusion,把两条轨迹和真值画在一起,一眼就能看出谁更准。

4.4.4 结果汇总与对比

evo还能把多个结果汇总在一起,方便对比。

# 生成对比表格
evo_res results1.zip results2.zip --plot

这个命令会把多个评估结果放在一起,生成箱线图。我在写论文时经常用这个功能,一张图就能展示所有算法的对比结果。

4.5 避坑指南

用evo这几年,我踩过不少坑。分享几个最常见的:

坑1:时间戳对齐失败

我曾经遇到过估计轨迹和真值轨迹的时间戳对不上,导致评估结果完全错误。后来发现是时间戳的精度不一致——一个是微秒,一个是纳秒。解决办法是用--t_max_diff参数调整最大时间差。

evo_ape tum gt.txt est.txt -a --t_max_diff 0.01

坑2:坐标系不一致

不同SLAM算法输出的坐标系可能不一样。比如有的用右手系,有的用左手系。如果不做对齐,ATE会大得离谱。记得加-a参数做自动对齐。

坑3:数据格式错误

我见过有人把KITTI格式当成TUM格式传进去,结果解析失败。检查一下你的数据格式,用evo_traj命令先看一眼。

evo_traj tum your_file.txt --info

4.6 本章小结

evo是我工具箱里最常用的工具之一。它简单、高效、功能齐全。你只要记住:

  • 安装用pip,省心
  • 三种格式要分清:TUM带时间戳和四元数,KITTI只有矩阵,EuRoC多了协方差
  • ATE看整体漂移,RPE看局部抖动
  • 画图用--plot,对比用evo_res

嗯,掌握了这些,你就能用evo做基本的轨迹评估了。下一节我们会深入讲怎么用evo做更高级的分析,比如多段轨迹拼接、传感器延迟补偿等。但先把基础打牢,别急着跳。

一句话总结:evo是SLAM评估的瑞士军刀。装好它,学会它,你的定位算法评估效率至少提升一倍。

可可精品资料库