宇树 G1 部署(一)——综述
人形机器人相比于传统协作机器人底层算法完全不一样,主要包括了:VLA、多模态、遥操作、强化学习四大模块
宇树部分主要是后两者,VLA 他家是集成,且多模态他的相机及激光雷达也是集成
后面很多 VLA/RL 算法会在 G1/ur 上部署测试
🤖 宇树官网:宇树科技 | 人形机器人_四足机器人_机器狗
🐾 官方开源资料:官方开源 - 宇树科技
🌐 文档中心:宇树科技 文档中心
📄 此篇笔记主要参考:G1 SDK 开发指南
目录
1 G1 基本参数
1.1 机器人规格
1.2 关节自由度
1.3 电气接口
1.4 调试接口
***1.5 机载计算机
1.6 G1雷达与相机视场角
1.7 关节电机
2 基本操作
3 SDK
3.1 概述
3.2 开发样例
4 底层运动开发
4.1 底层运动参考例程
4.2 因时 DFX 灵巧手开发
5 软件服务接口
5.1 DDS通信接口
5.2 底层服务接口
5.3 高层运动服务接口
1 G1 基本参数
直接参考官方文档:宇树科技 文档中心
1.1 机器人规格
型号 | G1 | G1-EDU |
---|---|---|
高宽厚(站立) | 1320x450x200mm | 1320x450x200mm |
高宽厚(折叠) | 690x450x300mm | 690x450x300mm |
带电池重量 | 约35kg | 约35kg |
总自由度 | 23 | 23~43 |
单腿自由度 | 6 | 6 |
腰部自由度 | 1 | 1+(可加选2个腰部自由度) |
单手臂自由度 | 5 | 5 |
单手自由度 | / | 7(可加选力控3指灵巧手Dex3-1)+2(可加选2个手腕自由度) |
关节输出轴承 | 工业级交叉滚子轴承(高精度,高承载力) | 工业级交叉滚子轴承(高精度,高承载力) |
关节电机 | 低惯量高速内转子永磁同步电机 (更好的响应速度和散热) | 低惯量高速内转子永磁同步电机 (更好的响应速度和散热) |
膝关节最大扭矩[1] | 90N.m | 120N.m |
手臂最大负载[2] | 约2Kg | 约3Kg |
小腿+大腿长度 | 0.6M | 0.6M |
手臂臂展 | 约0.45M | 约0.45M |
超大关节运动空间 | 腰关节:Z±155° 膝关节:0~165° 髋关节:P±154°、R-30~+170°、Y±158° | 腰关节:Z±155°、X±45°、Y±30° 膝关节:0~165° 髋关节:P±154°、R-30~+170°、Y±158° 腕关节:P±92.5°、Y±92.5° |
全关节中空内走线 | 有 | 有 |
关节编码器 | 双编码器 | 双编码器 |
散热系统 | 局部风冷散热 | 局部风冷散热 |
供电方式 | 13串锂电池 | 13串锂电池 |
基础算力 | 8核高性能CPU | 8核高性能CPU |
感知传感器 | 深度相机+3D激光雷达 | 深度相机+3D激光雷达 |
4麦克风阵列 | 有 | 有 |
5w扬声器 | 有 | 有 |
WiFi6、蓝牙5.2 | 有 | 有 |
高算力模组 | / | NVIDIA Jetson Orin |
智能电池(快拆) | 9000mAh | 9000mAh |
充电器 | 54V 5A | 54V 5A |
手持式遥控器 | 有 | 有 |
续航时间 | 约2h | 约2h |
智能OTA升级 | 有 | 有 |
二次开发[3] | / | 有 |
1.2 关节自由度
G1 整机分为上半身和下半身,具备多个自由度:
- 单手臂拥有 5 个自由度和 7 个自由度两个版本,包括肩身关节、上臂关节、手肘关节和腕关节(选配)
- 单腿拥有 6 个自由度,包括胯关节、腿关节、髋关节、膝关节和踝关节
- 腰部具备 1自由度和3自由度两个版本,即腰关节
- 整机根据版本不同,可以分为 G1 基础版本 23 自由度,G1-EDU可选23~43 自由度,拥有多个关节电机自由度,使得机器人能够实现精确的运动和姿态控制
类型 | G1 | G1-EDU |
---|---|---|
总自由度 | 23 | 23~43 |
单腿自由度 | 6 | 6 |
腰部自由度 | 1 | 1+(可加选2个腰部自由度) |
单手臂自由度 | 5 | 5 |
单手自由度 | / | 7(可加选力控3指灵巧手Dex3-1)+ 2(可加选 2 个手腕自由度) |
部件说明 |
|
|
1.3 电气接口
G1 的顶部配备了电气接口,这些接口用于连接各个机身关节电机、传感器外设、网口等
序号 | 接口类型 | 接口简称 | 接口说明 |
---|---|---|---|
1 | XT30UPB-F | VBAT | 58V/5A 电池电源输出(此处直连电池电源) |
2 | XT30UPB-F | 24V | 24V/5A电源输出 |
3 | XT30UPB-F | 12V | 12V/5A电源输出 |
4 | RJ45 | 1000 BASE-T | 千兆以太网 |
5 | RJ45 | 1000 BASE-T | 千兆以太网 |
6 | Type-C | Type-C | 支持USB3.0 host,5V/1.5A电源输出 |
7 | Type-C | Type-C | 支持USB3.0 host,5V/1.5A电源输出 |
8 | Type-C | Type-C | 支持USB3.0 host,5V/1.5A电源输出 |
9 | Type-C | Alt Mode Type-C | 支持USB3.2 host,支持DP1.4 |
10 | I/O | I/O OUT | 12V: 12V/3A电源输出 GPIO详见下表 |
1.4 调试接口
***1.5 机载计算机
G1-EDU 机载标配 1 块【运控计算单元】,并且标配一块【开发计算单元】
参数 | 开发计算单元( PC2 ) |
---|---|
型号 | Jetson Orin NX |
CPU | Arm® Cortex®-A78AE |
内核数 | 8 |
线程数 | 8 |
最大睿频频率 | 2GHz |
显存 | 16G |
内存 | 16G |
缓存 | 2MB L2 + 4MB L3 |
存储 | 2T |
英特尔® 图像处理单元 | 6.0 |
GPU | 搭载 32 个 Tensor Core 的 1024 核 NVIDIA Ampere 架构 GPU |
显卡最大动态频率 | 918MHz |
高斯和神经加速器 | 3.0 |
英特尔®深度学习提升 | 是 |
英特尔®Adaptix™ 技术 | 是 |
英特尔®超线程技术 | 是 |
指令集 | 64bit |
OpenGL | 4.6 |
OpenCL | 3.0 |
DirectX | 12.1 |
IP 地址 | 192.168.123.164 |
- 【运控计算单元】为 Unitree 运动控制程序专用,不对外开放。开发者仅可使用【开发计算单元】进行二次开发。初始用户名:
unitree
, 密码:123
- 表中PC2【开发计算单元】,地址为192.168.123.164
1.6 G1雷达与相机视场角
G1头部搭载 LIVOX-MID360 激光雷达和 D435i 深度相机
MID360激光雷达FOV D435i深度相机FOV
MID360+D435i合并的FOV
1.7 关节电机
G1 关节采用了 Unitree 自研电机,电机的最大扭矩为 120N.m,采用了中空轴线的设计,电机还配备了双编码器
关节顺序名称与关节限位
关节序号 | 关节名称 | 限位(弧度) |
---|---|---|
0 | L_LEG_HIP_PITCH | -2.5307~2.8798 |
1 | L_LEG_HIP_ROLL | -0.5236~2.9671 |
2 | L_LEG_HIP_YAW | -2.7576~2.7576 |
3 | L_LEG_KNEE | -0.087267~2.8798 |
4 | L_LEG_ANKLE_PITCH | -0.87267~0.5236 |
5 | L_LEG_ANKLE_ROLL | -0.2618~0.2618 |
6 | R_LEG_HIP_PITCH | -2.5307~2.8798 |
7 | R_LEG_HIP_ROLL | -2.9671~0.5236 |
8 | R_LEG_HIP_YAW | -2.7576~2.7576 |
9 | R_LEG_KNEE | -0.087267~2.8798 |
10 | R_LEG_ANKLE_PITCH | -0.87267~0.5236 |
11 | R_LEG_ANKLE_ROLL | -0.2618~0.2618 |
12 | WAIST_YAW | -2.618~2.618 |
13 | WAIST_ROLL | -0.52~0.52 |
14 | WAIST_PITCH | -0.52~0.52 |
15 | L_SHOULDER_PITCH | -3.0892~2.6704 |
16 | L_SHOULDER_ROLL | -1.5882~2.2515 |
17 | L_SHOULDER_YAW | -2.618~2.618 |
18 | L_ELBOW | -1.0472~2.0944 |
19 | L_WRIST_ROLL | -1.972222054~1.972222054 |
20 | L_WRIST_PITCH | -1.614429558~1.614429558 |
21 | L_WRIST_YAW | -1.614429558~1.614429558 |
22 | R_SHOULDER_PITCH | -3.0892~2.6704 |
23 | R_SHOULDER_ROLL | -2.2515~1.5882 |
24 | R_SHOULDER_YAW | -2.618~2.618 |
25 | R_ELBOW | -1.0472~2.0944 |
26 | R_WRIST_ROLL | -1.972222054~1.972222054 |
27 | R_WRIST_PITCH | -1.614429558~1.614429558 |
28 | R_WRIST_YAW | -1.614429558~1.614429558 |
坐标系,关节旋转轴与关节零点
当各个关节均为零度时,各坐标系如下图。红色为 x 轴,绿色为 y 轴,蓝色为 z 轴。
23 dof | 29dof |
---|---|
|
|
2 基本操作
G1 遥控器使用说明,请查阅:《G1遥控器使用手册》
模式切换
3 SDK
3.1 概述
unitree_sdk2 是宇树科技为新一代机器人开发的 SDK。SDK 将底层电机控制、高层运动控制等接口进行封装,并提供相关的函数接口
SDK 下载地址:https://github.com/unitreerobotics/unitree_sdk2
简化模型-STEP
机型 | G1-EDU标准版 | G1-EDU进阶版 | G1-EDU旗舰版A | G1-EDU旗舰版B | G1-EDU旗舰版C | G1-EDU旗舰版D |
---|---|---|---|---|---|---|
配置 | 整机 23dof | 整机 29dof | 整机 29dof + 2 只Dex3-1力控3指灵巧手(不含触觉) | 整机 29dof + 2 只Dex3-1力控3指灵巧手(含触觉) | 整机 29dof + 2 只因时DFQ灵巧手 | 整机 29dof + 2 只因时FTP灵巧手 |
简化模型 | G1-EDU 标准版 | G1-EDU 进阶版 | G1-EDU 旗舰版A | G1-EDU 旗舰版B | G1-EDU 旗舰版C | G1-EDU 旗舰版D |
URDF
G1各版本 URDF 已经上传至宇树对外 GitHub 仓库:URDF:Github获取
3.2 开发样例
使用 unitree_sdk2 对 G1 进行快速开发应用
系统环境
推荐在 Ubuntu 系统下进行开发:
- PC1 运行官方服务,不支持开发
- PC2 可以访问开发
网络环境
将用户计算机与 G1 交换机接入同一网络。建议新用户使用网线与转接线将用户计算机接入 G1 交换机,并将与机器人通信的网卡设置在 192.168.123.X 网段下,推荐使用 192.168.123.99
安装与编译
安装 unitree_sdk2:进入 unitree_sdk2 目录,并执行以下命令
cd unitree_sdk2/
mkdir build
cd build
cmake ..
sudo make install
编译自带例子
编译步骤:进入 unitree_sdk2 目录,并按步骤执行以下命令
cd unitree_sdk2
mkdir build
cd build
cmake ..
make
若执行成功,生成的例程会在 unitree_sdk2/build 目录下
修改网络配置
1. 网线一端连接机器人,另一端连接电脑,并开启电脑的 USB Ethernet 后进行配置。机器人机载电脑的 IP 地地址为 192.168.123.161,故需将电脑 USB Ethernet 地址设置为与机器人同一网段,如在 Address 中输入 192.168.123.222
为了测试用户电脑与机器人内置电脑是否正常连接,可在终端中输入 ping 192.168.123.161 进行检测,出现下图类似内容即为连接成功
2. 查看 123 网段对应的网卡名字,通过 ifconfig 命令查看 123 网段的网卡名字,如下图所示:
图中 IP 为 192.168.123.222 对应的网卡名字为 enxf8e43b808e06
需要记住此名字,在运行例程时其将会作为必要参数
Notes:G1 的 IP 可能会不一样,具体查看按照上述步骤一样
例程运行
进入调试模式:按照《快速开始》 的操作流程,确保机器人进入调试模式
编译运行底层控制例程
Note:运行该例程会使 G1 多个关节运动。为了保护机器人,请在运行此例程之前将机器人悬挂起来
cd unitree_sdk2
cmake -Bbuild
cmake --build build
./build/bin/g1_ankle_swing_example network_interface_name
例程解读参考底层运动参考例程
4 底层运动开发
4.1 底层运动参考例程
底层运动开发例程实现了将机器人从任意初始关节位置,复位至零位,然后用两种不同模式控制 G1 机器人踝关节摆动,并且以一定频率打印欧拉角数据
例程源代码位于 unitree_sdk2/example/g1/low_level/g1_ankle_swing_example.cpp,可从此处访问,运行方式详见 《快速开发》
G1 机器人踝关节控制模式
G1 踝关节采用并联机构,为用户提供了两种控制模式:
- PR 模式:控制踝关节的 Pitch(P) 和 Roll(R) 电机 (默认模式,对应 URDF 模型)
- AB 模式:直接控制踝关节的 A 和 B 电机 (需要用户自己计算并联机构运动学)
因为 G1 机器人踝关节并联机构的 PR 与 AB 关节运动存在两组约束关系,所以踝关节实际只有两个自由度。硬件实现上,AB 关节处于主动控制 (电机直接驱动),而 PR 关节处于从动状态。为实现PR 模式,采用间接调节 AB 关节从而实现对 PR 关节的控制
G1 机器人腰部 Pitch 和 Roll 关节同样采用了并联机构,也提供了 PR 模式和 AB 模式两种控制模式
代码解析
以下代码针对 G1 29dof 版本机型,其他版本机型的例程均在 unitree_sdk2 仓库
核心类型与功能介绍
类型名称 | 描述 |
---|---|
DataBuffer | 多线程数据缓存工具类 |
ImuState | IMU 相关结构体 |
MotorCommand | 电机指令相关结构体 |
MotorState | 电机状态相关结构体 |
Mode | G1 踝关节控制模式 |
G1JointIndex | 所有关节按名称排序索引 |
G1Example | 核心控制逻辑类 |
4.2 因时 DFX 灵巧手开发
G1搭载了 Inspire Robotics(RH56DFTP) 仿人五指灵巧手,该灵巧手具有6个自由度和12个运动关节,可以模拟人手实现复杂动作
控制方式
因时机械手官方 SDK 通过串口进行通讯,G1 提供一个 USB 转串口模块,用户可以将该 USB 插在 G1 开发计算单元(PC2)上进行通讯控制灵巧手
此时端口通常左手为 /dev/ttyUSB1,右手为 /dev/ttyUSB2
- 使用因时官方 SDK 控制:可以根据因时灵巧手官方通讯协议自行编写程序控制灵巧手
- 使用宇树灵巧手SDK控制:G1通信建立在 DDS 框架之上。为便于使用 unitree_sdk2 进行控制灵巧手,宇树提供将串口收发的数据转为 DDS 消息的示例程序(点击下载)
宇树SDK接口说明
用户向 "rt/inspire/cmd" 话题发送 "unitree_go::msg::dds::MotorCmds_" 消息控制灵巧手
从 "rt/inspire/state" 话题接受 "unitree_go::msg::dds::MotorStates_" 消息获取灵巧手状态
IDL数据格式
采用数组格式的电机数据,内部包含双手12个电机数据。具体 MotorCmd_.idl 和 MotorState_.idl 的格式见 底层服务接口
Note:当前灵巧手只支持关节控制,即在 idl 格式中只有参数 q 有意义。其他保留
# namespace unitree_go::msg::dds_# unitree_go::msg::dds_::MotorCmds_
struct MotorCmds_
{sequence<unitree_go::msg::dds_::MotorCmd_> cmds;
};# unitree_go::msg::dds_::MotorStates_
struct MotorCmds_
{sequence<unitree_go::msg::dds_::MotorState> states;
};
5 软件服务接口
G1 的软件接口服务与宇树其他产品 Go2、B2、H1 基本一致,支持订阅/发布和请求/响应两种模式
- 订阅/发布:接收方订阅某个消息,发送方根据订阅列表向接收方发送消息,主要用于中高频或持续的数据交互
- 请求/响应:问答模式,通过请求实现数据获取或操作。用于低频或功能切换时的数据交互
其中官方提供的 unitree_sdk2 对于请求相应部分进行了优化封装,实现了函数式调用
详细服务接口请查看子文档
5.1 DDS通信接口
unitree_sdk2 是在DDS上做了一层封装,支持 DDS 组件的 Qos 配置,对应用开发提供简单的封装接口,并实现了基于 DDS Topic 的 RPC 机制,适用于在 G1 内部进程间以及 G1 外部与内部的进程间通过发布/订阅和请求/响应两种方式完成不同场景下的数据通信
DDS 简介
DDS(全称 Data Distribution Service 数据分发服务),是一个中间件,由OMG发布的分布式通信规范,采用发布/订阅模型,提供多种QoS服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求
5.2 底层服务接口
底层通信提供了用户端 PC(PC2/外部 PC)与机器人之间的数据交互功能。底层通信采用 DDS 协议:
- 订阅话题 rt/lowstate(类型: unitree_hg::msg::dds_::LowState_) 获取 G1 当前状态
- 发布话题 rt/lowcmd(类型: unitree_hg::msg::dds_::LowCmd_) 控制全身关节电机(不含灵巧手)、电池等设备
- 若使用 Dex3-1 力控灵巧手,需发布话题 rt/dex3/(left or right)/cmd(类型: unitree_hg::msg::dds_::HandCmd_) 控制灵巧手,并从 rt/dex3/(left or right)/state(类型: unitree_hg::msg::dds_::HandState_) 话题接受灵巧手状态
接口说明
采用 DDS通信接口 里介绍的方法订阅或发布话题。话题信息存储在由 IDL 定义的结构体中,常用结构体有:
结构体名称 | 说明 |
---|---|
HandCmd_ | Dex3-1 控制 |
HandState_ | Dex3-1 状态 |
IMUState_ | G1 IMU 状态 |
LowCmd_ | G1 底层控制 |
LowState_ | G1 底层状态 |
MotorCmd_ | G1 电机控制 |
MotorState_ | G1 电机状态 |
PressSensorState_ | Dex3-1 触觉状态 |
5.3 高层运动服务接口
高层运动服务接口的主要功能为机器人整机控制和上肢控制。整机控制可以控制机器人的模式切换与移动,提供 RPC 接口;上肢控制可以在运行机器人内置移动控制器的同时,单独控制上肢电机完成操作任务,提供 DDS 接口
Note:高层运动服务依赖于内置运控,进入调试模式后内置运控完全退出,高层运动服务失效。
RPC接口
用户可以创建 unitree::robot::g1::LocoClient 对象,通过成员函数发送请求,内置的高层运动服务响应请求,执行操作
#include <unitree/robot/g1/loco/g1_loco_client.hpp>
#include <unitree/robot/g1/loco/g1_loco_api.hpp>unitree::robot::g1::LocoClient client;
DDS 接口
DDS 接口支持上肢控制,仅能在锁定站立、运控 1 与运控 2 中使用
用户可以根据《DDS 通信接口》与底层服务《底层服务接口》,向 rt/arm_sdk 话题发送 LowCmd 类型的消息。参照《关节电机顺序》,为上肢设置电机指令