规划控制模块

规划控制模块

本页面包含了规划控制模块(Planning and Control, PNC)包含的话题和服务的相关文档协议,以支持系统的规划控制功能。

本模块位于 orin 开发板上,http 后端监听的端口为 53176。

Channel 接口

话题名话题描述订阅 or 发布消息类型频率通信后端
/body_drive/wheel_joint_command关节指令发布joint_msg_interface::msg::JointCommand100hzros2
/cmd_vel速度指令发布geometry_msgs/msg/Twist20hzros2
/pnc/human_detectpnc的行人检测结果发布std_msg::msg::Bool20hzros2
/pathpnc的路径规划path发布nav_msgs/msg/Path事件触发ros2

RPC 接口

任务下发接口统一说明:
1.执行任务前,需要机器人重定位成功,且下发任务的地图id需要与重定位的地图一致
2.下发任务时,需要设置task_id,若不设置(默认为0),PNC会自动生成一个task_id,并在response中返回,客户端需要保存该task_id以便后续下发控制指令或查询任务状态

接口名接口描述请求消息类型答复消息类型备注通信后端
pb:/aimdk.protocol.PncService/PlanningNaviToGoal下发给定目标点ID的规划导航任务aimdk::protocol::PncPlanningNaviToGoalRequestaimdk::protocol::CommonTaskResponse到点精度范围约0.05米http
pb:/aimdk.protocol.PncService/PlanningNaviToPose2D下发给定目标点位姿的规划导航任务aimdk::protocol::PncPlanningNaviToPose2DRequestaimdk::protocol::CommonTaskResponse到点精度范围约0.05米http
pb:/aimdk.protocol.PncService/MobileNaviToGoal下发给定目标点ID的短距离导航任务, 适用拆垛任务aimdk::protocol::PncPlanningNaviToGoalRequestaimdk::protocol::CommonTaskResponse到点精度范围约0.05米http
pb:/aimdk.protocol.PncService/MobileNaviToPose2D下发给定目标点位姿的短距离导航任务, 适用拆垛任务aimdk::protocol::PncPlanningNaviToPose2DRequestaimdk::protocol::CommonTaskResponse到点精度范围约0.05米http
pb:/aimdk.protocol.PncService/LinearNaviToRelative下发给定相对目标点位姿的直线导航任务aimdk::protocol::PncLinearNaviToRelativeRequestaimdk::protocol::CommonTaskResponse先执行原地旋转,再执行直线移动http
pb:/aimdk.protocol.PncService/LinearNaviToGoal下发给定目标点ID的直线导航任务aimdk::protocol::PncLinearNaviToGoalRequestaimdk::protocol::CommonTaskResponse先执行原地旋转,再执行直线移动http
pb:/aimdk.protocol.PncService/LinearNaviToPose2D下发给定目标点位姿的直线导航任务aimdk::protocol::PncLinearNaviToPose2DRequestaimdk::protocol::CommonTaskResponse先执行原地旋转,再执行直线移动http
pb:/aimdk.protocol.PncService/DirectNaviToRelativeGoal下发给定目标点ID的直接移动任务aimdk::protocol::PncDirectNaviToRelativeGoalRequestaimdk::protocol::CommonTaskResponse一边平移一边旋转,仅适用于目标点与机器人朝向偏差较小的任务,否则可能导致到点偏差较大http
pb:/aimdk.protocol.PncService/DirectNaviToRelative下发给定相对目标点位姿的直接移动任务aimdk::protocol::PncDirectNaviToRelativeRequestaimdk::protocol::CommonTaskResponse一边平移一边旋转,仅适用于目标点与机器人朝向偏差较小的任务,否则可能导致到点偏差较大http
pb:/aimdk.protocol.PncService/SpinTurnAndMoveForward下发给原地旋转+直线前进任务,会先执行原地旋转,再执行直线前进aimdk::protocol::PncSpinTurnAndMoveForwardRequestaimdk::protocol::CommonTaskResponsehttp
pb:/aimdk.protocol.PncService/SpinTurn下发原地旋转任务aimdk::protocol::PncSpinTurnRequestaimdk::protocol::CommonTaskResponsehttp
pb:/aimdk.protocol.PncService/MoveForward下发直线平移任务, 该Action会根据用户设置的angle的范围决定采用纵向移动模式或是横向移动模式,当angle在-30, 30度、-150, -180度、150, 180度范围内时,机器人会采用纵向移动模式,即机器人会沿着angle方向移动distance距离;当angle在60, 120度或-60, -120度范围内时,机器人会采用横向移动模式,即机器人会沿着angle方向移动distance距离。其它情况下任务返回失败。aimdk::protocol::PncMoveForwardRequestaimdk::protocol::CommonTaskResponse任务执行后机器朝向不会发生变化http
pb:/aimdk.protocol.PncService/PreciseNaviToGoal下发给定目标点ID的高精度导航任务aimdk::protocol::PncPreciseNaviToGoalRequestaimdk::protocol::CommonTaskResponse仅适用于特殊场景下的高精到点任务,机器人会先以普通规划导航模式走到目标点后方约0.5米的位置,再直接移动到目标点,直接移动过程中不避障,并可能多次调整。到点精度约0.1米左右。需要保证目标点后方有足够空间。非特殊需求不建议使用此模式http
pb:/aimdk.protocol.PncService/ActionCancel下发取消任务指令aimdk::protocol::CommonTaskRequestaimdk::protocol::CommonTaskResponse仅当task_id匹配时才响应指令,否则返回CommonState_FAILUREhttp
pb:/aimdk.protocol.PncService/ActionPause下发暂停任务指令aimdk::protocol::CommonTaskRequestaimdk::protocol::CommonTaskResponse仅当task_id匹配时才响应指令,否则返回CommonState_FAILUREhttp
pb:/aimdk.protocol.PncService/ActionResume下发恢复暂停中的任务指令aimdk::protocol::CommonTaskRequestaimdk::protocol::CommonTaskResponse仅当task_id匹配时才响应指令,否则返回CommonState_FAILUREhttp
pb:/aimdk.protocol.PncService/ActionGetState获取导航任务状态aimdk::protocol::CommonTaskRequestaimdk::protocol::PncServiceStateResponse仅当task_id匹配时才返回正确的任务状态,否则返回PncServiceState_FAILEDhttp

