规划控制模块
规划控制模块
Section titled “规划控制模块”【本模块仅供旗舰款调用,基础款用户无需查阅】
本页面包含了规划控制模块(Planning and Control, PNC)包含的话题和服务的相关文档协议,以支持系统的规划控制功能。
本模块位于 orin 开发板上,http 后端监听的端口为 53176。
Channel 接口
Section titled “Channel 接口”| 话题名 | 话题描述 | 订阅 or 发布 | 消息类型 | 备注 | 通信后端 |
|---|---|---|---|---|---|
/path | 机器人运行路线 | 发布 | nav_msgs::msg::Path | 用于可视化和调试,仅供参考 | ros2 |
/pnc/estimate_odom | PNC估计的运行速度 | 发布 | nav_msgs::msg::Odometry | 根据实时定位结果估计,仅在导航任务中发布,速度结果仅供参考,不一定准确; 如果需要持续获取机器人的定位信息请从 /tf 变换中获取(map 到 base_link 的变换) | ros2 |
RPC 接口
Section titled “RPC 接口”任务下发接口统一说明:
1.执行任务前,需要机器人重定位成功,且下发任务的地图id需要与重定位的地图一致
2.执行任务前,需要将MC状态切换到RL_LOCOMOTION_DEFAULT(强化直腿)模式,否则机器人可能无法正常响应PNC的速度指令
3.下发任务时,需要设置task_id,若不设置(默认为0),PNC会自动生成一个task_id,并在response中返回,客户端需要保存该task_id以便后续下发控制指令或查询任务状态
| 接口名 | 接口描述 | 请求消息类型 | 答复消息类型 | 备注 | 通信后端 |
|---|---|---|---|---|---|
pb:/aimdk.protocol.PncService/PlanningNaviToGoal | 下发给定目标点ID的规划导航任务 | aimdk::protocol::PncPlanningNaviToGoalRequest | aimdk::protocol::CommonTaskResponse | 到点精度范围约0.4米 | http |
pb:/aimdk.protocol.PncService/PlanningNaviToPose2D | 下发给定目标点位姿的规划导航任务 | aimdk::protocol::PncPlanningNaviToPose2DRequest | aimdk::protocol::CommonTaskResponse | 到点精度范围约0.4米 | http |
pb:/aimdk.protocol.PncService/LinearNaviToRelative | 下发给定相对目标点位姿的直线导航任务 | aimdk::protocol::PncLinearNaviToRelativeRequest | aimdk::protocol::CommonTaskResponse | 先执行原地旋转,再执行直线移动 | http |
pb:/aimdk.protocol.PncService/LinearNaviToGoal | 下发给定目标点ID的直线导航任务 | aimdk::protocol::PncLinearNaviToGoalRequest | aimdk::protocol::CommonTaskResponse | 先执行原地旋转,再执行直线移动 | http |
pb:/aimdk.protocol.PncService/LinearNaviToPose2D | 下发给定目标点位姿的直线导航任务 | aimdk::protocol::PncLinearNaviToPose2DRequest | aimdk::protocol::CommonTaskResponse | 先执行原地旋转,再执行直线移动 | http |
pb:/aimdk.protocol.PncService/DirectNaviToRelativeGoal | 下发给定目标点ID的直接移动任务 | aimdk::protocol::PncDirectNaviToRelativeGoalRequest | aimdk::protocol::CommonTaskResponse | 一边平移一边旋转,仅适用于目标点与机器人朝向偏差较小的任务,否则可能导致到点偏差较大 | http |
pb:/aimdk.protocol.PncService/DirectNaviToRelative | 下发给定相对目标点位姿的直接移动任务 | aimdk::protocol::PncDirectNaviToRelativeRequest | aimdk::protocol::CommonTaskResponse | 一边平移一边旋转,仅适用于目标点与机器人朝向偏差较小的任务,否则可能导致到点偏差较大 | http |
pb:/aimdk.protocol.PncService/SpinTurnAndMoveForward | 下发给原地旋转+直线前进任务,会先执行原地旋转,再执行直线前进 | aimdk::protocol::PncSpinTurnAndMoveForwardRequest | aimdk::protocol::CommonTaskResponse | http | |
pb:/aimdk.protocol.PncService/SpinTurn | 下发原地旋转任务 | aimdk::protocol::PncSpinTurnRequest | aimdk::protocol::CommonTaskResponse | http | |
pb:/aimdk.protocol.PncService/MoveForward | 下发直线平移任务 | aimdk::protocol::PncMoveForwardRequest | aimdk::protocol::CommonTaskResponse | 任务执行后机器朝向不会发生变化 | http |
pb:/aimdk.protocol.PncService/PreciseNaviToGoal | 下发给定目标点ID的高精度导航任务 | aimdk::protocol::PncPreciseNaviToGoalRequest | aimdk::protocol::CommonTaskResponse | 仅适用于特殊场景下的高精到点任务,机器人会先以普通规划导航模式走到目标点后方约0.5米的位置,再直接移动到目标点,直接移动过程中不避障,并可能多次调整。到点精度约0.1米左右。需要保证目标点后方有足够空间。非特殊需求不建议使用此模式 | http |
pb:/aimdk.protocol.PncService/ActionCancel | 下发取消任务指令 | aimdk::protocol::CommonTaskRequest | aimdk::protocol::CommonTaskResponse | 仅当task_id匹配时才响应指令,否则返回CommonState_FAILURE | http |
pb:/aimdk.protocol.PncService/ActionPause | 下发暂停任务指令 | aimdk::protocol::CommonTaskRequest | aimdk::protocol::CommonTaskResponse | 仅当task_id匹配时才响应指令,否则返回CommonState_FAILURE | http |
pb:/aimdk.protocol.PncService/ActionResume | 下发恢复暂停中的任务指令 | aimdk::protocol::CommonTaskRequest | aimdk::protocol::CommonTaskResponse | 仅当task_id匹配时才响应指令,否则返回CommonState_FAILURE | http |
pb:/aimdk.protocol.PncService/ActionGetState | 获取导航任务状态 | aimdk::protocol::CommonTaskRequest | aimdk::protocol::PncServiceStateResponse | 仅当task_id匹配时才返回正确的任务状态,若请求的task_id为0则返回最近一次任务的task_id及对应的状态,其它task_id不匹配的请求则返回PncServiceState_FAILED | http |
Protobuf 消息类型
Section titled “Protobuf 消息类型”aimdk::protocol::PncPathChannel
Section titled “aimdk::protocol::PncPathChannel”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::Header | 自定义消息头,指定路线所在的坐标系 |
| pose | aimdk::protocol::SE3Pose[] | 路径点位姿 |
aimdk::protocol::PncPlanningNaviToGoalRequest
Section titled “aimdk::protocol::PncPlanningNaviToGoalRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| target_id | int64 | 目标点id |
| guide_line_id | int64 | 引导路线id,保留字段,未使用 |
| ackerman_mode | bool | 阿克曼模式,保留字段,未使用 |
aimdk::protocol::PncPlanningNaviToPose2DRequest
Section titled “aimdk::protocol::PncPlanningNaviToPose2DRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| pose | aimdk::protocol::SE2Pose[] | 目标点位姿 |
| ackerman_mode | bool | 阿克曼模式,保留字段,未使用 |
aimdk::protocol::PncLinearNaviToRelativeRequest
Section titled “aimdk::protocol::PncLinearNaviToRelativeRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| pose | aimdk::protocol::SE2Pose[] | 相对机器本体的目标点位姿 |
aimdk::protocol::PncLinearNaviToGoalRequest
Section titled “aimdk::protocol::PncLinearNaviToGoalRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| target_id | int64 | 目标点id |
aimdk::protocol::PncLinearNaviToPose2DRequest
Section titled “aimdk::protocol::PncLinearNaviToPose2DRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| pose | aimdk::protocol::SE2Pose[] | 目标点位姿 |
aimdk::protocol::PncDirectNaviToRelativeGoalRequest
Section titled “aimdk::protocol::PncDirectNaviToRelativeGoalRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| target_id | int64 | 目标点id |
aimdk::protocol::PncDirectNaviToRelativeRequest
Section titled “aimdk::protocol::PncDirectNaviToRelativeRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| pose | aimdk::protocol::SE2Pose[] | 相对机器本体的目标点位姿 |
aimdk::protocol::PncSpinTurnAndMoveForwardRequest
Section titled “aimdk::protocol::PncSpinTurnAndMoveForwardRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| angle | double | 相对机器当前朝向的旋转角度,单位:弧度 |
| distance | double | 相对机器当前位置的前进距离,单位:米 |
aimdk::protocol::PncSpinTurnRequest
Section titled “aimdk::protocol::PncSpinTurnRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| angle | double | 相对机器当前朝向的旋转角度,单位:弧度 |
aimdk::protocol::PncMoveForwardRequest
Section titled “aimdk::protocol::PncMoveForwardRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| angle | double | 相对机器当前朝向的平移方向,单位:弧度 |
| distance | double | 相对机器当前位置的平移距离,单位:米 |
aimdk::protocol::PncPreciseNaviToGoalRequest
Section titled “aimdk::protocol::PncPreciseNaviToGoalRequest”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::RequestHeader | RPC 请求的 header |
| task_id | uint64 | 任务id |
| map_id | uint64 | 地图id |
| target_id | int64 | 目标点id |
| pose_offset | aimdk::protocol::SE2Pose[] | 目标点相对偏移 |
aimdk::protocol::PncServiceStateResponse
Section titled “aimdk::protocol::PncServiceStateResponse”| Field | Type | Description |
|---|---|---|
| header | aimdk::protocol::ResponseHeader | RPC 响应的 header |
| task_id | uint64 | 当前任务id |
| state | aimdk::protocol::PncServiceState[] | PNC运行状态 |
aimdk::protocol::PncServiceState
Section titled “aimdk::protocol::PncServiceState”| Name | Number | Description |
|---|---|---|
| PncServiceState_UNDEFINED | 0 | 未知状态 |
| PncServiceState_IDLE | 1 | 任务空闲中 |
| PncServiceState_RUNNING | 2 | 任务运行中 |
| PncServiceState_PAUSED | 3 | 任务暂停中 |
| PncServiceState_SUCCESS | 4 | 任务完成 |
| PncServiceState_FAILED | 5 | 任务失败 |
1. 下发PlanningNaviToGoal任务
Section titled “1. 下发PlanningNaviToGoal任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/PlanningNaviToGoal' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "target_id": 0, "guide_line_id": 0, "ackerman_mode": false }'2. 下发PlanningNaviToPose2D任务
Section titled “2. 下发PlanningNaviToPose2D任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/PlanningNaviToPose2D' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "pose": { "position": { "x": 10.0, "y": 5.0 }, "angle": 3.14159 }, "ackerman_mode": false }'3. 下发LinearNaviToRelative任务
Section titled “3. 下发LinearNaviToRelative任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/LinearNaviToRelative' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "pose": { "position": { "x": 1.0, "y": 1.0 }, "angle": 1.57 } }'4. 下发LinearNaviToGoal任务
Section titled “4. 下发LinearNaviToGoal任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/LinearNaviToGoal' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "target_id": 0 }'5. 下发LinearNaviToPose2D任务
Section titled “5. 下发LinearNaviToPose2D任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/LinearNaviToPose2D' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "pose": { "position": { "x": 1.0, "y": 1.0 }, "angle": 1.57 } }'6. 下发DirectNaviToRelativeGoal任务
Section titled “6. 下发DirectNaviToRelativeGoal任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/DirectNaviToRelativeGoal' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "target_id": 0 }'7. 下发DirectNaviToRelative任务
Section titled “7. 下发DirectNaviToRelative任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/DirectNaviToRelative' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "pose": { "position": { "x": 1.0, "y": 1.0 }, "angle": 0.0 } }'8. 下发SpinTurnAndMoveForward任务
Section titled “8. 下发SpinTurnAndMoveForward任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/SpinTurnAndMoveForward' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "angle": 3.14159, "distance": 1.0 }'9. 下发SpinTurn任务
Section titled “9. 下发SpinTurn任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/SpinTurn' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "angle": 3.14159 }'10. 下发MoveForward任务
Section titled “10. 下发MoveForward任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/MoveForward' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "angle": 0.0, "distance": 1.0 }'11. 下发PreciseNaviToGoal任务
Section titled “11. 下发PreciseNaviToGoal任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/PreciseNaviToGoal' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 0, "map_id": 1, "target_id": 0, "pose_offset": { "position": { "x": 1.0, "y": 1.0 }, "angle": 0.0 } }'12. 取消任务
Section titled “12. 取消任务”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/ActionCancel' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 6874745825616545102 }'13. 查询任务状态
Section titled “13. 查询任务状态”#!/bin/bash#curl使用示例(以 ORIN ip: 192.168.100.110 为例):curl -i -H 'content-type:application/json' \ -H 'timeout: 60000' \ -X POST 'http://192.168.100.110:53176/rpc/aimdk.protocol.PncService/ActionGetState' \ -d '{ "header": { "timestamp": { "seconds": 0, "nanos": 0, "ms_since_epoch": 0 }, "control_source": 0 }, "task_id": 6874745825616545102 }'