宇树机器人SDK2开发指南:从环境搭建到Demo测试

宇树机器人SDK2开发指南:从环境搭建到Demo测试
本文以宇树 G1 人形机器人为主线,系统介绍 unitree_sdk2(C++)与 unitree_sdk2_python(Python)的完整开发流程,涵盖通信架构原理、环境搭建、依赖安装、Demo 编译运行、网络配置以及常见问题处理,适合具身智能领域的初中级开发者快速上手。

目录

  1. SDK2 概述与架构原理
  2. 开发环境要求
  3. 获取官方 SDK 包
  4. 安装依赖与编译
  5. 机器人与开发机网络配置
  6. 调试并运行 Demo
  7. Python SDK Demo 测试
  8. 常见问题与解决方案
  9. 总结

1. SDK2 概述与架构原理

1.1 宇树 SDK2 是什么

unitree_sdk2 是宇树科技官方提供的机器人二次开发工具包,支持 Go2、B2、H1、G1 等主流机型在真实环境中的数据通信与运动控制。它是 unitree_legged_sdk 的升级替代版本,底层基于 CycloneDDS 实现了一套高效可靠的机器人通信机制。

SDK 包语言适用场景
unitree_sdk2C++高性能实时控制、底层关节控制、嵌入式开发
unitree_sdk2_pythonPython快速原型验证、上层应用开发、算法研究

1.2 宇树 G1 机器人规格速览

开始开发前,先了解硬件规格有助于正确配置控制参数:

参数项规格
身高(站立)1320 mm
整机重量≈ 35 kg
总自由度(关节电机)23 ~ 43 个(版本不同)
单臂自由度5 DOF(标准)/ 7 DOF(含腕关节)
单腿自由度6 DOF(髋 ×3 + 膝 ×1 + 踝 ×2)
膝关节最大扭矩90 N·m
最大关节扭矩120 N·m
手臂最大负载≈ 3 kg
通信接口以太网(CycloneDDS)
机器人固定 IP192.168.123.161

2. 开发环境要求

项目要求
操作系统Ubuntu 20.04 LTS(推荐,官方完整支持)
编译器GCC 9+ / G++ 9+
构建工具CMake 3.16+
PythonPython 3.8+(建议 3.10)
网络接口有线以太网(需与机器人同网段)
C++ SDKunitree_sdk2
Python SDKunitree_sdk2_python
⚠️ 注意:SDK2 不建议在 Windows 上直接使用;若只有 Windows 主机,需安装 VMware 后在 Ubuntu 虚拟机中开发,但虚拟机的网卡直通配置较复杂,强烈建议使用原生 Ubuntu 系统。

3. 获取官方 SDK 包

3.1 正常网络环境

# 克隆 C++ SDKgit clone https://github.com/unitreerobotics/unitree_sdk2 # 克隆 Python SDKgit clone https://github.com/unitreerobotics/unitree_sdk2_python 

3.2 国内网络加速(可选)

若 GitHub 访问较慢,可将域名替换为国内镜像加速节点:

# 将 https://github.com 替换为 https://bgithub.xyzgit clone https://bgithub.xyz/unitreerobotics/unitree_sdk2 git clone https://bgithub.xyz/unitreerobotics/unitree_sdk2_python # 或使用 Gitee 镜像(若有同步)# git clone https://gitee.com/unitreerobotics/unitree_sdk2

3.3 目录结构预览

克隆完成后,C++ SDK 的核心目录结构如下:

unitree_sdk2/ ├── CMakeLists.txt # 顶层构建文件 ├── include/ │ └── unitree/ # SDK 头文件 │ ├── robot/ # 机器人控制接口 │ └── idl/ # DDS IDL 数据结构定义 ├── example/ │ ├── g1/ # G1 机器人示例 │ │ ├── low_level/ # 底层关节控制 │ │ ├── audio/ # 音频播放 │ │ └── ... │ ├── go2/ # Go2 机器人示例 │ └── h1/ # H1 机器人示例 └── lib/ # 预编译库文件 

