跳转到内容

运动控制状态接口

机器人基本状态之间的切换通过发送相应指令实现,如下图所示(括号中标注的对应代码为状态值)。

基本状态切换图

部分指令如下表所示:

指令代码值类型功能
站立/坐下0x21010202-0在坐姿状态与站姿状态之间切换
停止 STOP0x21020C0E-0触发软件急停
回零位0x21010C05-0初始化机器人关节

轴指令是手柄左右摇杆 X 轴和 Y 轴输出的指令,其取值范围为 [-32767, 32767]。轴指令下发的频率应不低于 20Hz。轴指令超时时间为 250ms,当机器人超过 250ms 未收到轴指令时,将自动停止运动。

原地模式下,客户端发送轴指令给运动主机,可以控制机器人改变身体姿势。如果运动主机超过一秒未收到任何轴指令,系统会认为指令失效,机器人将恢复正常站立姿势。若轴指令值在死区范围内,则视轴指令值为 0。

指令名称指令码指令类型死区指令功能
调整横滚角0x210101310[-12553, 12553]取正值时向右翻滚
调整俯仰角0x210101300[-6553, 6553]取正值时低头
调整身体高度0x210101020[-20000, 20000]取正值时抬高身体
调整偏航角0x210101350[-9553, 9553]取正值时向右旋转

移动模式下,下发轴指令给运动主机,可以控制机器人改变移动方向和速度。当轴指令取值在死区范围内时,视其值为 0,机器人停止移动。轴指令值的正负确定速度方向。

指令名称指令码指令类型死区指令功能
左右平移0x210101310[-12553, 12553]指定机器人 y 轴上的期望线速度,正值向右
前后平移0x210101300[-6553, 6553]指定机器人 x 轴上的期望线速度,正值向前
左右转弯0x210101350[-9553, 9553]指定机器人的期望角速度,正值向右转

机器人在运动过程中,若下发轴指令为 0,机器人将停止运动。

指令名称指令代码指令值指令类型
姿态模式0x21010D05-0
运动模式0x21010D06-0

机器人处于运动模式时可以调整步态。

指令代码值类型功能
慢速挡平地步态0x21010300-0将机器人从当前步态切换到低速步态
中速挡平地步态0x21010307-0将机器人从当前步态切换到中速步态
快速挡平地步态0x21010303-0将机器人从当前步态切换到高速步态
爬行挡平地步态0x21010406-0将机器人从当前步态切换到低速爬行步态,或从低速爬行步态切换到普通低速步态
抓地挡 RUG 步态0x21010402-0将机器人从当前步态切换到抓地步态
普通挡 RUG 步态0x21010401-0将机器人从当前步态切换到普通步态
高抬腿挡 RUG 步态0x21010407-0将机器人从当前步态切换到高抬腿步态

机器人当前步态可通过 robot_gait_state 字段读取,状态值定义详见状态机概述与实现。

速度指令是复杂指令,每条速度指令所携带的数据值均为双精度浮点型,需要在机器人处于导航模式时发送。

指令名称指令代码指令类型取值范围
角速度 (rad/s)0x01411[-1.5, 1.5]
机器人 x 轴线速度 (m/s)0x01401[-1.0, 1.0]
机器人 y 轴线速度 (m/s)0x01451[-0.5, 0.5]

机器人状态信息的指令码如下:

指令码指令类型数据内容发送频率
0x09011结构体 RobotStateUpload(具体见下)50 Hz
struct RobotStateUpload{
int robot_basic_state;
int robot_gait_state;
double rpy[3];
double rpy_vel[3];
double xyz_acc[3];
double pos_world[3];
double vel_world[3];
double vel_body[3];
unsigned touch_down_and_stair_trot;
bool is_charging;
unsigned error_state;
int robot_motion_state;
double battery_level;
int task_state;
bool is_robot_need_move;
bool zero_position_flag;
double ultrasound[2];
};

各字段含义如下:

