ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kimera SLAM 实战:Ubuntu 18.04 + ROS Melodic 安装与 EuRoC 数据集运行指南

Kimera SLAM 实战:Ubuntu 18.04 + ROS Melodic 安装与 EuRoC 数据集运行指南 如果你在 Ubuntu 18.04 上折腾过视觉 SLAM多半经历过“装环境一小时跑通半小时调 bug 一整天”的连环折磨。Kimera SLAM 是我试过的少数能把 VIO、鲁棒位姿图优化、稠密网格重建和语义解析打包到一起而且真正能跑出完整地图的开源框架之一。这篇文章我从实际部署角度把 Ubuntu 18.04 ROS Melodic 环境下安装 Kimera SLAM、编译、跑 EuRoC 数据集 demo 的完整过程拆开讲一遍包括我踩过的一些坑和最后的排查清单。适合已经熟悉 ROS 基础操作、想快速上手一个现代视觉惯性 SLAM 系统的同学。1. Kimera-SLAM 到底解决了什么问题为什么值得装1.1 它不是一个普通的里程计很多人第一次看到 Kimera-SLAM 这个名字会以为它只是又一个 VIO 算法。实际上它是一个模块化程度很高的完整 SLAM 框架MIT SPARK 实验室开源核心价值在于把“前端视觉惯性里程计”和“后端鲁棒位姿图优化”拆成独立模块同时还能输出带语义标签的 3D 网格地图。整个架构里最核心的几个包分别是模块主要作用核心依赖Kimera-VIO-ROS视觉惯性里程计前端融合双目/单目和 IMU 估计位姿OpenCV、gflags、glog、protobufKimera-RPGO-ROS鲁棒位姿图优化自动剔除错误回环GTSAM、EigenKimera-Mesher实时生成三角网格地图PCL、OpenCVKimera-Semantics把语义分割标签融合到网格地图中CUDA、分割网络模型可选为什么这类架构重要因为传统 VIO 只能给你一条轨迹和稀疏特征点做路径规划、人机交互、语义理解都不够用。Kimera 的设计思路是前端负责“稳”后端负责“准”网格和语义负责“看得懂”。在真实机器人和自动驾驶感知场景里这种模块化设计最大的优势是你可以只替换其中某一块比如把 VIO 换成你自己的里程计后端和语义部分原样保留不需要推倒重来。1.2 为什么选 Ubuntu 18.04 ROS Melodic 做测试平台虽然 ROS 现在已经有了更新版本Ubuntu 18.04 也早已不是最新系统但它在机器人社区的地位非常特殊ROS Melodic 是官方长期支持版本中生命周期最完整的一个第三方库的兼容性踩坑资料最多很多高校实验室和工业项目到现在还在用它。Kimera 的官方文档和大多数 CI 配置也都以 Melodic 为主所以用这个组合跑 demo 是最稳的。从硬件角度说Kimera-SLAM 本身对 CPU 要求不算变态我实测 4 核 8 线程的笔记本也能跑 EuRoC 数据集但如果要跑语义重建最好有一块 NVIDIA GPU。另外内存建议 16GB 起步编译阶段和运行阶段占用都不低8GB 机器容易卡到怀疑人生。2. 安装之前的准备环境、依赖、仓库2.1 基础依赖安装清单安装的第一步是把系统依赖补齐。不要跳过这一步Kimera 的编译链里既有 C 科学计算库也有 ROS 消息生成依赖缺一个都能让你在 build 阶段卡很久。先安装 ROS Melodic 桌面完整版然后安装一些常用工具sudo apt update sudo apt install -y ros-melodic-desktop-full sudo apt install -y python-rosdep python-rosinstall python-catkin-tools sudo rosdep init rosdep update如果你已经装过 ROS可以跳过这一步。紧接着是 Kimera 依赖的第三方库sudo apt install -y cmake libgoogle-glog-dev libgflags-dev libeigen3-dev \ libsuitesparse-dev libboost-all-dev libprotobuf-dev protobuf-compiler \ libyaml-cpp-dev libopencv-dev libpcl-dev逐个解释一下这些库的作用glog 和 gflags 是 Kimera-VIO 的日志和参数解析库Eigen 是矩阵运算核心suitesparse 提供稀疏线性代数支持GTSAM 的构建也会用到它。protobuf 是 Kimera-RPGO 进行消息序列化时需要的OpenCV 和 PCL 则分别负责图像特征提取与点云网格处理。yaml-cpp 是用来读取相机标定参数文件的很多人漏掉它。这里的核心逻辑是先把系统级依赖装正确再进 workspace 层面否则后面报错你分不清是源码问题还是环境问题。2.2 GTSAM 的源码安装细节Kimera-RPGO 的鲁棒位姿图优化部分依赖 GTSAM这是一个因子图优化库。Ubuntu 18.04 的 apt 源里虽然有 GTSAM但版本比较旧而且不一定带 Kimera 需要的 unstable 模块所以官方推荐源码安装。我个人的习惯是在 catkin_ws/src 目录下单独克隆 GTSAM这样它和 Kimera 源码放在同一个源码树里后续 catkin build 时能找到头文件cd ~/catkin_ws/src git clone https://github.com/borglab/gtsam.git cd gtsam git checkout 4.0.2 mkdir build cd build cmake -DGTSAM_BUILD_UNSTABLEON -DGTSAM_WITH_TBBOFF -DGTSAM_USE_SYSTEM_EIGENON .. make -j$(nproc) sudo make install这里有两个细节值得说明。一是-DGTSAM_BUILD_UNSTABLEON因为 Kimera-RPGO 会用到 GTSAM 的 unstable 模块比如一些自定义鲁棒代价函数不开启这个选项你会在链接阶段遇到 undefined reference 错误。二是-DGTSAM_WITH_TBBOFFTBB 是 Intel 的线程构建块开了之后在某些老版本上会和 OpenMP 冲突导致运行时崩溃关掉更稳。如果你编译 GTSAM 时系统提示找不到 Boost 或者 Eigen回头检查上一节的基础依赖是不是装全了这种情况基本都是libboost-all-dev和libeigen3-dev没装。2.3 克隆 Kimera-SLAM 及子模块Kimera-SLAM 不是一个单独的仓库它是一组子模块的集合。官方仓库拉下来之后如果你不小心漏掉了子模块更新编译时会发现很多目录是空的然后报一堆找不到头文件的错误。我的建议是直接递归克隆cd ~/catkin_ws/src git clone --recursive https://github.com/MIT-SPARK/Kimera-SLAM.git如果你已经用了普通方式克隆也可以用下面两条命令补救cd Kimera-SLAM git submodule update --init --recursive子模块包含 Kimera-VIO-ROS、Kimera-RPGO、Kimera-Semantics、Kimera-Mesher、kimera_msgs 等下载量不小网络不好的时候容易中断。我的经验是不要并行拉取中断后重新执行git submodule update --init --recursive即可它会断点续传。这里再提醒一句如果打算跑语义重建先确认子模块里有没有 Kimera-Semantics 相关目录有的机器会因为子模块拉取失败而静默缺失这种问题隐蔽性很强。3. 用 catkin 构建与编译常见坑3.1 工作空间组织强烈建议所有源码都放在同一个 catkin workspace 里而不是把 GTSAM 装到系统目录后就撒手不管。原因很简单后续调试时如果你改了某个包只需要catkin build指定包名即可增量编译省时间。单独把 GTSAM 装到/usr/local也能用但一旦遇到版本冲突排查成本成倍上升。我习惯的工作区结构如下mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin init然后开始构建。这里要注意一个关键选择用catkin_make还是catkin build。我更推荐catkin build因为它默认按包依赖关系并行构建且编译输出目录更干净不会像 catkin_make 那样把所有 CMake 文件混在一起。Kimera 的多个模块之间依赖关系比较重catkin build的隔离性会让你在出问题时更容易定位。3.2 实际编译命令在~/catkin_ws目录下执行catkin build首次构建的时间取决于你的 CPU 性能我这边 8 核机器大概 10 到 15 分钟。构建过程中能明显看到 Kimera-VIO、Kimera-RPGO、Kimera-Mesher 等包依次编译。如果构建过程中某个包报错不要整个 workspace 重新编译而是针对性处理。比如 RPGO 编译过期了就单独执行catkin build kimera_rpgo_ros这样可以节省大量时间。3.3 编译阶段常见报错编译阶段遇到最多的几个问题我整理成表格方便对照处理报错信息可能原因解决方法Could not find a package configuration file provided by gtsamGTSAM 没有安装或安装路径不对回到 2.2 节重新安装确认/usr/local/lib/cmake/GTSAM存在fatal error: opencv2/xfeatures2d.hpp: No such file or directoryOpenCV contrib 模块缺失优先使用系统自带的 libopencv-dev不要自己编译高版本 OpenCVundefined reference to gtsam::...GTSAM 版本过高或过低切换到官方推荐的 4.0.2 版本Eigen alignment errorsEigen 版本与编译选项不匹配使用-DGTSAM_USE_SYSTEM_EIGENON并确保没有混用不同编译标准我自己遇到过最坑的一次是 protobuf 版本冲突。Ubuntu 18.04 系统自带 protobuf 3.0.0但如果你的 ROS 环境里安装了某个包自动升级了 protobufRPGO 编译时就会出现 API 不匹配的问题。我的处理方法是干脆把libprotobuf-dev protobuf-compiler重新装回默认版本然后彻底清理 build 目录重新编译。4. Demo 流程用 EuRoC 数据集跑通全部流程4.1 下载 EuRoC bagKimera 官方推荐使用 EuRoC MAV 数据集这是一个在室内无人机上采集的双目 IMU 数据集有 ground truth非常适合评估 VIO 精度。我们只需要下载其中的 bag 文件不需要原始图像序列。推荐用 MH_01_easy轨迹简单光线变化不大对第一次跑通流程很友好。下载链接可以从 EuRoC 数据集官网找也可以直接在终端用 wget 拉取mkdir -p ~/bagfiles cd ~/bagfiles wget http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_01_easy/MH_01_easy.bag文件大小大概 1GB 左右下载速度取决于你的网络。如果网速不理想可以先用小的 V1_01_easy大小不到 400MB轨迹也短适合快速验证。4.2 启动 Kimera-SLAM先把 workspace 环境加载进来然后启动核心节点source ~/catkin_ws/devel/setup.bash roslaunch kimera_slam kimera_slam.launch这个 launch 文件会启动 VIO 前端、RPGO 后端、mesher 网格生成节点并且会等待图像和 IMU 输入。如果一切正常终端里会看到类似Waiting for IMU and stereo images...的日志。有些版本还带了视觉话题配置默认参数对应 EuRoC 数据集的 topic 名称/cam0/image_raw、/cam1/image_raw、/imu0。如果你下载的是其他数据集需要自己调整 topic remap。此时最好再开一个终端输入rqt_graph看一下节点话题连接是否正常。如果 Kimera 节点已经启动但没有订阅到任何话题多半是 launch 里的相机参数与 bag 中的 topic 名不一致。4.3 播放 bag 并验证输出核心节点启动正常后另开一个终端播放 bagcd ~/bagfiles rosbag play MH_01_easy.bag播放一开始你会在 kimera_slam 的终端里看到配合时间戳持续的图像和 IMU 数据流。此时再开一个 rvizsource ~/catkin_ws/devel/setup.bash rviz在 rviz 里手动添加以下几个关键话题这是我自己调试时验证系统是否真正在工作的核心方法话题类型看什么/kimera_slam/vio/odometrynav_msgs/Odometry位姿轨迹是否连续平滑/kimera_slam/pose_graphvisualization_msgs/MarkerArray回环检测和位姿图是否更新/kimera_slam/left/rgbsensor_msgs/Image当前左目相机画面/kimera_slam/meshshape_msgs/Mesh稠密网格是否实时生成/kimera_slam/vio/featuressensor_msgs/PointCloud特征点跟踪情况如果看到位姿轨迹沿着 EuRoC 数据集的室内环境走了一圈且网格地图逐渐成型说明整个系统已经跑通。这里有个非常重要的经验EuRoC 的 bag 播放速度默认是 1 倍速但实际速度会受到机器性能影响。如果发现网格生成慢或者 rviz 卡顿可以用rosbag play --rate 0.5 MH_01_easy.bag调慢播放速度这在前期验证时比提高帧率更有用。4.4 如何判断 Demo 是否真正成功很多人看到 rviz 里有图像输出就以为成功了其实不然。判断 Kimera-SLAM 是否真正跑出质量我有几个实在标准轨迹连续/kimera_slam/vio/odometry的频率稳定在 10Hz 以上且没有反复跳变。回环明显改善运行到 MH_01 较后期pose_graph的 markers 会突然与已有轨迹重合这时后端优化的效果直接可见。网格无断裂/kimera_slam/mesh中的三角网格在地面、墙壁等平面区域应该连续而不是大片空洞。内存占用量可控mesh 生成会耗费内存但不应出现内存持续飙升到接近上限的情况。如果以上满足恭喜你已经跑通了标准 demo。下一步可以尝试不同序列比如 MH_03_medium 或 V2_02_difficult验证系统在更大场景和更剧烈运动下的表现。5. 进阶玩法语义重建与地图输出5.1 语义重建模块的启动思路Kimera-SLAM 真正让我觉得“值回票价”的是 Kimera-Semantics 语义模块。它会在普通稠密网格的基础上把语义分割结果融合进去最终输出一个带标签的语义地图。实际演示中墙壁、地面、物体都能用不同颜色标识出来。但这里我要先泼一盆冷水语义模块的依赖比核心模块重很多它往往需要运行一个分割网络来给图像打标签GPU 几乎是必需品而且不同分支的数据集格式差异很大。我在部署时发现官方 README 里提到的语义 demo 命令在不同版本之间存在差异所以更稳妥的做法是先把核心 demo 跑通再把语义模块作为单独项目来调试。大致流程是先运行 Kimera-SLAM 核心节点保证位姿和网格输出正常再运行一个语义分割节点将分割后的话题输入给 Kimera-Semantics 进行融合。具体 topic 名称需要依据你使用的分割节点版本进行配置不要照搬网上教程的固定名称。如果你只是想要一个带颜色标注的地图用于演示一个折中方案是直接从/kimera_slam/mesh话题提取几何网格再离线用 Meshlab 或 Blender 叠加语义标签这比在线融合简单很多。5.2 地图保存与后处理运行完 demo 之后很多人的需求是把地图留下来。Kimera 没有提供一个一键保存整个地图的服务但有一个实用技巧直接用rosbag record把 mesh 话题录下来后续离线处理。rosbag record -O kimera_mesh.bag /kimera_slam/mesh录包的好处是不会影响在线运行性能而且可以反复回放调试。后期如果你想把 mesh 转为点云可以使用 PCL 工具也可以把 bag 中的 shape_msgs/Mesh 转成 PLY 文件再导入 Meshlab 查看。我个人的习惯是先录包再做后处理不要在运行现场开一堆保存程序否则容易打断 SLAM 的实时性。6. 常见问题排查速查6.1 编译阶段问题现象处理思路某个 Kimera 包报catkin build到一半死掉先用catkin build 包名单独编看报错是否稳定复现gtsam找不到重装 GTSAM 并确认 CMake 路径OpenCV 版本报错优先使用系统 OpenCV 3.2不要手动换成 4.xprotobuf 冲突重装系统默认 protobuf并执行catkin clean后重新编译子模块目录为空git submodule update --init --recursive重新拉取编译失败时很多人第一反应是去网上找所谓魔法参数我的建议是先把报错日志完整读一遍八成问题都写在日志里。如果日志里出现“undefined reference”基本都是依赖库没有正确链接如果出现“No such file or directory”基本都是头文件路径没包含进来。6.2 运行阶段问题现象处理思路启动后一直等 IMU 和图像数据确认 bag 已开始播放用rostopic list查看话题是否发布位姿轨迹跳变严重调慢 bag 播放速率检查相机参数和 IMU 参数是否匹配rviz 不显示网格确认/kimera_slam/mesh话题有数据必要时手动指定 fixed frame内存占满关闭其他应用降低 bag 播放速度或者关闭语义模块运行阶段最诡异的问题往往是时间同步。SLAM 系统对图像和 IMU 时间戳非常敏感如果 bag 播放时没有正确使用自带时间会导致整个系统认为传感器数据没有同步。此时可以在启动前加上rosparam set use_sim_time true并且在 rviz 里把 fixed frame 设置为world或odom很多诡异的视觉问题都会消失。另外一个很容易忽略的点是CPU 降频。笔记本在电池模式下性能会明显下降导致 bag 播放时数据积压SLAM 节点始终处理不过来。我用笔记本测试时都会插电运行同时关闭后台浏览器等吃 CPU 的应用。6.3 数据集与 Topic 匹配问题EuRoC 原生 bag 的话题是/imu0、/cam0/image_raw、/cam1/image_raw。如果你用其他数据集比如 TUM-VI 或者自采数据话题名称肯定不一样。最简单的方式是使用rosbag play的 remap 参数rosbag play --topic /imu/data /imu0 your.bagKimera 默认 launch 里的参数文件和话题名是对应 EuRoC 的我实际测试中见过最多的问题就是大家拿 KITTI 数据集去跑默认配置然后报 IMU 数据不存在。KITTI 本身没有 IMU 话题Kimera-VIO 是视觉惯性里程计没有 IMU 信息自然跑不起来。这个坑看一遍文档就能避免但每年都能看到有人踩进去。我自己折腾 Kimera 的过程中最有感触的一点是这类现代视觉 SLAM 框架算法本身经过大量验证出问题的地方几乎都在环境和数据上。子模块没拉全、GTSAM 版本不匹配、bag 话题名对不上这三件事占了九成以上的调试时间。建议你安装时严格按章节顺序来不要跳步跑 demo 时也先把 MH_01 这种简单序列跑顺再尝试复杂场景。最后再分享一个我实操中摸索出来的小技巧如果你编译完成后想快速验证整个链路是否打通可以先不播放整个 bag只播放前 30 秒数据rosbag play MH_01_easy.bag --start 10 --duration 30 --rate 0.5这样消耗的时间短内存占用低出现问题也能快速定位。等确认前端 VIO 和后端 RPGO 都有输出后再去跑完整的数据集体验会顺滑很多。希望这篇文章能帮你少走点弯路。
返回列表