运动控制状态接口
TCP 运动控制
Section titled “TCP 运动控制”通过 TCP 本体监控协议向导航主机(192.168.1.106:30000)发送运动控制指令。
| Type字段值 | 消息类型 |
|---|---|
| 2 | 运动控制 |
| Command字段值 | 消息命令 |
|---|---|
| 1 | 前进 |
| 2 | 后退 |
| 3 | 左转 |
| 4 | 右转 |
| 6 | 速度清零 |
| 11 | 左移 |
| 12 | 右移 |
| 13 | 软急停 |
| 14 | 停止运动 |
| 15 | 趴下 |
| 16 | 站立 |
| 18 | 开始运动 |
| 20 | 切换步态 |
注意: 当使用该协议规定的方式控制机器人运动时,机器人会自动切换到需要的模式(导航模式)。部分指令支持跳步操作:例如,机器人在趴下状态时,下发开始运动指令,机器人将自动起立并开始运动。
<?xml version="1.0" encoding="UTF-8"?><PatrolDevice> <Type>2</Type> <Command>1</Command> <Time>2023-01-01 00:00:00</Time> <Items> <Value>-1</Value> </Items></PatrolDevice>| 参数项 | 前置条件 | 含义 | 参数值说明 |
|---|---|---|---|
| Value | Command=1 | 设定前进速度(m/s) | {-1}∪[0,1.50],-1时取默认值0.50 |
| Command=2 | 设定后退速度(m/s) | {-1}∪[0,1.30],-1时取默认值0.50 | |
| Command=3 | 设定左转角速度(rad/s) | {-1}[0,0.45],-1时取默认值0.35 | |
| Command=4 | 设定右转角速度(rad/s) | {-1}∪[0,0.45],-1时取默认值0.35 | |
| Command=11 | 设定左移速度(m/s) | {-1}∪[0,0.15],-1时取默认值0.10 | |
| Command=12 | 设定右移速度(m/s) | {-1}∪[0,0.15],-1时取默认值0.10 | |
| Command=20 | 切换步态 | 行走步态=0,普通楼梯步态=1,斜坡/防滑步态=2,感知楼梯步态=4,L行走步态=100,山地步态=101,L楼梯步态=102 |
注意: 轴指令(Command=1、2、3、4、6、11、12)与步态切换指令(Command=20)仅在机器人处于踏步状态与RL状态时支持。控制机器人平移或旋转的请求消息发送频率为3Hz~5Hz。
基本状态转换
Section titled “基本状态转换”机器人基本状态通过 UDP 指令切换,目标地址为 192.168.1.103:43893。
下图为机器人基本状态转换图,图中虚线箭头表示在任一基本状态下,机器人可能由于意外事故,由当前状态转换到软急停/摔倒状态。

