作为一名在机器人导航领域摸爬滚打多年的工程师,我深知SLAM(即时定位与地图构建)系统搭建的痛点。今天要分享的Cartographer环境搭建经验,都是我在多个实际项目中踩坑后总结的干货。这个由Google开源的SLAM框架,以其轻量高效著称,特别适合资源受限的移动机器人平台。
在众多开源SLAM方案中,Cartographer有三大杀手锏:首先是其独特的"局部子图+全局优化"架构,将计算负载分散到不同时间尺度;其次是优秀的回环检测能力,能有效消除里程计累积误差;最后是对传感器要求不高,单线激光雷达就能获得不错的效果。我们团队在仓储AGV项目中使用它,建图精度达到±5cm,完全满足工业场景需求。
虽然Cartographer以轻量著称,但推荐配置仍不能太差:
实测发现,在树莓派4B上也能运行2D建图,但需要关闭部分优化选项
Ubuntu 20.04是最稳定的选择,跟着以下步骤配置基础环境:
bash复制# 安装ROS Noetic(已安装可跳过)
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 ros-noetic-desktop-full
# 安装必要工具
sudo apt install -y git cmake python3-catkin-tools python3-rosdep \
libboost-all-dev libeigen3-dev libceres-dev libpcl-dev
建议使用catkin_tools管理项目,比传统catkin_make更灵活:
bash复制mkdir -p ~/cartographer_ws/src
cd ~/cartographer_ws
catkin init
catkin config --merge-devel
catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release
Cartographer依赖的几个关键库需要特别注意版本:
bash复制# Abseil库(必须与Cartographer版本匹配)
git clone https://github.com/abseil/abseil-cpp.git
cd abseil-cpp
git checkout lts_2023_04_25 # 重要!必须指定此版本
mkdir build && cd build
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON ..
make -j4 && sudo make install
分步操作确保成功率:
bash复制cd ~/cartographer_ws/src
# 克隆核心库
git clone https://github.com/cartographer-project/cartographer.git
# 克隆ROS接口
git clone https://github.com/cartographer-project/cartographer_ros.git
# 安装依赖
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=noetic -y
# 开始编译
catkin build -j4
编译常见问题处理:
以常见的2D激光雷达为例,需要修改cartographer_ros/launch/demo_revo_lds.launch:
xml复制<launch>
<param name="/use_sim_time" value="false" />
<node name="cartographer_node" pkg="cartographer_ros"
type="cartographer_node" args="
-configuration_directory $(find cartographer_ros)/configuration_files
-configuration_basename revo_lds.lua"
output="screen">
<remap from="scan" to="/laser/scan" /> <!-- 修改为实际激光话题 -->
</node>
</launch>
revo_lds.lua中的几个核心参数:
lua复制TRAJECTORY_BUILDER_2D = {
min_range = 0.3, -- 最小有效距离
max_range = 8., -- 最大有效距离
missing_data_ray_length = 5., -- 缺失数据处理
num_accumulated_range_data = 1, -- 累积扫描次数
use_imu_data = false, -- 是否使用IMU
motion_filter.max_angle_radians = math.rad(0.5), -- 运动滤波
}
调优建议:
use_imu_data=true可提升旋转估计bash复制# 终端1:启动ROS核心
roscore
# 终端2:启动Cartographer节点
roslaunch cartographer_ros demo_revo_lds.launch
# 终端3:播放bag数据(示例数据)
wget -P ~/Downloads https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
rosbag play ~/Downloads/cartographer_paper_deutsches_museum.bag --clock
/scan/map建图完成后保存pgm地图:
bash复制rosrun map_server map_saver -f my_map
这会生成my_map.pgm和my_map.yaml两个文件,可直接用于导航。
通过以下参数平衡精度与性能:
lua复制POSE_GRAPH.optimize_every_n_nodes = 90 -- 优化频率
TRAJECTORY_BUILDER_2D.submaps.num_range_data = 60 -- 子图包含的扫描数
经验值:
修改cartographer_ros/urdf/backpack_2d.urdf中的参数:
xml复制<param name="voxel_filter_size" value="0.025" /> <!-- 点云滤波尺寸 -->
建议:
可能原因及解决方案:
use_online_correlative_scan_matching是否开启排查步骤:
bash复制rostopic echo /map_metadata # 检查地图数据
rostopic list | grep scan # 确认激光话题
rviz -d $(rospack find cartographer_ros)/configuration_files/demo_2d.rviz
典型错误1:ceres-solver找不到
bash复制sudo apt install libceres-dev
典型错误2:absl报错
bash复制# 确认安装的abseil版本是否为lts_2023_04_25
cd abseil-cpp && git checkout lts_2023_04_25
修改lua配置启用IMU和里程计:
lua复制TRAJECTORY_BUILDER_2D.use_imu_data = true
TRAJECTORY_BUILDER_2D.use_odometry = true
使用demo_backpack_3d.launch启动3D建图:
bash复制roslaunch cartographer_ros demo_backpack_3d.launch
关键参数差异:
lua复制TRAJECTORY_BUILDER_3D = {
num_accumulated_range_data = 1,
voxel_filter_size = 0.15, -- 更大的体素滤波
}
需要调整的地方:
我在实际部署中发现,将submaps.num_range_data设置为机器人的运动周期整数倍,能显著提升建图质量。比如机器人每2秒完成一次扫描,就设置为60(假设10Hz扫描频率)。