【技术博客】宇树 G1机器人二次开发案例 LED 灯控制开发实操指南
2025-12-05

【新手入门】宇树 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 通信:


  1. 用网线将开发电脑与 G1 的交换机直连(G1 机身脖颈处有网线通信接口);

  2. 将开发电脑的网卡 IP 设置为192.168.123.X网段(本文设置为192.168.123.222,避免与其他设备 IP 冲突);

  3. 验证连通性:打开终端输入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
编译成功后,build/bin目录下会生成各模块的可执行文件


2、官方例程验证


终端中输入 ./例程文件名 网卡名称


编译完成后,可运行官方例程(如官方文档中的G1足部摆动例程),验证开发环境与 G1 的通信是否正常。需注意:部分例程需 G1 进入 “调试模式”,具体操作可参考《开发指南》中的 相关章节,避免因模式错误导致例程无法运行。



四、核心步骤:写代码让 LED 灯 “变色”


本次要实现的目标:让 G1 额头的 LED 灯,循环切换颜色。


1、核心思路拆解


1. 先找对 “控制开关”:LED 灯的接口在哪


打开《G1 SDK 开发指南》,找到 “软件服务接口→音频灯光服务接口”,能看到一个叫AudioClient的类 —— 别看名字带 “音频”,它其实也管灯光控制。里面有个专门的函数LedControl(uint8_t R, uint8_t G, uint8_t B),就是我们要找的 “开关”:


图片
图片


  1. 查阅接口文档:在 "软件服务接口 - 音频灯光服务接口" 中,确认AudioClient类提供 LED 控制功能;

  2. 核心函数:LedControl(uint8_t R, uint8_t G, uint8_t B),通过 RGB 三原色参数(取值范围 0-255)控制灯光颜色;

  3. 实现逻辑:通过循环切换 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[]){    //检查命令行参数数量是否小于 2    if (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(02550); //设置绿色
        unitree::common::Sleep(1); //暂停1s
        client.LedControl(25500); //设置红色
        unitree::common::Sleep(1);
        client.LedControl(00255); //设置蓝色
        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、添加星标:

在您的微信订阅号列表中,寻找并点击“道非科技”长按其图标,直至弹出操作菜单。选择“标为星标”,这样“道非科技”将跃居列表前端,便于您快速访问。


地址:山东省青岛市市北区黑龙江南路2号乙803户
电话: 0532-87621819

合作与咨询

渠道商务合作:13658663399 13687670777

售前技术咨询:16678687621

售后服务热线:
0532-87621819

网站备案号:鲁ICP备2025150244号-2 | 技术支持 | 联系我们 | 网站地图