| 指令名称 | 指令码 | 指令功能 |
|---|---|---|
| 起立/趴下 | 0x21010202 | 在趴下状态和初始站立状态之间轮流切换 |
| 力控模式 | 0x2101020A | 从初始站立状态切入力控站立状态 |
| 开始运动/停止运动 | 0x21010201 | 在力控站立状态和踏步状态之间轮流切换 |
| 软急停 | 0x21010C0E | 立刻趴下,进入关节保护状态 |
基本运动状态值(通过 RcsData 或 ROS 话题 /robot_basic_state 获取):
| 状态值 | 状态 |
|---|---|
| 0 | 趴下状态 |
| 1 | 正在起立状态 |
| 2 | 初始站立状态 |
| 3 | 力控站立状态 |
| 4 | 踏步状态 |
| 5 | 正在趴下状态 |
| 6 | 软急停/摔倒状态 |
| 16 | RL 状态 |
注意: 下发状态切换指令不能改变原有的控制逻辑,例如机器人处于趴下状态时,发送开始运动指令不起作用,控制逻辑遵循机器人本身的运动逻辑。
控制模式决定机器人响应的速度指令来源:
| 指令名称 | 指令码 | 指令功能 |
|---|---|---|
| 手动模式 | 0x21010C02 | 机器人响应手柄下发的速度指令(摇杆轴指令) |
| 非手动模式 | 0x21010C03 | 根据地形图速度输入源区分辅助模式和导航模式 |
通过 ROS 话题 /control_mode 获取当前控制模式:0 = 手动模式,1 = 非手动模式。
机器人在踏步状态下可切换步态以适应不同地形。
| 步态 | 指令码 |
|---|---|
| 行走步态 | 0x21010300 |
| 斜坡步态 | 0x21010402 |
| 越障步态 | 0x21010401 |
| 楼梯步态(实心地面/镂空地面/无踢面楼梯模式) | 0x21010405 |
| 楼梯步态(累积帧模式) | 0x2101040A |
| 45°楼梯步态(累积帧模式) | 0x2101040B |
| L行走步态 | 0x21010420 |
| 山地步态 | 0x21010421 |
| 静音步态 | 0x21010422 |
| L楼梯步态 | 0x21010424 |
通过 ROS 话题 /robot_gait_state 获取当前步态值。
注意: 各楼梯步态仅能在其对应的地形图模式下使用。当机器人身体高度处于匍匐高度时,仅支持行走步态和斜坡步态。当机器人使用L行走、山地、静音、L楼梯步态时,不支持更改机器人的身体高度与地形图模式。
轴指令是手柄左右摇杆X轴和Y轴输出的指令,其取值范围为 。轴指令下发的频率为50Hz。
力控站立状态下的轴指令
Section titled “力控站立状态下的轴指令”力控站立态下,下发轴指令给运动主机,可以控制机器人改变身体姿势。若指令超时失效,机器人将恢复正常站立姿态。
| 指令名称 | 指令码 | 指令类型 | 指令功能 |
|---|---|---|---|
| 左摇杆X轴指令 | 0x21010131 | 0 | 调整Roll角,取正值时左肩耸起,取负值时右肩耸起 |
| 左摇杆Y轴指令 | 0x21010130 | 0 | 调整身体高度,取正值时抬高身体,取负值时降低身体 |
| 右摇杆X轴指令 | 0x21010135 | 0 | 调整Yaw角,取正值时向右扭头,取负值时向左扭头 |
| 右摇杆Y轴指令 | 0x21010102 | 0 | 调整Pitch角,取正值时向上抬头,取负值时向下低头 |
踏步状态下的轴指令
Section titled “踏步状态下的轴指令”机器人在踏步状态下时,可通过轴指令调整其速度和方向。机器人收到用户下发的轴指令后,会将其从摇杆坐标系映射到机器人身体坐标系。

