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米——后来发现是某个转弯处出现了跟丢。
-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的核心功能串起来了。你从中间开始看,核心工具下面分三个主要命令,每个命令负责不同的评估任务。数据格式在最下面一层,是支撑这些命令的基础。
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这个工具,说白了就是帮你省时间。你不需要重复造轮子,把精力放在算法本身就好。下一章我们会深入讲一个实际案例,看看怎么用evo分析一个完整的SLAM系统输出。