EXP-01 · 8 学时

SDK 运动控制与巡检准备

融合理论「四足运动与巡检概述」:先认识 Go2 Edu 硬件与三类巡检任务,再安装 Unitree SDK 与 ROS2 驱动,用速度指令遥控前进转向、站起趴下、读回状态——验收标准:指令驱动四足运动正常。

实践/理论unitree_sdk2pyunitree_ros2低速起步

00课程节奏:五星学习法 · 8 段微课(每段 ≤ 15 min)

本实验按五星学习法组织:先用一个真实故障聚焦问题,再激活旧知(Linux 网络 + ROS2 DDS),接着示证新知(Go2 硬件三大件 + 步态/指令链路动画),然后动手应用新知完成配网装 SDK 到遥控运动,最后借排障与拓展融会贯通。全程切成 8 段微课、每段不超过 15 分钟,段间停顿 1~2 分钟消化;纯讲授合计约 100 分钟,其余课时用于动手实操与个别辅导。

① 聚焦问题
课段 1 · 12 min
"指令发了狗不动"故障现场,带着问题开课
② 激活旧知
课段 2 · 8 min
静态 IP · DDS 发现 · ROS2 话题发布订阅
③ 示证新知
课段 3~4 · 27 min
Go2 硬件清单 + 步态相位/指令链路动画
④ 应用新知
课段 5~7 · 40 min
配网→装 SDK/ROS2→读状态→遥控运动
⑤ 融会贯通
课段 8 · 13 min
排障口诀 · 拓展阅读 · 思考题
课段五星阶段时长对应章节本段任务
课段 1聚焦问题12 min§01 + §02 前半抛出现场故障"指令发了狗不动",明确本课要解决的目标
课段 2激活旧知8 min§02 后半用静态 IP、DDS 发现、话题模型三条旧知解释故障成因
课段 3示证新知15 min§03对照实物认识 Go2 激光雷达/深度相机/足端力传感及场地要求
课段 4示证新知12 min§06看懂 trot 步态相位与"脚本→sport_request→运动服务"指令链路
课段 5应用新知15 min§04 S1~S3 + §05 ①②完成配网、装 SDK、装 ROS2 驱动(边讲边演)
课段 6应用新知15 min§04 S4~S5 + §05 ③④⑤读状态 + 站立/趴下/速度遥控低速起步——课段 1 的故障就此根除
课段 7应用新知10 min§07步态相位步进器自测,全通方可进入下一实验
课段 8融会贯通13 min§08~§10排障口诀收口,挑战题与思考题拔高迁移

讲课提示:课段 1/2 以讲授 + 提问为主;课段 3~6 边讲边演(实物 / 动画 / 命令行);课段 7 学员独立完成;课段 8 答疑拔高。段与段之间停顿 1~2 分钟,确认学员跟上再进下一段。

01学习目标课段 1 · 聚焦问题 · 12 min

  • 说出 Go2 Edu 关键硬件:3D 激光雷达、深度相机、高清相机、足端力传感、Jetson Orin 40 TOPS 机载算力。
  • 讲清三类巡检任务:表计读数、异常检测、自主巡逻回充,以及四足运动在其中承担的角色。
  • 完成 Unitree SDK(Python)与 ROS2 Go2 驱动安装,跑通状态读取与运动示例。
  • 用指令遥控四足前进、转向、站起、趴下,达到「指令驱动四足运动正常」的验收线。
  • 牢记安全铁律:低速起步,避免跌落与碰撞,异常时先发停止/趴下指令。
素材说明:本课无本地视频素材——固定章节的动态演示自制动图 GIF(来自开源仓库 README)与 SVG 原理动画替代,不虚构实拍录像。

02原理:四足运动与巡检概述(理论 1 融合)课段 1 收尾 + 课段 2 · 激活旧知 · 8 min

❓ 聚焦问题(课段 1)学员现场最常遇到的怪事:SDK 脚本跑完,狗纹丝不动;ros2 topic list 是空的,机器狗仿佛"失联"。问题出在哪?带着这个故障听完全课——到课段 6 你会亲手让它动起来。

把机器狗想像成一位厂区巡检员:四条腿是它的「交通工具」,身上的雷达和相机是「眼睛」,脑子是机载的 Jetson Orin。它要干的活就三样——抄表(对着表计拍一张,后面用 YOLO 认数字)、看异常(跑冒滴漏、烟火、异物)、自己巡逻自己充电(定时出门,见桩就回)。这三样任务的共同前提:狗得先听指挥、走得起、停得稳——这就是本实验要打通的运动控制层。

Go2 Edu 硬件清单与分工

