1. 项目概述:为什么我们需要evo?
在机器人、自动驾驶和SLAM(即时定位与地图构建)领域,评估算法的性能是研发过程中至关重要的一环。我们常常需要回答这些问题:我新写的视觉里程计算法,其轨迹精度到底如何?与开源方案相比,我的改进带来了多少提升?不同参数配置下,算法的稳定性有多大差异?
如果你还在用肉眼对比两条轨迹的曲线,或者手动计算均方根误差,那效率就太低了,而且不精确。这时,一个专业、高效的工具就显得尤为重要。evo就是为此而生的。它是一个用于评估、可视化和处理SLAM轨迹数据的Python工具包,支持多种数据格式(如TUM、KITTI、EuRoC等),能一键生成精度对比图、误差统计表,是算法工程师和研究者手中的“瑞士军刀”。
然而,对于刚接触Ubuntu或Python生态的新手来说,在Ubuntu 20.04上安装evo可能会遇到一系列依赖问题、版本冲突,甚至因为网络环境导致安装失败。网上的教程质量参差不齐,很多步骤已经过时。这篇教程将基于我多次在纯净Ubuntu 20.04系统上部署的经验,提供一个详细、完整、且亲测有效的安装指南。我会带你绕过所有常见的“坑”,从系统准备到最终验证,确保你能一次成功。
2. 环境准备与依赖梳理
在动手安装之前,充分的准备工作能避免后续绝大多数问题。Ubuntu 20.04是一个长期支持版本,其默认的软件源和Python环境比较稳定,但这也意味着一些较新的库可能需要我们手动处理。
2.1 系统更新与基础工具安装
首先,确保你的系统是最新的。打开终端(Ctrl+Alt+T),执行以下命令:
sudo apt update sudo apt upgrade -y这个操作会更新软件包列表并升级所有可升级的软件包。虽然耗时,但能确保系统底层库的兼容性,减少因版本过旧导致的诡异错误。
接着,安装一些编译和开发必备的工具链:
sudo apt install -y build-essential cmake git wget curlbuild-essential:包含了GCC、G++、make等核心编译工具,是编译任何C/C++扩展的基石。cmake:一个跨平台的安装(编译)工具,很多Python包的底层C++扩展(如后面会用到的pangolin)依赖它来构建。git:用于从GitHub克隆evo的源代码。wget和curl:常用的网络下载工具。
注意:即使你确信系统里已有部分工具,也建议执行此命令。它能确保所有工具都安装到位,并且是最新版本,避免因缺失某个子组件而导致的编译失败。
2.2 Python环境配置:pip与虚拟环境
Ubuntu 20.04默认安装了Python 3.8。evo主要支持Python 3.6+,所以默认版本完全够用。我们的首要任务是安装并升级Python的包管理工具pip。
sudo apt install -y python3-pip python3 -m pip install --upgrade pip这里使用python3 -m pip而不是直接使用pip命令,是为了明确指定使用Python 3的pip,防止与可能存在的Python 2的pip混淆。
强烈建议使用虚拟环境。虚拟环境能为每个项目创建独立的Python运行环境,避免包之间的版本冲突。例如,项目A需要numpy 1.19,而项目B需要numpy 1.24,全局安装只能满足一个,虚拟环境则可以完美解决。
安装虚拟环境工具并创建专属环境:
sudo apt install -y python3-venv cd ~ # 切换到你的家目录,你也可以在其他路径创建 python3 -m venv evo_env # 创建一个名为evo_env的虚拟环境激活虚拟环境:
source ~/evo_env/bin/activate激活后,你的命令行提示符前通常会显示(evo_env),表示你已经在这个独立环境中了。后续所有pip install操作都只影响这个环境,不会干扰系统全局的Python包。
3. 核心依赖项的安装与避坑指南
evo的安装并非简单地pip install evo,因为它依赖一些包含C++代码的图形库,这些库需要通过系统包管理器apt先行安装,或者从源码编译。
3.1 系统级依赖安装
这些是evo运行和绘图所必需的后端库。
sudo apt install -y libeigen3-dev libboost-all-devlibeigen3-dev:一个高层次的C++模板库,用于线性代数、矩阵和向量运算。它是许多SLAM算法和evo内部计算的数学基础。libboost-all-dev:Boost库的完整开发文件。Boost提供了大量C++通用库,evo可能在其底层数据处理或文件IO中使用了Boost的某些组件(如文件系统、序列化等)。
接下来是可视化依赖,这是最容易出问题的部分。evo使用matplotlib进行绘图,而matplotlib需要一个功能性的后端。在无图形界面的服务器(如云服务器)上,需要安装虚拟显示后端;在有桌面的环境下,也需要确保相关图形库存在。
对于有桌面环境的Ubuntu 20.04:
sudo apt install -y python3-tkpython3-tk是matplotlib常用的GUI后端之一,安装后可以正常弹出绘图窗口。
3.2 Pangolin的源码编译安装
pangolin是一个轻量级的OpenGL显示/交互库,被许多SLAM项目(如ORB-SLAM, VINS-Mono)用于3D轨迹和点云的可视化。evo的可视化功能部分依赖于它。虽然pip可以安装一个纯Python版本的pangolin(pip install pangolin),但那个版本功能不全,无法支持evo的3D可视化。我们必须从源码编译安装。
安装Pangolin的依赖:
sudo apt install -y libgl1-mesa-dev libglew-dev libwayland-dev libxkbcommon-dev wayland-protocols libegl1-mesa-dev libpng-dev libjpeg-dev这些包涵盖了OpenGL驱动(
libgl1-mesa-dev)、OpenGL扩展库(libglew-dev)、Wayland/X11显示协议支持以及图像编解码库。缺一不可。克隆并编译Pangolin:
cd ~ git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build && cd build cmake .. cmake --build . -j$(nproc) # -j$(nproc) 表示使用所有CPU核心并行编译,加快速度 sudo cmake --install .cmake ..会检查所有依赖并生成编译配置。如果这一步报错,通常是上一步的某个依赖没装好,请根据错误信息回溯。sudo cmake --install .会将编译好的库文件和头文件安装到系统目录(如/usr/local/lib和/usr/local/include)。验证Pangolin安装: 安装完成后,系统需要刷新动态链接库的缓存:
sudo ldconfig你可以通过查找库文件来验证:
ldconfig -p | grep pangolin如果能看到
libpangolin.so的相关信息,说明安装成功。
实操心得:编译Pangolin时,如果网络不好导致
git clone缓慢,可以尝试使用镜像源,或者先下载源码zip包。另外,确保你的cmake版本不要太旧(Ubuntu 20.04默认的3.16+即可)。编译过程如果卡住,可以去掉-j$(nproc)参数单线程编译,便于观察错误。
4. 安装evo及其Python依赖
核心系统依赖搞定后,安装evo本身反而相对简单。但要注意安装渠道和版本。
4.1 通过pip安装evo
确保你已经在之前创建的虚拟环境evo_env中(命令行提示符前有(evo_env))。然后使用pip从PyPI(Python官方包索引)安装:
pip install evo --upgrade--upgrade参数确保安装的是最新版本。pip会自动解析并安装evo的所有Python依赖,包括:
numpy:数值计算核心。matplotlib:绘图库。scipy:科学计算工具,用于一些高级统计分析。pandas:数据分析库,用于处理表格数据。seaborn:基于matplotlib的统计图表库,让默认图表更美观。pyyaml:用于读写YAML配置文件。tqdm:在命令行中显示进度条。
这个过程会自动进行,通常比较顺利。
4.2 验证基础安装
安装完成后,进行一个快速验证:
python -c "import evo; print(evo.__version__)"或者直接运行evo的命令行工具:
evo -h如果能看到evo的版本号和帮助信息,恭喜你,核心Python包安装成功了。
5. 进阶功能支持与完整测试
基础的evo命令(如evo_ape,evo_rpe,evo_traj)现在应该可以工作了。但要发挥其全部威力,特别是对更多数据格式的支持和3D可视化,还需要一些额外步骤。
5.1 安装附加格式支持
evo默认支持TUM、KITTI、EuRoC等格式。但如果你想处理ROS中常用的bag文件,需要安装ROS相关的插件。由于ROS本身是一个庞大的系统,这里提供两种方案:
方案A:你已安装ROS(推荐给ROS用户)如果你已经在Ubuntu 20.04上安装了ROS Noetic,那么可以直接安装evo的ROS扩展:
pip install evo --upgrade --no-binary evo--no-binary evo强制从源码编译安装,这会触发对rospkg等ROS依赖的配置检查,从而启用ROS bag支持。
方案B:仅需读取bag文件(轻量级方案)如果你没有安装完整的ROS,只想读取bag文件,可以安装一个精简的替代方案:
pip install rosbags安装后,evo可以通过rosbags库来读取.bag文件,无需完整ROS环境。使用时,evo会自动尝试调用这个库。
5.2 完整的端到端测试
理论说得再多,不如实际跑一遍。我们用一个最简单的例子,测试evo从数据评估到可视化的全流程。
下载示例数据: evo的GitHub仓库提供了示例数据。我们直接下载:
cd ~ wget https://raw.githubusercontent.com/MichaelGrupp/evo/master/test/data/freiburg1_xyz-rgb_traj.txt wget https://raw.githubusercontent.com/MichaelGrupp/evo/master/test/data/freiburg1_xyz-rgb_groundtruth.txt这下载了两个轨迹文件:一个估计轨迹,一个真实轨迹(ground truth)。
运行轨迹评估: 使用绝对位姿误差(APE)来评估估计轨迹与真实轨迹的差异:
evo_ape tum freiburg1_xyz-rgb_groundtruth.txt freiburg1_xyz-rgb_traj.txt -va --plottum:指定轨迹文件格式为TUM。-va:详细输出并对齐(Align)轨迹。--plot:自动弹出结果图表。
命令行会输出详细的误差统计,包括RMSE(均方根误差)、均值、中位数等。同时,一个matplotlib窗口会打开,显示轨迹对比和误差分布图。
测试3D可视化: 使用
evo_traj命令进行3D可视化:evo_traj tum freiburg1_xyz-rgb_traj.txt --ref=freiburg1_xyz-rgb_groundtruth.txt -p --plot_mode=xyz--ref:指定参考轨迹。-p:开启绘图。--plot_mode=xyz:进行3D绘图。
如果Pangolin安装成功且环境配置正确,这个命令会尝试打开一个3D交互窗口,你可以用鼠标拖动旋转视角查看轨迹。如果系统没有图形界面,或者Pangolin有问题,它会回退到2D的matplotlib绘图。
6. 常见问题与排查技巧实录
即使按照教程一步步来,也可能因为系统差异遇到问题。这里汇总了我踩过的坑和解决方案。
6.1 安装阶段问题
问题1:pip install evo时报错,提示“Failed building wheel for evo”或与“pangolin”相关。
- 原因:这通常是因为pip尝试从源码构建evo的某些组件,但找不到Pangolin。
- 解决:首先,确保你已经按照第3.2节从源码编译并安装了Pangolin,并执行了
sudo ldconfig。然后,尝试使用--no-binary选项重新安装evo,强制它链接到系统已安装的Pangolin:
如果还不行,可以临时设置环境变量告知编译器Pangolin的位置(假设安装在pip install evo --upgrade --no-binary evo/usr/local):
然后再运行pip安装命令。export CPATH=/usr/local/include:$CPATH export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
问题2:import evo时出现ModuleNotFoundError: No module named 'tkinter'
- 原因:
matplotlib默认使用了需要tkinter的后端,但Python的tkinter包未安装。 - 解决:安装
python3-tk包即可。sudo apt install -y python3-tk
问题3:在无图形界面的服务器(如云服务器)上,evo绘图报错。
- 原因:没有可用的显示设备。
- 解决:安装虚拟显示后端,并使用Agg这样的非交互式后端。
- 安装
xvfb:sudo apt install -y xvfb - 在运行任何evo绘图命令前,先启动一个虚拟X服务器:
Xvfb :99 -screen 0 1024x768x24 & export DISPLAY=:99 - 告诉matplotlib使用Agg后端(不弹出窗口,只保存文件): 你可以修改matplotlib的配置文件,或者在Python脚本/命令行中指定:
使用evo_ape tum groundtruth.txt estimate.txt -va --plot --save_plot ./plot.png--save_plot参数将图保存为文件,而不是显示。
- 安装
6.2 运行阶段问题
问题4:运行evo_traj进行3D绘图时,窗口一闪而过或根本打不开。
- 原因:Pangolin的OpenGL环境可能有问题,或者系统缺少某些GL驱动。
- 排查:
- 先测试一个简单的Pangolin示例程序(如果编译Pangolin时保留了
examples):
如果这个例子能正常运行出一个旋转的立方体,说明Pangolin本身是好的。cd ~/Pangolin/build/examples/HelloPangolin ./HelloPangolin - 如果例子也失败,可能是显卡驱动问题。尝试安装Mesa的通用OpenGL驱动:
运行sudo apt install -y mesa-utils libglu1-mesa-devglxinfo | grep "OpenGL version"检查OpenGL版本。
- 先测试一个简单的Pangolin示例程序(如果编译Pangolin时保留了
- 临时方案:如果3D可视化不是必须的,可以强制evo使用2D绘图。几乎所有evo命令都支持
--plot_mode xy(2D俯视图)或直接使用-p(默认2D)。
问题5:评估结果中RMSE误差极大,或者轨迹看起来完全没对齐。
- 原因:最常见的原因是轨迹的时间戳没有对齐,或者坐标系不一致(例如,z轴朝上 vs. y轴朝上)。
- 解决:
- 检查时间戳:使用
evo_traj先可视化看一下两条轨迹:
如果它们起点相差十万八千里,说明需要时间对齐。在evo_traj tum traj1.txt traj2.txt -pevo_ape或evo_rpe命令中,-a或--align参数会进行基于SE(3)的轨迹对齐(旋转和平移),而-s或--correct_scale会校正尺度(对于单目SLAM估计的轨迹很有用)。组合使用-as是常见做法。 - 检查坐标系:确认你的轨迹文件格式符合evo的要求。例如TUM格式是“时间 tx ty tz qx qy qz qw”。确保没有把位置和四元数的顺序搞错。可以查看evo官网的格式说明。
- 检查时间戳:使用
6.3 性能与使用技巧
技巧1:处理大型轨迹文件时加速默认的绘图和计算对于几万点的轨迹可能较慢。你可以使用--delta参数对轨迹进行下采样:
evo_ape kitti groundtruth.txt estimate.txt -va --plot --delta 100--delta 100表示每隔100个点取一个点进行计算和绘图,能显著提升速度。
技巧2:生成出版级质量的图片evo的默认绘图样式比较简洁。你可以通过--plot_colormap、--plot_linewidth等参数调整样式,或者使用--save_plot保存为SVG或PDF矢量图,方便在论文中插入。
evo_ape tum groundtruth.txt estimate.txt -va --plot --save_plot comparison.pdf --plot_mode xz --verbose --no_warnings技巧3:批量处理多个实验如果你有多次实验的轨迹需要比较,可以写一个简单的Shell脚本或Python脚本,循环调用evo命令,并自动将结果(RMSE等)汇总到一个CSV文件中,便于后续分析。
安装和配置evo的过程,本质上是对一个Python科学计算生态和特定领域工具链的熟悉过程。一旦成功部署,它将成为你算法开发迭代中不可或缺的效率工具。希望这篇详尽的指南能帮你扫清障碍,把时间花在更有价值的算法研究和优化上。如果在操作中遇到本教程未覆盖的新问题,不妨去evo的GitHub仓库的Issues页面搜索一下,很可能已经有解决方案了。