Protobuf 消息类型

aimdk::protocol::PncPathChannel

FieldTypeDescription
headeraimdk::protocol::Header自定义消息头,指定路线所在的坐标系
poseaimdk::protocol::SE3Pose路径点位姿

aimdk::protocol::OccupancyGrid

FieldTypeDescription
headeraimdk::protocol::Header消息头
infoaimdk::protocol::MapMetaData地图元数据信息
dataint32占用栅格数据,-1表示未知,0表示空闲,100表示占用

aimdk::protocol::MapMetaData

FieldTypeDescription
map_load_timeaimdk::protocol::Timestamp地图加载时间
resolutionfloat地图分辨率,米/像素
widthuint32地图宽度,像素
heightuint32地图高度,像素
originaimdk::protocol::SE3Pose地图原点位姿

aimdk::protocol::PncAvoidStatusChannel

FieldTypeDescription
headeraimdk::protocol::Header消息头
avoid_statusaimdk::protocol::AvoidStatus避障状态

aimdk::protocol::AvoidStatus

NameNumberDescription
AvoidStatus_UNKNOWN0未知状态
AvoidStatus_NORMAL1正常状态
AvoidStatus_AVOIDING2避障中
AvoidStatus_BLOCKED3被阻挡

aimdk::protocol::PncPlanningNaviToGoalRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
target_idint64目标点id
guide_line_idint64引导路线id,保留字段,未使用
ackerman_modebool阿克曼模式,保留字段,未使用
enable_obstacle_avoidancebool是否开启实时避障

aimdk::protocol::PncPlanningNaviToPose2DRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
poseaimdk::protocol::SE2Pose目标点位姿
ackerman_modebool阿克曼模式,保留字段,未使用
enable_obstacle_avoidancebool是否开启实时避障

aimdk::protocol::PncMobileNaviToGoalRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
target_idint64目标点id
guide_line_idint64引导路线id,保留字段,未使用
ackerman_modebool阿克曼模式,保留字段,未使用
waypointsrepeated aimdk::protocol::SE2Pose途经点坐标,保留字段,未使用
enable_obstacle_avoidancebool是否开启实时避障

