第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评估的瑞士军刀。装好它,学会它,你的定位算法评估效率至少提升一倍。