在上一期内容中,我们借助 OpenClaw(龙虾)完成了整个项目的初步规划,包括获取总体架构概览、梳理 API 接口文档以及生成配套的测试程序骨架。今天,我们将进入实际的验证阶段——把龙虾写出来的程序真正跑起来,看看它到底能不能正常工作。
本期的重点是状态获取方向的接口测试,涵盖连接验证、底层传感器数据订阅以及高级运动状态订阅三个测试脚本。所有测试均不涉及运动控制指令,机器人将始终保持静止,因此可以放心执行。运动控制的测试内容我们留到下一期专门介绍。
宇树 Go2 机器狗实时照片如下(站立状态):

1 连接测试:01_connection_check.py
脚本说明
这是整个测试套件中最基础也最关键的一个脚本。在与机器人进行任何通信之前,我们首先需要确认网络层和 DDS 中间件层都已经正常工作。所谓 DDS(Data Distribution Service,数据分发服务),是宇树机器人 SDK 所依赖的底层通信协议,所有的传感器数据订阅和控制指令下发都通过它来实现。如果这一环节不通,后续的一切测试都无从开展。
该脚本的主要作用包括:验证本地网络配置是否正确、确认能与机器人建立 DDS 通信链路,以及列出当前机器人上所有正在运行或已注册的服务。
使用方式:
python 01_connection_check.py预期效果:
•打印当前配置的网络接口名称(如 ens33)和 Domain ID
•成功连接后,以表格形式打印机器人上所有服务的名称、运行状态以及是否受到保护
•额外查询当前的运动模式(通过 MotionSwitcherClient)
•若连接失败或超时,打印错误码并提示检查网线连接和 .env 配置文件
安全提示: 本脚本不发送任何控制指令,不会产生任何物理动作,可以在机器人处于任意状态时安全运行。
运行结果
运行指令:python 01_connection_check.py
运行结果如下:
(base) fgai@fgai-virtual-machine:~/project/resarch/unitree_sdk2_python/user_dev/go2_tests$ python 01_connection_check.py==================================================Go2 连接验证 & 服务列表查询==================================================网络接口:ens33Domain ID:0DDS 通道初始化成功[1] 查询服务列表 (RobotStateClient)...共发现 31 个服务:服务名 状态 受保护------------------------- -------- --------4gcm 运行中 是advanced_sport 运行中 否ai_sport 运行中 否audio_hub 已停止 否audio_player_service 已停止 否bashrunner 已停止 否basic_service 已停止 是battery_guard 已停止 否chat_go 已停止 否gesture_recognition 已停止 否go2_videohub_rtsp_server 已停止 否master_service 已停止 是mcf 已停止 否motion_switcher 已停止 否net_switcher 已停止 否obstacles_avoid 已停止 否ota_box 运行中 否pet_go 已停止 否programming_actuator 已停止 否robot_state 已停止 是sbus_handle 已停止 否sport_mode 运行中 否unitree_lidar 已停止 否unitree_lidar_slam 已停止 否utrack 已停止 否video_hub 已停止 否voxel_height_mapping 已停止 否vui_service 已停止 否webrtc_bridge 已停止 是webrtc_multicast_responder 已停止 否webrtc_signal_server 已停止 是[2] 查询当前运动模式 (MotionSwitcherClient)...当前运动模式:mcf✓ 连接验证完成