aimdk::protocol::PncMobileNaviToPose2DRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
poseaimdk::protocol::SE2Pose目标点位姿
ackerman_modebool阿克曼模式,保留字段,未使用
waypointsrepeated aimdk::protocol::SE2Pose途经点坐标,保留字段,未使用
enable_obstacle_avoidancebool是否开启实时避障

aimdk::protocol::PncLinearNaviToRelativeRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
poseaimdk::protocol::SE2Pose相对机器本体的目标点位姿

aimdk::protocol::PncLinearNaviToGoalRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
target_idint64目标点id

aimdk::protocol::PncLinearNaviToPose2DRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
poseaimdk::protocol::SE2Pose目标点位姿

aimdk::protocol::PncDirectNaviToRelativeGoalRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
target_idint64目标点id

aimdk::protocol::PncDirectNaviToRelativeRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
poseaimdk::protocol::SE2Pose相对机器本体的目标点位姿

aimdk::protocol::PncSpinTurnAndMoveForwardRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
angledouble相对机器当前朝向的旋转角度,单位:弧度
distancedouble相对机器当前位置的前进距离,单位:米

aimdk::protocol::PncSpinTurnRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
angledouble相对机器当前朝向的旋转角度,单位:弧度

aimdk::protocol::PncMoveForwardRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
angledouble相对机器当前朝向的平移方向,单位:弧度
distancedouble相对机器当前位置的平移距离,单位:米

aimdk::protocol::PncPreciseNaviToGoalRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id
map_iduint64地图id
target_idint64目标点id
pose_offsetaimdk::protocol::SE2Pose目标点相对偏移

aimdk::protocol::PncActionCancelRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id

aimdk::protocol::PncActionPauseRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id

aimdk::protocol::PncActionResumeRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id

aimdk::protocol::PncActionGetStateRequest

FieldTypeDescription
headeraimdk::protocol::RequestHeaderRPC 请求的 header
task_iduint64任务id

aimdk::protocol::PncServiceStateResponse

FieldTypeDescription
headeraimdk::protocol::ResponseHeaderRPC 响应的 header
task_iduint64当前任务id
stateaimdk::protocol::PncServiceStatePNC运行状态

aimdk::protocol::PncServiceState

NameNumberDescription
PncServiceState_UNDEFINED0未知状态
PncServiceState_IDLE1任务空闲中
PncServiceState_RUNNING2任务运行中
PncServiceState_PAUSED3任务暂停中
PncServiceState_SUCCESS4任务完成
PncServiceState_FAILED5任务失败

aimdk::protocol::PncRcTwistChannel

FieldTypeDescription
headeraimdk::protocol::Header请求头
twistaimdk::protocol::pnc::Twist

使用示例

1. 下发PlanningNaviToGoal任务

bash
#!/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,
              "enable_obstacle_avoidance": true
            }'

2. 下发PlanningNaviToPose2D任务

bash
#!/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,
              "enable_obstacle_avoidance": true
            }'

3. 下发MobileNaviToGoal任务

bash
#!/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/MobileNaviToGoal' \
        -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,
              "enable_obstacle_avoidance": true
            }'

4. 下发MobileNaviToPose2D任务

bash
#!/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/MobileNaviToPose2D' \
        -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,
              "enable_obstacle_avoidance": true
            }'

5. 下发LinearNaviToRelative任务

bash
#!/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
              }
            }'

6. 下发LinearNaviToGoal任务

bash
#!/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
            }'

7. 下发LinearNaviToPose2D任务

bash
#!/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
              }
            }'

8. 下发DirectNaviToRelativeGoal任务

bash
#!/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
            }'

9. 下发DirectNaviToRelative任务

bash
#!/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
              }
            }'

10. 下发SpinTurnAndMoveForward任务

bash
#!/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
            }'

11. 下发SpinTurn任务

bash
#!/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
            }'

12. 下发MoveForward任务

bash
#!/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
            }'

13. 下发PreciseNaviToGoal任务

bash
#!/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
              }
            }'

14. 取消任务

bash
#!/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
            }'

15. 查询任务状态

bash
#!/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
            }'