1. 环境准备与依赖安装
在Ubuntu 20.04上安装Cartographer ROS之前,我们需要先准备好基础环境。我建议使用全新的ROS Noetic环境,避免与其他ROS版本产生冲突。实测发现,很多安装失败案例都是由于环境不干净导致的。
首先更新软件源并安装基础工具链:
sudo apt-get update sudo apt-get install -y python3-wstool python3-rosdep ninja-build stow这里有个小技巧:如果你之前安装过ROS但不确定环境是否干净,可以新建一个用户专门用于Cartographer开发。我就曾经因为残留的旧版ROS依赖浪费了半天时间排查问题。
接下来创建工作空间时,建议直接在主目录下创建,避免路径中包含中文或空格:
mkdir -p ~/cartographer_ws/src cd ~/cartographer_ws2. 解决网络访问问题
官方文档中建议使用wstool直接获取源码,但在实际操作中我发现这个方法经常因为网络问题失败。经过多次尝试,总结出两种可靠的替代方案:
2.1 手动创建.rosinstall文件
首先在src目录下创建隐藏文件.rosinstall(按Ctrl+H可显示隐藏文件),内容如下:
- git: local-name: cartographer uri: 'https://github.com/cartographer-project/cartographer.git' version: 'master' - git: local-name: cartographer_ros uri: 'https://github.com/cartographer-project/cartographer_ros.git' version: 'master' - git: local-name: ceres-solver uri: 'https://github.com/ceres-solver/ceres-solver.git' version: 'master'2.2 使用国内镜像源
如果你觉得手动操作麻烦,可以尝试修改hosts文件或者使用国内镜像源。我在测试中发现清华镜像源速度不错,只需修改git配置:
git config --global url."https://mirrors.tuna.tsinghua.edu.cn/git/".insteadOf https://github.com/3. 处理依赖问题
执行rosdep install时最常见的错误就是libabsl-dev缺失。这个问题其实是因为Ubuntu 20.04的官方源中没有这个包。经过多次测试,我发现有两种解决方案:
3.1 修改package.xml
进入cartographer源码目录:
cd ~/cartographer_ws/src/cartographer用文本编辑器打开package.xml,找到第46行左右的libabsl-dev依赖项,直接删除或注释掉这行。保存后重新执行:
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y3.2 手动安装abseil库
如果你希望保持完整性,可以手动安装abseil:
sudo apt-get install -y libabsl-dev=20200923.3-1如果提示找不到包,需要先添加PPA源:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update4. 编译与安装
解决所有依赖问题后,就可以开始编译了。这里推荐使用ninja构建工具,速度比make快很多:
catkin_make_isolated --install --use-ninja编译过程中可能会遇到几个常见问题:
- 内存不足:建议至少4GB内存,如果不够可以添加swap分区
- 编译器版本问题:确保使用gcc-9和g++-9
- 权限问题:不要在root用户下编译
编译完成后,目录结构应该是这样的:
cartographer_ws/ ├── build_isolated/ ├── devel_isolated/ ├── install_isolated/ │ ├── setup.bash │ ├── share/ │ └── ... └── src/5. 测试与验证
安装完成后,我们可以用官方提供的2D背包数据集进行测试。这个数据集大约200MB,建议使用wget断点续传:
wget -c -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag启动建图节点:
source ~/cartographer_ws/install_isolated/setup.bash roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag如果一切正常,你应该能在RViz中看到实时建图过程。我建议首次运行时降低播放速度,方便观察:
rosbag play -r 0.5 ${HOME}/Downloads/cartographer_paper_deutsches_museum.bag6. 常见问题排查
在实际使用中,我遇到过几个典型问题:
- RViz不显示地图:检查tf树是否完整,通常是因为时间同步问题
- 建图漂移严重:尝试调整configuration_files中的参数
- 内存泄漏:长时间运行时建议监控内存使用情况
对于性能调优,我发现修改lua配置文件中的以下参数效果明显:
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 50 -- 默认90 POSE_GRAPH.optimization_problem.huber_scale = 1e2 -- 默认1e17. 进阶使用建议
成功运行demo后,你可以尝试用自己的设备采集数据。我用RPLIDAR A1测试时,需要修改以下配置:
- 在backpack_2d.lua中添加雷达参数:
TRAJECTORY_BUILDER_2D.min_range = 0.1 TRAJECTORY_BUILDER_2D.max_range = 12.0- 修改launch文件中的话题映射:
<remap from="scan" to="/rplidar_scan" />- 对于室内环境,建议调整子图大小:
TRAJECTORY_BUILDER_2D.submaps.resolution = 0.05Cartographer的调参是个经验活,我建议每次只修改一个参数,记录下效果。建图质量不仅取决于参数,传感器标定的准确性也很关键。我用了一周时间才调出满意的办公室地图,关键是要有耐心。