保姆级避坑指南:在Ubuntu 18.04 ROS Melodic上,用LeGO-LOAM跑通KITTI 00序列(附完整配置流程)
从零到一:Ubuntu 18.04 ROS Melodic环境下的LeGO-LOAM与KITTI实战全记录
第一次在Ubuntu 18.04上配置ROS Melodic运行LeGO-LOAM处理KITTI数据集时,我花了整整三天时间解决各种"玄学"问题。从catkin_make的诡异报错到rviz的突然卡死,从话题映射错误到evo评估时的巨大偏差,每一个坑都让我这个激光SLAM新手印象深刻。本文将详细记录整个配置流程中的关键步骤和解决方案,特别聚焦那些官方文档没有提及但实际会遇到的"坑"。
1. 环境准备:Ubuntu 18.04与ROS Melodic的完美搭配
1.1 系统基础配置
在开始之前,强烈建议使用物理机而非虚拟机安装Ubuntu 18.04。KITTI数据集00序列的rosbag文件大小超过10GB,加上处理过程中的临时文件,至少需要50GB的可用空间。如果必须使用虚拟机,请确保分配足够的资源:
- CPU:至少4核(建议8核)
- 内存:至少8GB(建议16GB)
- 磁盘空间:至少100GB(建议200GB)
# 检查系统资源 free -h # 查看内存 df -h # 查看磁盘空间 nproc # 查看CPU核心数1.2 ROS Melodic安装与配置
ROS Melodic是Ubuntu 18.04的官方支持版本,但安装过程中有几个关键点需要注意:
设置正确的软件源:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update完整安装ROS Melodic(包括rqt、rviz等工具):
sudo apt install ros-melodic-desktop-full初始化rosdep时常见的网络问题解决方案:
sudo rosdep init rosdep update --include-eol-distros
提示:如果rosdep update失败,可以尝试修改/etc/hosts文件,添加以下内容: 151.101.84.133 raw.githubusercontent.com
2. LeGO-LOAM源码编译:那些官方没告诉你的细节
2.1 依赖项安装
LeGO-LOAM依赖GTSAM 4.0.0-alpha2版本,直接从源码编译是最可靠的方式:
wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2.zip cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/ cd ~/Downloads/gtsam-4.0.0-alpha2/ mkdir build && cd build cmake .. make -j$(nproc) # 使用所有CPU核心加速编译 sudo make install2.2 源码编译的玄学问题
从GitHub克隆LeGO-LOAM源码后,编译时可能会遇到各种奇怪的问题:
cd ~/catkin_ws/src git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git cd .. catkin_make -j1 # 必须使用-j1参数,否则大概率编译失败为什么必须使用-j1?经过多次测试发现,LeGO-LOAM的某些组件在多线程编译时会出现竞态条件,导致编译失败。虽然这会显著增加编译时间(约30分钟),但能保证成功率。
2.3 运行时环境配置
每次运行LeGO-LOAM前都需要设置环境变量,可以通过以下方式简化:
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc3. KITTI数据集处理:从原始数据到可用rosbag
3.1 数据集获取与准备
KITTI数据集00序列包含4541帧激光雷达数据,可以从以下渠道获取:
- 官方渠道(需注册):http://www.cvlibs.net/datasets/kitti/
- 国内镜像(百度网盘):https://pan.baidu.com/s/1htFmXDE 密码:uu20
下载后目录结构应如下:
kitti_data_00/ ├── velodyne_points/ │ ├── data/ │ │ ├── 000000.bin │ │ ├── 000001.bin │ │ └── ... ├── calib.txt └── times.txt3.2 数据转换工具选择
将KITTI数据转换为rosbag有多种工具可选,经过实测推荐以下两种:
| 工具名称 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| kitti2bag | 简单易用 | 不支持IMU模拟 | 快速验证 |
| lidar2rosbag_KITTI | 功能全面 | 配置复杂 | 精确实验 |
这里重点介绍lidar2rosbag_KITTI的使用方法:
git clone https://github.com/AbangLZU/lidar2rosbag_KITTI.git cd lidar2rosbag_KITTI mkdir build && cd build cmake .. make ./lidar2rosbag -p /path/to/kitti_data_00 -o kitti_00.bag3.3 话题映射问题解决
LeGO-LOAM默认订阅的话题是/kitti/velo/pointcloud,而大多数转换工具生成的话题是/velodyne_points。解决方法有两种:
- 修改LeGO-LOAM源码中的话题名称(不推荐)
- 在播放rosbag时重映射话题:
rosbag play kitti_00.bag /velodyne_points:=/kitti/velo/pointcloud --clock4. 运行与评估:从启动到精度分析
4.1 启动LeGO-LOAM
在正确配置环境后,启动LeGO-LOAM:
roslaunch lego_loam run.launch常见问题及解决方案:
问题:rviz启动后无显示解决:检查
Map Cloud选项是否勾选,并确保话题映射正确问题:终端输出大量警告信息解决:这通常是正常的,只要没有
ERROR级别的日志即可继续
4.2 轨迹评估工具evo使用
安装evo工具:
pip install evo --upgrade --no-binary evo评估LeGO-LOAM输出的轨迹:
evo_traj kitti re_00.txt --ref=00.txt -p --plot_mode=xz --full_check典型评估指标解读:
| 指标 | 理想值 | 实际值 | 说明 |
|---|---|---|---|
| APE | <1.0 | ~2.5 | 绝对位姿误差 |
| RPE | <0.5 | ~1.2 | 相对位姿误差 |
| 轨迹长度 | 3724m | ~3700m | 总行驶距离 |
注意:由于KITTI数据集缺少IMU信息,LeGO-LOAM的精度会有所下降。这是正常现象,不代表配置有问题。
5. 进阶技巧与性能优化
5.1 参数调优建议
修改LeGO-LOAM/utility/utility.h中的以下参数可以提升性能:
// 原值 const int systemDelay = 3; const int imuQueLength = 200; // 建议值(针对KITTI数据集) const int systemDelay = 0; const int imuQueLength = 500;5.2 可视化优化
在rviz中添加以下显示项可以获得更好的可视化效果:
- 添加
PointCloud2显示类型,话题设为/laser_cloud_surround - 添加
Path显示类型,话题设为/aft_mapped_path - 调整
Global Options中的Fixed Frame为/camera_init
5.3 常见错误代码速查表
| 错误代码 | 可能原因 | 解决方案 |
|---|---|---|
| [mapOptmization-7] | 点云话题不匹配 | 检查话题映射 |
| [featureAssociation-5] | IMU数据缺失 | 添加--use_imu=false参数 |
| [transformFusion-4] | 时间同步问题 | 确保--clock参数正确使用 |
经过一周的反复测试和参数调整,最终在KITTI 00序列上获得了相对满意的结果。虽然由于数据集本身的限制,精度无法达到论文中的水平,但整个配置过程让我对激光SLAM系统有了更深入的理解。特别提醒后来者注意数据转换环节的话题映射问题,这是最容易出错的地方。