部件关键参数(培训方案「课程5」口径)在巡检中的角色
3D 激光雷达多线激光(Mid-360 / XT16 级别),点云话题 utlidar/cloudEXP-02 建图、EXP-03 定位避障的主传感器
深度相机提供近距离深度信息近障感知、台阶/沟坎辅助判断
高清相机前置彩色相机,可 OpenCV 取帧EXP-04 拍照识别表计与异常的主相机
足端力传感4 足触地力反馈(foot_force)步态落地检测、打滑与跌倒判断
Jetson Orin40 TOPS 机载算力边缘侧跑检测模型,弱网也不断巡检

四足运动能力:一个运动服务管所有动作

Go2 的运动不靠你直接拧电机——机上跑着一个运动服务(sport mode),你发「请求」,它负责步态平衡。订阅 /sportmodestate 话题能看到它的状态字典,其中两个字段最常读:mode(0=默认站立、1=平衡站立、3= locomotion 运动中、5=趴下、8=恢复站立……)与 gait_type(0=待机、1=trot 对角小跑、2=run、3=爬楼),外加 body_height、velocity、foot_force 等。控制侧走 /api/sport/request 话题发 unitree_api/msg/Request 请求——SDK 里的站立/趴下、速度移动、姿态控制,底层都是它。

站立 / 趴下
SDK 的 StandUpDown():起身与卧倒,是每轮实验的第一与最后一个动作。
速度指令
VelocityMove():vx/vy/yaw 三元组遥控——前进、平移、原地转向都从这里来。
姿态指令
BalanceAttitude():调整机身 roll/pitch/yaw,过坎抬身用得上。
状态回读
read_highstate / /sportmodestead:发完指令必须回读,确认狗真的动了。
↺ 激活旧知(课段 2)回忆三条旧知:① 静态 IP(ifconfig 给网卡设 192.168.123.x);② DDS 发现机制(ROS2 节点同网段才能互相发现);③ 话题发布/订阅(/sportmodestate 广播状态、/api/sport/request 收指令)。三条合起来,正好解释课段 1 那个故障。
Unitree 官方文档:网卡手动配置 IPv4 192.168.123.99
图 1-1|Unitree 官方配置(来自 unitree_ros2 仓库 README):连接机器狗的网卡手动指定 IPv4 地址 192.168.123.99、掩码 255.255.255.0,这是对话的第一步。
ros2 topic list 显示 unitree 话题列表
图 1-2|连接成功后的 ros2 topic list(来自 unitree_ros2 仓库 README):sportmodestate、lowstate 等状态话题全部出现,说明 DDS 链路已通。
生活化类比:运动服务像「驾校教练」:你(SDK 脚本)只说「起步、左转」,离合油门刹车它替你协调;但你若同时用 App 手动模式抢方向盘,两套指令就会打架——所以底层操作前要先关掉 sport_mode,一次只听一个人的。

03硬件与材料课段 3 · 示证新知 · 15 min

Go2 Edu 整机
3D 激光雷达 + 深度相机 + 高清相机 + 足端力传感 + Jetson Orin 40 TOPS,电量 >50% 再实训。
遥控器
原装无线遥控,随时接管;/wirelesscontroller 话题可读摇杆与键值(lx/ly/rx/ry、keys)。
工控/实训主机
Ubuntu 22.04 + ROS2 Humble,网线直连或与狗同网段,网卡名用 ifconfig 确认。
场地
平整硬至少 3×5m,四周留净空、移开易碎品;边缘/台阶外 1m 设警戒。
检查项标准不达标后果
网络网卡静态 IP 192.168.123.x,与狗互通DDS 发现不到机器人,topic list 为空
网卡名ifconfig 记下连接狗的接口名(如 enp3s0)CYCLONEDDS_URI 指错口,通信时断时续
运动模式App 高层运动服务处于默认状态与低压指令冲突,狗动作怪异
电量>50%,低于 30% 立即回充低电保护中途趴窝,巡检中断

04操作步骤课段 5~6 · 应用新知 · 2×15 min