结果分析
从输出中可以看到,DDS 通道初始化成功,机器人共响应了 31 个服务条目。其中,4gcm、advanced_sport、ai_sport、ota_box 和 sport_mode 处于运行中状态,其余服务均已停止——这是机器人在正常待机状态下的典型服务分布。值得关注的是,当前运动模式为 mcf,说明机器人处于某种特定的运动控制框架下。
连接测试通过。 DDS 通信链路完全正常,可以继续进行后续的数据订阅测试。
2 订阅低级状态:02_lowstate_subscriber.py
脚本说明
在确认连接正常之后,接下来测试最底层的传感器数据读取能力。低级状态(LowState)是 Go2 SDK 提供的最基础的数据流,直接来自机器人的硬件传感器,包含丰富的实时物理量:IMU 姿态测量、全部 12 个关节的角度和力矩、电池健康状态,以及四条腿末端的接触力传感器读数。这些数据对于开发底层控制算法、进行运动规划和状态估计至关重要。
该脚本通过订阅 rt/lowstate 话题,以每秒一次的频率刷新并打印上述所有传感器数据,直到用户按下 Ctrl+C 主动退出。
使用方式:
python 02_lowstate_subscriber.py# 按 Ctrl+C 退出
预期效果:
•每秒打印一次 IMU 数据,包含 RPY 欧拉角(横滚、俯仰、偏航)和四元数表示,以及陀螺仪角速度
•打印全部 12 个关节(前右/前左/后右/后左腿各 3 个自由度)的当前角度、角速度、估算力矩和电机温度
•打印电池的当前电压、电流和剩余电量百分比
•打印四个足端力传感器的原始读数
安全提示: 本脚本仅订阅数据,不发送任何控制指令,可在机器人处于任意运动模式下安全运行,不会影响机器人当前的行为。
运行结果
运行指令:python 02_lowstate_subscriber.py
运行结果如下:
(base) fgai@fgai-virtual-machine:~/project/resarch/unitree_sdk2_python/user_dev/go2_tests$ python 02_lowstate_subscriber.pyGo2 LowState 实时监控(Ctrl+C 退出)网络接口:ens33订阅 rt/lowstate,每秒刷新一次...等待数据... (检查机器人是否开机、网络是否连通)=======================================================消息计数:500 Tick:1194965 ms[IMU]RPY : roll= -1.21° pitch= -1.03° yaw= -41.57°四元数: w=-0.9348 x=0.0131 y=0.0047 z=0.3549陀螺仪: +0.001 +0.006 -0.019 rad/s[关节角度 (rad)][ 0] FR_hip : q=-0.028 dq=+0.004 τ_est= +0.02Nm T=33°C[ 1] FR_thigh : q=+0.725 dq=+0.031 τ_est= -0.59Nm T=32°C[ 2] FR_calf : q=-1.415 dq=-0.038 τ_est= +3.60Nm T=35°C[ 3] FL_hip : q=+0.017 dq=-0.027 τ_est= -0.17Nm T=32°C[ 4] FL_thigh : q=+0.727 dq=+0.012 τ_est= -0.22Nm T=33°C[ 5] FL_calf : q=-1.497 dq=-0.032 τ_est= +4.08Nm T=35°C[ 6] RR_hip : q=-0.007 dq=+0.031 τ_est= +4.01Nm T=51°C[ 7] RR_thigh : q=+0.765 dq=+0.031 τ_est= +1.78Nm T=35°C[ 8] RR_calf : q=-1.449 dq=-0.028 τ_est= +5.41Nm T=37°C[ 9] RL_hip : q=+0.125 dq=+0.031 τ_est= -4.08Nm T=51°C[10] RL_thigh : q=+0.697 dq=+0.054 τ_est= +0.96Nm T=34°C[11] RL_calf : q=-1.423 dq=+0.008 τ_est= +4.65Nm T=37°C[足端力] (原始值)FR: 38 (est: 0)FL: 42 (est: 0)RR: 44 (est: 0)RL: 16 (est: 0)[电池]电压: 31.62 V 电流: 1.06 A电量: 85% 循环次数: 5


