XGO串口通信协议
文档目的和对象
本文档适用于任意上位机与XGO系列机器驱动板之间命令/数据交互的通信协议。示用于高阶开发者对XGO进行二次开发。
软件接口
采用标准TTL串行通讯。
| 波特率 | 115200 |
|---|---|
| 数据位 | 8 |
| 停止位 | 1 |
| 奇偶校验位 | 无 |
数据帧格式
数据帧采用固定格式:帧头+帧长度+数据+校验和+帧尾。
| 帧头 | 固定为0x55 0x00 |
|---|---|
| 帧长度 | 整个数据帧的字节数 |
| 数据 | 依据指令类型有不同含义,见第二部分 |
| 校验和 | 长度和数据的所有字节相加,取最低字节,然后取反 |
| 帧尾 | 固定为0x00 0xAA |
指令
建议上位机每条指令之间的间隔至少为1ms,以防发送指令过快,机器狗来不及处理出现丢包的现象。
可以参考python库中send和read的代码。
写指令,无应答(0x00)
| 帧头 | 帧长度 | 指令类型 | 首地址 | 数据 | 校验和 | 帧尾 |
|---|---|---|---|---|---|---|
| 0x55 0x00 | 0x00 | data | 0x00 0xAA |
写指令会修改从首地址开始的数据,不会产生应答。
:::color1
例如修改机器狗的前进速度,前进速度地址为0x30,以最大速度前进,即速度内容为0xFF,具体指令如下:
0x55 0x00 0x09 0x00 0x30 0xFF 0xC7 0x00 0xAA
其中校验和计算过程如下:
0x09+0x00+0x30+0xFF=0x138,取最低字节0x38,取反得0xC7
:::
读指令,有应答(0x02)
| 帧头 | 帧长度 | 指令类型 | 首地址 | 读取长度 | 校验和 | 帧尾 |
|---|---|---|---|---|---|---|
| 0x55 0x00 | 0x02 | uint_8 | 0x00 0xAA |
写指令会连续读取从首地址开始的数据,不会产生应答。
返回数据包的格式为:
| 帧头 | 帧长度 | 指令类型 | 首地址 | 数据 | 校验和 | 帧尾 |
|---|---|---|---|---|---|---|
| 0x55 0x00 | 0x12 | data | 0x00 0xAA |
:::color1
例如读取12个舵机的角度,0x50为第一个舵机位置的地址,0x0C意思为连续读取12个,具体指令如下:
0x55 0x00 0x09 0x02 0x50 0x0C 0x98 0x00 0xAA
其中校验和计算过程如下:
0x09+0x02+0x50+0x0C=0x67,取反得0x98
读取返回数据包:
0x55 0x00 0x14 0x12 0x50 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x80 0x89 0x00 0xAA
:::
整机坐标系
在初始站姿情况下,原点位于机身正下方,机器狗前进方向为X轴正向,左为Y轴正向,上为Z轴正向。

单腿坐标系
单腿坐标系用于描述足端的位置,四条腿对应四个独立的单腿坐标系,大腿关节为原点,机器狗前进方向为x轴正向,左为Y轴正向,下为Z轴正向。

