跳转到内容

运动控制状态接口

通过 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>
参数项前置条件含义参数值说明
ValueCommand=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。

机器人基本状态通过 UDP 指令切换,目标地址为 192.168.1.103:43893。

下图为机器人基本状态转换图,图中虚线箭头表示在任一基本状态下,机器人可能由于意外事故,由当前状态转换到软急停/摔倒状态。

机器人基本状态转换图

指令名称指令码指令功能
起立/趴下0x21010202在趴下状态和初始站立状态之间轮流切换
力控模式0x2101020A从初始站立状态切入力控站立状态
开始运动/停止运动0x21010201在力控站立状态和踏步状态之间轮流切换
软急停0x21010C0E立刻趴下,进入关节保护状态

基本运动状态值(通过 RcsData 或 ROS 话题 /robot_basic_state 获取):

状态值状态
0趴下状态
1正在起立状态
2初始站立状态
3力控站立状态
4踏步状态
5正在趴下状态
6软急停/摔倒状态
16RL 状态

注意: 下发状态切换指令不能改变原有的控制逻辑,例如机器人处于趴下状态时,发送开始运动指令不起作用,控制逻辑遵循机器人本身的运动逻辑。

控制模式决定机器人响应的速度指令来源:

指令名称指令码指令功能
手动模式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轴输出的指令,其取值范围为 [−32767,32767][-32767, 32767]。轴指令下发的频率为50Hz。

力控站立态下,下发轴指令给运动主机,可以控制机器人改变身体姿势。若指令超时失效,机器人将恢复正常站立姿态。

指令名称指令码指令类型指令功能
左摇杆X轴指令0x210101310调整Roll角,取正值时左肩耸起,取负值时右肩耸起
左摇杆Y轴指令0x210101300调整身体高度,取正值时抬高身体,取负值时降低身体
右摇杆X轴指令0x210101350调整Yaw角,取正值时向右扭头,取负值时向左扭头
右摇杆Y轴指令0x210101020调整Pitch角,取正值时向上抬头,取负值时向下低头

机器人在踏步状态下时,可通过轴指令调整其速度和方向。机器人收到用户下发的轴指令后,会将其从摇杆坐标系映射到机器人身体坐标系。

摇杆坐标系与身体坐标系

若指令超时失效,机器人将停止移动。各轴指令的功能定义如下:

左摇杆Y轴指令

指令码指令类型指令功能
0x210101300指定机器人X轴上的期望线速度,正值向前平移,负值向后平移

机器人身体坐标系X轴期望线速度与左摇杆Y轴指令值的关系如下:

vx={0,−655<y<655y32767×vmax⁡,655≤∣y∣≤32767v_{x} = \begin{cases} 0, & -655 < y < 655 \\ \frac{y}{32767} \times v_{\max}, & 655 \leq |y| \leq 32767 \end{cases}

其中 vxv_{x} 表示机器人在身体坐标系X轴上的期望线速度,vmaxv_{max} 表示当前步态限制下的最大速度,yy 表示左摇杆Y轴指令值。

左摇杆X轴指令

指令码指令类型指令功能
0x210101310指定机器人Y轴上的期望线速度,正值向右平移,负值向左平移

机器人身体坐标系Y轴期望线速度与左摇杆X轴指令值的关系如下:

vy={0,−655<x<655(−1)×x32767×vmax⁡,655≤∣x∣≤32767v_{y} = \begin{cases} 0, & -655 < x < 655 \\ (-1) \times \frac{x}{32767} \times v_{\max}, & 655 \leq |x| \leq 32767 \end{cases}

右摇杆X轴指令

指令码指令类型指令功能
0x210101350指定机器人Yaw角的期望角速度,正值向右转弯,负值向左转弯

机器人Yaw角期望角速度与右摇杆X轴指令值的关系如下:

ω={0,−655<x<655(−1)×x32767×ωmax⁡,655≤∣x∣≤32767\omega = \begin{cases} 0, & -655 < x < 655 \\ (-1) \times \frac{x}{32767} \times \omega_{\max}, & 655 \leq |x| \leq 32767 \end{cases}

其中 ω\omega 表示机器人Yaw角的期望角速度,ωmax\omega_{max} 表示当前步态限制下的最大转向速度,xx 表示右摇杆X轴指令值。

各步态最大速度限制(正常身体高度)

Section titled “各步态最大速度限制(正常身体高度)”
步态(正常高度下)最大前进速度最大后退速度最大侧向速度最大转向速度
行走步态1.5 m/s0.75 m/s0.15 m/s0.45 rad/s
斜坡步态0.7 m/s0.75 m/s0.25 m/s0.5 rad/s
越障步态0.3 m/s0.4 m/s0.1 m/s0.5 rad/s
楼梯步态(实心地面模式)0.3 m/s0.3 m/s0.2 m/s0.8 rad/s
楼梯步态(镂空地面模式)0.3 m/s0.3 m/s0.2 m/s0.8 rad/s
楼梯步态(无踢面楼梯模式)0.3 m/s0.3 m/s0.2 m/s0.8 rad/s
楼梯步态(累积帧模式)0.6 m/s0.3 m/s0.2 m/s0.8 rad/s
45°楼梯步态(累积帧模式)0.3 m/s0.2 m/s0.2 m/s0.8 rad/s
L行走步态1.5 m/s1.0 m/s0.5 m/s1.2 rad/s
山地步态1.5 m/s1.0 m/s0.5 m/s1.2 rad/s
L楼梯步态0.6 m/s0.3 m/s0.2 m/s0.5 rad/s

感知主机中包含三个速度相关的话题:

话题名描述消息类型
/handle_state手柄摇杆速度指令geometry_msgs/Twist
/cmd_vel导航模块规划的运动速度geometry_msgs/Twist
/cmd_vel_corrected地形图发布的修正后的速度指令geometry_msgs/Twist

在辅助模式或导航模式下,运动程序执行 /cmd_vel_corrected 中发布的速度指令。当没有手柄或导航模块的原始速度指令输入时,开发者也可以直接在 /cmd_vel_corrected 话题中发布消息,使运动程序执行未经地形图碰撞检测模块处理的速度指令。

运动主机通过 UDP 向 network.toml 中所列的通讯地址上报状态信息、关节信息,用户可参照应用手册“通讯参数配置”增加自己所需的通讯地址。

指令码指令类型数据内容发送频率
0x10081结构体 RcsData200Hz
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_namechar[15]机器人名称
current_mileageint32_t当次开机后运行的里程数(cm)
total_mileageint32_t累计运行里程数(cm)
current_run_timelong当次开机后的运行时间(s)
total_run_timelong累计运行时间(s)
current_motion_timelong当次开机后的运动时间(s)
total_motion_timelong累计运动时间(s)
joystickfloat[4]按比例缩放到[-1.0,1.0]的轴指令值
rcs_stateuint8_t[10]状态回传
error_stateuint32_t错误状态

joystick 字段中各参数的定义:

参数名类型取值范围含义
LXfloat[-1.0,1.0]左摇杆X轴指令值
LYfloat[-1.0,1.0]左摇杆Y轴指令值
RXfloat[-1.0,1.0]右摇杆X轴指令值
RYfloat[-1.0,1.0]右摇杆Y轴指令值

rcs_state 字段中各参数的定义:

参数名类型参数值含义
is_nav_modeuint8_t0=手动模式,1=非手动模式
emergency_sourceuint8_t1=尾部软急停已触发,2=运动中自主触发软急停,3=导航中自主触发软急停,4=自主充电中自主触发软急停,5=客户端触发软急停,6=RAS自主触发软急停

error_state 每一位对应一个参数,从最低位到最高位:

参数名类型参数值含义
imu_errorbool0=正常,1=IMU更新超时
wifi_errorbool0=正常,1=心跳包更新超时
driver_heat_warnbool0=正常,1=驱动器过温
driver_errorbool0=正常,1=驱动器故障
motor_heat_warnbool0=正常,1=电机过温
battery_low_warnbool0=正常,1=电池低电量
battery_heat_warnbool0=正常,1=电池过温
gpio_errorbool0=正常,1=GPIO故障
cpu_heat_warnbool0=正常,1=cpu过温
cpu_freq_warnbool0=正常,1=cpu主频过低
指令码指令类型数据内容发送频率
0x10091结构体 MotionStateData200Hz
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_stateuint8_t机器人基本状态
gait_stateuint8_t步态信息
leg_odom_posfloat[3]世界坐标系下的机器人位姿信息 {x, y, yaw}
leg_odom_velfloat[3]身体坐标系下的机器人速度信息 {x_vel, y_vel, yaw_vel}
robot_distancefloat当次开机后运行的里程数(cm)
task_stateuint8_t[10]任务状态

basic_state 的值:

变量值机器人基本状态
0趴下状态
1正在起立状态
2初始站立状态
3力控站立状态
4踏步状态
5正在趴下状态
6软急停/摔倒状态
16RL状态

gait_state 的值:

变量值步态
0行走步态
1越障步态
2斜坡步态
3跑步步态
6楼梯步态(实心地面/镂空地面/无踢面楼梯模式)
7楼梯步态(累积帧模式)
845°楼梯步态(累积帧模式)
32L行走步态
33山地步态
34静音步态
36L楼梯步态

注意: 世界坐标系的原点为机器人此次开机启动时所在的位置,其坐标轴朝向与开机启动时机器人的身体坐标系朝向一致。

通过 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机器人在地图坐标系下的坐标floatm
Roll/Pitch/Yaw机器人在地图坐标系下的姿态角度floatrad
Speed机器人的前向移动速度floatm/s
CurOdom当次开机后的里程数floatkm
SumOdom累计里程数floatkm
Res地图图像像素在实际地图中的物理长度floatm
X0地图图像左下角在地图坐标系下的X轴坐标floatm
Y0地图图像左下角在地图坐标系下的Y轴坐标floatm
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时,说明获取机器人实时基础状态失败或定位导航程序未启动。