结果分析
数据流正常,每秒稳定刷新。从这一帧快照中可以读取到不少有用的信息:
•IMU 姿态:横滚和俯仰均接近零(约 -1°),说明机器人站在相对平坦的地面上;偏航角约为 -41.57°,对应机器人当前的朝向,这是一个世界坐标系下的累积角度值,受初始位置影响。
•关节温度:大部分电机温度在 32–37°C 之间,属于正常工作温度。值得注意的是,后腿的 Hip 关节(RR_hip 和 RL_hip)温度达到了 51°C,略高于其他关节——这可能是由于后髋关节在维持站立姿态时承受了更大的扭矩,导致发热更明显。
•电池状态:电量 85%,电压 31.62V,已完成 5 次充放电循环,整体健康状况良好。
低级状态订阅测试通过。
3 订阅高级运动状态:03_sportstate_subscriber.py
脚本说明
与低级状态不同,高级运动状态(SportModeState)是由机器人的高层运动控制模块计算和发布的,包含更具语义含义的状态信息:机器人在世界坐标系中的绝对位置、线速度向量、步态类型以及障碍物感知距离。这类数据更适合用于导航规划、行为逻辑设计和人机交互开发。
该脚本通过订阅 rt/sportmodestate 话题来获取上述信息,同样以每秒一次的频率刷新显示。需要注意的是,这个话题只有在机器人处于高级运动模式(如 normal 或 ai 模式)下才会有数据发布;如果机器人处于其他状态,脚本将持续等待而不会显示任何数据。
使用方式:
python 03_sportstate_subscriber.py# 按 Ctrl+C 退出
预期效果:
•每秒打印机器人在世界坐标系中的三维位置坐标 (x, y, z)
•打印线速度(前进/横移/垂直)和偏航角速度
•打印 RPY 欧拉角姿态、当前体高和抬脚高度
•打印当前步态类型、运动模式标识和步态进度
•打印前后左右四个方向的障碍物检测距离
前提条件: 机器人须处于高级运动模式(normal / ai 等),否则 Topic 无数据输出,脚本将停留在等待状态。
运行结果
运行指令:python 03_sportstate_subscriber.py
运行结果如下:(base) fgai@fgai-virtual-machine:~/project/resarch/unitree_sdk2_python/user_dev/go2_tests$ python 03_sportstate_subscriber.pyGo2 SportModeState 实时监控(Ctrl+C 退出)网络接口:ens33订阅 rt/sportmodestate,每秒刷新一次...等待数据... (需在高级运动模式下)=======================================================消息计数:297 错误码:100[位置] (世界坐标系,m)x= -0.034 y= -0.126 z= +0.312[速度] (m/s / rad/s)vx=-0.001 vy=+0.001 vz=-0.049偏航角速度: -0.003 rad/s[姿态]roll= -1.2° pitch= -1.1° yaw= -34.5°体高: 0.321 m 抬脚高度: 0.000 m[步态] mode=0 gait=空闲/站立 progress=0.00[障碍距离] (m)前: 0.00 m后: 0.00 m左: 0.00 m右: 0.00 m

结果分析
数据获取成功,高级运动状态话题正常工作。
从数据中可以读取到:机器人当前静止站立,速度向量接近零,步态类型为“空闲/站立”,步态进度为 0。当前体高为 0.321 m,这是 Go2 正常站立时的典型高度;如果控制机器狗执行趴下动作,体高数值会降至接近 0 m。
障碍距离全部显示为 0.00 m,这并不意味着机器人四周紧贴着障碍物,而是因为当前步态为静止站立,障碍检测模块尚未激活或未返回有效数据。
关于错误码字段的说明
输出中出现了 错误码:100,初看容易让人误以为发生了故障。但实际上,这个字段并不是传统意义上的“错误代码”,而是运动状态机的状态标识符——它描述的是机器人当前处于哪种运动状态,而非是否出现了异常。
以下是完整的状态码对照表:
状态码 状态机名称100 灵动(当前状态)1001 阻尼1002 站立锁定1004 / 2006 蹲下1006 打招呼 / 伸懒腰 / 舞蹈 / 拜年 / 比心 / 开心1007 坐下1008 前跳1009 扑人1013 平衡站立1015 常规行走1016 常规跑步1017 常规续航1091 摆姿势2007 闪避2008 并腿跑2009 跳跃跑2010 经典2011 倒立2012 前空翻2013 后空翻2014 左空翻2016 交叉步2017 直立2019 牵引
当前状态码 100 对应“灵动”模式,是 Go2 在高级运动模式下的默认待机状态,表示机器人处于响应式站立,随时可以接收运动指令。在开发过程中,实时监测这个字段可以帮助我们准确判断机器人当前所处的行为阶段,对调试运动控制逻辑非常有帮助。
高级运动状态订阅测试通过。
总结
本期完成了三个基础状态测试脚本的验证工作,全部通过:
1.连接测试确认了 DDS 通信链路正常,并成功获取了机器人上 31 个服务的运行状态清单。
2.低级状态订阅验证了底层传感器数据(IMU、关节、电池、足端力)均可实时读取,数据帧率稳定。
3.高级运动状态订阅验证了位置、速度、姿态和步态等高层运动信息的正常获取,并澄清了状态码字段的实际含义。
整个状态获取体系工作正常。下一期,我们将在此基础上迈出更关键的一步——测试运动控制接口,让机器狗真正动起来。我们将在“龙虾实验室”中同步更新。
夜雨聆风