1. Cartographer简介与环境准备
Cartographer是谷歌开源的实时SLAM(同步定位与地图构建)系统,广泛应用于机器人导航、自动驾驶等领域。它最大的特点是支持2D/3D建图,且对硬件要求相对友好。我第一次接触Cartographer是在一个室内服务机器人项目上,当时被它处理复杂环境的能力惊艳到了——即使在没有GPS信号的仓库里,它也能精准构建厘米级地图。
安装前需要确认你的系统环境。Cartographer官方支持Ubuntu 16.04/18.04和ROS Kinetic/Melodic组合(2023年已有部分开发者成功移植到ROS Noetic)。我强烈建议使用Ubuntu 18.04 + ROS Melodic这个"黄金组合",这是社区验证最稳定的环境。如果你用Windows子系统或虚拟机,记得分配至少4GB内存,编译过程非常吃资源。
注意:安装前务必运行
sudo apt update && sudo apt upgrade更新系统,很多奇怪报错都是因为系统包版本过旧导致的。
2. 二进制安装:最快上手方案
对于只想快速体验Cartographer功能的开发者,二进制安装是最佳选择。只需一行命令就能搞定:
sudo apt-get install ros-melodic-cartographer*这个命令会安装所有相关组件,包括:
- cartographer(核心算法)
- cartographer_ros(ROS接口)
- 可视化工具
安装完成后,你可以立即测试2D建图效果:
roslaunch cartographer_ros demo_backpack_2d.launch不过二进制安装有两个局限:
- 版本固定无法升级(Ubuntu 18.04默认安装的是1.0.0版本)
- 无法修改核心算法参数
我在去年一个物流机器人项目中就遇到了这个问题——官方二进制包不支持我们定制化的激光雷达,最后不得不改用源码安装。所以如果你需要深度定制,建议直接看下一节的源码安装指南。
3. 源码安装完整指南
3.1 依赖安装与避坑
源码安装的第一步是解决依赖问题。这个环节最容易出问题的是Protobuf版本冲突。ROS自带的是Protobuf 2.x,而Cartographer需要Protobuf 3.x。下面是经过我多次验证的可靠方案:
先彻底卸载旧版Protobuf:
sudo apt-get remove libprotobuf-dev protoc_path=$(which protoc) [ -n "$protoc_path" ] && sudo rm $protoc_path然后安装Protobuf 3.6.0(这个版本与Cartographer兼容性最好):
sudo apt-get install autoconf automake libtool curl make g++ unzip git clone -b v3.6.0 https://github.com/protocolbuffers/protobuf.git cd protobuf git submodule update --init --recursive # 关键!缺少这步会导致后续编译失败 ./autogen.sh ./configure make -j$(nproc) make check sudo make install sudo ldconfig安装完成后,务必将protoc复制到/usr/bin目录:
sudo cp /usr/local/bin/protoc /usr/bin protoc --version # 应该显示libprotoc 3.6.03.2 构建Cartographer工作空间
创建工作空间并克隆源码:
mkdir -p ~/carto_ws/src cd ~/carto_ws/src git clone https://github.com/googlecartographer/cartographer_ros.git git clone https://github.com/googlecartographer/cartographer.git git clone https://github.com/ceres-solver/ceres-solver.git这里有个小技巧:如果你在国内,可以在git clone时加上--depth=1参数只克隆最新提交,能显著加快下载速度。
3.3 编译Ceres Solver
Ceres是Cartographer依赖的优化库,需要先单独编译:
cd ~/carto_ws/src/ceres-solver mkdir ceres-bin && cd ceres-bin cmake .. -DEXPORT_BUILD_DIR=ON make -j$(nproc) sudo make install3.4 主程序编译与安装
关键步骤来了!按照这个顺序编译:
cd ~/carto_ws rosdep update rosdep install --from-paths src --ignore-src --rosdistro=melodic -y # 编译Cartographer核心 cd src/cartographer mkdir build && cd build cmake .. -G Ninja ninja ninja test sudo ninja install # 编译ROS接口 cd ~/carto_ws catkin_make_isolated --install --use-ninja source install_isolated/setup.bash实测建议:ninja编译时可以用
-j参数指定线程数,比如8核CPU就用ninja -j8,但要注意内存消耗。我曾经在4GB内存的机器上开满线程导致OOM崩溃。
4. 实战测试与常见问题排查
4.1 标准测试流程
安装完成后,用官方数据集验证:
# 下载2D测试数据(约50MB) wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag # 启动2D建图 roslaunch cartographer_ros demo_backpack_2d.launch bag_filename:=${HOME}/Downloads/cartographer_paper_deutsches_museum.bag正常情况你应该能看到RViz中的地图构建过程。如果没显示,检查:
- RViz左侧Global Options的Fixed Frame是否设置为"base_link"
- 是否添加了LaserScan和Map显示层
4.2 高频问题解决方案
问题1:rosdep初始化失败
ERROR: Rosdep cannot find all required resources解决方法:
sudo pip install rosdepc # 国内用户推荐 sudo rosdepc init rosdepc update问题2:ninja编译卡住可能是内存不足导致,尝试:
- 减少编译线程:
ninja -j2 - 增加swap空间:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile问题3:Protobuf版本冲突如果遇到类似This file was generated by a newer version of protoc的错误,说明系统存在多个Protobuf版本。彻底解决:
sudo apt purge libprotobuf-dev protobuf-compiler which protoc | xargs sudo rm # 然后重新安装Protobuf 3.6.05. 进阶配置与优化建议
5.1 性能调优参数
在cartographer_ros/configuration_files目录下可以找到各种设备的配置文件。对于常见2D激光雷达,我推荐修改这些参数:
-- 提高建图精度 TRAJECTORY_BUILDER_2D.submaps.num_range_data = 60 POSE_GRAPH.constraint_builder.min_score = 0.65 -- 降低CPU占用 TRAJECTORY_BUILDER_2D.adaptive_voxel_filter.max_length = 1.0 TRAJECTORY_BUILDER_2D.voxel_filter_size = 0.055.2 自定义传感器配置
如果你使用非标准设备(比如多线雷达),需要修改urdf模型文件。以Velodyne VLP-16为例:
<robot name="vlp16"> <joint name="laser_joint" type="fixed"> <parent link="base_link"/> <child link="laser"/> </joint> <link name="laser"> <inertial> <mass value="0.001"/> <inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/> </inertial> </link> <gazebo reference="laser"> <sensor type="ray" name="vlp16_sensor"> <pose>0 0 0 0 0 0</pose> <visualize>false</visualize> <update_rate>10</update_rate> <ray> <scan> <horizontal> <samples>1800</samples> <resolution>1</resolution> <min_angle>-3.1415926</min_angle> <max_angle>3.1415926</max_angle> </horizontal> </scan> <range> <min>0.4</min> <max>100.0</max> <resolution>0.002</resolution> </range> </ray> </sensor> </gazebo> </robot>5.3 实时建图技巧
在实际项目中,我发现这些技巧特别有用:
- 建图时保持低速移动(建议<0.5m/s)
- 定期保存子图:
rosservice call /finish_trajectory 0 - 使用
cartographer_assets_writer导出最终地图:
rosrun cartographer_ros cartographer_assets_writer -configuration_directory $(rospack find cartographer_ros)/configuration_files -configuration_basename backpack_2d.lua -bag_filenames ${HOME}/Downloads/cartographer_paper_deutsches_museum.bag -pose_graph_filename ${HOME}/Downloads/b2-3.pbstream最后提醒大家,Cartographer的编译过程可能长达2-3小时(取决于硬件配置),建议在稳定网络环境下进行。如果在某一步卡住,可以先尝试重新执行上一步命令,很多错误都是因为网络超时导致的依赖下载不全。