(rpc-map-command)= # SendMapCommand Unary 请求 → Server Stream 响应。地图操作前请先 [GetCapabilities](04_query_api.md) / [GetActiveTask](04_query_api.md);Stream 以末帧 `ack.final=true` 结束。 --- ## 12.1 方法签名 ```protobuf rpc SendMapCommand(MapCommandRequest) returns (stream MapCommandResponse); ``` --- ## 12.2 Proto 定义 源文件:`autonomy/bridge/proto/external_command_service.proto` ```protobuf enum MapCommand { MAP_CMD_UNSPECIFIED = 0; MAP_CMD_LOAD = 1; MAP_CMD_SWITCH = 2; MAP_CMD_SET_INITIAL_POSE = 3; MAP_CMD_CLEAR_COSTMAP = 4; MAP_CMD_ADD_KEEP_OUT_ZONE = 5; MAP_CMD_REMOVE_KEEP_OUT_ZONE = 6; } enum MapStatus { MAP_STATUS_UNKNOWN = 0; MAP_STATUS_IDLE = 1; MAP_STATUS_LOADING = 2; MAP_STATUS_SUCCEEDED = 3; MAP_STATUS_FAILED = 4; } message MapCommandRequest { RequestHeader header = 1; MapCommand command = 2; oneof params { string map_name = 3; commsgs.proto.geometry_msgs.PoseWithCovarianceStamped initial_pose = 4; commsgs.proto.geometry_msgs.Polygon keep_out_zone = 5; string zone_id = 6; } } message MapCommandResponse { CommandAck ack = 1; MapStatus status = 2; string current_map_name = 3; } ``` --- ## 12.3 字段说明 ### Request · `MapCommandRequest` | 字段 | 类型 | 必填 | 说明 | |------|------|:----:|------| | `header` | `RequestHeader` | ✓ | [03 §3.1](03_common_types.md#31-requestheader) | | `command` | `MapCommand` | ✓ | 子命令;见下表 | | `map_name` | `string` | `LOAD`/`SWITCH` | `oneof params` | | `initial_pose` | `PoseWithCovarianceStamped` | `SET_INITIAL_POSE` | 重定位初始位姿 | | `keep_out_zone` | `Polygon` | `ADD_KEEP_OUT_ZONE` | 禁行区多边形 | | `zone_id` | `string` | `REMOVE_KEEP_OUT_ZONE` | 待移除禁行区 ID | **`MapCommand` 枚举** | 值 | 常量 | `params` / 说明 | |:--:|------|-----------------| | 1 | `MAP_CMD_LOAD` | `map_name` — 加载地图 | | 2 | `MAP_CMD_SWITCH` | `map_name` — 切换地图 | | 3 | `MAP_CMD_SET_INITIAL_POSE` | `initial_pose` — 重定位 | | 4 | `MAP_CMD_CLEAR_COSTMAP` | 清除代价地图 | | 5 | `MAP_CMD_ADD_KEEP_OUT_ZONE` | `keep_out_zone` | | 6 | `MAP_CMD_REMOVE_KEEP_OUT_ZONE` | `zone_id` | ### Response · `MapCommandResponse` | 字段 | 类型 | 说明 | |------|------|------| | `ack` | `CommandAck` | 流应答;末帧 `final=true` · [03 §3.2](03_common_types.md#32-commandack) | | `status` | `MapStatus` | 地图操作阶段 | | `current_map_name` | `string` | 当前加载地图名 | **`MapStatus`**:`IDLE`(1) · `LOADING`(2) · `SUCCEEDED`(3) · `FAILED`(4)
> `SET_INITIAL_POSE` / `CLEAR_COSTMAP` / 禁行区等命令为**瞬时操作**,Stream 中通常 `IDLE → SUCCEEDED`,不经过 `LOADING`。 --- ## 12.4 示例(grpcurl) **环境**:[01 §1.1](01_connection_guide.md#11-环境配置) · **TC 全集**:[13 §13.11](13_integration_tests.md#1311-sendmapcommand-测试用例) · **JSON 参考**:[01 §1.4](01_connection_guide.md#14-响应-json-参考) 每张卡片上方 **发送指令**(蓝)、下方 **收到结果**(绿);Stream 响应以末帧 `ack.final=true` 为准。 ### 12.4.1 示例索引 | 编号 | 在干什么 | `command` | 末帧预期 | TC | |:----:|----------|:---------:|----------|-----| | [MAP-00](#map-00) | 确认支持地图管理、无冲突任务 | — | 可地图管理 · 无活跃任务 | — | | [MAP-01](#map-01) | 加载静态地图 | 1 | `SUCCEEDED` · `currentMapName` | `TC-MAP-001` | | [MAP-02](#map-02) | 切换到另一张地图 | 2 | `SUCCEEDED` · 地图名更新 | `TC-MAP-002` | | [MAP-03](#map-03) | 设置重定位位姿 | 3 | `success=true` | `TC-MAP-003` | | [MAP-04](#map-04) | 清除局部代价地图 | 4 | `SUCCEEDED` | `TC-MAP-004` | | [MAP-05](#map-05) | 添加禁行区 | 5 | `SUCCEEDED` | `TC-MAP-005` | | [MAP-06](#map-06) | 移除禁行区 | 6 | `SUCCEEDED` | `TC-MAP-005` | --- (map-00)= ### 12.4.2 MAP-00 · 前置检查 发地图 Command 前确认:Bridge 支持地图管理,且当前无进行中的 Command 任务。 --- ### 12.4.3 地图加载 (map-01)= #### 12.4.3.1 MAP-01 · LOAD 从磁盘加载 named 地图,Stream 中可见 `LOADING` → `SUCCEEDED`。 (map-02)= #### 12.4.3.2 MAP-02 · SWITCH 已加载一张地图后,切换到另一张(无需重启导航栈)。 --- ### 12.4.4 定位与代价地图 (map-03)= #### 12.4.4.1 MAP-03 · SET_INITIAL_POSE 手动设置机器人在地图中的初始位姿(重定位 / 开机放置)。 (map-04)= #### 12.4.4.2 MAP-04 · CLEAR_COSTMAP 清除局部代价地图中的动态障碍残留,常用于机器人被困后恢复。 --- ### 12.4.5 禁行区 (map-05)= #### 12.4.5.1 MAP-05 · ADD_KEEP_OUT_ZONE 在代价地图上添加多边形禁行区(导航规划将绕开)。 (map-06)= #### 12.4.5.2 MAP-06 · REMOVE_KEEP_OUT_ZONE 按 `zone_id` 移除先前添加的禁行区。