4. 安装依赖与编译

4.1 C++ SDK 依赖安装

首先更新系统软件源,然后一次性安装所有编译依赖:

sudoapt-get update sudoapt-getinstall-y\ cmake \ g++ \ build-essential \ libyaml-cpp-dev \ libeigen3-dev \ libboost-all-dev \ libspdlog-dev \ libfmt-dev 
在这里插入图片描述

各依赖包用途说明:

包名用途
cmake / build-essential / g++基础编译工具链
libyaml-cpp-devYAML 配置文件解析(机器人参数配置)
libeigen3-dev线性代数库(矩阵运算、坐标变换)
libboost-all-devC++ 通用工具库(异步 IO、线程等)
libspdlog-dev高性能日志库
libfmt-dev格式化输出库(spdlog 依赖)

4.2 编译 C++ SDK

cd unitree_sdk2 # 方法一:标准两步构建mkdir build cd build cmake ..make
在这里插入图片描述


在这里插入图片描述

4.3 Python SDK 安装

# 确保 pip3 是最新版本sudoaptinstall python3-pip pip3 install--upgrade pip # 进入 Python SDK 目录并以可编辑模式安装cd ~ cd unitree_sdk2_python pip3 install-e.

验证安装是否成功:

python3 -c"import unitree_sdk2py; print('SDK 安装成功!')"

5. 机器人与开发机网络配置

SDK2 通过有线以太网实现 PC 与机器人之间的 DDS 通信,正确的网络配置是连接成功的前提。

5.1 网络拓扑

开发电脑 宇树 G1 机器人 ┌─────────────────┐ 以太网 ┌─────────────────┐ │ eth0(或其他) ├──────────────┤ 固定 IP │ │ 192.168.123.222 │ 网线直连 │ 192.168.123.161 │ └─────────────────┘ 或通过交换机 └─────────────────┘ 
机器人固定使用 192.168.123.161 作为 IP 地址,开发机需设置为同一网段(123 网段)的其他 IP。

5.2 Ubuntu 图形界面配置静态 IP

在这里插入图片描述
  1. 打开 系统设置 → 网络(Network)
  2. 选择连接机器人的有线网卡,点击 ⚙ 设置图标
  3. 选择 IPv4 选项卡,将方式改为 手动(Manual)
  4. 填写以下信息:
字段填写内容
地址(Address)192.168.123.222(或其他 123 网段空闲 IP)
子网掩码(Netmask)255.255.255.0
网关(Gateway)192.168.123.1
  1. 点击 应用(Apply),断开并重新连接网络使配置生效。

5.3 命令行配置静态 IP(可选)

# 查看网卡名称(记住连接机器人的那块网卡名,如 eth0、enp3s0 等)ifconfig# 临时设置(重启后失效,用于快速测试)sudoip addr add192.168.123.222/24 dev eth0 sudoiplinkset eth0 up 

5.4 验证网络连通性

# 测试是否能 ping 通机器人ping192.168.123.161 # 正常输出示例:# PING 192.168.123.161 (192.168.123.161) 56(84) bytes of data.# 64 bytes from 192.168.123.161: icmp_seq=1 ttl=64 time=0.456 ms

5.5 查询实际网卡名称

ifconfig

输出示例:

enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.123.222 netmask 255.255.255.0 broadcast 192.168.123.255 ... lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 ... 
⚠️ 重要:记下连接机器人的网卡名称(如 enp3s0eth0),后续运行 Demo 时需要作为命令行参数传入。不同电脑的网卡名称可能不同,请以实际 ifconfig 输出为准。

6. 调试并运行 Demo

6.1 机器人准备流程

在运行任何 Demo 之前,必须按以下步骤准备机器人:

步骤 1:开机 └── 将机器人在吊装状态下通电启动 ↓ 步骤 2:等待零力矩模式 └── 等待机器人完成自检,进入零力矩(Damping)模式 关节处于自由垂落状态,此时可安全操作 ↓ 步骤 3:进入调试模式 └── 同时长按遥控器 L2 + R2 组合键 机器人进入调试模式,等待外部控制指令 
⚠️ 安全提示:务必在吊装状态下进行调试,防止机器人倒塌造成损坏进入调试模式后,机器人关节将响应外部控制指令,请确保周围无障碍物首次测试建议先以最小幅度运行 Demo,确认行为符合预期后再扩大测试范围

6.2 Step 1:重新编译(首次运行必须)

cd unitree_sdk2 cmake -Bbuild cmake --build build 

6.3 Step 2:运行关节摆动 Demo

以 G1 踝关节摆动为例:

# 语法:./build/bin/<demo名称> <网卡名称> ./build/bin/g1_ankle_swing_example enp3s0 

enp3s0 替换为你实际的网卡名称。

在这里插入图片描述


程序运行后的预期行为:

  1. 终端输出连接状态日志
  2. 订阅机器人 rt/lowstate 话题,接收关节状态
  3. rt/lowcmd 话题发布控制指令
  4. G1 的踝关节开始按正弦波形规律左右摆动

6.4 Step 3:运行音频播放 Demo(C++)

./build/bin/g1_audio_server_example enp3s0 
在这里插入图片描述


预期效果:机器人内置扬声器播放预设音频,可用于验证音频通信链路是否正常。


7. Python SDK Demo 测试

Python SDK 提供了与 C++ SDK 功能等价的接口,更适合快速开发和算法验证。

7.1 运行音频客户端示例

cd unitree_sdk2_python python3 ./example/g1/audio/g1_audio_client_example.py enp3s0 

7.2 Python SDK 使用范例

以下是一个完整的 Python 控制示例,展示如何订阅机器人状态并发布控制指令:

import sys import time import math from unitree_sdk2py.core.channel import ChannelSubscriber, ChannelPublisher, ChannelFactoryInitialize from unitree_sdk2py.idl.unitree_go.msg.dds_ import LowCmd_, LowState_ # 话题名称常量 TOPIC_LOWCMD ="rt/lowcmd" TOPIC_LOWSTATE ="rt/lowstate"classG1Controller:def__init__(self): self.low_state =None self.low_cmd = LowCmd_()definit_cmd(self):"""初始化控制指令结构,所有关节设置为阻尼模式"""for i inrange(35): self.low_cmd.motor_cmd[i].mode =0x01 self.low_cmd.motor_cmd[i].q =0.0 self.low_cmd.motor_cmd[i].dq =0.0 self.low_cmd.motor_cmd[i].kp =0.0 self.low_cmd.motor_cmd[i].kd =0.5# 阻尼系数 self.low_cmd.motor_cmd[i].tau =0.0deflow_state_handler(self, msg: LowState_):"""机器人状态回调函数""" self.low_state = msg defmain():iflen(sys.argv)<2:print("用法: python3 script.py <网卡名称>") sys.exit(1)# 初始化 DDS 通信 ChannelFactoryInitialize(0, sys.argv[1]) ctrl = G1Controller() ctrl.init_cmd()# 创建订阅器(接收机器人状态) sub = ChannelSubscriber(TOPIC_LOWSTATE, LowState_) sub.Init(ctrl.low_state_handler,10)# 创建发布器(发送控制指令) pub = ChannelPublisher(TOPIC_LOWCMD, LowCmd_) pub.Init()print("连接成功,开始控制循环...") t =0.0whileTrue:# 踝关节正弦摆动示例if ctrl.low_state isnotNone: ctrl.low_cmd.motor_cmd[14].q =0.3* math.sin(t)# 左踝关节 ctrl.low_cmd.motor_cmd[14].kp =10.0 ctrl.low_cmd.motor_cmd[14].kd =1.0 pub.Write(ctrl.low_cmd) t +=0.002# 500 Hz 控制频率 time.sleep(0.002)if __name__ =="__main__": main()

