5.5.2 SLAM
SLAM(同步定位与建图)模块提供地图构建、地图获取和重定位接口,支持机器人在未知环境中建立地图并基于已有地图进行精确定位。
地图构建
使用话题控制建图流程的启停,并指定保存的地图名称。
话题名称 |
数据类型 |
描述 |
|---|---|---|
|
发布建图控制指令 |
指令格式:
指令 |
说明 |
|---|---|
|
开始建图 |
|
停止建图并以 |
地图获取
服务名称 |
数据类型 |
描述 |
|---|---|---|
|
|
按地图名称获取已存储的地图数据 |
GetStoredMapByNameros2-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/Headerros2-msgnav_msgs/MapMetaDataros2-msgNaviPointros2-msg @ robot/mm/msg/NaviPoint.msgint32 point_id # 点位 ID geometry_msgs/Pose2D navi_point # 导航点二维坐标位姿
geometry_msgs/Pose2Dros2-msg
QRPointros2-msg @ robot/mm/msg/QRPoint.msgint32 point_id # 点位 ID QRCode qr_code # 二维码信息
QRCoderos2-msg @ robot/aima/internal/common/QRCode.msgint32 code # 二维码值 geometry_msgs/Pose pose # 二维码位姿
geometry_msgs/Poseros2-msg
HRPointros2-msg @ robot/mm/msg/HRPoint.msgint32 point_id # 点位 ID geometry_msgs/Pose pose # 高精度点的实时位姿 QRCode[] qr_list # 关联的二维码点列表 bool use_head # 是否使用头部相机
geometry_msgs/Poseros2-msg
Pathros2-msg @ robot/mm/msg/Path.msgint32 path_id # 路径 ID geometry_msgs/Pose2D[] points # 路径点二维坐标位姿列表
geometry_msgs/Pose2Dros2-msg
Regionros2-msg @ robot/mm/msg/Region.msguint8 type # 区域类型(0: 未定义, 1: 工作区域, 2: 虚拟墙) uint8 drawing_type # 绘制类型(0: 未定义, 1: 封闭区域, 2: 折线) string name # 区域名称 geometry_msgs/Polygon polygon # 闭合多边形顶点(有序,首尾不重合)
geometry_msgs/Polygonros2-msg
重定位
将机器人定位到已建立地图中的指定位置,需先触发重定位指令,再提供初始位姿估计,最后通过订阅定位结果话题确认重定位是否成功。
话题名称 |
数据类型 |
方向 |
描述 |
|---|---|---|---|
|
发布 |
发布重定位控制指令 |
|
|
发布 |
提供机器人初始位姿估计 |
|
|
订阅 |
激光定位结果(BEST_EFFORT QoS) |
重定位指令格式:
指令 |
说明 |
|---|---|
|
开始重定位, |
操作流程:
向
/integrated_command发布start_relocalization:<timestamp_ms>指令稍作延迟后向
/relocalization_pose发布机器人的初始位姿估计(建议从地图构建的起始点开始)订阅
/slam/lidar_loc,收到数据表示重定位成功
编程示例
详细的编程示例和代码说明请参考:
Python 示例(建图):地图构建
Python 示例(重定位):使用地图进行重定位
Python 示例(地图获取):获取已存储的地图
C++ 示例(建图):地图构建
C++ 示例(重定位):使用地图进行重定位
C++ 示例(地图获取):获取已存储的地图
小心
ROS的服务(service)机制在跨板通信时存在一些待优化问题, 二次开发时请参考例程添加异常处理、快速重试等保护机制