字段类型含义
robot_basic_stateint机器人基本运动状态
robot_gait_stateint机器人当前步态
rpy[3]doubleIMU 角度信息
rpy_vel[3]doubleIMU 角速度信息
xyz_acc[3]doubleIMU 加速度信息
pos_world[3]double机器人在世界坐标系下的位姿信息
vel_world[3]double机器人在世界坐标系下的速度信息
vel_body[3]double机器人在身体坐标系下的速度信息
touch_down_and_stair_trotunsigned无效数据,仅作占位用
is_chargingbool无效数据,仅作占位用
error_stateunsigned无效数据,仅作占位用
robot_motion_stateint机器人动作状态
battery_leveldouble电池电量百分比的小数形式
task_stateint无效数据,仅作占位用
is_robot_need_movebool机器人受外力影响时的平衡状态
zero_position_flagbool回零标志位
ultrasound[2]double超声波数据
变量值机器人基本运动状态
1趴下状态
4准备起立状态
5正在起立状态
6力控状态
7正在趴下状态
8失控保护状态
9姿态调整状态
11执行翻身动作
17回零状态
18执行后空翻动作
20执行打招呼动作

注意: 机器人基本状态的转换关系可参考基本状态切换接口。

变量值步态
0平地低速步态
2通用越障步态
4平地中速步态
5平地高速步态
6抓地越障步态
12太空步步态
13高踏步越障步态

double rpy[3] = {roll, pitch, yaw};

元素名称含义
rollIMU 在世界坐标系下的 roll 角(°)
pitchIMU 在世界坐标系下的 pitch 角(°)
yawIMU 在世界坐标系下的 yaw 角(°)

double rpy_vel[3] = {roll_vel, pitch_vel, yaw_vel};

元素名称含义
roll_velIMU 在世界坐标系下的 roll 角速度(rad/s)
pitch_velIMU 在世界坐标系下的 pitch 角速度(rad/s)
yaw_velIMU 在世界坐标系下的 yaw 角速度(rad/s)

double xyz_acc[3] = {x_acc, y_acc, z_acc};

元素名称含义
x_accIMU 在世界坐标系 x 轴上的加速度(m/s²)
y_accIMU 在世界坐标系 y 轴上的加速度(m/s²)
z_accIMU 在世界坐标系 z 轴上的加速度(m/s²)

double pos_world[3] = {x, y, yaw};

元素名称含义
x机器人在世界坐标系下的 x 轴坐标值(m)
y机器人在世界坐标系下的 y 轴坐标值(m)
yaw机器人在世界坐标系下的 yaw 角(rad)

double vel_world[3] = {x_vel, y_vel, yaw_vel};

元素名称含义
x_vel机器人在世界坐标系 x 轴上的速度(m/s)
y_vel机器人在世界坐标系 y 轴上的速度(m/s)
yaw_vel机器人在世界坐标系下的 yaw 角速度(rad/s)

double vel_body[3] = {x_vel, y_vel, yaw_vel};

元素名称含义
x_vel机器人在身体坐标系 x 轴上的速度(m/s)
y_vel机器人在身体坐标系 y 轴上的速度(m/s)
yaw_vel机器人在身体坐标系下的 yaw 角速度(rad/s)
变量值机器人动作状态
0机器人处于 robot_basic_state 的值对应的状态中
1机器人正在以 robot_gait_state 的值对应的步态踏步
2机器人正在执行扭身体
4机器人正在执行扭身跳
11机器人正在执行向前跳

注意: 机器人基本运动状态 robot_basic_state、机器人步态 robot_gait_state、机器人动作状态 robot_motion_state 共同表示机器人状态。

变量值平衡状态
0可保持平衡
1无法保持平衡,踏步调整姿态
变量值回零状态
0未完成回零或已退出回零状态
1已完成回零

double ultrasound[2] = {forward_distance, backward_distance};

元素名称含义
forward_distance机器人前方障碍物的距离(m)
backward_distance机器人后方障碍物的距离(m)

注意: 超声波有效量程为 [0.28m, 4.50m],当障碍物距离小于 0.28m 时显示为 0.28m,当障碍物距离大于 4.50m 时显示为 4.50m。