S1配网通狗
网卡静态 IP → ping 通 → 确认网卡名
→
S2装 SDK
unitree_sdk2py 源码安装(cyclonedds 0.10.2)
→
S3装 ROS2 驱动
unitree_ros2 编译 → source setup.sh
→
S4读状态
read_highstate / topic echo 双通道验证
→
S5指令遥控
站立趴下 → 速度指令低速起步 → 停止复位
  1. 配网:网线连接 Go2,网卡 IPv4 设静态(示例 192.168.123.99/24),ifconfig 记下接口名。
  2. 装 Python SDK:依赖 Python≥3.8、cyclonedds==0.10.2、numpy、opencv-python;源码方式 pip3 install -e .(找不到 cyclonedds 时先本地编译并导出 CYCLONEDDS_HOME)。
  3. 装 ROS2 驱动:克隆 unitree_ros2 → 安装 rmw_cyclonedds 依赖 → 编译 cyclonedds_ws 与 unitree_go/unitree_api 包 → 用 setup.sh 配置接口名与 RMW_IMPLEMENTATION。
  4. 验证链路:ros2 topic echo /sportmodestate 有数据滚动即通;无真机时用 setup_local.sh(回环口 lo)跑本地流程。
  5. 运动序列:先 StandUpDown 站起 → VelocityMove 用最低速度档走直线与小半径转向 → 收到停止 → 趴下 → 回读状态确认 mode/gait 正常。
  6. 留痕:录下「指令-动作」对照视频或截图状态话题,作为「指令驱动四足运动正常」的验收证据。
ros2 topic echo /sportmodestate 输出
图 1-3|ros2 topic echo /sportmodestate 实测输出(来自 unitreerobotics/unitree_ros2 仓库 README):position、velocity、yaw_speed、gait、foot_force 随运动实时刷新——这就是验收时要看的「心跳」。
utlidar/cloud 话题 frame_id 查看
图 1-4|预检激光通道:ros2 topic echo --no-arr /utlidar/cloud 查到 frame_id 为 utlidar_lidar(来自 unitree_ros2 仓库 README)——EXP-02 建图就靠这条话题。
Go2 实时关节同步动画
图 1-5|指令下发后四足关节实时同步效果(来自 abizovnuralem/go2_ros2_sdk 仓库 README 演示动图):URDF 模型随真机关节 1:1 动,说明运动链路全通。

05关键命令随课段 5 / 6 对照使用

以下命令均摘自 unitree_sdk2py 与 unitree_ros2 官方 README,网卡名按实机替换。

# ① 安装 Python SDK(依赖 cyclonedds==0.10.2 / numpy / opencv-python)
git clone https://github.com/unitreerobotics/unitree_sdk2py.git
cd unitree_sdk2py && pip3 install -e .

# ② 读高层状态(enp2s0 换成连接机器狗的网卡名)
python3 ./example/high_level/read_highstate.py enp2s0

# ③ 运动测试:站立/趴下、速度控制、姿态控制(择一放开注释)
python3 ./example/high_level/sportmode_test.py enp2s0
#   test.StandUpDown()      站立与趴下
#   test.VelocityMove()     速度控制(低速起步!)
#   test.BalanceAttitude()  姿态控制

# ④ ROS2 侧:source 环境后验证状态与状态机
source ~/unitree_ros2/setup.sh
ros2 topic echo /sportmodestate        # 运动状态:mode/gait/velocity
ros2 topic echo /lowstate              # 底层状态:关节、IMU、电池
ros2 topic echo /wirelesscontroller    # 遥控器摇杆 lx/ly/rx/ry 与 keys

# ⑤ 站立示例(example 工作空间编译后)
cd ~/unitree_ros2/example && colcon build
./install/unitree_ros2_example/bin/go2_stand_example
安全闸门:VelocityMove 示例速度按官方写法跑即可,课堂自行改参数时把线速度压到最低档、先空旷后狭窄;狗出现抬腿异常/连跌趋势,立即让它趴下(lieDown 模式)再排查。任何时刻遥控器在手。
控制走哪条路
高层:SDK/Ros2SportClient 组 Request → 发到 /api/sport/request,运动服务统一执行。
状态走哪条路
运动服务广播 /sportmodestate 与 /lowstate,订阅即可,不用轮询。
为什么用 DDS
ROS2 与 Go2 底层同为 CycloneDDS,话题可以直连,不必二次封装。
验收判据
同一脚本三连:站起→低速直线+转向→趴下,状态话题全程无丢帧即为通过。

06动画:步态相位与指令链路课段 4 · 示证新知 · 12 min

