1. SDK2 概述与架构原理
1.1 宇树 SDK2 是什么
unitree_sdk2 是宇树科技为开发者提供的机器人二次开发工具包,支持包括 G1 在内的多款人形机器人。这个 SDK 最大的特点是采用了 DDS(Data Distribution Service)通信架构,相比传统的 ROS 通信方式,DDS 在实时性和可靠性方面表现更出色。
在实际开发中,我发现 DDS 架构特别适合机器人这种对实时性要求高的场景。比如在控制 G1 机器人行走时,从传感器数据采集到控制指令下发,整个闭环延迟可以控制在毫秒级。这得益于 DDS 的发布-订阅模型和 QoS(服务质量)策略,开发者可以根据不同数据的重要程度配置不同的传输策略。
SDK 提供了 C++ 和 Python 两个版本:
- C++ 版本适合需要高性能的场景,比如底层关节控制、实时运动规划等
- Python 版本则更适合快速原型验证和算法研究
1.2 宇树 G1 机器人规格解析
G1 作为宇树最新的人形机器人,其硬件配置相当强大。在实际开发中,有几个关键参数需要特别注意:
- 关节扭矩参数:
- 膝关节最大扭矩 90N·m,这个数值决定了机器人的负载能力
- 在编写控制算法时,需要确保指令扭矩不超过这个限制,否则可能损坏电机
- 自由度配置:
- 标准版 23 个自由度,扩展版可达 43 个
- 每个关节的 ID 和运动范围都需要在开发前确认清楚
- 通信接口:
- 固定使用 192.168.123.161 这个 IP
- 实测发现,使用千兆网卡时通信延迟最低
提示:开发前建议先熟悉机器人的机械结构,特别是各关节的运动范围和限位位置,这对后续的运动控制开发很有帮助。
2. 开发环境准备
2.1 系统要求详解
官方推荐使用 Ubuntu 20.04,这个不是随便选的。经过测试,20.04 的实时性表现最好,而且与 CycloneDDS 的兼容性最佳。如果使用其他版本,可能会遇到各种奇怪的依赖问题。
开发机配置建议:
- CPU:至少 4 核,推荐 8 核
- 内存:8GB 起步,16GB 更佳
- 网卡:必须是有线千兆网卡
2.2 依赖安装技巧
安装依赖时有个小技巧:可以一次性安装所有需要的开发工具:
bash复制sudo apt-get install -y cmake g++ build-essential libyaml-cpp-dev libeigen3-dev libboost-all-dev libspdlog-dev libfmt-dev
如果遇到网络问题,可以更换阿里云的源:
bash复制sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
sudo apt-get update
3. SDK 获取与编译
3.1 获取 SDK 的最佳实践
直接从 GitHub 克隆时,可能会遇到网络问题。这里分享几个实测可用的方法:
- 使用 ghproxy 代理:
bash复制git clone https://ghproxy.com/https://github.com/unitreerobotics/unitree_sdk2
- 如果克隆速度慢,可以先只克隆最新的一次提交:
bash复制git clone --depth 1 https://github.com/unitreerobotics/unitree_sdk2
3.2 编译过程中的常见问题
编译时最容易出问题的是 CycloneDDS 的依赖。如果遇到相关错误,可以这样解决:
- 先确认是否安装了必要的开发包:
bash复制sudo apt-get install -y libssl-dev libxml2-dev
- 如果还是报错,可以尝试手动编译安装 CycloneDDS:
bash复制git clone https://github.com/eclipse-cyclonedds/cyclonedds
cd cyclonedds && mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j$(nproc) && sudo make install
4. 网络配置实战
4.1 静态 IP 配置详解
G1 机器人使用固定的 192.168.123.161 这个 IP,开发机需要配置同网段的 IP。推荐使用 192.168.123.100-192.168.123.200 之间的地址。
配置方法:
- 打开网络设置
- 选择有线连接 → IPv4
- 设置为手动,填写:
- IP:192.168.123.100
- 子网掩码:255.255.255.0
- 网关:192.168.123.1
4.2 网络连通性测试
配置完成后,一定要测试连通性:
bash复制ping 192.168.123.161 -c 4
正常应该能看到类似这样的输出:
code复制64 bytes from 192.168.123.161: icmp_seq=1 ttl=64 time=0.456 ms
如果 ping 不通,检查:
- 网线是否插好
- 防火墙是否关闭
- IP 配置是否正确
5. Demo 运行与调试
5.1 机器人准备步骤
在运行 Demo 前,必须按正确流程准备机器人:
- 确保机器人在吊装状态下开机
- 等待进入零力矩模式(关节可以自由摆动)
- 同时按住遥控器的 L2 + R2 进入调试模式
安全提示:第一次运行时,建议先让机器人处于悬空状态,避免意外摔倒造成损坏。
5.2 关节控制 Demo 详解
运行踝关节摆动 Demo:
bash复制./build/bin/g1_ankle_swing_example enp3s0
这个 Demo 的底层原理是:
- 通过 DDS 订阅机器人状态
- 计算正弦波轨迹
- 通过 PD 控制实现关节位置跟踪
如果想修改摆动幅度,可以编辑代码中的相关参数:
cpp复制// 在 g1_ankle_swing_example.cpp 中修改这个值
float amplitude = 0.3; // 弧度值
6. Python SDK 开发技巧
6.1 Python 环境配置
建议使用 virtualenv 创建隔离的 Python 环境:
bash复制python3 -m venv unitree_env
source unitree_env/bin/activate
pip install -e .
6.2 Python 控制示例解析
Python SDK 提供了与 C++ 相同的功能接口。下面是一个完整的控制示例:
python复制import time
import math
from unitree_sdk2py.core.channel import ChannelSubscriber, ChannelPublisher
# 初始化通信
ChannelFactoryInitialize(0, "enp3s0")
# 创建发布器和订阅器
pub = ChannelPublisher("rt/lowcmd", LowCmd_)
sub = ChannelSubscriber("rt/lowstate", LowState_)
# 控制循环
t = 0.0
while True:
cmd = LowCmd_()
# 设置左踝关节位置
cmd.motor_cmd[14].q = 0.2 * math.sin(t)
cmd.motor_cmd[14].kp = 50.0
cmd.motor_cmd[14].kd = 1.0
pub.Write(cmd)
t += 0.002
time.sleep(0.002)
这个示例展示了如何:
- 初始化 DDS 通信
- 创建话题发布器和订阅器
- 实现简单的正弦波位置控制
7. 常见问题解决方案
7.1 编译问题排查
问题:找不到 dds.hpp 头文件
解决方案:
bash复制sudo apt-get install -y ros-noetic-cyclonedds
export CYCLONEDDS_HOME=/opt/ros/noetic
7.2 网络连接问题
问题:DDS 通信失败
检查步骤:
- 确认网卡名称正确
- 检查防火墙设置
- 确认机器人处于调试模式
7.3 Python 导入错误
问题:ImportError: No module named 'unitree_sdk2py'
解决方法:
bash复制cd unitree_sdk2_python
pip install -e .
8. 进阶开发建议
8.1 性能优化技巧
- 使用实时内核:
bash复制sudo apt-get install linux-rt
- 提高进程优先级:
cpp复制#include <sched.h>
sched_setscheduler(0, SCHED_FIFO, ¶m);
8.2 安全注意事项
- 开发时始终使用吊装装置
- 先在小范围内测试动作
- 设置紧急停止开关
8.3 扩展开发方向
- 结合 ROS2 进行开发
- 使用 MuJoCo 进行仿真
- 开发强化学习算法
在实际项目中,我发现先进行仿真验证可以大大提高开发效率。宇树提供了 MuJoCo 的仿真环境,可以在不接触真实机器人的情况下测试算法。