8. 常见问题与解决方案

8.1 编译类错误

问题 1:fatal error: dds/dds.hpp: No such file or directory

原因:CycloneDDS 库未正确安装或 CMake 未找到库路径 解决: # 检查 dds.h 是否存在 find /usr -name "dds.hpp" 2>/dev/null # 如果不存在,手动安装 cyclonedds sudo apt-get install -y ros-noetic-cyclonedds # 如果已装 ROS Noetic # 或从源码编译 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 

问题 2:libyaml-cpp 相关编译错误

# 重新安装sudoapt-getinstall--reinstall libyaml-cpp-dev 

8.2 网络连接类错误

问题 3:ping 192.168.123.161 无响应

排查步骤: ① 确认网线物理连接正常(网卡指示灯是否亮起) ② 确认 IP 配置在正确的网卡上(注意多网卡环境) ③ 确认机器人已开机并处于调试模式 ④ 检查防火墙是否阻断了 ICMP 包: sudo ufw disable # 临时关闭防火墙测试 ⑤ 用 ifconfig 确认 PC 端 IP 是否在 192.168.123.x 网段 

问题 4:Demo 运行无响应(DDS 连接失败)

# 确认网卡名称正确(区分大小写)ifconfig|grep-E"^[a-z]"# 以正确网卡名重新运行 ./build/bin/g1_ankle_swing_example enp3s0 # 换成实际网卡名

8.3 Python 环境类错误

问题5:pip3 install -e . 失败

# 升级 pip 后重试 pip3 install--upgrade pip setuptools wheel pip3 install-e.# 若提示权限不足,加 --user 或使用 sudo pip3 install--user-e.

问题6:ModuleNotFoundError: No such module 'unitree_sdk2py'

# 检查是否在正确目录下安装cd ~/unitree_sdk2_python pip3 install-e.# 验证模块路径 python3 -c"import unitree_sdk2py; print(unitree_sdk2py.__file__)"
现象可能原因快速解决
编译时找不到头文件依赖库未安装重新运行 apt-get install 命令
ping 不通网络配置错误检查 IP 地址是否在 123 网段
Demo 运行无输出网卡名称错误ifconfig 查询正确名称
Python 模块找不到未安装 SDK在 SDK 目录执行 pip3 install -e .
关节无响应未进入调试模式重新按 L2 + R2 进入调试模式
编译警告 / 错误依赖版本冲突参考各问题具体解决方案

9. 总结

11.1 完整开发流程回顾

环境准备 ├── Ubuntu 20.04 系统 ├── 安装编译依赖(apt-get) └── 克隆 SDK 仓库 ↓ SDK 编译安装 ├── C++:cmake -B build && cmake --build build └── Python:pip3 install -e . ↓ 网络配置 ├── 开发机设置静态 IP(192.168.123.x 网段) ├── ping 192.168.123.161 验证连通性 └── ifconfig 查询网卡名称 ↓ 机器人准备 ├── 吊装状态下开机 ├── 等待零力矩模式 └── 遥控器 L2 + R2 进入调试模式 ↓ Demo 测试 ├── C++ Demo:./build/bin/g1_ankle_swing_example <网卡名> └── Python Demo:python3 ./example/g1/audio/g1_audio_client_example.py <网卡名> ↓ 二次开发 ├── 仿真验证(unitree_mujoco) └── 真机部署 

参考资源

资源地址
宇树官方文档中心support.unitree.com
C++ SDK 仓库github.com/unitreerobotics/unitree_sdk2
Python SDK 仓库github.com/unitreerobotics/unitree_sdk2_python
MuJoCo 仿真器github.com/unitreerobotics/unitree_mujoco
ROS2 支持包github.com/unitreerobotics/unitree_ros2
强化学习训练框架github.com/unitreerobotics/unitree_rl_gym
宇树开源项目总览unitree.com/cn/mobile/opensource

