【新手入门】宇树 G1 LED 灯控制开发实操指南
对于刚接触宇树 G1 的同学,在刚拿到宇树 G1 的时候,是不是被它的机械质感和灵活动作圈粉了?用手柄操控着它转圈圈、做动作,新鲜劲过了之后,是不是总想自己写段代码,让它多些 “专属小细节”?
相较于复杂的运动控制,控制额头 LED 灯颜色变换是入门的理想选择 —— 既无 需深入底层硬件细节,又能完整体验二次开发的核心流程。本文将以实用为导向,带你梳理从准备到运行的全步骤,助力快速掌握 G1 开发的基础逻辑。
一、先搞懂:开发 G1 前必须知道的 3 件事
作为新手,最容易犯的错就是上来就写代码,结果卡在 “不知道往哪写”“为什么跑不通” 上。其实先花 10 分钟搞懂这 3 个核心点,后面会顺畅很多:
1、官方资源是核心依据
宇树提供的《G1 SDK 开发指南》及 GitHub 上的unitree_sdk2包,是开发的核心参考。文档中不仅包含接口定义、数据交互规则,还提供了适配不同功能的示例代码,建议优先通读 “DDS 消息中间件”“软件服务接口” 两章节 —— 前者是 G1 各模块(电机、传感器等)数据交互的基础,后者直接关联功能控制接口。
https://support.unitree.com/home/zh/G1_developer

其中,DDS 的两种数据交互模式需重点理解:
订阅/发布: 接收方订阅某个消息,发送方根据订阅列表向接收方发送消息,主要用于中高频或持续的数据交互。(如雷达点云、电机状态实时反馈等)
请求/响应: 问答模式,通过请求实现数据获取或操作。用于低频或功能切换时的数据交互。(如模式切换等)
2、G1 的 “两台电脑”:别找错开发对象

宇树G1系统架构图
G1-EDU标准版里藏了两台计算单元(PC1 和 PC2),我们可以在PC2上进行开发(PC2 的固定 IP:192.168.123.164)也可以在自己的开发电脑上开发 ——PC1 是宇树专门用来跑运动控制的 “核心大脑”,不对外开放。
3、高层 / 底层开发:咱们先从 “简单模式” 开始
G1 开发分为高层与底层两类:
高层开发:基于宇树封装的接口实现功能,无需关注电机控制算法、硬件驱动等细节,如 LED 控制、预设动作调用;
底层开发:需编写电机速度、力矩等参数的控制逻辑,需进入调试模式,适合有一定硬件基础的开发者。
我们新手不用一上来就啃 “底层电机控制”(那得懂力矩、位置参数,太复杂)。本次控制 LED 灯,属于 “高层开发”—— 不用管硬件细节,直接调用宇树封装好的接口就行。
二、开发环境搭建:关键步骤与避坑要点
环境搭建的核心是确保 “开发电脑与 G1 正常通信” 及 “SDK 可正常编译”,如果开发环境没搭好,后面代码写得再溜也白搭。具体步骤如下:
1、系统环境要求

支持Ubuntu20.04及以上系统(暂不兼容 Mac、Windows),如果你的电脑不是这个系统,建议要么装双系统,要么用虚拟机(但虚拟机连网容易出问题,新手优先推荐双系统)。
2、连网:确保和 G1 “在同一个网里”
这是开发前的关键验证环节,操作不当会导致后续程序无法与 G1 通信:
用网线将开发电脑与 G1 的交换机直连(G1 机身脖颈处有网线通信接口);
将开发电脑的网卡 IP 设置为192.168.123.X网段(本文设置为192.168.123.222,避免与其他设备 IP 冲突);
验证连通性:打开终端输入ping 192.168.123.161,若显示 “64 bytes from ...” 则说明网络正常;若提示 “Request timeout”,需检查网线连接、IP 配置是否正确。



