该系统本质上不是传统的“机器人自己规划路线”,而是一套:
人体动作采集 + 实时遥操作 + 动作重定向 + 全身平衡控制 + 示教数据训练
系统,它要解决的核心问题不是“机器人从哪里走到哪里”,而是:
人做出一个动作后,怎样让结构不同、质量不同、平衡能力不同的机器人,安全、稳定、尽可能相似地完成这个动作。
宇树目前公开的 G1/H1 开发生态中,已经包含 XR 遥操作、SDK2、ROS 2、MuJoCo、Isaac Lab 和强化学习等工具。官方xr_teleoperate项目用于人形机器人遥操作和数据记录;SDK2 基于 Cyclone DDS 实现机器人状态获取与控制;MuJoCo 和 Isaac Lab 仿真工具则支持控制程序验证、数据回放和策略部署。(GitHub)
一、先建立整个系统的总体认识
整个系统可以分为六个核心层级。
┌─────────────────────────────┐ │ 1. 人体动作采集层 │ │ 动作捕捉服、IMU、人体骨骼模型 │ └──────────────┬──────────────┘ ↓ ┌─────────────────────────────┐ │ 2. 数据通信与预处理层 │ │ UDP、Wi-Fi、时间戳、滤波、校准 │ └──────────────┬──────────────┘ ↓ ┌─────────────────────────────┐ │ 3. 动作重定向层 │ │ 人体骨架 → 机器人关节和末端 │ └──────────────┬──────────────┘ ↓ ┌─────────────────────────────┐ │ 4. 全身控制与平衡层 │ │ 关节控制、质心控制、足底接触 │ └──────────────┬──────────────┘ ↓ ┌─────────────────────────────┐ │ 5. 宇树机器人执行层 │ │ SDK2/DDS、机载计算机、电机控制 │ └──────────────┬──────────────┘ ↓ ┌─────────────────────────────┐ │ 6. 数据记录与策略训练层 │ │ 模仿学习、强化学习、仿真验证 │ └─────────────────────────────┘这六层并不是简单单向运行,而是一个闭环。
机器人执行动作后,会不断返回:
当前关节角度;
关节速度;
电机状态;
机身姿态;
足底接触;
IMU 数据;
控制状态
控制程序再根据这些反馈修正下一时刻的动作。
因此,准确的整体结构是:
人体动作 ↓ 人体姿态估计 ↓ 动作重定向 ↓ 机器人目标动作 ↓ 机器人闭环控制 ↓ 机器人实际动作 ↓ 状态反馈 └────────返回控制器继续修正二、第一层:人体动作采集
1. 动作捕捉服到底采集什么
操作员穿戴动作捕捉服后,服装上的多个传感器分别固定在:
胸部;
腰部或骨盆;
上臂;
前臂;
手腕;
大腿;
小腿;
足部;
有时还包括头部和手指
大多数惯性动作捕捉服使用 IMU。每个 IMU 通常包含:
加速度计;
陀螺仪;
有时还有磁力计
这些传感器本身并不会直接告诉电脑“人的肘关节弯曲了 30 度”
它们最初提供的是:
当前加速度;
当前旋转速度;
重力方向;
磁场方向。
动作捕捉系统需要通过姿态融合算法,把这些原始数据转换成身体各个骨段的方向。
2. 动作捕捉系统输出的不是人体照片,而是数字骨架
最终传给电脑的通常是一个人体数字骨架。
例如:
骨盆: 位置 = (x, y, z) 方向 = 四元数 胸部: 方向 = 四元数 左上臂: 方向 = 四元数 左前臂: 方向 = 四元数 右大腿: 方向 = 四元数 ……电脑中看到的不是完整人体,而是一组连接起来的骨骼节点。
头 │ 左肩─胸部─右肩 │ │ │ 左肘 腰 右肘 │ │ │ 左手 骨盆 右手 / \ 左髋 右髋 │ │ 左膝 右膝 │ │ 左脚 右脚每一个骨段都有自己的方向数据。
3. 为什么必须进行穿戴标定
动作服每次穿到人身上时,传感器的位置和方向都会略有不同。
例如:
左前臂传感器可能向外偏了 10 度;
胸部传感器可能没有完全水平;
操作员的肩宽和臂长不同;
鞋上的传感器方向可能不同。
所以系统启动后通常需要操作员做标准姿态,例如:
T 形站立;
A 形站立;
双脚平行站立;
手臂自然下垂。
这一步的作用是建立:
传感器方向 ↓ 人体骨段真实方向之间的偏差关系。
如果不标定,常见结果包括:
人抬手,机器人手臂向侧面旋转;
人保持站立,机器人腰部已经倾斜;
左右手方向相反;
人的肘部弯曲映射成机器人肩部旋转。
所以标定不是附加步骤,而是整个系统的基础。
三、第二层:数据通过 UDP 和 Wi-Fi 进入电脑
1. Wi-Fi 和 UDP 不是同一个东西
可以把通信过程理解为邮寄包裹。
Wi-Fi 相当于运输道路;
IP 相当于地址系统;
UDP 相当于运输规则;
动作数据相当于包裹里的内容;
DDS 或自定义协议相当于包裹的格式和分类方式。
整体层次如下:
人体骨骼数据 ↓ 自定义消息 / DDS消息 ↓ UDP ↓ IP网络 ↓ Wi-Fi 或有线以太网Wi-Fi 决定数据通过无线方式发送。
UDP 决定发送时不建立复杂可靠连接,而是快速地将一帧一帧数据发出去。
2. 为什么实时动作通常使用 UDP
人体动作是连续产生的,例如每秒:
30 帧;
60 帧;
100 帧;
甚至更高。
在实时控制中,“最新数据”通常比“保证每一帧都收到”更重要。
例如,人正在挥手。
如果网络丢失了第 101 帧,但已经收到第 102、103 和 104 帧,那么再等待第 101 帧重传通常没有意义,因为第 101 帧已经过时。
因此 UDP 的特点反而适合动作流:
传输开销小;
不等待确认;
不因某个旧数据包丢失而阻塞后面的新数据;
延迟通常比较低。
但 UDP 不保证:
数据一定到达;
数据按顺序到达;
数据不会重复;
数据不会损坏;
数据频率稳定。
所以这些问题必须由你们自己的程序处理。
3. 每一帧动作数据应该包含什么
一个合理的动作数据包通常应包含:
数据包版本 机器人或操作员编号 当前帧序号 动作采集时间戳 人体根节点位置 各个骨段姿态 关节置信度 校验信息其中最重要的是帧序号和时间戳。
帧序号
例如:
1001 1002 1003 1005电脑看到 1004 不见了,就知道发生了丢包。
时间戳
时间戳告诉电脑:
这帧动作是什么时候采集的,而不是什么时候收到的。
因为某一帧可能在网络中停留时间更长。
如果不使用时间戳,程序无法区分:
人动作真的突然变慢;
网络延迟突然增大;
某帧数据晚到了。
4. 网络链路的实际逻辑
你们的系统可能存在两段通信。
第一段: 动作捕捉服 ↓ UDP/Wi-Fi 控制电脑 第二段: 控制电脑 ↓ SDK2 / DDS / UDP-IP 宇树机器人宇树 SDK2 提供请求响应和发布订阅式接口,SDK2 和 ROS 2 主要使用 Cyclone DDS 进行通信;Python SDK 同样支持机器人状态订阅和控制命令发布。(GitHub)
因此不要把整个系统简单理解成:
动作服直接控制电机实际情况更接近:
动作服发送人体信息 ↓ 电脑理解人体动作 ↓ 电脑计算机器人应该怎么动 ↓ 电脑通过宇树接口发送机器人命令四、第三层:数据预处理
动作数据收到以后,不能立刻发送给机器人。
至少需要经过以下处理。
收到人体动作数据 ↓ 检查帧序号和时间戳 ↓ 丢弃过期帧或重复帧 ↓ 坐标系转换 ↓ 穿戴标定修正 ↓ 滤波和异常检测 ↓ 形成稳定的人体姿态1. 坐标系转换
动作捕捉服和机器人通常不使用同一个坐标定义。
动作捕捉系统可能定义:
X:向右 Y:向上 Z:向前宇树机器人程序可能定义:
X:向前 Y:向左 Z:向上如果不进行坐标转换,那么:
人向前伸手,机器人可能向上抬手;
人向左转,机器人可能向右转;
人弯腰,机器人可能后仰。
所以程序需要明确三套坐标系:
动作捕捉世界坐标系 ↓ 人体骨盆或躯干坐标系 ↓ 机器人基座坐标系每一层都要进行方向转换。
2. 四元数连续性
人体骨段方向通常用四元数表示。
四元数有一个特殊性质:
q 和 -q 表示同一个空间方向动作捕捉设备有时会在相邻两帧之间从q跳到-q。
从物理姿态看没有发生变化,但如果程序直接对数字做插值,就可能认为人体突然旋转了很大角度,因此必须做四元数连续性处理,简单理解就是:
每收到一帧姿态,都要判断它与上一帧是否走了“最短旋转方向”。
3. 滤波
人体动作数据会有轻微抖动。
抖动来源包括:
IMU 噪声;
传感器绑带松动;
人体自然震颤;
无线网络抖动;
磁场干扰;
姿态融合误差。
如果直接传给机器人,机器人手臂和电机可能不停做小幅高频修正。
滤波的目标是:
保留真实动作 + 去除无意义抖动 + 尽量不增加明显延迟滤波太弱:
机器人抖动;
电机频繁调整;
运动不自然。
滤波太强:
人已经抬手,机器人过一会才抬;
快速动作被削弱;
机器人感觉“黏滞”。
所以实时遥操作最重要的不是滤得最平滑,而是找到:
平滑性与响应速度之间的平衡。
4. 异常值检测
必须识别明显不合理的数据,例如:
某关节一帧跳变 90 度;
四元数全部为零;
数据包含 NaN;
人体骨架突然消失;
根节点位置突然跳到几米外;
时间戳回退;
数据包长度错误。
发现异常后,不能把它直接发送给机器人。
通常处理方式是:
轻微异常 ↓ 使用上一帧或插值补偿 连续异常 ↓ 机器人平滑减速 长时间无数据 ↓ 机器人进入安全姿态或停止五、第四层:人体动作重定向
这是系统最核心、也是最难的一层。
1. 什么叫动作重定向
动作重定向不是简单复制人体关节角,而是:
在保留人体动作意图和整体外观的同时,将动作转换成符合机器人结构、关节限制和平衡要求的机器人动作。
人体和 G1/H1 的结构存在明显差异。
人体 机器人 肌肉和柔性关节 电机和刚性关节 肩胛骨可自由活动 肩部自由度有限 脊柱有大量小关节 腰部自由度有限 脚趾可以参与平衡 机器人足底结构固定 人体比例因人而异 机器人连杆固定 人可通过微小肌肉调整平衡 机器人依赖控制算法因此,不能直接进行:
人体左肩角度 = 机器人左肩角度2. 动作重定向的三种基本思路
方法一:关节直接映射
把人体关节和机器人关节一一对应。
人体肩关节 → 机器人肩关节 人体肘关节 → 机器人肘关节 人体髋关节 → 机器人髋关节 人体膝关节 → 机器人膝关节优点:
实现简单;
计算快;
延迟小;
适合初步测试。
缺点:
人与机器人关节轴不一致;
手的位置未必准确;
容易超过机器人关节范围;
无法自动保证平衡;
肩、腰、腕部动作容易失真。
适合:
单关节测试;
上肢简单动作;
系统通信验证。
方法二:末端位姿映射
不强求每一个关节角都与人相同,而是重点让机器人的:
手;
脚;
头;
骨盆;
胸部
到达与人体相似的位置和方向。
例如,人把右手伸到身体前方。
系统并不是问:
人的每个肩关节角是多少?
而是问:
人的手相对于胸口在哪里?机器人怎样调整肩和肘,才能让手到达相似位置?
然后通过逆运动学计算机器人关节。
人体右手位置和方向 ↓ 按人体与机器人尺寸缩放 ↓ 生成机器人右手目标 ↓ 逆运动学 ↓ 机器人肩、肘、腕关节角这种方法通常比直接复制关节角更合理。
方法三:全身优化重定向
这是效果更好的方法。
系统同时考虑:
双手位置;
双脚位置;
头部方向;
胸部方向;
骨盆方向;
机器人关节范围;
自碰撞;
动作连续性;
机器人平衡。
其思路可以理解为:
人体动作目标 ↓ 机器人尝试多个可行姿态 ↓ 比较哪个姿态: 手最接近人体 脚最稳定 关节不超限 身体不碰撞 动作最平滑 ↓ 选择综合最优姿态这不是简单求一个关节角,而是在多个要求之间做平衡。
六、人体尺寸与机器人尺寸的差异
假设操作员手臂长 70 cm,而机器人手臂长 55 cm。
人把手伸到距离肩部 65 cm 的位置,机器人显然不能完全照搬。
因此,必须做比例映射。
人体肩到手的相对位置 ↓ 根据人体臂长归一化 ↓ 乘以机器人臂长 ↓ 生成机器人手部目标类似地,还要处理:
肩宽差异;
躯干长度差异;
腿长差异;
髋宽差异;
操作员身高差异。
需要注意,动作缩放并不是简单地把所有位置乘同一个比例。
例如:
手臂按臂长缩放;
双手间距按肩宽缩放;
脚步距离按腿长和稳定范围缩放;
躯干倾角通常不能完全按比例复制。
七、关节限制与自碰撞
人体可以完成的动作,机器人未必可以完成。
例如:
人的肩部可以通过肩胛骨扩大运动范围;
人能把手放到背后;
人的腰部可进行复杂扭转;
人可以交叉双臂;
人的手腕灵活度通常高于部分机器人结构。
机器人必须限制:
关节最小角度 关节最大角度 最大运动速度 最大加速度 最大允许力矩同时还要检查:
左手是否碰到胸部;
右臂是否穿过身体;
双膝是否相撞;
手是否碰到头;
手臂是否碰到腰部;
两只手是否互相碰撞。
因此动作重定向结束前,需要经过机器人模型验证。
人体动作 ↓ 初步机器人姿态 ↓ 关节限位检查 ↓ 自碰撞检查 ↓ 速度和加速度检查 ↓ 输出安全目标八、动作平滑和轨迹生成
动作捕捉每一帧给出的是一个离散目标。
例如 60 Hz 时,每隔约 16.7 ms 得到一个人体动作。
机器人不能只把这些离散目标直接连接起来,因为:
网络时间间隔并不完全均匀;
人体数据有噪声;
某些帧可能丢失;
目标变化可能超过电机能力。
因此电脑还要将离散动作转换成连续轨迹。
人体离散姿态帧 帧1 帧2 帧3 帧4 ↓ 时间对齐 ↓ 插值和平滑 ↓ 速度限制 ↓ 加速度限制 ↓ 连续机器人轨迹这里的核心目标不是重新规划一条复杂路径,而是:
让机器人在两个连续人体动作之间,平稳、安全地过渡。
九、第五层:全身控制与平衡
动作重定向只能告诉机器人“希望做什么姿势”。
但它不能保证机器人不会摔倒。
例如,人向右侧倾斜。
人可以通过:
脚趾用力;
脚踝调整;
髋部补偿;
快速迈步;
上肢摆动
维持平衡。
机器人没有完全相同的身体能力。
因此机器人控制器还必须决定:
骨盆应该放在哪里;
躯干允许倾斜多少;
双脚如何受力;
膝盖应该弯曲多少;
是否需要迈步;
上肢动作是否需要缩小。
1. 支撑区域
机器人双脚站立时,两只脚与地面的接触区域形成支撑区域。
俯视图 ┌────────┐ ┌────────┐ │ 左脚 │ │ 右脚 │ └────────┘ └────────┘ 两脚及中间区域形成支撑范围机器人整体重心如果过度偏离该区域,就有倾倒风险。
因此人体做大幅倾斜动作时,系统通常不能完全复制,而是需要:
缩小躯干倾角;
调整骨盆;
弯曲膝盖;
移动脚步;
减弱手臂动作。
2. 上肢动作与下肢平衡解耦
实际工程中,一种常见而安全的做法是:
操作者直接控制: 双臂 双手 头部 有限腰部动作 机器人自主控制: 骨盆稳定 双腿 双脚接触 站立平衡 必要的迈步也就是:
人控制动作意图,机器人控制自己的身体稳定。
宇树官方 XR 遥操作说明中也包含由运动控制程序继续控制下半身、通过 DDS 接口执行双臂遥操作的模式。这表明在实际系统中,上肢遥操作和下肢运动控制可以分开处理。(GitHub)
这种架构比直接把人体全身关节全部强行映射给机器人更安全。
3. 全身控制器的职责
全身控制器可以看作一个协调者。
它同时接收:
上层给出的手部目标 上层给出的头部目标 上层给出的躯干目标 机器人当前关节状态 机器人当前身体姿态 双脚是否接触地面然后协调:
哪些关节优先完成手部动作;
哪些关节用于保持平衡;
哪些动作需要缩小;
哪些关节不能继续运动;
是否需要通过迈步恢复稳定。
十、控制优先级
人形机器人中,不同任务的重要程度不同。
一般可以理解为:
最高优先级: 不能摔倒 不能发生严重碰撞 不能超过电机和关节限制 第二优先级: 双脚稳定接触 身体姿态稳定 骨盆和质心合理 第三优先级: 手、头、腰部跟踪人体动作 第四优先级: 动作外观尽量与人体完全一致也就是说:
当“完全模仿人”和“保持机器人稳定”发生冲突时,必须优先保证机器人稳定。
例如人突然快速弯腰,机器人可能只执行一部分弯腰动作。
这不是控制失败,而是安全控制在主动限制不稳定动作。
十一、第六层:机器人底层轨迹跟踪
经过动作重定向和平衡修正后,系统得到机器人目标关节状态。
例如:
左肩目标角度 左肘目标角度 右肩目标角度 右肘目标角度 腰部目标角度 ……但电机当前状态未必等于目标状态。
所以机器人内部还有一个快速闭环控制器。
目标关节状态 ↓ 与当前关节状态比较 ↓ 得到跟踪误差 ↓ 控制器计算电机命令 ↓ 电机运动 ↓ 编码器返回最新状态 └────继续修正这个闭环的运行频率通常要比人体动作采集频率高得多。
例如:
动作捕捉:60 Hz 上层动作重定向:50~100 Hz 机器人控制循环:数百 Hz 或更高这里的具体频率取决于机器人接口、控制模式和你们使用的软件版本,不能仅根据型号统一假定。
十二、SDK2、DDS 和机器人控制接口
宇树 SDK2 的作用是为上层程序提供机器人通信接口,例如:
订阅机器人状态;
读取关节状态;
获取 IMU;
发布控制命令;
调用机器人服务;
进行高层或低层控制。
SDK2 使用 Cyclone DDS 建立发布—订阅通信机制;官方 Python SDK 保持了与 SDK2 类似的接口,可通过请求响应或 Topic 发布订阅完成状态获取和控制。(GitHub)
可以把 DDS 理解成一个数据总线:
机器人状态主题: joint_state imu_state motor_state 控制程序订阅这些主题 ↓ 计算下一步动作 ↓ 向控制主题发布: joint_command arm_command motion_command十三、网络异常时机器人应该怎么办
无线网络不可能始终稳定。
可能出现:
短时丢包;
延迟突然增加;
数据乱序;
Wi-Fi 断开;
控制电脑程序崩溃;
动作捕捉服掉线。
所以系统必须设计状态机。
┌────────────┐ │ 正常控制状态 │ └─────┬──────┘ │ 收不到新数据或数据异常 ↓ ┌────────────┐ │ 短时保持状态 │ │ 保持并平滑减速│ └─────┬──────┘ │ 持续超时 ↓ ┌────────────┐ │ 安全恢复状态 │ │ 回归安全姿态 │ └─────┬──────┘ │ 严重异常 ↓ ┌────────────┐ │ 阻尼/急停状态│ └────────────┘1. 为什么不能一直保持最后一帧
假设最后一帧动作是:
抬起左腿;
身体向右倾斜;
双臂快速挥动。
此时网络断开。
如果机器人永久保持最后一帧命令,可能失去平衡。
正确策略应该根据超时时长逐步处理。
短暂超时: 保持最近目标并降低速度 中等超时: 停止跟随新动作,恢复站立姿态 长时间超时: 进入阻尼、锁定或安全停机2. 心跳机制
控制电脑应定期向机器人发送心跳。心跳不代表动作,而是告诉机器人:
控制程序还在正常运行。
机器人或机载程序持续检测:
最近一次心跳距离当前时间多久超过阈值就进入安全状态。
动作数据包本身也可以作为心跳,但单独设计控制状态和心跳通常更加清晰。
十四、实时遥操作与训练不是同一件事
这是非常容易混淆的地方。
1. 实时遥操作
实时遥操作是:
人现在动 ↓ 机器人现在跟着动特点:
人必须持续在线;
动作由当前人体姿态决定;
重点是低延迟和稳定跟踪;
不一定使用神经网络训练。
2. 示教数据采集
示教采集是:
人控制机器人完成任务 ↓ 把整个过程记录下来记录内容通常包括:
人体动作;
机器人目标动作;
机器人实际动作;
相机图像;
机器人 IMU;
足底接触;
任务结果;
时间戳。
宇树官方xr_teleoperate提供数据记录模式;unitree_lerobot也明确将 G1 遥操作作为采集自定义数据集的一种方式。(GitHub)
3. 策略训练
训练阶段使用已经记录的数据,让模型学习:
看到什么状态 ↓ 应该输出什么动作训练完成后可能形成:
动作跟踪策略;
操作任务策略;
视觉—动作策略;
行走策略;
全身协调策略。
4. 部署执行
部署后,机器人可以不再完全依赖动作服。
实时遥操作: 人体动作 → 机器人动作 训练后自主执行: 机器人传感器 + 任务指令 ↓ 已训练策略 ↓ 机器人动作所以“采集人的动作并训练到机器人身上”实际上包含两个阶段:
第一阶段:人教机器人 第二阶段:机器人自己执行十五、训练数据应该怎样记录
不能只保存人体关节数据。
正确的数据结构应同时保存:
同一时刻 t: 人体骨架姿态 机器人目标关节 机器人实际关节 机器人身体姿态 机器人关节速度 足底接触状态 相机图像 任务状态 网络延迟与丢包情况可以理解为:
┌─────────────────────────┐ │ 时间戳 t │ ├─────────────────────────┤ │ 人做了什么 │ │ 程序希望机器人做什么 │ │ 机器人实际上做了什么 │ │ 机器人看到了什么 │ │ 机器人是否稳定 │ │ 任务是否成功 │ └─────────────────────────┘如果只记录人的动作,模型不知道:
机器人是否成功跟上;
是否发生滑动;
是否接触物体;
是否失去平衡;
相机中当时看到了什么。
十六、时间同步是训练质量的关键
假设:
人体动作采集延迟 20 ms;
相机延迟 80 ms;
机器人关节状态延迟 5 ms。
如果简单地按电脑接收顺序保存,可能出现:
保存的人体动作:已经伸手 保存的相机图像:手还没有伸出 保存的机器人状态:正在伸手一半这些数据在时间上不一致。
模型会错误地学习:
看到旧图像时,应该输出未来动作。
因此应尽量统一时间轴。
动作服时间戳 ─┐ 相机时间戳 ─┼─→ 时间对齐 → 训练样本 机器人时间戳 ─┘时间同步通常比单纯提高采样频率更重要。
十七、为什么需要仿真
动作数据或训练策略不能直接部署到真机。
因为可能存在:
左右关节方向写反;
零位错误;
关节角超限;
动作速度过快;
机器人自碰撞;
足部打滑;
质心失稳;
策略输出异常。
宇树官方提供基于 SDK2 的 MuJoCo 仿真项目,允许将 SDK2、ROS 2 和 Python SDK 控制程序接入仿真;Isaac Lab 项目也采用与真机一致的 DDS 通信方式,用于数据采集、回放、生成和模型验证。(GitHub)
推荐流程是:
人体动作数据 ↓ 离线动作重定向 ↓ 仿真机器人回放 ↓ 检查: 关节限位 自碰撞 足底接触 身体平衡 ↓ 训练策略 ↓ 仿真扰动测试 ↓ 悬挂真机测试 ↓ 低速站立测试 ↓ 正常真机运行十八、整个系统最容易出现的技术问题
1. 动作方向错误
原因通常是:
坐标轴定义不同;
左右手坐标系混淆;
四元数顺序错误;
旋转乘法顺序错误;
T-pose 标定错误。
2. 机器人动作抖动
可能原因:
IMU 噪声;
Wi-Fi 抖动;
滤波不足;
目标更新频率不稳定;
关节控制增益过高;
动作重定向解在不同姿态之间跳变。
3. 机器人动作明显滞后
可能原因:
动作捕捉服内部滤波延迟;
网络缓冲过大;
程序串行执行;
逆运动学计算过慢;
多次滤波;
Wi-Fi 拥塞;
使用旧帧排队处理。
实时控制程序应优先处理最新帧,而不是把所有旧帧依次执行完。
4. 人动作正常,但机器人容易摔倒
原因通常不是动作捕捉精度,而是:
直接复制下肢动作;
没有质心约束;
足底接触未建模;
躯干倾角过大;
动作速度超过平衡控制能力;
上肢快速运动产生较大惯性;
下肢控制与上肢目标冲突。
5. 仿真正常,真机效果差
这是仿真到现实差异造成的。
真实机器人存在:
摩擦;
电机延迟;
关节间隙;
地面柔软度;
传感器噪声;
电池电压变化;
结构柔性;
实际负载变化。
所以训练时通常需要:
随机化质量;
随机化摩擦;
随机化控制延迟;
加入传感器噪声;
随机化地面条件;
限制策略输出。
宇树官方强化学习项目目前支持 G1、H1 和其他平台,为策略训练与部署提供了公开基础。(GitHub)
十九、推荐的软件模块结构
┌────────────────────────────────┐ │ 模块1:动作捕捉接收 │ │ UDP接收、数据解析、帧号和时间戳 │ └───────────────┬────────────────┘ ↓ ┌────────────────────────────────┐ │ 模块2:人体姿态预处理 │ │ 标定、坐标转换、滤波、异常检测 │ └───────────────┬────────────────┘ ↓ ┌────────────────────────────────┐ │ 模块3:动作重定向 │ │ 人体骨架到机器人骨架、逆运动学 │ └───────────────┬────────────────┘ ↓ ┌────────────────────────────────┐ │ 模块4:安全动作生成 │ │ 限位、自碰撞、速度限制、动作平滑 │ └───────────────┬────────────────┘ ↓ ┌────────────────────────────────┐ │ 模块5:全身和平衡控制 │ │ 骨盆、质心、足底、上肢动作协调 │ └───────────────┬────────────────┘ ↓ ┌────────────────────────────────┐ │ 模块6:宇树通信 │ │ SDK2、DDS、状态订阅和控制发布 │ └───────────────┬────────────────┘ ↓ ┌────────────────────────────────┐ │ 模块7:安全状态机 │ │ 心跳、超时、恢复站立、阻尼、急停 │ └───────────────┬────────────────┘ ↓ ┌────────────────────────────────┐ │ 模块8:数据记录 │ │ 人体、机器人、图像、任务和网络数据 │ └────────────────────────────────┘建议这些模块相互解耦。
例如 UDP 接收线程不应同时负责:
求逆运动学;
写硬盘;
控制电机;
处理相机。
否则某个耗时操作就可能阻塞全部系统。
二十、最终完整逻辑框图
┌──────────────────────────────────────┐ │ 人体操作员 │ │ 穿动作捕捉服,完成示教或实时动作 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 动作捕捉与骨骼解算 │ │ IMU采样 → 姿态融合 → 人体数字骨架 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 数据封装 │ │ 帧号、时间戳、根节点、骨段姿态、置信度 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ UDP/IP + Wi-Fi传输 │ │ 低延迟发送,允许少量丢包,不等待旧帧 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 控制电脑接收 │ │ 丢包检测、乱序检查、时间同步、异常检测 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 人体姿态预处理 │ │ 坐标转换、穿戴校准、滤波、四元数连续性 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 动作重定向 │ │ 人体骨架 → G1/H1骨架 │ │ 尺寸缩放、末端映射、逆运动学 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 动作安全修正 │ │ 关节限位、自碰撞、速度和加速度限制 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 全身控制与平衡控制 │ │ 手臂跟踪人体,骨盆和下肢维持稳定 │ │ 必要时缩小动作或生成恢复动作 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ SDK2 / Cyclone DDS │ │ 发布控制命令,订阅机器人实时状态 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ G1/H1底层控制器 │ │ 关节控制、电机驱动、IMU和足底反馈 │ └──────────────────┬───────────────────┘ ↓ ┌──────────────────────────────────────┐ │ 机器人实际运动 │ └──────────────────┬───────────────────┘ ↓ ┌────────机器人状态反馈─────────┐ │ │ └────→ 控制器修正下一时刻动作 ←──┘ 同时进行数据记录: 人体动作 机器人目标动作 机器人实际状态 相机图像 IMU与足端接触 任务成功情况 网络延迟与丢包 ↓ 数据清洗和时间对齐 ↓ 模仿学习或强化学习 ↓ MuJoCo / Isaac Lab仿真验证 ↓ 真机部署二十一、用一句话理解每一层
| 层级 | 它解决的问题 |
|---|---|
| 动作捕捉 | 人现在做了什么 |
| 网络通信 | 怎样快速把人体动作送到电脑 |
| 数据预处理 | 收到的数据是否准确、连续、及时 |
| 动作重定向 | 机器人怎样做出与人相似的动作 |
| 安全约束 | 这个动作机器人能不能安全完成 |
| 平衡控制 | 机器人做动作时怎样不摔倒 |
| 底层跟踪 | 电机怎样准确执行目标动作 |
| 数据记录 | 人是怎样教机器人的 |
| 策略训练 | 机器人怎样逐渐学会自己完成 |
| 安全状态机 | 通信或算法异常时机器人怎样停下来 |
最终,可以把你们系统的核心逻辑浓缩为:
人做动作 ↓ 动作服测出人体姿态 ↓ 电脑理解人体动作 ↓ 把人体动作变成机器人可行动作 ↓ 机器人平衡控制器对动作进行安全修正 ↓ 通过SDK2和DDS发送给宇树机器人 ↓ 机器人电机执行 ↓ 状态反馈给电脑 ↓ 持续修正并记录为训练数据最重要的认识是:
UDP 和 Wi-Fi 只负责“把数据送过去”;动作重定向决定“机器人应该做什么”;全身控制和平衡控制决定“机器人能不能安全做出来”;底层闭环控制决定“机器人实际做得准不准”。