若指令超时失效,机器人将停止移动。各轴指令的功能定义如下:
左摇杆Y轴指令
| 指令码 | 指令类型 | 指令功能 |
|---|---|---|
| 0x21010130 | 0 | 指定机器人X轴上的期望线速度,正值向前平移,负值向后平移 |
机器人身体坐标系X轴期望线速度与左摇杆Y轴指令值的关系如下:
其中 表示机器人在身体坐标系X轴上的期望线速度, 表示当前步态限制下的最大速度, 表示左摇杆Y轴指令值。
左摇杆X轴指令
| 指令码 | 指令类型 | 指令功能 |
|---|---|---|
| 0x21010131 | 0 | 指定机器人Y轴上的期望线速度,正值向右平移,负值向左平移 |
机器人身体坐标系Y轴期望线速度与左摇杆X轴指令值的关系如下:
右摇杆X轴指令
| 指令码 | 指令类型 | 指令功能 |
|---|---|---|
| 0x21010135 | 0 | 指定机器人Yaw角的期望角速度,正值向右转弯,负值向左转弯 |
机器人Yaw角期望角速度与右摇杆X轴指令值的关系如下:
其中 表示机器人Yaw角的期望角速度, 表示当前步态限制下的最大转向速度, 表示右摇杆X轴指令值。
各步态最大速度限制(正常身体高度)
Section titled “各步态最大速度限制(正常身体高度)”| 步态(正常高度下) | 最大前进速度 | 最大后退速度 | 最大侧向速度 | 最大转向速度 |
|---|---|---|---|---|
| 行走步态 | 1.5 m/s | 0.75 m/s | 0.15 m/s | 0.45 rad/s |
| 斜坡步态 | 0.7 m/s | 0.75 m/s | 0.25 m/s | 0.5 rad/s |
| 越障步态 | 0.3 m/s | 0.4 m/s | 0.1 m/s | 0.5 rad/s |
| 楼梯步态(实心地面模式) | 0.3 m/s | 0.3 m/s | 0.2 m/s | 0.8 rad/s |
| 楼梯步态(镂空地面模式) | 0.3 m/s | 0.3 m/s | 0.2 m/s | 0.8 rad/s |
| 楼梯步态(无踢面楼梯模式) | 0.3 m/s | 0.3 m/s | 0.2 m/s | 0.8 rad/s |
| 楼梯步态(累积帧模式) | 0.6 m/s | 0.3 m/s | 0.2 m/s | 0.8 rad/s |
| 45°楼梯步态(累积帧模式) | 0.3 m/s | 0.2 m/s | 0.2 m/s | 0.8 rad/s |
| L行走步态 | 1.5 m/s | 1.0 m/s | 0.5 m/s | 1.2 rad/s |
| 山地步态 | 1.5 m/s | 1.0 m/s | 0.5 m/s | 1.2 rad/s |
| L楼梯步态 | 0.6 m/s | 0.3 m/s | 0.2 m/s | 0.5 rad/s |
速度指令话题
Section titled “速度指令话题”感知主机中包含三个速度相关的话题:
| 话题名 | 描述 | 消息类型 |
|---|---|---|
| /handle_state | 手柄摇杆速度指令 | geometry_msgs/Twist |
| /cmd_vel | 导航模块规划的运动速度 | geometry_msgs/Twist |
| /cmd_vel_corrected | 地形图发布的修正后的速度指令 | geometry_msgs/Twist |
在辅助模式或导航模式下,运动程序执行 /cmd_vel_corrected 中发布的速度指令。当没有手柄或导航模块的原始速度指令输入时,开发者也可以直接在 /cmd_vel_corrected 话题中发布消息,使运动程序执行未经地形图碰撞检测模块处理的速度指令。
运行状态信息接口
Section titled “运行状态信息接口”运动主机通过 UDP 向 network.toml 中所列的通讯地址上报状态信息、关节信息,用户可参照应用手册“通讯参数配置”增加自己所需的通讯地址。
| 指令码 | 指令类型 | 数据内容 | 发送频率 |
|---|---|---|---|
| 0x1008 | 1 | 结构体 RcsData | 200Hz |
struct RcsData{ char robot_name[15]; int32_t current_mileage;//Unit : cm int32_t total_mileage;//Unit : cm long current_run_time;//Unit : s long total_run_time;//Unit : s long current_motion_time;//Unit : s long total_motion_time;//Unit : s float joystick[4]; union { struct { uint8_t is_nav_mode; uint8_t emergency_source; uint8_t mode_reserved[8]; }rcs_state_list; uint8_t rcs_state[10]; }; union{ struct{ uint32_t imu_error : 1; uint32_t wifi_error : 1; uint32_t driver_heat_warn : 1; uint32_t driver_error: 1; uint32_t motor_heat_warn : 1; uint32_t battery_low_warn : 1; uint32_t battery_heat_warn : 1; uint32_t gpio_error : 1; uint32_t cpu_heat_warn : 1; uint32_t cpu_freq_warn : 1; uint32_t reserved : 22; }error_state_bit; uint32_t error_state; };};| 字段 | 类型 | 含义 |
|---|---|---|
| robot_name | char[15] | 机器人名称 |
| current_mileage | int32_t | 当次开机后运行的里程数(cm) |
| total_mileage | int32_t | 累计运行里程数(cm) |
| current_run_time | long | 当次开机后的运行时间(s) |
| total_run_time | long | 累计运行时间(s) |
| current_motion_time | long | 当次开机后的运动时间(s) |
| total_motion_time | long | 累计运动时间(s) |
| joystick | float[4] | 按比例缩放到[-1.0,1.0]的轴指令值 |
| rcs_state | uint8_t[10] | 状态回传 |
| error_state | uint32_t | 错误状态 |
joystick 字段中各参数的定义:
| 参数名 | 类型 | 取值范围 | 含义 |
|---|---|---|---|
| LX | float | [-1.0,1.0] | 左摇杆X轴指令值 |
| LY | float | [-1.0,1.0] | 左摇杆Y轴指令值 |
| RX | float | [-1.0,1.0] | 右摇杆X轴指令值 |
| RY | float | [-1.0,1.0] | 右摇杆Y轴指令值 |
rcs_state 字段中各参数的定义:
| 参数名 | 类型 | 参数值含义 |
|---|---|---|
| is_nav_mode | uint8_t | 0=手动模式,1=非手动模式 |
| emergency_source | uint8_t | 1=尾部软急停已触发,2=运动中自主触发软急停,3=导航中自主触发软急停,4=自主充电中自主触发软急停,5=客户端触发软急停,6=RAS自主触发软急停 |
error_state 每一位对应一个参数,从最低位到最高位:
| 参数名 | 类型 | 参数值含义 |
|---|---|---|
| imu_error | bool | 0=正常,1=IMU更新超时 |
| wifi_error | bool | 0=正常,1=心跳包更新超时 |
| driver_heat_warn | bool | 0=正常,1=驱动器过温 |
| driver_error | bool | 0=正常,1=驱动器故障 |
| motor_heat_warn | bool | 0=正常,1=电机过温 |
| battery_low_warn | bool | 0=正常,1=电池低电量 |
| battery_heat_warn | bool | 0=正常,1=电池过温 |
| gpio_error | bool | 0=正常,1=GPIO故障 |
| cpu_heat_warn | bool | 0=正常,1=cpu过温 |
| cpu_freq_warn | bool | 0=正常,1=cpu主频过低 |
运动状态信息接口
Section titled “运动状态信息接口”| 指令码 | 指令类型 | 数据内容 | 发送频率 |
|---|---|---|---|
| 0x1009 | 1 | 结构体 MotionStateData | 200Hz |
struct MotionStateData{ uint8_t basic_state; uint8_t gait_state; float max_forward_vel; float max_backward_vel; float leg_odom_pos[3]; float leg_odom_vel[3]; float robot_distance; unsigned touch_state; union { struct{ uint32_t narrow_walk : 1; uint32_t pose_safe_flag : 1; uint32_t joint_limit_flag: 1; uint32_t state_reserved : 29; }control_state_bit; uint32_t control_state; }; union{ struct{ uint8_t auto_charge_state; uint8_t pos_ctrl_state; uint8_t task_reserved[8]; }task_state_list; uint8_t task_state[10]; };};| 字段 | 类型 | 含义 |
|---|---|---|
| basic_state | uint8_t | 机器人基本状态 |
| gait_state | uint8_t | 步态信息 |
| leg_odom_pos | float[3] | 世界坐标系下的机器人位姿信息 {x, y, yaw} |
| leg_odom_vel | float[3] | 身体坐标系下的机器人速度信息 {x_vel, y_vel, yaw_vel} |
| robot_distance | float | 当次开机后运行的里程数(cm) |
| task_state | uint8_t[10] | 任务状态 |
basic_state 的值:
| 变量值 | 机器人基本状态 |
|---|---|
| 0 | 趴下状态 |
| 1 | 正在起立状态 |
| 2 | 初始站立状态 |
| 3 | 力控站立状态 |
| 4 | 踏步状态 |
| 5 | 正在趴下状态 |
| 6 | 软急停/摔倒状态 |
| 16 | RL状态 |
gait_state 的值:
| 变量值 | 步态 |
|---|---|
| 0 | 行走步态 |
| 1 | 越障步态 |
| 2 | 斜坡步态 |
| 3 | 跑步步态 |
| 6 | 楼梯步态(实心地面/镂空地面/无踢面楼梯模式) |
| 7 | 楼梯步态(累积帧模式) |
| 8 | 45°楼梯步态(累积帧模式) |
| 32 | L行走步态 |
| 33 | 山地步态 |
| 34 | 静音步态 |
| 36 | L楼梯步态 |
注意: 世界坐标系的原点为机器人此次开机启动时所在的位置,其坐标轴朝向与开机启动时机器人的身体坐标系朝向一致。
实时基础状态接口
Section titled “实时基础状态接口”通过 TCP 本体监控协议向导航主机(192.168.1.106:30000)发送请求,获取机器人当前的基础状态信息。
| Type字段值 | 消息类型 | Command字段值 | 消息命令 |
|---|---|---|---|
| 1002 | 获取实时基础状态 | 1 | 默认 |
<?xml version="1.0" encoding="UTF-8"?><PatrolDevice> <Type>1002</Type> <Command>1</Command> <Time>2023-01-01 00:00:00</Time> <Items/></PatrolDevice><?xml version="1.0" encoding="UTF-8"?><PatrolDevice> <Type>1002</Type> <Command>1</Command> <Time>2023-01-01 00:00:01</Time> <Items> <MotionState>0</MotionState> <PosX>0.0</PosX><PosY>0.0</PosY><PosZ>0.0</PosZ> <Roll>0.0</Roll><Pitch>0.0</Pitch><Yaw>0.0</Yaw> <Speed>0.0</Speed> <CurOdom>0.0</CurOdom><SumOdom>0.0</SumOdom> <Res>0.0</Res><X0>0.0</X0><Y0>0.0</Y0><H>1000</H> <Electricity>50</Electricity> <Location>0</Location> <GaitState>0</GaitState> <MotorState>0</MotorState> <ChargeState>0</ChargeState> <ControlMode>0</ControlMode> <OnDockState>0</OnDockState> </Items></PatrolDevice>响应中Items字段各参数项:
| 参数项 | 含义 | 数据类型 | 单位 | 参数值说明 |
|---|---|---|---|---|
| MotionState | 机器人运动状态 | int | / | 趴下=0,正在起立=1,初始站立=2,力控站立=3,踏步=4,正在趴下=5,软急停=6,摔倒=7,RL=16 |
| PosX/PosY/PosZ | 机器人在地图坐标系下的坐标 | float | m | |
| Roll/Pitch/Yaw | 机器人在地图坐标系下的姿态角度 | float | rad | |
| Speed | 机器人的前向移动速度 | float | m/s | |
| CurOdom | 当次开机后的里程数 | float | km | |
| SumOdom | 累计里程数 | float | km | |
| Res | 地图图像像素在实际地图中的物理长度 | float | m | |
| X0 | 地图图像左下角在地图坐标系下的X轴坐标 | float | m | |
| Y0 | 地图图像左下角在地图坐标系下的Y轴坐标 | float | m | |
| H | 地图图像高度包含的像素数 | int | / | |
| Electricity | 机器人电量 | int | / | [0,100] |
| Location | 机器人定位状态 | int | / | 定位正常=0,定位丢失=1 |
| GaitState | 机器人步态 | int | / | 行走步态=0,复杂路面越障步态=1,斜坡/防滑步态=2,感知楼梯步态=6,累积帧楼梯步态=7,累积帧45°楼梯步态=8,L行走步态=32,山地步态=33,静音步态=34,L楼梯步态=36 |
| MotorState | 机器人电机状态 | int | / | 电机正常=0,电机过温=1 |
| ChargeState | 机器人自主充电状态 | int | / | 未在充电=0,正在充电=1 |
| ControlMode | 机器人控制模式 | int | / | 手动模式=0,自动模式=1 |
| OnDockState | 机器人是否趴在充电桩上 | int | / | 不在桩上=0,趴在桩上=1 |
注意: 当接收到Items中各参数项的值均为0时,说明获取机器人实时基础状态失败或定位导航程序未启动。