3、SDK 获取与解压
从 GitHub 仓库(unitreerobotics/unitree_sdk2)下载最新 SDK 包,解压至开发电脑的自定义目录(如~/unitree_dev/unitree_sdk2)。 SDK 已经把复杂的底层逻辑(比如怎么跟电机通信)都封装好了,我们不用自己写,直接调用里面的函数就行 —— 相当于别人帮你搭好了积木底座,你只需要拼上面的造型。

git clone https://github.com/unitreerobotics/unitree_sdk2
三、SDK 编译与官方例程验证
在编写自定义代码前,建议先编译 SDK 并运行官方例程,确认环境无问题:
1、SDK 编译步骤
进入 SDK 根目录,执行以下命令完成编译:
cd unitree_sdk2/mkdir buildcd buildcmake ..sudo make install
2、官方例程验证
终端中输入 ./例程文件名 网卡名称
编译完成后,可运行官方例程(如官方文档中的G1足部摆动例程),验证开发环境与 G1 的通信是否正常。需注意:部分例程需 G1 进入 “调试模式”,具体操作可参考《开发指南》中的 相关章节,避免因模式错误导致例程无法运行。
四、核心步骤:写代码让 LED 灯 “变色”
本次要实现的目标:让 G1 额头的 LED 灯,循环切换颜色。
1、核心思路拆解
1. 先找对 “控制开关”:LED 灯的接口在哪
打开《G1 SDK 开发指南》,找到 “软件服务接口→音频灯光服务接口”,能看到一个叫AudioClient的类 —— 别看名字带 “音频”,它其实也管灯光控制。里面有个专门的函数LedControl(uint8_t R, uint8_t G, uint8_t B),就是我们要找的 “开关”:


查阅接口文档:在 "软件服务接口 - 音频灯光服务接口" 中,确认AudioClient类提供 LED 控制功能;
核心函数:LedControl(uint8_t R, uint8_t G, uint8_t B),通过 RGB 三原色参数(取值范围 0-255)控制灯光颜色;
实现逻辑:通过循环切换 RGB 参数值,结合接口要求的 200ms 调用间隔(这个函数调用间隔要大于 200ms,不然 G1 反应不过来),实现 LED 灯颜色变换。
2.写代码:复制粘贴 + 简单修改就行
不用新建文件夹,直接在 SDK 的example/audio目录下,新建一个叫g1_light_demo.cpp的文件(用 VSCode 打开这个目录,右键新建就行)。然后把下面的代码复制进去,道非这里加了超详细注释,新手也能看懂每一行在干嘛:
#include//包含 C++ 标准输入输出库,用于后续的std::cout输出信息#include//包含 Unitree G1 机器人的音频客户端头文件。该头文件中定义了g1::AudioClient类#include//包含 Unitree 公共库中的时间工具头文件,提供unitree::common::Sleep等时间相关函数,用于程序中的延时操作。//程序主函数,argc是命令行参数数量,argv是参数数组(存储参数内容)int main(int argc, char const *argv[]){//检查命令行参数数量是否小于 2if (argc 2){std::cout "别忘了输入网卡名称"exit(0);}//在unitree::robot 下,提供了一个ChannelFactory 的单例,用于创建基于 DDS Topic 的 Channel。//ChannelFactory 在使用前必须调用初始化接口,以对底层的 DDS 配置进行初始化unitree::robot::ChannelFactory::Instance()->Init(0, argv[1]);//实例化 G1 机器人的音频客户端对象client。该类封装了与机器人音频模块(及关联外设,如 LED)通信的接口。unitree::robot::g1::AudioClient client;//调用客户端的Init方法,完成客户端的初始化(如建立与机器人的连接、初始化通信协议等),为后续控制操作做准备。client.Init();/*调用SetTimeout方法设置客户端 API 调用的超时时间为 10 秒(float参数单位为秒)。作用:当调用LedControl等方法时,如果超过 10 秒未收到机器人的响应,会触发超时机制(避免程序无限期阻塞)。*/client.SetTimeout(10.0f);int i = 0;while (i 3){client.LedControl(0, 255, 0); //设置绿色unitree::common::Sleep(1); //暂停1sclient.LedControl(255, 0, 0); //设置红色unitree::common::Sleep(1);client.LedControl(0, 0, 255); //设置蓝色unitree::common::Sleep(1);i = i + 1;}std::cout "灯光测试结束"return 0;}
2、开发注意事项
1. 代码整合:与 SDK 的适配要点

