第一次接触Cartographer时,最头疼的就是环境配置。我在Ubuntu 20.04上实测过多次,总结出最稳定的安装方案。先确保系统已更新:
bash复制sudo apt update && sudo apt upgrade -y
核心依赖包括CMake、Eigen3和Boost库,建议手动安装而非完全依赖脚本:
bash复制sudo apt install -y cmake libeigen3-dev libboost-all-dev
ROS Noetic用户需要额外安装这些包:
bash复制sudo apt install -y ros-noetic-cartographer ros-noetic-cartographer-ros
遇到protobuf版本冲突时(这是常见坑),可以这样解决:
bash复制sudo apt install -y libprotobuf-dev protobuf-compiler
我习惯用脚本检查关键依赖版本:
bash复制cmake --version | grep "3.16" && protoc --version | grep "3.6"
注意:如果使用李想老师的注释版源码,建议先卸载系统自带的cartographer包,避免符号冲突
源码编译环节最容易卡住。推荐使用SSD硬盘编译,机械硬盘可能要多等半小时。先创建工作空间:
bash复制mkdir -p ~/carto_ws/src
cd ~/carto_ws/src
git clone --recursive https://github.com/xiangli0608/cartographer_detailed_comments_ws.git
编译时有三个关键点:
-j参数根据CPU核心数调整编译线程(我常用-j$(nproc))--use-ninja参数加速-DCMAKE_BUILD_TYPE=Release完整编译命令示例:
bash复制catkin_make_isolated --install --use-ninja -DCMAKE_BUILD_TYPE=Release
编译成功后,在.bashrc中添加环境变量:
bash复制echo "source ~/carto_ws/install_isolated/setup.bash" >> ~/.bashrc
用RS16雷达数据建图时,launch文件需要特别注意这些参数:
xml复制<param name="use_sim_time" value="true" />
<node name="cartographer_node" pkg="cartographer_ros" type="cartographer_node" args="-configuration_directory $(find cartographer_ros)/configuration_files -configuration_basename lx_rs16_2d_outdoor.lua" output="screen">
实测发现bag播放速度影响建图质量,推荐用以下命令控制速率:
bash复制rosbag play --clock -r 0.5 your_bag.bag
建图过程中要监控两个关键话题:
/submap_list 查看子图生成情况/constraint_list 观察优化约束数量保存地图时,我更喜欢用pbstream格式,后期可二次编辑:
bash复制rosservice call /finish_trajectory 0
rosservice call /write_state "{filename: '${HOME}/map.pbstream'}"
3D建图对硬件要求更高,建议显卡至少6GB显存。启动前修改lua配置:
lua复制TRAJECTORY_BUILDER_3D.num_accumulated_range_data = 1
MAP_BUILDER.use_trajectory_builder_3d = true
点云处理有个实用技巧 - 在rviz中添加PointCloud2显示时,把Decay Time设为0.5秒能更清晰观察扫描线。
保存3D地图时,assets_writer的配置很关键:
xml复制<param name="pose_graph_filename" value="$(arg pose_graph_filename)" />
<param name="output_file_prefix" value="$(arg output_file_prefix)" />
用pcl_viewer查看点云时,按数字键5开启高度着色模式,能直观判断楼层结构。
tracking_frame设置要看实际传感器:
imu_linkbase_linklaser_link坐标系转换常见问题排查:
tf_monitor检查各坐标系连接tf_echo命令实测变换矩阵map->odom->base_link层级运动补偿参数这样调:
lua复制TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true
TRAJECTORY_BUILDER_2D.ceres_scan_matcher.translation_weight = 10
切换到定位模式时,pbstream加载要注意时间同步:
lua复制POSE_GRAPH.constraint_builder.min_score = 0.65
POSE_GRAPH.optimize_every_n_nodes = 10
实测发现调整这两个参数能显著提升重定位成功率:
global_sampling_ratio从0.3调到0.5max_covariance_trace设为8.0有个实用debug技巧:在rviz中同时显示当前scan和地图点云,观察匹配情况。
内存占用高的解决方案:
pose_graph的max_nodes_per_submap为50submaps的num_range_data到30trimming策略遇到地图漂移时检查:
rostopic hz /imu)header.stamp)最后分享一个监控脚本,实时显示CPU/内存占用:
bash复制watch -n 1 'echo "CPU: "$[100-$(vmstat 1 2|tail -1|awk '\''{print $15}'\'')]"% MEM: "$(free -m | grep Mem | awk '\''{print $3/$2 * 100}'\'')"%"'