俯视 · trot 对角小跑步态(俯视图,循环往复) Go2 机身 重心投影 左前 FL 右前 FR 左后 RL 右后 RR 黄线=相位A 对角支撑 · 红线=相位B 对角支撑 · 绿脚=踩地 灰脚=摆动 支撑多边形与重心(侧视抽象) 黄色重心投影始终落在支撑区域内 → 不倒 (对角两足触地时支撑域收窄,摆动腿快速过隙)
动画 1-1:上半部为俯视 trot 步态——绿脚踩地、灰脚摆动,两条对角支撑线交替亮起;下半部显示重心投影在支撑多边形内小幅晃动却不出界,这就是四足不摔倒的全部秘密。
脚本 / 遥控器 vx · vy · yaw 速度指令 /api/sport/request unitree_api/msg/Request 运动服务 + 步态 mode / gait_type 执行 /sportmodestate 状态反馈:每发一条指令,回读一次 mode/gait/velocity 确认执行
动画 1-2:黄点=下行指令流(脚本 → /api/sport/request → 运动服务执行),蓝点=上行状态流(/sportmodestate 回读验证)——控制与反馈构成完整闭环,只发不收等于蒙眼开车。
观察步态动画里为什么摆动腿总比支撑腿「快进快出」?摆动期间支撑域只剩一条对角线,机身重心越稳、留给纠错的时间越短——所以速度越快、地面越滑,这条线越不能抖,这正是「低速起步」的物理原因。

07互动:步态相位步进器课段 7 · 应用新知 · 10 min

手动步进 trot 步态四相位,观察支撑足与重心安全判据

把相位走完一圈你会发现:trot 每个瞬间只有对角两足着地,支撑域是一条线段,重心投影必须压在这条线上才稳——这就是四足机器人「走路要算数学」的直观版本。

08常见问题课段 8 · 融会贯通 · 13 min

Q pip 报 Could not locate cyclonedds?
cyclonedds==0.10.2 没装好:按 README 本地编译 cyclonedds,再 export CYCLONEDDS_HOME 指到 install 目录重装。
Q ros2 topic list 是空的?
三查:网段是否 192.168.123.x、setup.sh 里网卡名是否写对、RMW_IMPLEMENTATION 是否 rmw_cyclonedds_cpp 且已 source。
Q 狗不听速度指令?
先看 /sportmodestate 的 mode:处于手动/阻尼等非 locomotion 态会拒答;确认运动服务在线、无 App 抢占。
Q 指令一发就猛窜?
示例里残留了较大的目标速度:把 VelocityMove 参数压回最低档再跑,牢记低速起步、预留急停空间。
Q 没有真机怎么练?
source setup_local.sh 用回环接口跑 ROS2 流程,状态话题用录包回放;运动真操环节统一上真机。
Q 要用 App 额外操作吗?
高层 SDK 模式用默认运动服务即可;只有跑底层 low_level 控制前才需在 App 关闭 sport_mode,避免指令打架。
Q 前置相机怎么取帧?
unitree_sdk2py 提供 example/front_camera/camera_opencv.py(需图形界面,ESC 退出),EXP-04 拍照复用它。
Q 遥控器数据能读吗?
能:订阅 /wirelesscontroller 得 lx/ly/rx/ry 摇杆量与 keys 键值,可做手动接管的二次判据。

09拓展阅读课段 8 · 融会贯通

  • unitree_rl_gym(BSD-3): Isaac Gym 里 train.py --task=go2_* 训练步态策略——机器狗的「天生会走」其实是学出来的,与运动服务的「写死规则」对照着看。
  • unitree_ros / robots/go2_description:官方 URDF 模型可进 RViz 看结构,但 Gazebo 仿真只支持底层关节、不支持完整行走——这是要讲清的局限,别指望仿真里遛狗。
  • 宇树机载 unitree_slam / mid360_driver:官方闭源服务,课堂可演示其 App 建图效果,但不随课分发——与本课 slime/开源方案(EXP-02)形成对比。
  • go2_ros2_sdk:一个 launch 集成 pointcloud_to_laserscan、slam_toolbox、Nav2、joy 遥控与 Foxglove,EXP-02/03 的主力底座。
  • Unitree 官方开发者文档 sports_services / Basic_services:Request api_id 全表,做自定义指令(灯光、音量、避障开关)时回来查。

10思考题 · 自测课段 8 · 融会贯通

✅ 完成成果
站立→低速前进转向→趴下全链路走通,/sportmodestate 数据滚动并留痕。
🧠 原理收获
用「驾校教练」类比讲清运动服务与底层关节的分工,以及为什么指令要配状态回读。
🛠 技能收获
独立完成配网、SDK/驱动安装与三类状态话题验证,排掉一次常见连不上的故障。
📐 评分速览
动画观察 30% + 互动步进 30% + 思考题作答 40%。
思考 1为什么控制要用「发指令 + 读状态」的闭环,而不是发完就不管?如果状态回读发现 mode 始终不进 locomotion,可能有哪三种原因?
思考 2trot 步态为什么天生比四足全支撑「难稳」?联系重心投影与支撑多边形,解释速度指令里 yaw(原地转向)为什么比直线更需要低速。