舵机编号
| 肩(3) | 臂(2) | 肘(1) | |
|---|---|---|---|
| 左前腿(1) | 13 | 12 | 11 |
| 右前腿(2) | 23 | 22 | 21 |
| 右后腿(3) | 33 | 32 | 31 |
| 左后腿(4) | 43 | 42 | 41 |
机器狗内存表 2023-12-12
| 地址 | 功能 | 读写 | 初始值 | 备注 | 模式 |
|---|---|---|---|---|---|
| 0x00 | 工作状态 | 读 | 0x00 | 状态信息 | |
| 0x01 | 电池电量 | 读 | 0xff | 范围为0-100,线性对应电量最低值-最高值 | |
| 0x03 | 表演模式 | 写 | 0x00 | 0x00正常控制模式 | 0x01循环做动作 |
| 0x04 | 标定模式 | 写 | 0x00 | 0x01进入标定模式 0x00退出标定模式完成标定 | |
| 0x05 | 更新固件 | 写 | 0x00 | 0x01进入更新模式,下位机会发送一条同样的指令作为答复,延时1s后上位机开始传输hex | |
| 0x06 | 设置原点 | 0x01设置,将当前朝向设置为0度 | |||
| 0x07 | 固件版本 | 读 | 返回10字节的字符串 | ||
| 0x09 | 步态 | 写 | 0x00 | 0x00 TROT | 0x01 WALK |
| 0x20 | 卸载舵机 | 读写 | 0x00 | 0x00舵机处于正常工作状态,0x01卸载所有舵机,0x11-0x14依次卸载1-4号腿,0x21-0x24依次恢复1-4号腿 | 调试模式 |
| 0x21 | 重置舵机零位 | 写 | 0x00 | 0x00舵机处于正常工作状态0x01所有舵机记录当前位置为零位 该寄存器设定为0x01后,会自动跳变为0x00 | |
| 0x30 | 前后移动速度 | 读写 | 0x80 | 范围为0x00-0xff,线性对应反向最大值-正向最大值,正方向按机器人坐标系,下同(注③) | 整机模式 |
| 0x31 | 左右移动速度 | 读写 | 0x80 | ||
| 0x32 | 顺逆时针旋转速度 | 读写 | 0x80 | 迎着z轴射来方向顺时针对应最大值方向 | |
| 0x33 | 身体沿x方向平移距离 | 读写 | 0x80 | 足端与地面接触点不变而身体扭动,下同 | |
| 0x34 | 身体沿y方向平移距离 | 读写 | 0x80 | ||
| 0x35 | 身体高度 | 读写 | 0x80 | ||
| 0x36 | 身体绕x轴旋转角度 | 读写 | 0x80 | 迎着坐标轴射来方向顺时针对应最大值方向,下同 | |
| 0x37 | 身体绕y轴旋转角度 | 读写 | 0x80 | ||
| 0x38 | 身体绕z轴旋转角度 | 读写 | 0x80 | ||
| 0x39 | 以一定周期绕x轴旋转身体 | 读写 | 0x00 | 0x00停止,0x01-0xff线性对应最小-最大旋转速度 ,该功能与直接设置位置寄存器不能同时起作用 | |
| 0x3A | 以一定周期绕y轴旋转身体 | 读写 | 0x00 | ||
| 0x3B | 以一定周期绕z轴旋转身体 | 读写 | 0x00 | ||
| 0x3C | 原地踏步 | 读写 | 0x00 | 0x00停止,0x01-0xff线性对应最小-最大踏步高度 | |
| 0x3D | 运动模式 | 读写 | 0x00 | 0x00常速运动0x01慢速运动0x02高速运动 | |
| 0x3E | 动作指令 | 写 | 0x00 | 详情见动作指令表 255为恢复默认姿态 1-N为各个动作(见右侧) | |
| 0x3F | 旋转到指定角度 | 写 | 参考0x06,输入类型为short(int16) | ||
| 0x80 | 以一定周期沿X轴方向平移运动 | 读写 | 0x00 | 0x00停止,0x01-0xff对应最小-最大旋转速度,移动幅度为位置限幅的一半 | |
| 0x81 | 以一定周期沿Y轴方向平移运动 | 读写 | 0x00 | ||
| 0x82 | 以一定周期沿Z轴方向平移运动 | 读写 | 0x00 | ||
| 0x40 | 左前腿x方向足端位置 | 读写 | 0x80 | 范围为0x00-0xff,线性对应反向最大值-正向最大值,正方向按机器人坐标系,下同 | 单腿模式 |
| 0x41 | 左前腿y方向足端位置 | 读写 | 0x80 | ||
| 0x42 | 左前腿z方向足端位置 | 读写 | 0x80 | ||
| 0x43 | 右前腿x方向足端位置 | 读写 | 0x80 | ||
| 0x44 | 右前腿y方向足端位置 | 读写 | 0x80 | ||
| 0x45 | 右前腿z方向足端位置 | 读写 | 0x80 | ||
| 0x46 | 右后腿x方向足端位置 | 读写 | 0x80 | ||
| 0x47 | 右后腿y方向足端位置 | 读写 | 0x80 | ||
| 0x48 | 右后腿z方向足端位置 | 读写 | 0x80 | ||
| 0x49 | 左后腿x方向足端位置 | 读写 | 0x80 | ||
| 0x4A | 左后腿y方向足端位置 | 读写 | 0x80 | ||
| 0x4B | 左后腿z方向足端位置 | 读写 | 0x80 | ||
| 0x50 | ID为11舵机位置 | 读写 | 0x80 | 范围为0x00-0xff,线性对应反向最大值-正向最大值,下同 | 舵机模式 |
| 0x51 | ID为12舵机位置 | 读写 | 0x80 | ||
| 0x52 | ID为13舵机位置 | 读写 | 0x80 | ||
| 0x53 | ID为21舵机位置 | 读写 | 0x80 | ||
| 0x54 | ID为22舵机位置 | 读写 | 0x80 | ||
| 0x55 | ID为23舵机位置 | 读写 | 0x80 | ||
| 0x56 | ID为31舵机位置 | 读写 | 0x80 | ||
| 0x57 | ID为32舵机位置 | 读写 | 0x80 | ||
| 0x58 | ID为33舵机位置 | 读写 | 0x80 | ||
| 0x59 | ID为41舵机位置 | 读写 | 0x80 | ||
| 0x5A | ID为42舵机位置 | 读写 | 0x80 | ||
| 0x5B | ID为43舵机位置 | 读写 | 0x80 | ||
| 0x5C | 设置舵机速度 | 读写 | 0x80 | 范围为0x00-0xff,线性对应最小值-最大值(仅在该模式下有效) | |
| 0x5D | ID为52舵机位置 | 读写 | 0x80 | 机械臂小臂舵机 | |
| 0x5E | ID为53舵机位置 | 读写 | 0x80 | 机械臂大臂舵机 | |
| 0x60 | 陀螺仪YAW漂移校准 | 写 | 0x00 | 先平稳放置,然后写入0x01,背部指示灯停止闪烁后完成校准(大约五秒),单独使用,不要在程序运行过程中使用 | |
| 0x61 | IMU状态 | 读写 | 0x00 | 0x00关闭 0x01自稳定模式 | |
| 0x62 | ROLL角度 float类型 | 读 | |||
| 0x63 | PITCH角度 float类型 | 读 | |||
| 0x64 | YAW角度 float类型 | 读 | |||
| 0x66 | ROLL角度 short类型 | 读 | |||
| 0x67 | PITCH角度 short类型 | 读 | |||
| 0x68 | YAW角度 short类型 | 读 | |||
| 0x71 | 夹爪状态 | 写 | 0x80 | 0x00-0xFF,0x00对应夹爪完全张开 | 0xFF对应夹爪完全张开 |
| 0x72 | 机械臂稳定模式 | 写 | 0x00 | 0x00不启用自稳定,0x01启动稳定模式,身体在平移时机械臂末端在空间中的位置不变 | |
| 0x73 | 夹爪X轴位置 | 写 | 0x80 | 0x00-0xFF,对应[-80mm,155mm],机械臂坐标系原点位于机械臂大臂舵机转动轴处 | |
| 0x74 | 夹爪Z轴位置 | 写 | 0x80 | 0x00-0xFF,对应[-95mm,155mm] | |
| 0x75 | 机械臂大小臂舵机速度 | 写 | 0x00 | 范围为0x00-0xff,线性对应最小值-最大值 夹爪速度始终最快 | |
| 0x76 | 机械臂极坐标角度 | 写 | 0x80 | 范围为0x00-0xff,线性对应70°~270° 身体背部为0°,正前方为180° | |
| 0x77 | 机械臂极坐标半径 | 写 | 0x80 | 范围为0x00-0xff,线性对应80mm~140mm 210-270°区间,因为会和屏幕干涉,有控制盲区无法到达较小的半径。 如果想要抓取地下的物体,采用舵机控制指令,直接设定舵机角度更加方便。 | |
| 0x90 | 2Pin接口 5V输出 | 写 | 0x00 | 开机时输出低电平 0输出低电平 | 1输出高电平 5V供电(开关),注释:低电平是关,高电平是开 |
| 0x91 | 数字IO输出 | 写 | 0x00 | 开机时输出低电平 0输出低电平 | 1输出高电平 电磁阀(开关) ,注释:低电平是关,高电平是开 |
| 0x92 | 模拟读取 | 读 | 0x00 | 返回单字节数据,范围0-255 | |
| 0x93 | 数字读取 | 读 | 0x00 | 返回单字节数据,范围0-1 | |
| 0x69 | 1号LED的颜色 | 写 | 写入三个字节数据,数值范围为0-255,代表RGB的亮度,[0,0,0]代表灭,[255,255,255]代表最亮的白光 | ||
| 0x6A | 2号LED的颜色 | 写 | |||
| 0x6B | 3号LED的颜色 | 写 |
机器狗动作内容
动作执行过程中可以被其他指令打断,并且动作执行完成之后不会向上位机发送任何信息,如果希望动作完成之后自动正常执行下一条命令,可以在发送动作指令之后手动给一定的延时
| 动作ID(十进制) | 动作内容 | 执行时间(秒) |
|---|---|---|
| 1 | 趴下 | 3 |
| 2 | 站起 | 3 |
| 3 | 匍匐前进 | 5 |
| 4 | 转圈 | 5 |
| 6 | 蹲起 | 4 |
| 7 | 转动Roll | 4 |
| 8 | 转动Pitch | 4 |
| 9 | 转动Yaw | 4 |
| 10 | 三轴转动 | 7 |
| 11 | 撒尿 | 7 |
| 12 | 坐下 | 5 |
| 13 | 招手 | 7 |
| 14 | 伸懒腰 | 10 |
| 15 | 波浪 | 6 |
| 16 | 左右摇摆 | 6 |
| 17 | 求食 | 4 |
| 18 | 找食物 | 6 |
| 19 | 握手 | 10 |
| 20 | 鸡头 | 9 |
| 21 | 俯卧撑 | 8 |
| 22 | 张望 | 7 |
| 23 | 跳舞 | 6 |
| 24 | 调皮 | 7 |
| 128 | 上抓 | 10 |
| 129 | 中抓 | 10 |
| 130 | 下抓 | 10 |
| 255 | 恢复默认姿态 | 1 |
| 144 | 爬楼梯 | 12 |
双轮足内存表 2024-11
| 地址 | 功能 | 读写 | 初始值 | 备注 |
|---|---|---|---|---|
| 0x01 | 电池电量 | 读 | 0xff | 范围为0-100,线性对应电量最低值-最高值 |
| 0x02 | 工作状态 | 读 | 0x01 | 0x00 倒地状态 |
| 0x03 | 表演模式 | 写 | 0x00 | 0x00正常控制模式 |
| 0x04 | 标定模式 | 写 | 0x00 | 0x01进入标定模式 0x00退出标定模式完成标定 |
| 0x05 | 更新固件 | 写 | 0x00 | 0x01进入更新模式,下位机会发送一条内容为0x55的指令作为答复,延时1s后上位机开始传输hex |
| 0x06 | 设置原点 | 写 | 0x00 | 0x01设置,将当前朝向设置为0度,里程计归零 |
| 0x07 | 固件版本 | 读 | 返回10字节的字符串,例如"R-1.2.3" L代表lite M代表mini R代表rider | |
| 0x08 | 数据自动反馈 | 写 | 0x00 | 以50Hz频率向串口发送 电量 关节角 imu6轴数据 里程计 的数据包 |
| 0x0A | 静态转向环开关 | 写 | 0x01 | 0x00 关 |
| 0x13 | 蓝牙名称 | 写 | 可命名长度为20个字节,只能是英文和数字的组合,命名后蓝牙名称为XGORider_xxxx | |
| 0x30 | 前后移动速度 | 写 | 0x80 | 范围为0x00-0xff,线性对应反向最大值-正向最大值 |
| 0x32 | 顺逆时针旋转速度 | 写 | 0x80 | 迎着z轴射来方向顺时针对应最大值方向 |
| 0x35 | 身体高度 | 写 | 0x80 | |
| 0x39 | 以一定周期绕x轴旋转身体 | 写 | 0x00 | 0x00停止,0x01-0xff线性对应最小-最大旋转速度 ,该功能与直接设置roll不能同时起作用 |
| 0x3E | 动作指令 | 写 | 0x00 | 详情见动作指令表 255为恢复默认姿态 1-N为各个动作 |
| 0x82 | 以一定周期沿Z轴方向平移运动 | 写 | 0x00 | 0x00停止,0x01-0xff对应最小-最大旋转速度,移动幅度为位置限幅的一半 |
| 0x61 | ROLL平衡模式 | 写 | 0x00 | 0x00关闭 0x01自稳定模式 |
| 0x62 | ROLL角度 | 读 | float | |
| 0x63 | PITCH角度 | 读 | float | |
| 0x64 | YAW角度 | 读 | float | |
| 0x65 | IMU 6轴数据 | 读 | float*6 一共24字节 | |
| 0x66 | ROLL角度 | 读 | int16 | |
| 0x67 | PITCH角度 | 读 | int16 | |
| 0x68 | YAW角度 | 读 | int16 | |
| 0x69 | 1号LED的颜色 | 写 | 三个字节,数值范围为0-255,[0,0,0]代表灭,[255,255,255]代表最亮的白光 | |
| 0x6A | 2号LED的颜色 | 写 | 同上 | |
| 0x6B | 3号LED的颜色 | 写 | 同上 | |
| 0x6C | 4号LED的颜色 | 写 | 同上 |
| 动作ID (十进制) | 动作内容 |
|---|---|
| 1 | 左右摇摆 |
| 2 | 高低起伏 |
| 3 | 前进后退 |
| 4 | 四方蛇形 |
| 5 | 升降旋转 |
| 6 | 圆周晃动 |
