1. 项目概述
cartographer_ros是Google开源的Cartographer SLAM算法与ROS系统的集成版本,主要用于二维和三维环境下的实时同步定位与地图构建(SLAM)。这个项目在机器人导航、自动驾驶、室内测绘等领域有着广泛应用。neotic指的是ROS 2的Neotic版本,这是目前ROS 2的长期支持版本(LTS)。
我在实际部署过程中发现,虽然官方文档提供了安装指南,但在不同硬件环境和系统配置下仍会遇到各种"坑"。本文将基于Ubuntu 20.04系统,详细记录从零开始安装cartographer_ros neotic的全过程,包括那些官方文档没写但实际会遇到的问题。
2. 环境准备
2.1 系统要求
cartographer_ros neotic对系统环境有明确要求:
- 操作系统:推荐Ubuntu 20.04 Focal(官方支持版本)
- ROS版本:必须使用ROS 2 Foxy Fitzroy或更新版本
- 内存:至少4GB(建议8GB以上)
- 存储空间:至少20GB可用空间(编译过程会产生大量中间文件)
注意:虽然理论上支持其他Linux发行版,但官方只在Ubuntu上进行过完整测试。我在Manjaro上尝试编译时遇到过glibc版本冲突问题,最终不得不切换回Ubuntu。
2.2 基础依赖安装
首先安装基础工具链:
bash复制sudo apt update && sudo apt install -y \
build-essential \
cmake \
git \
python3-colcon-common-extensions \
python3-rosdep \
python3-vcstool \
wget
然后是ROS 2 Foxy的安装(如果尚未安装):
bash复制sudo apt install -y curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" > /etc/apt/sources.list.d/ros2-latest.list'
sudo apt update
sudo apt install -y ros-foxy-desktop
3. 源码获取与编译
3.1 创建工作空间
建议创建一个独立的工作空间以避免污染系统环境:
bash复制mkdir -p ~/cartographer_ws/src
cd ~/cartographer_ws
3.2 获取源码
使用vcs工具批量获取所有相关仓库:
bash复制wget https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall
vcs import src < cartographer_ros.rosinstall
这个命令会获取以下关键组件:
- cartographer(核心算法)
- cartographer_ros(ROS接口)
- ceres-solver(优化库)
- protobuf(数据序列化)
3.3 安装依赖
初始化rosdep并安装依赖:
bash复制sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro foxy -y
这个步骤可能会遇到网络问题导致失败。我在实际操作中发现,可以通过修改rosdep源为国内镜像来加速:
bash复制sudo sed -i 's/http:\/\/github.com/https:\/\/ghproxy.com\/https:\/\/github.com/g' /etc/ros/rosdep/sources.list.d/20-default.list
rosdep update
3.4 编译安装
使用colcon进行编译:
bash复制source /opt/ros/foxy/setup.bash
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
编译过程可能需要30分钟到2小时不等,取决于硬件性能。有几个关键点需要注意:
- 内存不足问题:如果内存小于8GB,建议添加交换空间:
bash复制sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
-
编译ceres-solver时的优化:编辑
src/ceres-solver/CMakeLists.txt,找到-march=native并注释掉,可以避免在某些CPU上编译失败。 -
Protobuf版本冲突:如果系统已安装protobuf,可能需要先卸载:
bash复制sudo apt remove libprotobuf-dev protobuf-compiler
4. 环境配置与验证
4.1 环境变量设置
编译完成后,需要设置环境变量:
bash复制echo "source ~/cartographer_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
4.2 测试安装
运行demo测试是否安装成功:
bash复制ros2 launch cartographer_ros demo_backpack_2d.launch.py
如果一切正常,你应该能看到RViz窗口显示激光雷达数据和地图构建过程。
4.3 常见问题排查
- 缺少ROS消息类型:
错误信息类似Package 'xxx_msgs' not found,需要安装对应包:
bash复制sudo apt install ros-foxy-xxx-msgs
- ABI版本不匹配:
如果遇到GLIBCXX_3.4.26 not found等错误,可能是因为gcc版本不匹配。解决方案:
bash复制sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt install gcc-9 g++-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 60
- 内存不足导致编译失败:
除了增加交换空间,还可以尝试限制并行编译线程数:
bash复制colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --parallel-workers 2
5. 高级配置与优化
5.1 性能调优
cartographer的性能高度依赖参数配置。对于不同传感器和场景,建议调整以下参数(位于src/cartographer_ros/cartographer_ros/configuration_files):
| 参数 | 默认值 | 优化建议 |
|---|---|---|
num_range_data |
100 | 根据内存调整,越大建图越精细但消耗更多资源 |
voxel_filter_size |
0.025 | 值越大计算越快但精度越低 |
submaps.num_range_data |
90 | 控制子图大小,影响闭环检测性能 |
5.2 传感器配置
对于不同的传感器组合,需要修改URDF和launch文件。以2D激光雷达为例,关键配置在backpack_2d.lua中:
lua复制TRAJECTORY_BUILDER_2D = {
use_imu_data = false, -- 如果没有IMU设为false
min_range = 0.3, -- 最小有效距离
max_range = 8., -- 最大有效距离
missing_data_ray_length = 5., -- 缺失数据处理
}
5.3 建图质量提升技巧
- 运动畸变校正:如果使用低成本激光雷达,建议开启:
lua复制TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
- 多传感器融合:如果有IMU和里程计数据,可以显著提升精度:
lua复制POSE_GRAPH.optimization_problem.odometry_translation_weight = 1e5
POSE_GRAPH.optimization_problem.odometry_rotation_weight = 1e5
- 闭环检测优化:对于大场景建图:
lua复制POSE_GRAPH.constraint_builder.min_score = 0.55 -- 降低可提高闭环检测灵敏度
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.6
6. 实际应用案例
6.1 室内移动机器人建图
以TurtleBot3为例的配置流程:
- 安装TurtleBot3包:
bash复制sudo apt install ros-foxy-turtlebot3-*
- 修改launch文件,替换激光雷达配置:
xml复制<param name="robot_description"
command="$(find xacro)/xacro $(find turtlebot3_description)/urdf/turtlebot3_waffle.urdf.xacro" />
- 启动建图:
bash复制ros2 launch cartographer_ros tb3_cartographer.launch.py
6.2 保存与加载地图
建图完成后保存:
bash复制ros2 run nav2_map_server map_saver_cli -f ~/map
加载已有地图:
bash复制ros2 launch cartographer_ros offline_backpack_2d.launch.py \
bag_filenames:=${HOME}/mydata.bag \
pose_graph_filename:=${HOME}/mydata.pbstream
7. 维护与更新
7.1 版本升级
当有新版本发布时,建议的升级流程:
- 备份当前工作空间
- 更新源码:
bash复制cd ~/cartographer_ws/src/cartographer
git pull origin master
- 重新编译:
bash复制colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
7.2 性能监控
使用ROS 2内置工具监控cartographer性能:
bash复制ros2 topic hz /scan # 监控激光数据频率
ros2 run rqt_graph rqt_graph # 查看节点关系
ros2 run rqt_tf_tree rqt_tf_tree # 检查TF树
对于长期运行的建图任务,建议定期检查内存使用:
bash复制watch -n 1 'free -h'