头文件导入:确保包含AudioClient类相关头文件(如#include "unitree_sdk2/audio/audio_client.hpp"),避免因头文件缺失导致编译报错;
接口初始化:代码开头需调用unitree::sdk2::Init()初始化 DDS 通信,这是与 G1 建立连接的前提;
对象创建:实例化AudioClient对象,用于调用LedControl接口。
2. 编译配置:CMakeLists 关键设置
告诉电脑 “怎么运行这个代码”
光写好代码还不行,得告诉编译器 “这个代码要和 SDK 的库绑在一起才能跑”。
打开example/audio目录下的CMakeLists.txt文件,在末尾加两行代码:
//编译源文件生成可执行文件//第一个参数 g1_light_demo:是生成的可执行程序的名称//第二个参数 audio/g1_light_demo.cpp:是编译该可执行程序所需的源代码文件路径add_executable(g1_light_demo audio/g1_light_demo.cpp)//为可执行文件链接依赖库//第一个参数 g1_light_demo:是要链接库的目标//第二个参数 unitree_sdk2:是需要链接的库的名称target_link_libraries(g1_light_demo unitree_sdk2)
3. 编译 + 运行:看 LED 灯 “动起来”
回到终端,cd 到 SDK 的build目录(比如cd 文档/G1开发/unitree_sdk2/build),输下面几行命令:
cd unitree_sdk2 mkdir build cd build cmake .. make
编译成功后,在build/example/audio目录下,会出现一个叫g1_light_demo的可执行文件。

最后输 ./g1_light_demo 网卡名称 运行 —— 这时看 G1 的额头,LED 灯就会一圈圈循环变色啦!想停的话,按键盘Ctrl+C就行。

五、总结:开发没那么难,从 “小功能” 开始就对了
其实这次的 LED 控制,本质就是 “找对接口→传对参数→让代码跑起来”。很多新手觉得机器人开发难,是因为一开始就想搞复杂功能(比如让 G1 跳个舞),反而被劝退。
不如像这次一样,从 “改个灯色”“让它走一步” 这种小功能入手,每实现一个,就搞懂一个知识点:比如这次我们摸清了 DDS 初始化、函数调用间隔、编译配置,下次再学高层运动控制(比如让 G1 走个正方形),就会觉得 “哦,原来和上次的逻辑差不多”。
下次咱们玩点更酷的 —— 教 G1 按咱们设定的路线走,或者让它根据传感器数据调整动作。跟着一步步来,你会发现:自己控制机器人,比用手柄玩有意思多啦!
选择道非
选择道非科技(青岛)有限公司,您将获得:
✅ 正品授权:
宇树科技产品官方渠道供应,确保技术迭代同步;
✅ 专业服务:
提供API接口与仿真训练框架,满足个性化需求;
✅ 快速响应:
山东本地化技术服务团队,7×24小时售后支持;
✅ 机器人产品租赁:
想体验机器人又担心预算不够,尝试租赁新方案;
✅ 立即咨询:
📞 热 线:0532-87621819 13687670777
END

【重要提示!!!】
随着微信公众号平台的更新,只有那些被标记为常读和星标的订阅号,才能确保您及时收到它们的最新推送。如果您渴望第一时间获取“道非科技”的最新资讯,只需简单两步,即可紧密跟随“道非科技”的官方微信动态:
1、设为常读:
访问“道非科技”微信公众号,多浏览、互动(如点赞、留言或转发)我们的内容,让微信了解您的偏好。
2、添加星标:
在您的微信订阅号列表中,寻找并点击“道非科技”长按其图标,直至弹出操作菜单。选择“标为星标”,这样“道非科技”将跃居列表前端,便于您快速访问。