5.5.2 SLAM(选装)
SLAM(同步定位与建图)模块提供地图构建、地图获取和重定位接口,支持机器人在未知环境中建立地图并基于已有地图进行精确定位。
重要
本模块默认不启用,如需使用本页面所述功能接口, 请联系售后技术支持
地图构建
使用话题控制建图流程的启停,并指定保存的地图名称。
话题名称 |
数据类型 |
描述 |
|---|---|---|
|
发布建图控制指令 |
指令格式:
指令 |
说明 |
|---|---|
|
开始建图 |
|
停止建图并以 |
地图获取
服务名称 |
数据类型 |
描述 |
|---|---|---|
|
|
按地图名称获取已存储的地图数据 |
GetStoredMapByNameros2-srv @ 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
NaviPointros2-msg @ mm/msg/NaviPoint.msgint32 point_id # 点位 ID geometry_msgs/Pose2D navi_point # 导航点二维坐标位姿
QRPointros2-msg @ mm/msg/QRPoint.msgint32 point_id # 点位 ID QRCode qr_code # 二维码信息
QRCoderos2-msg @ common/QRCode.msgint32 code # 二维码值 geometry_msgs/Pose pose # 二维码位姿
HRPointros2-msg @ mm/msg/HRPoint.msgint32 point_id # 点位 ID geometry_msgs/Pose pose # 高精度点的实时位姿 QRCode[] qr_list # 关联的二维码点列表 bool use_head # 是否使用头部相机
Pathros2-msg @ mm/msg/Path.msgint32 path_id # 路径 ID geometry_msgs/Pose2D[] points # 路径点二维坐标位姿列表
Regionros2-msg @ mm/msg/Region.msguint8 type # 区域类型(0: 未定义, 1: 工作区域, 2: 虚拟墙) uint8 drawing_type # 绘制类型(0: 未定义, 1: 封闭区域, 2: 折线) string name # 区域名称 geometry_msgs/Polygon polygon # 闭合多边形顶点(有序,首尾不重合)
重定位
将机器人定位到已建立地图中的指定位置,需先触发重定位指令,再提供初始位姿估计,最后通过订阅定位结果话题确认重定位是否成功。
话题名称 |
数据类型 |
方向 |
描述 |
|---|---|---|---|
|
发布 |
发布重定位控制指令 |
|
|
发布 |
提供机器人初始位姿估计 |
|
|
订阅 |
激光定位结果(BEST_EFFORT QoS) |
重定位指令格式:
指令 |
说明 |
|---|---|
|
开始重定位, |
操作流程:
向
/integrated_command发布start_relocalization:<map_id>指令延迟约 1 秒后向
/relocalization_pose发布机器人的初始位姿估计(建议从地图构建的起始点开始)订阅
/slam/lidar_odom,收到数据表示重定位成功
注意:
/relocalization_pose中使用的坐标为像素坐标,可从地图信息文件中获取。地图信息文件路径为:/agibot/data/var/MapManagerModule/<map_id>/grid_map_info.txt该文件包含三行:
第一行:分辨率(1m 对应 20 个 pixel)
第二行:地图起点坐标(建图原点的像素坐标),即重定位时可使用的初始位姿
第三行:图像长宽(pixel)
地图标识与坐标的获取
调用地图获取、重定位、导航接口时常用的参数,获取方式如下:
map_id(重定位、导航必填)与map_name(GetStoredMapByName按名取图用):通过手机 APP 查看,或在机器人上查询地图数据库,从结果中读取对应的map_id/map_name字段:sqlite3 /agibot/data/var/MapManagerModule/map.db "SELECT * FROM map;"
坐标:
重定位初始位姿(
/relocalization_pose)使用像素坐标,取grid_map_info.txt(见上文「重定位」说明)第 2 行的建图原点origin,其中origin.u对应position.x、origin.v对应position.y。
编程示例
详细的编程示例和代码说明请参考:
Python 示例(建图):地图构建
Python 示例(重定位):使用地图进行重定位
Python 示例(地图获取):获取已存储的地图
C++ 示例(建图):地图构建
C++ 示例(重定位):使用地图进行重定位
C++ 示例(地图获取):获取已存储的地图
小心
ROS的服务(service)机制在跨板通信时存在一些待优化问题, 二次开发时请参考例程添加异常处理、快速重试等保护机制