SendNavigationCommand
Unary 请求 → Server Stream 响应。START 前请先 GetCapabilities / GetActiveTask;Stream 以末帧 ack.final=true 结束。
7.1 方法签名
rpc SendNavigationCommand(NavigationCommandRequest)
returns (stream NavigationCommandResponse);
7.2 Proto 定义
源文件:autonomy/bridge/proto/external_command_service.proto
enum NavigationMode {
NAV_MODE_UNSPECIFIED = 0;
NAV_MODE_SINGLE_POSE = 1; // NavigateToPose
NAV_MODE_THROUGH_POSES = 2; // NavigateThroughPoses,按序巡航
}
enum NavigationCommand {
NAV_CMD_UNSPECIFIED = 0;
NAV_CMD_START = 1;
NAV_CMD_STOP = 2;
NAV_CMD_CANCEL = 3;
NAV_CMD_RESUME = 4;
NAV_CMD_PAUSE = 5;
NAV_CMD_REPLAN = 6; // 保持目标不变,重新规划路径
}
enum NavigationStatus {
NAV_STATUS_UNKNOWN = 0;
NAV_STATUS_IDLE = 1;
NAV_STATUS_PLANNING = 2;
NAV_STATUS_NAVIGATING = 3;
NAV_STATUS_PAUSED = 4;
NAV_STATUS_SUCCEEDED = 5;
NAV_STATUS_FAILED = 6;
NAV_STATUS_CANCELED = 7;
}
message NavigationCommandRequest {
RequestHeader header = 1;
NavigationCommand command = 2;
NavigationMode mode = 3; // START 时必填
repeated commsgs.proto.geometry_msgs.PoseStamped goals = 4; // START 时必填
NavigationPluginOptions plugins = 5;
float timeout_sec = 6; // 0 = 服务端默认
}
message NavigationCommandResponse {
CommandAck ack = 1;
NavigationStatus status = 2;
int32 current_waypoint_index = 3;
int32 total_waypoints = 4;
float distance_remaining = 5;
commsgs.proto.geometry_msgs.PoseStamped current_pose = 6;
}
7.3 字段说明
Request · NavigationCommandRequest
字段 |
类型 |
必填 |
说明 |
|---|---|---|---|
|
|
✓ |
|
|
|
✓ |
子命令;见下表 |
|
|
START |
|
|
|
START |
|
|
|
— |
|
|
|
— |
秒; |
NavigationCommand 枚举
值 |
常量 |
说明 |
|---|---|---|
1 |
|
开始;需 |
2 |
|
停止;幂等 → |
3 |
|
取消任务 |
4 |
|
从 |
5 |
|
暂停 |
6 |
|
保持 |
Response · NavigationCommandResponse
字段 |
类型 |
说明 |
|---|---|---|
|
|
流应答;末帧 |
|
|
导航阶段 |
|
|
当前航点(多点) |
|
|
航点总数 |
|
|
剩余距离 (m) |
|
|
当前位姿 |
NavigationStatus:IDLE(1) · PLANNING(2) · NAVIGATING(3) · PAUSED(4) · SUCCEEDED(5) · FAILED(6) · CANCELED(7)
%%{init: {"theme":"base","themeVariables":{"fontSize":"12px","primaryColor":"#e0f2f2","primaryTextColor":"#1a4d6e","primaryBorderColor":"#2d9294","lineColor":"#5a7289","stateBkg":"#e0f2f2","stateBorder":"#2d9294","stateLabelColor":"#1a4d6e","edgeLabelBackground":"#ffffff","labelTextColor":"#455a64"},"state":{"nodeSpacing":18,"rankSpacing":22,"padding":6,"fontSize":12}}}%%
stateDiagram-v2
direction TB
[*] --> IDLE
IDLE --> PLANNING: START
PLANNING --> NAVIGATING
NAVIGATING --> PAUSED: PAUSE
PAUSED --> NAVIGATING: RESUME
NAVIGATING --> PLANNING: REPLAN
PLANNING --> IDLE: STOP
NAVIGATING --> IDLE: STOP
NAVIGATING --> SUCCEEDED
NAVIGATING --> FAILED
NAVIGATING --> CANCELED: CANCEL
SUCCEEDED --> [*]
FAILED --> [*]
CANCELED --> [*]
classDef idle fill:#f5f7fa,stroke:#78909c,color:#455a64
classDef run fill:#e0f2f2,stroke:#2d9294,color:#1a4d6e
classDef active fill:#e3f2fd,stroke:#1565c0,color:#0d47a1
classDef pause fill:#fff8e1,stroke:#fb8c00,color:#e65100
classDef ok fill:#e8f5e9,stroke:#43a047,color:#2e7d32
classDef fail fill:#ffebee,stroke:#e53935,color:#c62828
classDef cancel fill:#eceff1,stroke:#607d8b,color:#546e7a
class IDLE idle
class PLANNING run
class NAVIGATING active
class PAUSED pause
class SUCCEEDED ok
class FAILED fail
class CANCELED cancel
7.4 示例(grpcurl)
环境:01 §1.1 · TC 全集:13 §13.6 · JSON 参考:01 §1.4
每张卡片上方 发送指令(蓝)、下方 收到结果(绿);Stream 响应以末帧 ack.final=true 为准。
7.4.1 示例索引
编号 |
在干什么 |
|
末帧预期 |
TC |
|---|---|---|---|---|
确认可导航、无残留任务 |
— |
可导航 · 无活跃任务 |
— |
|
单点导航到目标 |
1 |
到达 · SUCCEEDED |
|
|
3 航点顺序巡航 |
1 |
航点索引 0→2 · SUCCEEDED |
|
|
暂停导航 |
5 |
PAUSED |
|
|
暂停后恢复 |
4 |
恢复行驶 → SUCCEEDED |
|
|
保持目标重规划 |
6 |
重规划后继续 |
|
|
取消任务 |
3 |
CANCELED |
|
|
停止并回空闲 |
2 |
IDLE |
|
|
双终端联调冒烟 |
— |
见步骤表 |
E2E-001 / 002 |
7.4.2 NAV-01 · 前置检查
发 START 前确认:Bridge 支持导航,且当前无进行中的任务。
发送指令
# NAV-01 · GetCapabilities + GetActiveTask
grpcurl -plaintext $PROTO_OPTS -d '{}' $BRIDGE $SVC/GetCapabilities
grpcurl -plaintext $PROTO_OPTS -d '{}' $BRIDGE $SVC/GetActiveTask
收到结果
{ "supportsNavigation": true }
{ "type": "TASK_TYPE_NONE" }
7.4.3 启动
7.4.3.1 NAV-02 · START 单点
向单一目标点发起导航:规划 → 行驶 → 到达,Stream 末帧 SUCCEEDED。
发送指令
# NAV-02 · START(1) mode=1 · 单目标点
export CMD_ID=$(new_cmd_id)
grpcurl -plaintext $PROTO_OPTS \
-d @- \
$BRIDGE \
$SVC/SendNavigationCommand <<EOF
{
"header": {
"cmd_id": "${CMD_ID}",
"client_id": "demo"
},
"command": 1,
"mode": 1,
"goals": [
{
"header": { "frame_id": "map" },
"pose": {
"position": { "x": 1.0, "y": 2.0, "z": 0.0 },
"orientation": { "w": 1.0 }
}
}
],
"plugins": {
"planner_id": "navfn_planner",
"controller_id": "graceful_controller"
},
"timeout_sec": 300
}
EOF
收到结果 · 末帧
{
"ack": {
"success": true,
"final": true,
"taskStatus": "TASK_STATUS_SUCCEEDED"
},
"status": "NAV_STATUS_SUCCEEDED",
"distanceRemaining": 0.0
}
7.4.3.2 NAV-03 · START 多点
按顺序经过 3 个航点(mode=2);Stream 中 currentWaypointIndex 应从 0 增至 2。
发送指令
# NAV-03 · START(1) mode=2 · 3 航点
export CMD_ID=$(new_cmd_id)
grpcurl -plaintext $PROTO_OPTS \
-d @- \
$BRIDGE \
$SVC/SendNavigationCommand <<EOF
{
"header": { "cmd_id": "${CMD_ID}" },
"command": 1,
"mode": 2,
"goals": [
{
"header": { "frame_id": "map" },
"pose": { "position": { "x": 1.0, "y": 1.0 } }
},
{
"header": { "frame_id": "map" },
"pose": { "position": { "x": 3.0, "y": 1.0 } }
},
{
"header": { "frame_id": "map" },
"pose": { "position": { "x": 3.0, "y": 3.0 } }
}
]
}
EOF
收到结果 · 流中帧 + 末帧
{ "status": "NAV_STATUS_PLANNING", "totalWaypoints": 3, "currentWaypointIndex": 0 }
{ "status": "NAV_STATUS_NAVIGATING", "currentWaypointIndex": 1, "distanceRemaining": 1.4 }
{
"ack": { "success": true, "final": true, "taskStatus": "TASK_STATUS_SUCCEEDED" },
"status": "NAV_STATUS_SUCCEEDED",
"currentWaypointIndex": 2,
"totalWaypoints": 3,
"distanceRemaining": 0.0
}
7.4.4 运行控制
7.4.4.1 NAV-04 · PAUSE
暂停正在进行的导航(机器人停住,任务保持 PAUSED)。
前提:NAV-02/03 已 START 且 Stream 未结束 · 另开终端发送。
发送指令
# NAV-04 · PAUSE(5)
export CMD_ID=$(new_cmd_id)
grpcurl -plaintext $PROTO_OPTS \
-d @- \
$BRIDGE \
$SVC/SendNavigationCommand <<EOF
{
"header": { "cmd_id": "${CMD_ID}" },
"command": 5
}
EOF
收到结果 · 末帧
{
"ack": {
"success": true,
"final": true,
"taskStatus": "TASK_STATUS_PAUSED"
},
"status": "NAV_STATUS_PAUSED"
}
7.4.4.2 NAV-05 · RESUME
从暂停恢复,继续向原目标行驶直至完成。
前提:紧接 NAV-04 PAUSE 之后发送。
发送指令
# NAV-05 · RESUME(4)
export CMD_ID=$(new_cmd_id)
grpcurl -plaintext $PROTO_OPTS \
-d @- \
$BRIDGE \
$SVC/SendNavigationCommand <<EOF
{
"header": { "cmd_id": "${CMD_ID}" },
"command": 4
}
EOF
收到结果 · 末帧
{
"ack": {
"success": true,
"final": true,
"taskStatus": "TASK_STATUS_SUCCEEDED"
},
"status": "NAV_STATUS_SUCCEEDED"
}
7.4.4.3 NAV-06 · REPLAN
目标点不变,重新规划路径(遇动态障碍时使用)。
前提:导航进行中(通常已 START)。
发送指令
# NAV-06 · REPLAN(6)
export CMD_ID=$(new_cmd_id)
grpcurl -plaintext $PROTO_OPTS \
-d @- \
$BRIDGE \
$SVC/SendNavigationCommand <<EOF
{
"header": { "cmd_id": "${CMD_ID}" },
"command": 6
}
EOF
收到结果 · 流中帧
{ "status": "NAV_STATUS_PLANNING" }
{ "status": "NAV_STATUS_NAVIGATING", "ack": { "success": true, "final": false } }
7.4.5 结束
7.4.5.1 NAV-07 · CANCEL
取消当前导航任务,释放任务槽,状态变为 CANCELED。
发送指令
# NAV-07 · CANCEL(3)
export CMD_ID=$(new_cmd_id)
grpcurl -plaintext $PROTO_OPTS \
-d @- \
$BRIDGE \
$SVC/SendNavigationCommand <<EOF
{
"header": { "cmd_id": "${CMD_ID}" },
"command": 3
}
EOF
收到结果 · 末帧
{
"ack": {
"success": true,
"final": true,
"taskStatus": "TASK_STATUS_CANCELED"
},
"status": "NAV_STATUS_CANCELED"
}
7.4.5.2 NAV-08 · STOP
停止导航并回到 IDLE;联调收尾常用,无活跃任务时调用亦有效(幂等)。
发送指令
# NAV-08 · STOP(2)
export CMD_ID=$(new_cmd_id)
grpcurl -plaintext $PROTO_OPTS \
-d @- \
$BRIDGE \
$SVC/SendNavigationCommand <<EOF
{
"header": { "cmd_id": "${CMD_ID}" },
"command": 2
}
EOF
收到结果 · 末帧
{
"ack": {
"success": true,
"final": true,
"taskStatus": "TASK_STATUS_IDLE"
},
"status": "NAV_STATUS_IDLE"
}
7.4.6 NAV-09 · 典型联调流程
双终端冒烟:A 看状态流 · B 清场 → 发导航 → 查活跃任务。各步 grpcurl 见下方卡片或对应 NAV 示例。
步骤 |
终端 |
在干什么 |
参考 |
|---|---|---|---|
0 |
B |
确认可导航、无残留任务 |
|
1 |
A |
订阅机器人状态流 |
下方 · 终端 A |
2 |
B |
STOP 清场 |
|
3 |
B |
START 单点导航 |
|
4 |
B |
确认任务类型为 NAVIGATION |
下方 · 终端 B |
可选 |
B |
途中暂停再恢复 |
发送指令 · 步骤 1
# NAV-09 · 终端 A · ReceiveBotStates
grpcurl -plaintext $PROTO_OPTS -d '{}' $BRIDGE $SVC/ReceiveBotStates
收到结果 · 首帧示例
{
"pose": { "position": { "x": 0.1, "y": 0.2 } },
"velocity": { "linear": { "x": 0.0 } },
"batteryPercent": 87.5
}
步骤 2–4 依次执行 NAV-08 → NAV-02,再调用 GetActiveTask;应返回 TASK_TYPE_NAVIGATION / TASK_STATUS_RUNNING。
E2E 场景 → 13 §13.12(E2E-001 / E2E-002)