5.5.2 SLAM

SLAM(同步定位与建图)模块提供地图构建、地图获取和重定位接口,支持机器人在未知环境中建立地图并基于已有地图进行精确定位。

地图构建

使用话题控制建图流程的启停,并指定保存的地图名称。

话题名称

数据类型

描述

/integrated_command

std_msgs/String

发布建图控制指令

指令格式:

指令

说明

start_mapping

开始建图

stop_mapping:<map_name>

停止建图并以 <map_name> 保存地图

地图获取

服务名称

数据类型

描述

/aimdk_5Fmsgs/srv/GetStoredMapByName

GetStoredMapByName

按地图名称获取已存储的地图数据

  • GetStoredMapByName ros2-srv @ robot/mm/srv/GetStoredMapByName.srv

    # 按地图名称获取已存储的地图数据
    # 服务名称: /aimdk_5Fmsgs/srv/GetStoredMapByName
    
    # 请求
    std_msgs/Header header   # 请求头
    string map_name          # 地图名称
    
    ---
    
    # 响应
    uint64 code              # 返回码,0 表示成功
    std_msgs/Header header   # 响应头
    nav_msgs/MapMetaData map_info  # 地图信息(分辨率、宽高等)
    uint64 map_version       # 地图版本号
    string map_path          # 地图 PNG 文件路径
    int8[] data              # 地图栅格数据(-1/0/100)
    NaviPoint[] navi_points  # 导航点拓扑信息
    QRPoint[] qr_points      # 二维码点拓扑信息
    HRPoint[] hr_points      # 高精度点拓扑信息
    Path[] paths             # 路径拓扑信息
    Region[] regions         # 区域拓扑信息(含虚拟墙)
    uint64 map_id            # 地图 ID
    
    • std_msgs/Header ros2-msg

    • nav_msgs/MapMetaData ros2-msg

    • NaviPoint ros2-msg @ robot/mm/msg/NaviPoint.msg

      int32 point_id                   # 点位 ID
      geometry_msgs/Pose2D navi_point  # 导航点二维坐标位姿
      
    • QRPoint ros2-msg @ robot/mm/msg/QRPoint.msg

      int32 point_id  # 点位 ID
      QRCode qr_code  # 二维码信息
      
      • QRCode ros2-msg @ robot/aima/internal/common/QRCode.msg

        int32 code               # 二维码值
        geometry_msgs/Pose pose  # 二维码位姿
        
    • HRPoint ros2-msg @ robot/mm/msg/HRPoint.msg

      int32 point_id           # 点位 ID
      geometry_msgs/Pose pose  # 高精度点的实时位姿
      QRCode[] qr_list         # 关联的二维码点列表
      bool use_head            # 是否使用头部相机
      
    • Path ros2-msg @ robot/mm/msg/Path.msg

      int32 path_id                    # 路径 ID
      geometry_msgs/Pose2D[] points    # 路径点二维坐标位姿列表
      
    • Region ros2-msg @ robot/mm/msg/Region.msg

      uint8 type          # 区域类型(0: 未定义, 1: 工作区域, 2: 虚拟墙)
      uint8 drawing_type  # 绘制类型(0: 未定义, 1: 封闭区域, 2: 折线)
      string name                        # 区域名称
      geometry_msgs/Polygon polygon      # 闭合多边形顶点(有序,首尾不重合)
      

重定位

将机器人定位到已建立地图中的指定位置,需先触发重定位指令,再提供初始位姿估计,最后通过订阅定位结果话题确认重定位是否成功。

话题名称

数据类型

方向

描述

/integrated_command

std_msgs/String

发布

发布重定位控制指令

/relocalization_pose

geometry_msgs/Pose

发布

提供机器人初始位姿估计

/slam/lidar_loc

nav_msgs/Odometry

订阅

激光定位结果(BEST_EFFORT QoS)

重定位指令格式:

指令

说明

start_relocalization:<timestamp_ms>

开始重定位,<timestamp_ms> 为毫秒时间戳

操作流程:

  1. 向 /integrated_command 发布 start_relocalization:<timestamp_ms> 指令

  2. 稍作延迟后向 /relocalization_pose 发布机器人的初始位姿估计(建议从地图构建的起始点开始)

  3. 订阅 /slam/lidar_loc,收到数据表示重定位成功

编程示例

详细的编程示例和代码说明请参考:

小心

ROS的服务(service)机制在跨板通信时存在一些待优化问题, 二次开发时请参考例程添加异常处理、快速重试等保护机制