保姆级教程:在Ubuntu 20.04上从零搞定Cartographer SLAM(附李想老师注释版源码)
保姆级教程:在Ubuntu 20.04上从零搞定Cartographer SLAM(附李想老师注释版源码)
当第一次接触Cartographer时,许多开发者都会被其复杂的依赖关系和配置步骤劝退。官方文档虽然全面,但缺乏针对初学者的细节指导,导致很多人在配置过程中频频踩坑。本文将带你从零开始,一步步完成Cartographer的安装、配置和运行,确保你能顺利复现整个流程。
1. 环境准备与依赖安装
在开始之前,确保你的系统是Ubuntu 20.04,这是目前最稳定的ROS Noetic支持版本。Cartographer对系统环境有严格要求,任何版本不匹配都可能导致编译失败。
首先更新系统软件包:
sudo apt update && sudo apt upgrade -y安装基础依赖工具链:
sudo apt install -y git cmake python3-wstool python3-rosdep ninja-build stowROS Noetic是Cartographer运行的基础环境,如果尚未安装,执行以下命令:
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 sudo apt install -y ros-noetic-desktop-full初始化ROS环境:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrcCartographer需要特定版本的protobuf库(3.0.0),安装时需特别注意:
sudo apt install -y libprotobuf-dev protobuf-compiler2. 获取李想老师注释版源码
官方Cartographer源码虽然功能完整,但缺乏详细注释,对初学者不够友好。李想老师的注释版源码对关键代码和配置做了详细解释,是学习Cartographer的绝佳资源。
创建工作空间目录:
mkdir -p ~/carto_ws/src cd ~/carto_ws/src克隆注释版源码仓库:
git clone https://github.com/xiangli0608/cartographer_detailed_comments_ws.git这个仓库包含以下关键组件:
- cartographer:核心SLAM算法实现
- cartographer_ros:ROS接口封装
- cartographer_rviz:可视化工具
- 示例配置和启动文件
3. 编译与配置
Cartographer的编译过程较为特殊,需要使用提供的专用脚本而非标准的catkin_make。
进入工作空间目录:
cd ~/carto_ws/cartographer_detailed_comments_ws执行编译脚本:
./catkin_make.sh编译过程可能需要较长时间(约30-60分钟,取决于机器性能),期间会输出大量信息。如果遇到错误,通常是依赖缺失导致,可以根据提示安装相应包。
编译完成后,需要设置环境变量。编辑~/.bashrc文件:
vim ~/.bashrc在文件末尾添加(路径根据实际安装位置调整):
source ~/carto_ws/cartographer_detailed_comments_ws/install_isolated/setup.bash小技巧:在vim中,按G可直接跳转到文件末尾,i进入插入模式,添加内容后按ESC退出插入模式,输入:wq保存退出。
验证环境配置是否正确:
rospack profile4. 运行2D建图
Cartographer最常用的功能是2D建图,下面介绍如何使用公开数据集进行测试。
创建数据存储目录:
mkdir -p ~/bagfiles将下载的bag文件放入该目录。常用的测试数据集包括:
- 2D建图:
b3-2016-04-05-13-54-42.bag - 3D建图:
cartographer_paper_deutsches_museum.bag
启动2D建图节点:
roslaunch cartographer_ros lx_rs16_2d_outdoor.launch在新终端中播放bag文件:
rosbag play -r 1 ~/bagfiles/your_2d_bag.bag建图过程中可以通过RVIZ观察实时结果。Cartographer提供两种可视化方式:
- Submaps:原始子图显示
- Map:整合后的全局地图
查看地图话题信息:
rostopic info /map5. 地图保存与后处理
建图完成后,需要将结果保存以供后续使用。Cartographer提供多种保存方式:
方法一:使用map_server保存为PGM格式
rosrun map_server map_saver -f ~/map方法二:使用项目提供的脚本(推荐)
./finish_slam_2d.sh该脚本会生成.pgm(地图图像)和.yaml(地图配置)文件,默认保存在用户主目录下。如需修改保存路径,可编辑脚本文件。
6. 高级配置与调优
Cartographer的性能很大程度上取决于配置文件(.lua)的参数设置。以下是关键参数说明:
options = { map_frame = "map", -- 地图坐标系名称 tracking_frame = "imu_link", -- 传感器数据基准坐标系 published_frame = "odom", -- 发布的TF最下层坐标系 provide_odom_frame = false, -- 是否提供odom坐标系 use_odometry = false, -- 是否使用里程计数据 num_laser_scans = 0, -- 单线激光雷达数量 num_point_clouds = 1, -- 点云数据源数量 } TRAJECTORY_BUILDER_2D = { use_imu_data = true, -- 是否使用IMU数据 min_z = 0.1, -- 点云数据的最低有效高度 }常见问题排查:
- TF树不完整:检查
tracking_frame和published_frame设置 - 点云显示异常:调整
min_z值过滤无效数据 - 建图漂移:启用
use_odometry或优化IMU配置
7. 3D建图与点云处理
对于需要三维场景重建的应用,Cartographer同样提供强大的3D建图能力。
启动3D建图节点:
roslaunch cartographer_ros lx_rs16_3d.launch播放3D数据集:
rosbag play -r 1 ~/bagfiles/your_3d_bag.bag保存3D地图:
./finish_slam_3d.sh生成的.pcd文件可以用PCL工具查看:
pcl_viewer your_map.pcd操作提示:
- 按
4键启用高度着色模式 - 鼠标滚轮控制缩放,左键旋转视角
- 右键平移视图
8. 实际应用技巧
在真实项目中部署Cartographer时,以下几点经验值得注意:
- 传感器校准:IMU和激光雷达的精确标定对建图质量至关重要
- 参数调优:根据环境特点调整
submap大小和扫描匹配参数 - 计算资源:3D建图需要较强的GPU支持
- 实时性优化:适当降低
pose_publish_period_sec提高响应速度
对于长期运行的SLAM系统,建议:
- 定期保存中间状态(
.pbstream) - 使用
assets_writer生成轻量级地图 - 建立完善的参数配置文件管理体系
