| name | map-building |
| description | 地图构建技能 - SLAM实时建图、地图保存与加载、动态地图更新 |
| argument-hint | 建图 OR SLAM OR 地图 OR map building OR slam |
| user-invocable | true |
地图构建技能
使用 ROS2 + SLAM 工具链构建 2D/3D 地图,支持实时建图与动态更新
核心工具链
| 工具 | ROS2 包 | 说明 |
|---|
| Cartographer | cartographer_ros | Google SLAM,2D/3D |
| SLAM Toolbox | slam_toolbox | 实时在线建图,Karto-SLAM |
| RTAB-Map | rtabmap_ros | 视觉SLAM,3D建图 |
| GMapping | slam_gmapping | 2D 激光SLAM(离线) |
2D 建图(slam_toolbox)
ros2 launch slam_toolbox online_async_launch.py \
slam_params_file:=config/slam_params.yaml
ros2 run nav2_map_server map_saver_cli -f my_map
ros2 run nav2_map_server map_server_yaml my_map.yaml
slam_params.yaml 关键参数
solver_plugin: solver_plugins::CeresSolver
ceres_linear_solver: SPARSE_NORMAL_CHOLESKY
scanmatcher:
resolution: 0.05
max_iterations: 20
correlation_search_space:
transform_timeout: 0.2
vietoris_radius: 2.0
3D 建图(RTAB-Map)
ros2 launch rtabmap_ros rtabmap.launch.py \
rgb_topic:=/camera/color/image_raw \
depth_topic:=/camera/depth/image_raw \
camera_info_topic:=/camera/color/camera_info \
rtabmap_args:="--delete_db_on_start"
ros2 run rtabmap_ros rtabmap_utilities \
/rtabmap/export_point_cloud
动态地图更新
#include <octomap/OctoMap.h>
#include <octomap_ros/conversions.h>
void mapCallback(const sensor_msgs::msg::PointCloud2::SharedPtr msg) {
octomap::OctoMap tree(0.05);
octomap::PointCloud pc;
octomap::pointCloud2ToOctomap(*msg, pc);
tree.insertPointCloud(pc, octomap::point3d(0,0,0));
tree.updateInnerOccupancy();
}
规范
- 地图坐标系:
map frame,TF: map → odom → base_link
- 分辨率:室内 0.05m/pixel,室外 0.10-0.20m/pixel
- 保存格式:2D 用 PGM+ YAML,3D 用 OctoMap (.bt/.ot)
- 动态地图更新需用
nav2_costmap_2d 的 VoxelLayer 或 OctoMap
错误处理
| 问题 | 原因 | 解决 |
|---|
| 地图漂移 | 激光数据质量差 | 检查 scan_matcher/max_iterations |
| 里程计跳变 | TF 配置错误 | 确认 odom frame 正确 |
| 建图不闭合 | 闭环检测失败 | 增大 correlation_search_space |