💬 本文涵盖内容为宇树 SDK2 开发的完整主流程。如需深入了解特定模块(如强化学习部署、全身运动控制、ROS2 集成),欢迎继续探讨。

Read more

前端微前端架构:大项目的救命稻草还是自找麻烦?

前端微前端架构:大项目的救命稻草还是自找麻烦? 毒舌时刻 微前端?听起来就像是一群前端工程师为了显得自己很高级,特意发明的复杂术语。不就是把一个大应用拆成几个小应用嘛,至于搞得这么玄乎吗? 你以为拆成微前端就能解决所有问题?别做梦了!到时候你会发现,调试变得更麻烦了,部署变得更复杂了,甚至连样式都可能互相冲突。 为什么你需要这个 1. 大型应用的可维护性:当你的应用变得越来越大,单靠一个团队已经无法高效维护时,微前端可以让不同团队独立开发和部署各自的模块。 2. 技术栈的灵活性:不同的微前端可以使用不同的技术栈,比如一个模块用React,另一个模块用Vue,这样可以根据团队的专长选择最合适的技术。 3. 独立部署:微前端可以独立部署,不需要整个应用一起发布,这样可以减少发布风险,加快发布速度。 4. 团队协作:不同团队可以独立开发各自的微前端,减少代码冲突和沟通成本。 反面教材 // 这是一个典型的单体应用结构 import React from 'react'; import ReactDOM from 'react-dom'

【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

目录 【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦 一、为什么要做全局错误处理? 1、将业务逻辑与错误处理解耦 2、为监控和埋点提供统一入口 二、Vue 中的基础全局错误处理方式 1、Vue 中全局错误处理写法 2、它会捕获哪些错误? 3、它不会捕获哪些错误? 4、errorHandler 的参数含义 三、全局错误处理的进阶设计 1、定义“可识别的业务错误” 2、在 errorHandler 中做真正的“分类处理” 3、补齐 Promise reject 的捕获能力 4、错误处理的策略化封装 四、结语         作者:watermelo37         ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“

Web 毕设篇-适合练手的 Spring Boot Web 毕业设计项目:智驿AI系统(前后端源码 + 数据库 sql 脚本)

Web 毕设篇-适合练手的 Spring Boot Web 毕业设计项目:智驿AI系统(前后端源码 + 数据库 sql 脚本)

🔥博客主页: 【小扳_-ZEEKLOG博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录         AI系统具有许多优势         1.0 项目介绍         1.1 项目功能         1.2 用户端功能         2.0 用户登录         3.0 首页界面         4.0 物件管理功能         5.0 用户管理功能         6.0 区域管理功能         7.0 物件日志管理功能         8.0 操作日志         AI系统具有许多优势         1)自动化:AI 系统能够自动化执行任务,减少人力和时间成本。它们可以自动处理大量数据并执行复杂的计算,从而提高效率。         2)智能决策:AI 系统可以通过学习和分析数据来做出智能决策。

WSL2 下启动 Webots 地址一直不对:`10.255.255.254` 的原因与修复

WSL2 下启动 Webots 地址一直不对:`10.255.255.254` 的原因与修复

最近在 WSL2 + ROS2 Humble + Webots 环境中运行 webots_ros2_universal_robot 示例时,发现 webots-controller 启动后立刻退出。日志显示它自动使用了一个明显不对的地址: [ERROR] [webots_controller_UR5e-3]: process has died [pid 2087, exit code 1, cmd '/opt/ros/humble/share/webots_ros2_driver/scripts/webots-controller --robot-name=UR5e --protocol=tcp --ip-address=10.255.255.254 --port=1234 ...'