4、evo工具入门:evo的安装、基本命令行使用、数据格式支持

好,咱们进入第四讲。前面几章我们聊了理论,聊了数学,聊了那些让人头大的误差指标。这一章,咱们来点实在的——上手一个工具。

做SLAM轨迹评估,我个人最常用的工具就是evo。为什么?因为它够轻量,够直接,而且社区活跃。说白了,你不需要写一堆Python脚本去对齐时间戳、计算ATE,evo一条命令就搞定了。

4.1 evo的安装

安装evo其实很简单。我建议你直接用pip安装,干净利落。

pip install evo

嗯,就这么一行。但如果你是在一个干净的虚拟环境里装,可能会遇到一些依赖问题。我记得有一次在Ubuntu 18.04上装,numpy版本冲突搞得我折腾了半小时。后来我学乖了,先装numpy和scipy,再装evo。

pip install numpy scipy matplotlib
pip install evo

如果你用的是ROS,那更简单。evo官方提供了ROS的安装方式:

sudo apt install ros-$(rosversion -d)-evo

我个人习惯用pip版本,因为更新快。但ROS版本的好处是,它直接集成了ROS bag的读取功能,后面我们会讲到。

小提示: 安装完成后,在终端输入 evo 回车,如果看到一堆命令列表,说明装成功了。如果报错,多半是Python路径问题,检查一下你的环境变量。

4.2 基本命令行使用

evo的核心命令就那么几个,我列个表给你看:

命令 功能 我常用的场景
evo_traj 绘制轨迹 看两条轨迹是否对齐,有没有漂移
evo_ape 计算绝对位姿误差 评估整体轨迹精度,最常用
evo_rpe 计算相对位姿误差 看局部漂移,比如每10米的误差
evo_res 比较多个结果 对比不同算法的表现
evo_config 配置工具参数 改改颜色、线型、输出格式

咱们先看最常用的 evo_ape。假设你有一个真实轨迹 ground_truth.txt 和一个估计轨迹 estimated.txt,你想看看ATE是多少:

evo_ape tum ground_truth.txt estimated.txt -a -p

这里 -a 表示自动对齐轨迹(用Umeyama算法),-p 表示绘图。你想想看,如果没有evo,你得自己写多少行代码?

输出结果会显示RMSE、mean、median、std、min、max这些统计量。我一般先看RMSE,再看max。为什么?因为RMSE代表整体水平,max代表最差情况。我曾经在一个项目中,RMSE只有0.05米,但max达到了0.3米——后来发现是某个转弯处出现了跟丢。

避坑指南: 我曾经在计算APE时忘了加 -a 参数,结果误差大得离谱。后来才意识到,估计轨迹和真实轨迹的坐标系原点可能不一样,必须对齐。所以,除非你确定两个轨迹已经对齐了,否则一定要加 -a。

再看 evo_rpe,它用来评估局部一致性:

evo_rpe tum ground_truth.txt estimated.txt -r angle_deg --delta 100 -p

这个命令的意思是:计算每100米距离内的相对旋转误差(单位是度)。-r angle_deg 表示只考虑旋转误差,--delta 100 表示步长100米。如果你关心平移漂移,可以用 -r trans_part。

4.3 数据格式支持

evo支持好几种数据格式。我整理了一下:

格式 说明 典型文件
TUM 时间戳 x y z qx qy qz qw RGB-D SLAM常用
KITTI 每行12个数字(3x4变换矩阵) 自动驾驶数据集
EuRoC 时间戳, p_x, p_y, p_z, q_w, q_x, q_y, q_z 无人机数据集
ROS bag 直接读取bag中的topic 机器人常用

我个人最常用的是TUM格式,因为它直观,而且很多开源SLAM系统都输出这个格式。KITTI格式我也经常用,但要注意它的坐标系定义和TUM不一样——KITTI是前向为x,左向为y,上向为z;而TUM是右向为x,下向为y,前向为z。嗯,这里很容易搞混,我曾经因为这个坐标系问题,花了半天时间排查误差为什么那么大。

如果你用的是ROS bag,evo可以直接读取:

evo_traj bag your_bag.bag /your_topic --full_check

这个命令会检查bag中topic的消息类型,确保是geometry_msgs/PoseStamped或者nav_msgs/Odometry。如果不是,evo会报错。我建议先用 rostopic info 确认一下topic类型。

4.4 知识体系总览

为了让你更直观地理解evo工具的整体结构,我画了一张图:

evo工具知识体系 evo 核心工具 evo_traj 轨迹绘制与对比 evo_ape 绝对位姿误差 evo_rpe 相对位姿误差 数据格式支持:TUM | KITTI | EuRoC | ROS bag evo_res 多结果对比 evo_config 配置与可视化 evo_traj + bag ROS bag读取 一条命令搞定轨迹评估,告别手写脚本

这张图把evo的核心功能串起来了。你从中间开始看,核心工具下面分三个主要命令,每个命令负责不同的评估任务。数据格式在最下面一层,是支撑这些命令的基础。

4.5 实战小技巧

最后,分享几个我平时用evo的小技巧:

  • 批量处理: 如果你有多个估计轨迹文件,可以用 evo_res 一次性对比。我经常把不同参数跑出来的结果放在一个文件夹里,然后 evo_res *.zip -p 一键出图。
  • 保存结果: 加 --save_results result.zip 可以把结果保存成zip文件,方便后续分析或分享。
  • 自定义绘图: 用 evo_config set plot_seaborn_style whitegrid 可以改绘图风格。我个人喜欢白色背景加网格,看起来清爽。
  • 时间戳对齐: evo默认用线性插值对齐时间戳。如果你的数据时间戳抖动很大,可以试试 --sync_method nearest 用最近邻对齐。
注意: evo默认假设你的轨迹数据是连续的。如果你的数据有丢帧或者时间戳跳跃,建议先预处理一下。我曾经遇到过因为IMU数据丢帧导致轨迹时间戳不连续,evo报了一堆警告。后来我用Python脚本把时间戳重新插值了一遍才解决。

好了,这一章的内容就到这里。evo这个工具,说白了就是帮你省时间。你不需要重复造轮子,把精力放在算法本身就好。下一章我们会深入讲一个实际案例,看看怎么用evo分析一个完整的SLAM系统输出。


可可精品资料库