ROS2结合cartographer实现高精度激光SLAM建图实战

张开发
2026/4/9 19:40:09 15 分钟阅读

分享文章

ROS2结合cartographer实现高精度激光SLAM建图实战
1. 环境准备与安装指南第一次接触ROS2和cartographer时我被各种依赖关系和配置问题折磨得够呛。经过多次实践我总结出一套最稳妥的安装方案。建议使用Ubuntu 22.04系统这是目前ROS2 Humble最稳定的运行环境。记得先更新系统sudo apt update sudo apt upgrade -y安装ROS2 Humble时很多人会忽略区域设置这一步导致后续出现奇怪的编码错误。我的经验是先执行sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8安装cartographer时有个小技巧先单独安装核心库再装ROS接口包。这样能避免常见的依赖冲突问题sudo apt install ros-humble-cartographer sudo apt install ros-humble-cartographer-ros安装完成后建议用以下命令验证是否成功ros2 pkg list | grep cartographer如果看到cartographer_ros和cartographer_ros_msgs两个包名说明安装正确。我遇到过系统显示安装成功但实际文件缺失的情况这时可以手动检查文件是否存在ls /opt/ros/humble/share/cartographer_ros2. 激光雷达配置实战不同型号的激光雷达配置差异很大我以常用的镭神N10为例。首先要确保雷达驱动正常建议先用官方驱动测试ros2 launch lsidar_driver lsn_10.launch.py在RViz中添加LaserScan可视化确认能接收到点云数据。常见的坑是frame_id不匹配可以用下面命令检查ros2 topic echo /scan --no-arr | grep frame_id记录下输出的frame_id通常是laser或laser_link这将在后续配置中用到。我遇到过雷达数据倒置的情况这时需要修改驱动参数# 在驱动launch文件中添加 remappings: - [scan, horizontal_laser_2d]对于其他型号雷达TI毫米波雷达需要额外安装ti_mmwave_ros2驱动而Velodyne雷达则需要配置特定的数据格式。测试时建议先用低速模式ros2 param set /laser_node scan_mode 13. Lua配置文件深度解析cartographer的核心配置都在.lua文件中我建议复制默认的backpack_2d.lua进行修改cd /opt/ros/humble/share/cartographer_ros/configuration_files cp backpack_2d.lua mylaser.lua关键参数需要根据实际场景调整tracking_frame改为你的雷达frame_idpublished_frame通常设为base_linknum_laser_scans单线雷达设为1多线雷达需要特殊配置我常用的优化参数组合TRAJECTORY_BUILDER_2D.submaps.num_range_data 35 TRAJECTORY_BUILDER_2D.min_range 0.3 -- 过滤近距离噪声 TRAJECTORY_BUILDER_2D.max_range 20.0 -- 根据雷达性能调整 TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching true对于大场景建图需要调整位姿图优化参数POSE_GRAPH.optimize_every_n_nodes 90 POSE_GRAPH.constraint_builder.min_score 0.65 POSE_GRAPH.global_sampling_ratio 0.0034. Launch文件编写技巧launch文件是ROS2的灵魂我习惯用模块化方式编写。先创建基础模板from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packagecartographer_ros, executablecartographer_node, parameters[{use_sim_time: False}], arguments[ -configuration_directory, /opt/ros/humble/share/cartographer_ros/configuration_files, -configuration_basename, mylaser.lua ], remappings[(scan, horizontal_laser_2d)], outputscreen ) ])添加可视化节点时建议预加载RViz配置rviz_node Node( packagerviz2, executablerviz2, arguments[-d, /path/to/your/config.rviz], outputscreen )对于复杂系统可以使用条件启动from launch.conditions import IfCondition from launch.substitutions import LaunchConfiguration use_rviz LaunchConfiguration(use_rviz, defaulttrue) # 在节点定义中添加 conditionIfCondition(use_rviz)5. 建图实战与问题排查启动顺序很关键我建议的流程是先启动雷达驱动再启动cartographer节点最后打开RViz常见问题及解决方案地图不更新检查/scan话题是否正常发布ros2 topic list | grep scan位姿漂移严重调整TRAJECTORY_BUILDER_2D.ceres_scan_matcher参数建图出现鬼影增加TRAJECTORY_BUILDER_2D.missing_data_ray_length我常用的调试命令# 查看计算耗时 ros2 topic hz /submap_list # 检查坐标变换 ros2 run tf2_ros tf2_echo map base_link6. 地图保存与后续处理保存地图前建议先暂停机器人运动。我习惯用以下命令组合ros2 run nav2_map_server map_saver_cli -f my_map --ros-args -p save_map_timeout:10000对于大型地图可以启用压缩选项ros2 param set /map_saver use_compression true保存后的地图可以用Python脚本进行后处理import numpy as np from PIL import Image img Image.open(my_map.pgm) arr np.array(img) # 进行腐蚀膨胀等操作 processed some_processing(arr) Image.fromarray(processed).save(processed_map.pgm)7. 性能优化进阶技巧经过多次实测我发现这些参数对性能影响最大-- 降低计算负载 TRAJECTORY_BUILDER_2D.voxel_filter_size 0.025 -- 提高闭环检测精度 POSE_GRAPH.constraint_builder.fast_correlative_scan_matcher.linear_search_window 7. POSE_GRAPH.constraint_builder.fast_correlative_scan_matcher.angular_search_window math.rad(30.)对于嵌入式设备可以启用轻量模式TRAJECTORY_BUILDER_2D.submaps.num_range_data 60 TRAJECTORY_BUILDER_2D.max_range 12. POSE_GRAPH.optimize_every_n_nodes 120多传感器融合时IMU配置示例TRAJECTORY_BUILDER_2D.use_imu_data true TRAJECTORY_BUILDER_2D.imu_gravity_time_constant 10.8. 真实场景应用案例在仓库AGV项目中我们遇到了动态物体干扰的问题。解决方案是TRAJECTORY_BUILDER_2D.adaptive_voxel_filter.max_length 1.5 TRAJECTORY_BUILDER_2D.adaptive_voxel_filter.min_num_points 100室外场景需要调整TRAJECTORY_BUILDER_2D.max_range 50. TRAJECTORY_BUILDER_2D.voxel_filter_size 0.05 POSE_GRAPH.global_constraint_search_after_n_seconds 300.对于多层建筑建议分层建图后使用map_merge工具合并。我在实践中发现先建轮廓再填充细节的效果最好。启动建图后先让机器人绕场一周确定边界再逐步填充内部细节。

更多文章