
如何造一台人形机器人:从关节模组到 sim-to-real 的七层约束链
一台人形机器人不是七个模块的拼装,是一叠互相设边界条件的物理方程。本文沿整机技术栈逐层往下算:关节电机模组(声明扭矩 vs 准静态 CoP 真实需求,BHL 髋部只有 0.9× 裕度)→ IMU(杆臂伪加速度是器件噪声底的 21,752 倍,安装位置比规格重要四个数量级)→ 材料与结构(X1 三版 BOM 的材质迁移史:进了闭链传动路径的零件全部升级到 7075-T6 / TC4 / 17-4PH)→ 传感器(先定观测空间再定采购清单)→ 电池与 BMS(「所有关节同时发力」在物理上不成立:G1 Σ 峰值 46,062 W 对 421 Wh 包等于 109 C)→ 软件控制与 CAN 下位板卡(22 节点 500 Hz 单总线负载率 130.9%,必须拆四路)→ 仿真训练与 sim-to-real(12 个失败模式里 9 个是硬件标定问题,不是仿真不够真)。全部数字来自五台机器公开模型文件的程序化解析与厂商官方规格,可复算。
引言:一台人形机器人是一叠互相约束的物理方程
「怎么造一台人形机器人」这个问题,绝大多数回答停在两种极端:一种是发布会话术(「40 个自由度、2 小时续航、端到端大模型」),另一种是采购清单(「买 20 个关节模组、一块 NUC、一个 IMU」)。前者不解释任何一个数字从哪来,后者不解释为什么是这些数字。
本文按整机技术栈从上到下走一遍:关节电机模组 → IMU → 材料与结构设计 → 传感器 → 电池与 BMS → 软件控制/驱动/CAN 下位板卡 → 仿真训练与 sim-to-real。每一层都问同一个问题:这个参数是怎么被上下游约束死的?因为人形机器人不是模块拼装,而是一叠互相锁死的物理方程——踝关节扭矩决定脚掌能压出多大力臂,力臂决定 IMU 装在哪,IMU 的杆臂伪加速度决定它比传感器噪声底大几个数量级,整机峰值功率决定电池包必须能承受多少 C,而电池包的 C 率上限又反过来限制了「所有关节同时发力」这件事在物理上能不能发生。
我们用两组参照系。第一组是可复现的开源参照:UC Berkeley 的 Berkeley Humanoid Lite(下称 BHL,arXiv:2504.17249),22 个自由度、16.33 kg,从电机型号、FOC 固件、3D 打印参数到 Isaac Lab 训练配置全部公开在官方文档站,是唯一一台「照着做能真做出来」的样本。第二组是工业级参照:Unitree G1(29 dof / 35.12 kg)、Unitree H1(10 dof / 51.65 kg)、智元灵犀 X1(腿部 12 dof / 35.32 kg)、RoboParty ATOM01(23 dof / 33.97 kg)。所有扭矩、速度、质量、惯量数字来自这几台机器公开的 URDF / MJCF 文件程序化解析(G1 URDF、H1 URDF、X1 URDF 与 MJCF、ATOM01 URDF);电池包参数来自厂商官方规格;BMS 器件栈来自 TI / ADI / Renesas 公开资料;零部件型号与规格来自 RobotWorld 知识库已收录的 873 条零部件档案(每条均可在站内零部件库查到原始 specs)。全文所有外链在文末「数据来源与解析口径」一节按类别集中列出。
本文不替任何厂商背书,也不做「哪台更好」的排名。我们做的是把每一层的工程约束讲清楚,并给出可复算的数字。文末附完整的解析口径与数据来源。
整机技术栈:七层,每层都在给下一层设边界条件
flowchart TD A["1. 关节电机模组
无框电机 + 减速器 + 双编码器 + 驱动器
决定:扭矩 / 速度 / 反驱性 / 反射惯量"] B["2. 结构与材料
闭链连杆 / 7075-T6 / TC4 / 17-4PH
决定:质量分布 → 各关节静力矩需求"] C["3. IMU
安装位置 + 杆臂 r
决定:状态估计精度上限"] D["4. 传感器
视觉 / 激光 / 六维力 / 触觉 / 关节编码器
决定:策略观测空间"] E["5. 电池 + BMS
串数 S / 容量 Ah / C 率上限 / 双路径电流采样
决定:可交付峰值功率与续航"] F["6. 下位板卡与总线
FOC 电流环 → CAN 总线拓扑 → 机载算力
决定:控制频率与节点数上限"] G["7. 仿真与 sim-to-real
Isaac Lab 训练 → MuJoCo sim2sim → ONNX 上机
决定:策略能否落到真实硬件"] B --> A A --> E B --> C A --> D E --> F A --> F C --> G D --> G F --> G G -.->|域随机化反过来要求硬件留裕度| A
第一层:关节电机模组——先把扭矩预算算清楚,再谈买什么
关节模组占整机 BOM 的 40–60%,其中减速器又占单个模组的 30–50%。这是全机最贵的一块,也是最容易买错的一块。买错的典型形态是「看峰值扭矩下单」,而峰值扭矩恰恰是 URDF 里最不可靠的一个字段。
1.1 五台机器人的声明扭矩全景
把五份 URDF 里所有 revolute 关节的 effort(峰值扭矩,Nm)与 velocity(峰值角速度,rad/s)逐项相乘再求和,得到「全关节同时打到峰值」的理论总功率。结果如下:
| 机器人 | 质量 (kg) | revolute 关节 | Σ effort (Nm) | Σ 峰值功率 (W) | Nm/kg | W/kg | W/Nm |
|---|---|---|---|---|---|---|---|
| Berkeley Humanoid Lite | 16.33 | 22 | 440 | 6,600 | 26.9 | 404 | 15.00 |
| RoboParty ATOM01 | 33.97 | 23 | 972 | 8,488 | 28.6 | 250 | 8.73 |
| AgiBot 灵犀 X1(仅腿部) | 35.32 | 12 | 1,320 | 12,800 | 37.4 | 362 | 9.70 |
| Unitree H1 | 51.65 | 10 | 1,880 | 36,720 | 36.4 | 711 | 19.53 |
| Unitree G1(29 dof) | 35.12 | 29 | 1,464 | 46,062 | 41.7 | 1,312 | 31.46 |
最后一列 W/Nm(每牛米扭矩配多少瓦)是这张表里最有信息量的一列,它衡量的是速度设计意图而不是力量设计意图。ATOM01 和 X1 的 W/Nm 都在 9–10,说明它们的关节是「大扭矩、低转速」的准静态设计(X1 髋 pitch 只有 8 rad/s,约 76 rpm);G1 达到 31.5,说明它是按动态步态甚至奔跑设计的(髋 32 rad/s、踝 37 rad/s,接近 354 rpm)。同样 88 Nm 的髋关节,配 8 rad/s 和配 32 rad/s 是两个完全不同的电机和两套完全不同的减速比。这个差异会一路传导到减速器选型、电池 C 率和总线带宽。
({
"_height": "420px",
"backgroundColor": "transparent",
"grid": { "left": 70, "right": 40, "top": 46, "bottom": 70 },
"tooltip": {
"trigger": "axis",
"axisPointer": { "type": "shadow" },
"backgroundColor": "rgba(15,23,42,0.95)",
"borderColor": "#3ddc97",
"borderWidth": 1,
"textStyle": { "color": "#e2e8f0" },
"formatter": function (p) {
var d = p[0];
var extra = {
"BHL": "22 关节 · Σ440 Nm · 16.33 kg · 26.9 Nm/kg",
"ATOM01": "23 关节 · Σ972 Nm · 33.97 kg · 28.6 Nm/kg",
"X1 (腿)": "12 关节 · Σ1320 Nm · 35.32 kg · 37.4 Nm/kg",
"H1": "10 关节 · Σ1880 Nm · 51.65 kg · 36.4 Nm/kg",
"G1": "29 关节 · Σ1464 Nm · 35.12 kg · 41.7 Nm/kg"
};
return "" + d.name + "
峰值功率密度: " + d.value + " W/kg
" + (extra[d.name] || "");
}
},
"xAxis": {
"type": "category",
"data": ["BHL", "ATOM01", "X1 (腿)", "H1", "G1"],
"axisLabel": { "color": "#94a3b8", "fontSize": 12 },
"axisLine": { "lineStyle": { "color": "#334155" } }
},
"yAxis": {
"type": "log",
"name": "W/kg(对数)",
"nameTextStyle": { "color": "#94a3b8" },
"axisLabel": { "color": "#94a3b8" },
"splitLine": { "lineStyle": { "color": "rgba(148,163,184,0.15)" } }
},
"series": [{
"type": "bar",
"barWidth": "46%",
"data": [
{ "value": 404, "itemStyle": { "color": "#3ddc97" } },
{ "value": 250, "itemStyle": { "color": "#4aa8f0" } },
{ "value": 362, "itemStyle": { "color": "#e0b341" } },
{ "value": 711, "itemStyle": { "color": "#f0708a" } },
{ "value": 1312, "itemStyle": { "color": "#9d7bf0" } }
],
"label": { "show": true, "position": "top", "color": "#e2e8f0", "formatter": "{c} W/kg" },
"markLine": {
"symbol": "none",
"lineStyle": { "color": "#f0708a", "type": "dashed" },
"label": { "color": "#f0708a", "formatter": "G1 = 3.2× BHL" },
"data": [{ "yAxis": 404 }]
}
}]
})
1.2 声明扭矩 vs 真实需求:准静态 CoP 模型
URDF里的 effort 是厂商声明的关节峰值扭矩,它不告诉你这个扭矩够不够,也不告诉你它是按什么工况定的。要判断够不够,最简单的可复算模型是单腿支撑、准静态、压力中心(CoP)移到脚尖:整机重量 $m$ 由一条腿承担,CoP 从踝关节轴心前移到脚尖,力臂为脚掌长度 $L_{foot}$,此时踝关节必须提供的俯仰力矩为
$$\tau_{ankle} = m \cdot g \cdot d_{cop}, \qquad d_{cop} \le L_{foot}$$
其中 $d_{cop}$ 是踝轴到 CoP 的水平距离。$d_{cop} = L_{foot}$ 是最坏情况(全部重量压在脚尖,即起步/蹬地的瞬间)。反解可得这台机器设计上允许 CoP 前移到多远:
$$d_{cop}^{max} = \frac{\tau_{ankle}^{declared}}{m \cdot g}$$
膝关节与髋关节则按 40° 屈膝下蹲姿态(人形最常见的操作/抗扰姿态)做二维静力平衡,把大腿、小腿、脚的质量按 URDF 的 link mass 与质心位置逐段累加。计算结果:
| 机器人 | 脚掌长 (m) | 踝 effort (Nm) | 可达 CoP 力臂 (m) | 占脚掌比例 | 40° 屈膝需求:踝/膝/髋 (Nm) | 膝裕度 | 髋裕度 |
|---|---|---|---|---|---|---|---|
| ATOM01 | 0.22 | 18 | 0.054 | 39% | 46.7 / 17.6 / 35.9 | 4.5× | 2.2× |
| Unitree H1 | 0.21 | 40 | 0.079 | 58% | 68.4 / 61.9 / 68.4 | 4.9× | 2.9× |
| BHL | 0.22 | 20 | 0.125 | 89% | 22.4 / 6.0 / 21.4 | 3.4× | 0.9× |
| Unitree G1 | 0.17 | 50 | 0.145 | 121% | 41.3 / 25.1 / 14.2 | 5.5× | 6.2× |
| AgiBot X1 | 0.25 | 80 | 0.231 | 144% | 55.4 / 12.5 / 55.4 | 12.0× | 2.7× |
这张表给出三个非常硬的结论,是选型时最该记住的:
结论一:踝关节是唯一真正吃紧的关节,膝关节普遍被过度设计 3–12 倍。五台机器的膝裕度全部 ≥3.4×,X1 甚至到 12×;而 CoP 可达力臂占脚掌比例从 39% 到 144% 不等。ATOM01 的踝只有 18 Nm,意味着它的 CoP 永远不能移到脚掌前 39% 之外——这台机器在物理上就不允许做脚尖蹬地起步,只能全脚掌平踩式行走。这不是软件能修的,是硬件天花板。反过来 G1(121%)和 X1(144%)的踝扭矩已经超出「CoP 到脚尖」所需,多出来的部分正是留给动态步态(蹬地、跳跃、落地冲击)的。
结论二:BHL 的髋关节裕度只有 0.9×,即静力需求 21.4 Nm 已经超出声明的 20 Nm。这是刻意为之的——BHL 用的是统一的 M6C12 电机 + 15:1 行星减速 + 3D 打印摆线盘自制模组,22 个关节全部 20 Nm @ 15 rad/s,一个规格打天下。代价就是髋关节在深蹲姿态下贴边工作,靠策略避开极限姿态。这是「便宜可复现」与「性能裕度」之间一个非常典型的取舍,而且它明确写在硬件里,不藏着。
结论三:声明的 effort 不是按静力定的,是按动态步态定的。H1 是最好的证据:它的膝 40° 屈膝静力需求 61.9 Nm,声明 effort 是 300 Nm(4.9× 裕度);但它的踝静力需求 68.4 Nm,声明 effort 只有 40 Nm(0.58×,欠配)。同一个模型里一个关节超配 5 倍、另一个欠配 42%,唯一的解释是 H1 的膝是按行走摆动期的动态加速度($J\dot\omega$ 项)定的,而踝被假定不会承受全重量压脚尖——H1 的步态确实是 heel-strike 主导的平踩式。这与 ATOM01 的 39% CoP 结论互相印证:踝扭矩 = 步态类型的指纹。
({
"_height": "400px",
"backgroundColor": "transparent",
"legend": { "data": ["膝关节裕度", "髋关节裕度"], "textStyle": { "color": "#94a3b8" }, "top": 4 },
"grid": { "left": 70, "right": 40, "top": 56, "bottom": 46 },
"tooltip": {
"trigger": "axis",
"axisPointer": { "type": "shadow" },
"backgroundColor": "rgba(15,23,42,0.95)",
"borderColor": "#3ddc97",
"borderWidth": 1,
"textStyle": { "color": "#e2e8f0" },
"formatter": function (ps) {
var s = "" + ps[0].name + "";
for (var i = 0; i < ps.length; i++) { s += "
" + ps[i].marker + ps[i].seriesName + ": " + ps[i].value + "×"; }
return s;
}
},
"xAxis": {
"type": "category",
"data": ["BHL", "ATOM01", "G1", "H1", "X1"],
"axisLabel": { "color": "#94a3b8" },
"axisLine": { "lineStyle": { "color": "#334155" } }
},
"yAxis": {
"type": "log",
"name": "裕度倍数(对数)",
"nameTextStyle": { "color": "#94a3b8" },
"axisLabel": { "color": "#94a3b8" },
"splitLine": { "lineStyle": { "color": "rgba(148,163,184,0.15)" } }
},
"series": [
{
"name": "膝关节裕度",
"type": "bar",
"barWidth": "30%",
"itemStyle": { "color": "#e0b341" },
"label": { "show": true, "position": "top", "color": "#e2e8f0", "formatter": "{c}×" },
"data": [3.36, 4.54, 5.54, 4.85, 12.03],
"markLine": {
"symbol": "none",
"lineStyle": { "color": "#f0708a", "type": "dashed", "width": 2 },
"label": { "color": "#f0708a", "formatter": "1.0× = 恰好满足静力" },
"data": [{ "yAxis": 1.0 }]
}
},
{
"name": "髋关节裕度",
"type": "bar",
"barWidth": "30%",
"itemStyle": { "color": "#4aa8f0" },
"label": { "show": true, "position": "top", "color": "#e2e8f0", "formatter": "{c}×" },
"data": [0.93, 2.23, 6.21, 2.92, 2.71]
}
]
})
x1.urdf 的 12 个腿部关节 effort 合计 1320 Nm,而 xyber_x1_serial.xml(MuJoCo)的 12 个电机 ctrlrange 合计只有 872 Nm,差 51.4%;踝关节从 80 Nm 掉到 18 Nm(−77%),髋 roll 从 150 Nm 掉到 50 Nm(−67%)。做选型时如果只读了一份文件,你算出来的裕度可能整台机器都是错的。任何扭矩预算都必须先声明「读的是哪一份文件」。1.3 模组内部:电机、减速器、编码器、驱动器四件事的耦合
一个关节模组不是一个零件,是四个零件的耦合设计:无框电机(出扭矩)+ 减速器(换转速/放大扭矩)+ 双编码器(闭环)+ 驱动器(FOC 电流环)。任何一个的选型都会锁死其余三个。
扭矩放大与转速折损是一阶关系。设减速比 $n$、电机转矩常数 $K_t$(Nm/A)、电机转子惯量 $J_r$,则输出端:
$$\tau_{out} = n \cdot \eta \cdot K_t \cdot I, \qquad J_{reflected} = n^2 \cdot J_r, \qquad \omega_{out} = \frac{\omega_{motor}}{n}$$
$n^2$ 这一项是整个关节设计的核心矛盾:减速比每提高一倍,扭矩翻倍(好),但反射到输出端的转子惯量翻四倍(坏)。惯量大了,关节就「笨」——不可反驱、阻抗控制带宽低、碰撞时把冲击全传给连杆。这正是「准关节驱动(QDD)」路线存在的原因:用小减速比(6–15:1)+ 大电流电机,牺牲扭矩密度换反驱性和带宽。BHL 就是纯 QDD(15:1 行星),H1/X1 的髋膝也是低比行星,而腕关节、灵巧手这类小扭矩高带宽位置才用 100:1 以上的谐波。
BHL 的电机表征文档把整个自建模组测得非常完整,是目前唯一能拿到的「从裸电机到关节」的公开实测数据(模组装配与齿轮箱自制见Building the Actuator):
| 参数 | T-Motor M6C12(BHL 主用) | T-Motor 5010-110KV(备选) | 说明 |
|---|---|---|---|
| 相电阻 R | 0.1886 Ω | 0.6193 Ω | 线-线实测折半,决定铜损 $I^2R$ |
| 相电感 L | 0.0325 mH | 0.0850 mH | 决定电流环带宽上限 $f_c \approx R/2\pi L$ |
| 转矩常数 $K_t$(实测) | 0.0919 Nm/A | 0.1176 Nm/A | 由 $K_t = 11.6955/K_V$ 换算(Δ 接法) |
| $K_V$ 实测 vs 标称 | 127.19 vs 150(−15%) | 99.44 vs 110(−9.6%) | 标称值系统性偏高,必须自测 |
| 转子惯量 $J_r$ | 9.942×10⁻⁵ kg·m² | 3.301×10⁻⁵ kg·m² | 15:1 后反射 0.0224 / 0.00743 kg·m² |
| 减速后输出 Nm/A | 1.378(20 Nm 需 14.5 A) | 1.764(20 Nm 需 11.3 A) | ODRI 4004-300KV×9 仅 0.351 → 57 A |
| 位置编码器 | AS5600 磁编(改电阻提升分辨率) | 同 | 磁铁粘在转子轴上,I²C 读一次 78 µs |
最后一行那个 78 µs 是个非常有教育意义的数字。BHL 用 I²C 读 AS5600,单次读耗时 78 µs,直接给出了位置环的频率上限约 12.8 kHz——而它的固件跑在 160 MHz 的 MCU 上、-O2 编译(Recoil FOC)。也就是说,在这个设计里限制控制频率的不是算力,是编码器接口的物理传输时间。换成 SPI 或把磁编换成增量式 + 中断计数,同样的 MCU 能把环路上一个数量级。这是「驱动/下位板卡」层最典型的坑:预算算力之前先算接口。
同理,$K_V$ 标称比实测高 15% 这件事,意味着直接按标称 $K_t$ 设计的电流限幅会算错 15%:你以为 14.5 A 出 20 Nm,实际出 17 Nm,或者反过来你为了出 20 Nm 打到 17 A,超出驱动器的热设计。BHL 的做法是每台电机上电前做一次堵转/空载表征,把实测 R、L、$K_t$ 写进固件参数表。任何严肃的模组方案都应该有这一步。
1.4 反射惯量:远端关节是「电机主导」,近端是「连杆主导」
把 BHL 每个关节下游所有连杆的惯量(按平行轴定理折算到该关节轴,输入为 官方 URDF 的 mass / inertia / origin)与转子反射惯量 $n^2 J_r = 0.0224$ kg·m² 做比值,得到一张决定「这个关节该怎么控制」的表:
| 关节 | 下游连杆惯量 (kg·m²) | 转子反射惯量 (kg·m²) | 比值 (转子/连杆) | 主导方 | 控制含义 |
|---|---|---|---|---|---|
| 肘 roll | 0.00022 | 0.0224 | 103× | 电机 | 几乎全是转子惯量,反驱困难,需阻抗/导纳控制 |
| 踝 roll | 0.00098 | 0.0224 | 22.8× | 电机 | 接触关节却是电机主导 → 落地冲击全靠电流环吃 |
| 肩 yaw | 0.00082 | 0.0224 | 27.2× | 电机 | 小连杆 + 大减速比,典型电机主导 |
| 踝 pitch | 0.00765 | 0.0224 | 2.9× | 电机 | 过渡区 |
| 肘 pitch | 0.01276 | 0.0224 | 1.8× | 电机 | 过渡区 |
| 膝 pitch | 0.05608 | 0.0224 | 0.4× | 连杆 | 连杆主导,反驱性好,可直接力控 |
| 肩 pitch / roll | 0.068 / 0.073 | 0.0224 | 0.3× | 连杆 | 连杆主导 |
| 髋 yaw | 0.08021 | 0.0224 | 0.3× | 连杆 | 连杆主导 |
| 髋 pitch | 0.18273 | 0.0224 | 0.1× | 连杆 | 纯连杆主导,转子惯量可忽略 |
| 髋 roll | 0.19930 | 0.0224 | 0.1× | 连杆 | 纯连杆主导 |
({
"_height": "440px",
"backgroundColor": "transparent",
"grid": { "left": 130, "right": 70, "top": 30, "bottom": 50 },
"tooltip": {
"trigger": "axis",
"axisPointer": { "type": "shadow" },
"backgroundColor": "rgba(15,23,42,0.95)",
"borderColor": "#9d7bf0",
"borderWidth": 1,
"textStyle": { "color": "#e2e8f0" },
"formatter": function (p) {
var d = p[0];
return "" + d.name + "
转子/连杆惯量比: " + d.value + "×
" +
(d.value > 1 ? "电机主导 → 反驱差,需阻抗控制" : "连杆主导 → 反驱好,可直接力控");
}
},
"xAxis": {
"type": "log",
"name": "比值(对数)",
"nameTextStyle": { "color": "#94a3b8" },
"axisLabel": { "color": "#94a3b8" },
"splitLine": { "lineStyle": { "color": "rgba(148,163,184,0.15)" } }
},
"yAxis": {
"type": "category",
"data": ["髋 roll", "髋 pitch", "肩 roll", "肩 pitch", "髋 yaw", "膝 pitch", "肘 pitch", "踝 pitch", "踝 roll", "肩 yaw", "肘 roll"],
"axisLabel": { "color": "#94a3b8", "fontSize": 12 },
"axisLine": { "lineStyle": { "color": "#334155" } }
},
"series": [{
"type": "bar",
"barWidth": "55%",
"data": [
{ "value": 0.11, "itemStyle": { "color": "#3ddc97" } },
{ "value": 0.12, "itemStyle": { "color": "#3ddc97" } },
{ "value": 0.31, "itemStyle": { "color": "#3ddc97" } },
{ "value": 0.33, "itemStyle": { "color": "#3ddc97" } },
{ "value": 0.28, "itemStyle": { "color": "#3ddc97" } },
{ "value": 0.4, "itemStyle": { "color": "#3ddc97" } },
{ "value": 1.76, "itemStyle": { "color": "#e0b341" } },
{ "value": 2.93, "itemStyle": { "color": "#e0b341" } },
{ "value": 22.8, "itemStyle": { "color": "#f0708a" } },
{ "value": 27.3, "itemStyle": { "color": "#f0708a" } },
{ "value": 103.4, "itemStyle": { "color": "#f0708a" } }
],
"label": { "show": true, "position": "right", "color": "#e2e8f0", "formatter": "{c}×" },
"markLine": {
"symbol": "none",
"lineStyle": { "color": "#94a3b8", "type": "dashed", "width": 2 },
"label": { "color": "#94a3b8", "formatter": "1.0× 分界" },
"data": [{ "xAxis": 1.0 }]
}
}]
})
这张图解释了为什么「一套 PD 参数打全身」在真机上一定会失败。髋关节的转子惯量只占下游的 10%,你直接给扭矩指令,连杆立刻响应;肘 roll 的转子惯量是连杆的 103 倍,你给的扭矩先拿去加速转子,连杆几乎不动。G1 的 legged_gym 配置正是这么分组的:髋 $K_p=100$、膝 $K_p=150$、踝 $K_p=40$ Nm/rad,阻尼髋 2 / 膝 4 / 踝 2——膝刚度最高是因为它连杆主导且要扛 61.9 Nm 静力矩,踝刚度最低是因为它电机主导且是接触关节,硬了会把地面冲击直接打进基座。
1.5 减速器与模组选型:知识库里的真实货架
把上面的约束翻译成采购语言,就是三类减速器各自的地盘:
| 类型 | 典型减速比 | 背隙 | 反驱性 | 用在哪 | 知识库代表型号 |
|---|---|---|---|---|---|
| 行星(QDD) | 6–48:1 | 10–15 arcmin | 好 | 髋、膝、踝、肩——需要冲击吸收与力控 | CubeMars AKH70-48(48:1,74/222 Nm,159 Nm/kg,¥4888);BHL 自制 15:1 摆线盘 |
| 谐波(strain wave) | 50–160:1 | ≤10 arcsec | 差(不可反驱) | 腕、腰 yaw、手指——小扭矩高精度 | Harmonic Drive CSD-2A(50–160:1,峰值 12–823 Nm);绿的谐波 LHD 超薄中空轴(轴向长度较 LHS 缩短约 50%);来福 FS 系列 |
| 摆线/RV | 27–192:1 | <1 arcmin | 差 | 工业基座/肩轴,抗 5× 额定冲击;人形少见(太重) | Nabtesco RV-E/RV-C(额定 72–4900 Nm,瞬时冲击 5×);双环传动 SHPR-E |
| 行星滚柱丝杠(线性) | 按导程 | — | 中 | 线性髋/膝/踝(Optimus 路线) | Ewellix/Schaeffler(直径 8–240 mm,导程 2–50 mm,线速度 ≤1.8 m/s,加速度 ≤12,000 rad/s²);Rollvis RV/HRV |
选型上的实际判据只有三条。第一,先看反驱性再看扭矩密度:接触关节(踝)和需要力控的关节(膝、肩)如果上了谐波,你就永久失去了「用手推着它走」的能力,碰撞时也没有机械缓冲,全部冲击由电流环和连杆承担。第二,谐波怕摔——柔轮是薄壁弹性件,一次跌落冲击就可能造成永久变形,这在整机调试阶段是真实风险,所以行业主流是把谐波放在手臂远端(摔不着)而不是腿上。第三,看扭矩密度要连着看重量:CubeMars AKH70-48 的 159 Nm/kg 是按峰值扭矩算的,额定只有 74 Nm、1396 g,即额定密度 53 Nm/kg。厂商规格表里的峰值扭矩通常是 3 秒值,连续工作点要按额定算,否则会严重高估模组的持续能力。
一体化关节模组的货架形态已经很成熟,可直接对照整机需求选档:
| 模组 | 额定 / 峰值扭矩 | 重量 | 供电 | 编码器 | 总线 | 特点 |
|---|---|---|---|---|---|---|
| 优宝特 BM 系列(M5–M200) | 5.5–60 / 12–200 Nm | 280–4700 g | 24/42/72 VDC | 双绝对值 14 bit,断电位置记忆 | CAN 1 Mbps | 覆盖全身档位,一个系列打通 |
| 睿尔曼 WHG 系列 | 10–360 Nm | 0.8–5.77 kg | 24/48 V | 16 bit 增量 + 18 bit 绝对 | CAN FD | 带电磁抱闸,减速比 100/160 |
| 魔法原子 H70 | 30 / 96 Nm | 900 g | 48 V | — | CAN / EtherCAT | φ70×96 mm,12 mm 中空轴,30 rpm |
| CubeMars AKH70-48 | 74 / 222 Nm | 1396 g | 48 V(额定 6 A / 峰值 18 A) | 双 21 bit 磁编 | 双 CAN | 行星 48:1,背隙 12 arcmin,FOC 一体化 |
| Wonik Allegro Hand V4(手) | 0.70 Nm/关节 | 1.08 kg/整手 | 24 V / 100 W | 电位器 0.002° | CAN 333 Hz | 16 关节力矩控制,1:369 减速比 |
这张表里唯一需要单独强调的是「断电位置记忆」和「电磁抱闸」不是可选项。人形机器人一旦掉电,关节若没有绝对值多圈编码器或抱闸,整机就会在重力下垮塌——16–52 kg 的机器从站立姿态垮下来,最先损坏的恰恰是最贵的谐波减速器。多圈绝对值编码器(如多摩川 SA 系列,17–27 bit/圈 + 16 bit 多圈,无电池版 TS5966N)保证上电即知道姿态,抱闸保证髋膝在断电时能撑住自重。这两项的成本远低于一次摔机。
第二层:IMU——安装位置比器件规格重要四个数量级
IMU 是人形机器人唯一一个「装错位置就整机失效」的传感器。原因不是精度不够,而是杆臂效应(lever-arm effect):IMU 测的是它自己所在那一点的加速度,而状态估计器要的是基座质心的加速度,两者之间差一个由角运动产生的项。
设 IMU 安装点 $P$ 相对基座参考点 $O$ 的位置矢量为 $\vec r$,则两点加速度的关系是刚体运动学恒等式:
$$\vec a_P = \vec a_O + \dot{\vec\omega} \times \vec r + \vec\omega \times (\vec\omega \times \vec r)$$
第二项是切向项(角加速度 × 杆臂),第三项是向心项(角速度平方 × 杆臂)。这两项与重力、与真实平移加速度混在同一个读数里,估计器分不出来。它们的大小完全由 $\vec r$ 决定,而 $\vec r$ 是你在结构图上随手定的一个安装位置。
2.1 用 BHL 的真实安装位置算一遍
BHL 的 URDF里显式声明了一个 imu 关节(type="fixed",parent 为 base):xyz = (0.061722, 0, 0.68),parent 是 base。也就是 IMU 装在躯干内、基座原点前方 6.17 cm、上方 68 cm 处。IMU 到躯干质心的距离只有 0.065 m,但到踝关节/基座原点的杆臂在俯仰方向上是 0.683 m,在偏航方向上是 0.0617 m——相差 11 倍。
把典型的行走/抗扰角运动代进去:
| 工况 | 角加速度 $\dot\omega$ (rad/s²) | 角速度 $\omega$ (rad/s) | 杆臂方向 | 切向项 (m/s²) | 向心项 (m/s²) | 合成伪加速度 | 相当于 BNO085 噪声底的倍数 |
|---|---|---|---|---|---|---|---|
| 缓慢转身 | 20 | 3 | 俯仰 r=0.683 m | 13.66 | 6.15 | 14.98 m/s² = 1.53 g | 8,701× |
| 偏航 r=0.0617 m | 1.23 | 0.56 | 1.35 m/s² = 0.14 g | 786× | |||
| 快速转身 / 抗扰 | 50 | 6 | 俯仰 r=0.683 m | 34.15 | 24.59 | 42.08 m/s² = 4.29 g | 21,752× |
| 偏航 r=0.0617 m | 3.08 | 2.22 | 3.80 m/s² = 0.39 g | 1,965× | |||
| 跌倒/落地冲击 | 100 | 10 | 俯仰 r=0.683 m | 68.30 | 68.30 | 96.59 m/s² = 9.85 g | 43,503× |
| 偏航 r=0.0617 m | 6.17 | 6.17 | 8.73 m/s² = 0.89 g | 3,930× |
把这张表和器件规格放在一起看,结论就出来了。BNO085 的加速度计 RMS 噪声是 0.00157 m/s²,IM10A 是 0.00736 m/s²。而 BHL 那个 0.683 m 的俯仰杆臂在「快速转身」工况下产生 34.15 m/s² 的切向伪加速度,是 BNO085 噪声底的 21,752 倍;跌倒工况下是 43,503 倍。
器件噪声在这个量级面前完全不重要。你花十倍价钱把加速度计噪声从 1.57 mg 降到 0.16 mg,换来的是 0.015% 的改善;而把 IMU 从躯干顶端(0.683 m)挪到骨盆中心(0.1 m),伪加速度直接降 85%。这就是为什么所有人形机器人(Unitree、Tesla、Figure、Agility)都把 IMU 装在骨盆/躯干下部靠近质心的位置,而不是装在头部或胸腔上部——头部位置视觉好、散热好、装配方便,但杆臂最长,是最差的 IMU 位置。
2.2 为什么杆臂伪加速度是「可补偿的」,而噪声不是
杆臂效应有一个关键性质:它是确定性的。只要你知道 $\vec r$ 和 $\vec\omega, \dot{\vec\omega}$(陀螺仪直接给),就能把这两项精确减掉:
$$\vec a_O = \vec a_P - \dot{\vec\omega} \times \vec r - \vec\omega \times (\vec\omega \times \vec r)$$
这正是 BHL 在 URDF 里显式声明 imu 关节坐标的原因——那个 xyz=(0.061722, 0, 0.68) 不是给渲染用的,是给状态估计器做杆臂补偿用的。仿真里的 IMU 帧和真机上的物理安装位置必须逐毫米对上(URDF 与 MJCF 都把 imu 作为一等公民建模),否则 sim-to-real 时策略看到的基座加速度会有一个系统性偏差,而且这个偏差只在角运动时出现(静止站着完全看不出来),是最难调的一类 bug。
器件噪声则是随机的,只能靠滤波和积分时间压低,压不掉。所以选 IMU 的优先级是:① 安装位置(杆臂,量级 10³–10⁴)→ ② 零偏稳定性(决定长时间漂移)→ ③ 带宽(决定能否跟上 100 Hz 以上的冲击)→ ④ RMS 噪声(量级 10⁰)。绝大多数选型讨论把顺序完全搞反了。
2.3 器件档位与货架
| 参数 | BNO085(消费级,BHL 早期) | IM10A(BHL 现推荐) | Xsens MTi-620(工业级 VRU) | 华依 IMU3000(导航级) |
|---|---|---|---|---|
| 加速度计量程 | ±16 g | ±16 g | — | ±4 g |
| 加速度分辨率 | 1 mg/LSB | 0.5 mg/LSB | — | — |
| 加速度 RMS 噪声 | 0.16 mg | 0.75–1 mg | — | 偏置不稳定性 ≤0.015 mg |
| 加速度零偏漂移 | ±150 mg | ±20–40 mg | — | 偏置稳定性 ≤0.05 mg |
| 陀螺量程 | ±2000 °/s | ±2000 °/s | 2000 °/s | ±250 °/s |
| 陀螺 RMS 噪声 | 0.014 °/s | 0.028–0.07 °/s | 0.007 °/s/√Hz | ARW 0.15 °/√hr |
| 陀螺零偏 | ±1 °/s | ±0.5–1 °/s | in-run bias stability 8 °/h | 偏置不稳定性 ≤0.8 °/h |
| 带宽 | 8–1000 Hz | 5–256 Hz | 输出最高 2 kHz | 200 Hz |
| 磁力计 | ±13 Gauss | ±2 Gauss | 有(带气压计) | —(走 GNSS 组合) |
| 接口 | I²C / SPI | USB 直连 | UART / CAN / RS232 | — |
| 重量 / 尺寸 | — | — | 8.9 g / 28×31.5×13 mm | 22×22×5 mm |
| 定位 | 原型验证 | 开源人形首选 | 工业/研究 | 车规导航(ASIL-B) |
这张表里有一个反直觉的事实:BHL 从 BNO085 换到 IM10A,噪声指标是变差的(RMS 0.16 mg → 0.75–1 mg,陀螺噪声 0.014 → 0.028–0.07 °/s),但零偏漂移大幅改善(加速度 ±150 mg → ±20–40 mg)。BHL 的IMU 对比文档给出的理由是工程性的:IM10A 走 USB 直连,不需要 Arduino Nano 中转,少一层协议栈和少一个丢包源。对状态估计而言,零偏稳定性比 RMS 噪声重要得多——噪声可以被滤波平均掉($\propto 1/\sqrt{N}$),零偏是系统误差,积分一次就变成速度漂移、积分两次变成位置漂移。人形机器人靠 IMU 做姿态和接触检测,不靠它做绝对定位,所以「低漂移 + 简单可靠的数据链路」压倒「低噪声 + 复杂链路」。
还有一个容易被忽略的量程问题:跌倒工况下杆臂伪加速度合成达到 9.85 g,加上真实冲击,总读数很容易超过 ±16 g 量程。加速度计一旦削顶(clipping),姿态估计立刻发散,而这恰恰发生在最需要姿态估计的跌倒瞬间。所以 IMU 量程要按「杆臂伪加速度 + 冲击 + 重力」的总和留裕度,不是按行走工况留。导航级器件(华依 IMU3000 只有 ±4 g)在这类冲击场景下会直接削顶——它们的定位是车/无人机的平稳载体,不是会摔的双足机器人。
第三层:材料与结构设计——BOM 里的材质迁移是一部受力路径史
结构设计的核心矛盾只有一个:整机质量 $m$ 同时出现在扭矩需求($m g d$)和续航预算($E/P$)的分子上,也出现在惯量($J \propto m r^2$)里。减 1 kg 腿部远端质量,同时降低踝膝髋的静力矩需求、降低下游连杆惯量、降低整机功耗,是三赢;而减 1 kg 躯干质量只降低功耗和总静力矩,对惯量几乎无益(因为躯干靠近旋转轴,$r$ 小)。所以减重的优先级永远是远端 > 近端,脚的每一克都比胸腔的每一克贵。
3.1 X1 三版 BOM 的换料记录:材料升级方向不是随机的
智元 X1 的硬件仓库是三版 BOM 全部公开的唯一一台机器(agibot_x1_hardware 下按日期分目录:智元灵犀X1_20241024 / _20250108 / _20250307,每版含总 BOM xlsx、STEP 图纸与装机 SOP)。⚠️ 该仓库没有 LICENSE 文件,按著作权法默认「保留所有权利」,可参考但不可直接二次分发;相比之下 BHL(MIT + CC BY-SA 4.0)与 ATOM01(GPL-3.0)的授权是明确的。把三版 BOM 逐行对账,可以看到一次完整的材料迭代:
| 维度 | 首版 BOM(2024-10-24) | 第三版 BOM(2025-03-07) | 变化含义 |
|---|---|---|---|
| 材质标注种类 | 6 种 | 11 种 | 从「有什么用什么」到「按受力选料」 |
| 带材质标注的行数 | 100 行 | 167 行 | 材料从可选项变成必填字段 |
| 6061-T6 铝合金 | 50 处 | 大幅减少 | 被 7075-T6 / 17-4PH 替换 |
| 3D 打印树脂/ABS | 43 处 | 保留在非承力位置 | 原型件转正为外壳/支架件 |
| 腕十字轴 | 40Cr | 17-4PH | 沉淀硬化不锈钢,抗交变载荷 + 耐腐蚀 |
| 腰部支撑十字架 | 6061 | 17-4PH | 闭链机构核心承力件 |
| 脚踝摆臂 / 脚掌支撑 / 腰部连杆组件 | 6061 | 7075-T6 | 屈服强度 276 → 503 MPa(+82%) |
| 腰部连杆组件-5 / 脚踝连杆 | 6061 / 「钛合金」(未标牌号) | TC4(Ti-6Al-4V) | 比强度最高,用在最难减重的位置 |
这背后的工程逻辑值得展开,因为它是所有自研结构都要走的一步。6061-T6 的问题不是强度不够,是疲劳和接触应力不够。屈服 276 MPa 对于一次性静载完全够用,但闭链连杆的销轴承受的是微动磨损(fretting)+ 交变接触应力——两个面在高压下反复微幅相对滑动,这是铝合金最差的工况,会在远低于屈服强度的应力下产生疲劳裂纹。换成 17-4PH(沉淀硬化不锈钢,H900 时效后屈服 1170 MPa)或 7075-T6(屈服 503 MPa)是把疲劳极限和表面硬度一起提上去。TC4 用在腰部连杆是因为那里同时要求高强度和低质量,而 TC4 的密度只有 4.43 g/cm³(7075 是 2.81,钢是 7.85),比强度最高,代价是加工困难、成本高、导热差。
3.2 三种制造路线的成本结构
ATOM01 是唯一公开完整 BOM 单价的整机(散件清单 xlsx,随 CNC 加工 / 3D 打印 图纸一起发布),它的成本结构给出了「开源复现」路线的真实价格分布:
| 成本项 | 金额(¥) | 占比 | 说明 |
|---|---|---|---|
| 电机(23 台 DM 系列) | 31,187 | 62.7% | 9 台 DM10010L(80 Nm 档)+ 14 台 DM4340P(18 Nm 档) |
| CNC 机加工(68 件) | 15,670 | 31.5% | 结构件全金属,单件均价 ¥230 |
| 传感 + 计算 + 电池 + 线缆 + 紧固件 | 约 2,850 | 5.8% | 五项加起来不到电机的 1/10 |
| 合计 | ≈49,700 | 100% | 表内三处总额不一致(49,713 / 49,743.53 / 49,652.53),差 91 元 = 0.18% |
94% 的钱花在电机和 CNC 上,这个数字彻底改变了优化方向。想降成本,减传感器、换便宜 IMU、用国产计算板全部加起来也只有 6% 的空间;真正的杠杆只有两个——降电机单价(换国产模组或自研 QDD)和降 CNC 件数(用 3D 打印/铸造替代部分结构件)。BHL 走的正是第二条路:22 个关节全部用 3D 打印摆线盘 + 市售 T-Motor 电机自制模组(打印参数见官方 3D Printing Instructions),结构件以 Bambu Lab X1C 打印的 PLA 为主,整机成本压到 ATOM01 的几分之一,代价就是前面算出的髋关节 0.9× 裕度。
3.3 结构设计的三个隐藏约束
约束一:碰撞体不是可选项。X1 的 URDF里 58 个连杆只有 3 个带 collision geometry(3/58)。这意味着在仿真里,它的自碰撞检测基本是关闭的——手臂可以穿进躯干,脚可以穿过小腿。策略在这种仿真里训出来,上真机第一件事就是撞到自己的身体。复现时必须自己补碰撞体,而这需要知道每个连杆的真实包络尺寸,也就是需要 CAD。没有碰撞体的 URDF 不是「简化模型」,是一个物理上不成立的模型。
约束二:左右对称件不能直接复制惯量。X1 的左腕连杆惯量是从右腕复制过来忘了改镜像符号的(惯性积 $I_{xy}, I_{yz}$ 的符号必须翻转)。这个错误在仿真里几乎看不出后果(腕部惯量占比极小),但它揭示了一个普遍问题:镜像件在 CAD 里是几何镜像,在 URDF 里必须是惯量张量的符号镜像。批量导出时这是最容易出错的一步,也是自研结构必须写脚本校验的一步。
约束三:线束是最便宜也最容易断的零件。行业数据里线束是 BOM 上最便宜的一行,却是柔顺疲劳风险最高的一行(ATOM01 专门发布了一份 走线说明 PDF)。人形机器人有 30 个左右的活动关节,每个关节处的线束都要跟随关节全行程反复弯曲/扭转。BHL 的 BOM 与线束清单给出了开源级的具体做法:14 AWG 硅胶线走动力(白/红为正、黑为地),30 AWG 走 CAN 信号,主干用 XT60、分支用 XT30,调试节点用 WAGO 快接,上位机侧接 USB-CAN 适配器。动力线与信号线分开走线、分开线径,是因为 FOC 的相电流是高频 PWM 斩波,会与 CAN 差分对产生共模干扰——把 14 AWG 动力和 30 AWG CAN 绑成一束走同一个关节,是 CAN 偶发丢帧最常见的物理原因。
fixed。这不是错误,而是一个信号:X1 开源的 URDF 是「腿部步态训练专用模型」,不是整机模型。拿它训手臂操作策略会一无所获。3.4 材料选择的判据表
| 位置 | 主导载荷 | 推荐材料 | 理由 | 不推荐 |
|---|---|---|---|---|
| 脚掌 / 踝摆臂 | 冲击 + 接触应力 + 磨耗 | 7075-T6 / TC4 + 表面硬化 | 落地冲击 3–5× 体重,反复微动 | 6061(疲劳差)、纯 PLA(蠕变) |
| 闭链连杆 / 销轴 | 交变载荷 + 微动磨损 | 17-4PH / SCM435 / 40Cr 调质 | 需要高疲劳极限 + 高表面硬度 | 铝合金(微动磨损敏感) |
| 大腿 / 小腿主结构 | 弯曲 + 需减重 | 7075-T6 或 TC4(预算充足) | 远端质量三赢,值得花钱 | 6061 厚壁补强(重量反增) |
| 躯干框架 | 刚度 + 安装基准 | 6061-T6 型材/板 | 靠近旋转轴,减重收益低,够用即可 | TC4(性价比差) |
| 外壳 / 支架 / 走线件 | 几乎无载荷 | 3D 打印(PLA/PETG/尼龙) | 迭代快、成本近零、可现场改 | CNC(浪费预算) |
| 减速器柔轮 | 循环弹性变形 | 专用弹簧钢(供应商保密) | 这是谐波减速器的核心 know-how | 自制(疲劳寿命不可控) |
3D 打印在人形结构里的正确定位是「非承力件的主力 + 承力件的原型」。BHL 把 3D 打印推进到了承力件(摆线盘),这是个例外,成立的前提是:它的关节是 QDD 低减速比,摆线盘承受的接触应力远低于谐波柔轮;而且它的整机只有 16.33 kg,远端载荷小。同一套打印件放到 51.65 kg 的 H1 上会立刻失效。PLA 的另一个隐藏问题是蠕变和玻璃化转变温度(约 60 °C)——电机紧邻的支架件在持续工作下会接近这个温度,PLA 会缓慢变形。承力或近热源位置应该用 PETG、尼龙或碳纤维增强件。
第四层:传感器——先定观测空间,再定采购清单
传感器选型最容易犯的错是「按品类买齐」:一台深度相机、一个激光雷达、两个六维力、几个触觉,装上去就以为完成了。正确的顺序是反过来的:先看策略需要哪些观测(observation space),再决定装什么。观测空间是可以在训练配置里逐维读出来的,它比任何产品介绍都准确。
4.1 从训练配置反推传感器需求
G1 的 legged_gym 训练配置(g1_config.py)给出了一个非常干净的样本:47 维观测、50 维特权观测(privileged)、12 维动作。把这 47 维拆开,就能看出步态策略真正需要什么传感器:
| 观测项 | 维度 | 来源传感器 | 是否必须真机可得 | 缺失后果 |
|---|---|---|---|---|
| 基座角速度 | 3 | IMU 陀螺 | 是 | 无法估计姿态,立刻摔 |
| 投影重力向量 | 3 | IMU 加速度计 + 姿态解算 | 是 | 不知道自己是歪的 |
| 速度指令(x/y/yaw) | 3 | 摇杆/上位机 | 是(外部输入) | 不知道要去哪 |
| 关节位置偏差 | 12 | 关节编码器 | 是 | 无位置闭环 |
| 关节速度 | 12 | 关节编码器(差分/驱动内置) | 是 | 无阻尼项,振荡 |
| 上一帧动作 | 12 | 策略自身记忆 | — | 动作不平滑 |
| 合计 | 47 (含 2 维常量/噪声位) |
这张表最反直觉的结论是:整个行走策略里没有视觉、没有激光雷达、没有六维力、没有触觉。一个能稳定行走、抗推、爬缓坡的双足策略,只需要 IMU + 关节编码器。50 维特权观测里才包含地形高度图、摩擦系数、基座真实速度、外力扰动——这些只在仿真里可得,用于 teacher-student 蒸馏,真机上不存在。
那 50 维特权观测的存在恰恰说明了另一件事:真机上缺的信息,靠域随机化和特权蒸馏来补,而不是靠加装传感器。摩擦系数在真机上不可测(只能靠脚底打滑反推),所以训练时直接在 $[0.1, 1.25]$ 区间随机;基座真实速度真机上只能靠状态估计器(IMU + 运动学 + 接触检测)融合,误差不可消除,所以训练时给观测加噪声;外力扰动不可测,所以每 5 秒随机推一把(最大 1.5 m/s)。传感器缺口的正确解法是随机化,不是采购。
这也解释了为什么关节编码器是唯一不能省的传感器。G1 配置里 12 维位置 + 12 维速度 = 24 维,占了 47 维观测的一半以上。而 BHL 的 I²C 读 AS5600 需要 78 µs,这 24 维观测的每一帧都要付这个代价——编码器接口的选择直接决定了观测的更新率上限,进而决定了策略能跑多快。
4.2 什么任务需要加装什么
行走不需要视觉,但操作、上下楼、人机协作都需要。按任务分层给判据:
| 任务 | 必需传感器 | 知识库代表型号 | 关键规格 | 为什么 |
|---|---|---|---|---|
| 平地行走 / 抗扰 | IMU + 关节编码器 | IM10A;多摩川 SA 系列(17–27 bit/圈 + 16 bit 多圈) | 陀螺零偏 ≤1 °/s;编码器绝对值 + 断电记忆 | 47 维观测全部来源 |
| 上下楼 / 崎岖地形 | + 深度相机 或 激光雷达 | RealSense D435i / D455(内置 IMU);Livox Mid-360 / Mid-360S;Ouster OS1 / Velodyne;Stereolabs ZED | 需覆盖脚前方 1–2 m 的地形高度图,更新率 ≥10 Hz | 把特权观测里的 height map 变成真机可测 |
| 手臂操作 / 接触装配 | + 腕部六维力/力矩 | 宇立 SRI C025XX–C060XX(人形专用,Fz 50–1000 N,Mx/My/Mz 5–40 Nm,精度 <0.5% F.S.,OD 45–60 mm / 高 9.2–28 mm / 重 30–330 g,EtherCAT/CAN FD/RS485);坤维 KWR75(φ75 mm,Fz 30–3000 N,重复性 0.1% F.S.,IP64);ATI Gamma / Nano17(Nano17 仅 9.07 g,分辨率 1/320 N,谐振 7200 Hz,适合手指级) | 带宽 ≥1 kHz(接触瞬态),过载 ≥3× F.S.(碰撞保护) | 接触力不可由关节扭矩反推(摩擦 + 惯量项污染) |
| 灵巧抓取 / 手内操作 | + 指尖触觉 / 视触觉 | 戴盟 DM-Tac X(41×24×18 mm / 19.2 g,触觉分辨率 384×288 = 110,592 点,120 Hz,IP67);Tekscan 压力阵列;Paxini GRM118 / DexH5 | 阵列分辨率 >100 点,采样 ≥100 Hz | 滑移检测只能靠触觉,视觉看不到接触面 |
| 遥操作 / 数据采集 | + 动捕 或 VR 追踪 | BHL 用 SteamVR 动捕做遥操作采集;OptiTrack / Vicon(工业) | 亚毫米定位,≥100 Hz | 模仿学习需要高质量专家轨迹 |
| 人机协作安全 | + 安全激光扫描仪 / 光幕 | Pilz、SICK、Omron、Leuze、Fortress Interlocks | 按 ISO 13482 / ISO 10218 定安全等级 | 这不是性能件,是合规件,不能省 |
六维力传感器这一行值得多说一句,因为它是操作任务里最贵也最容易被低估的传感器。核心原因是:关节扭矩不能用来反推末端接触力。末端力 $F_{ext}$ 与关节扭矩的关系是
$$\tau = J^T(q) \cdot F_{ext} + M(q)\ddot q + C(q,\dot q)\dot q + G(q) + \tau_{friction}$$
要从中解出 $F_{ext}$,你必须精确知道惯量矩阵 $M$、科氏项 $C$、重力项 $G$ 和摩擦 $\tau_{friction}$,还要对 $\ddot q$ 做二阶差分(噪声放大 $\propto 1/\Delta t^2$)。实际工程里这个「无传感器力估计」方案的精度通常在 10–30% 量级,而一个 0.5% F.S. 的六维力传感器直接给 0.5%。差两个数量级。所以「用电流环当力传感器」只在准静态、低速、无摩擦补偿需求时勉强可用(ATOM01 这类 18 Nm 小关节 + 39% CoP 的准静态行走就是这个工况);一旦要做接触装配、插拔、擦拭这类需要力闭环的操作,六维力是硬需求。
选型时的三个坑:① 量程要按碰撞而不是按工作力选——宇立 C 系列标称过载 3×,部分型号每轴可承受 100 次 3× 过载循环,这个指标比量程本身重要,因为一次意外碰撞就报废一个传感器;② 解耦矩阵必须由厂商标定——六维力的六个通道天然耦合,厂商给的 6×6 解耦矩阵是随标定证书走的,自己算不出来;③ 重量计入远端惯量——腕部装一个 330 g 的六维力,等于给肘关节增加了 330 g 的远端负载,会直接改变第 1.4 节算出的转子/连杆惯量比。
第五层:电池与 BMS——「所有关节同时发力」在物理上不成立
这一层是整篇文章里最容易被糊弄过去、也最容易炸的一层。先把一个所有人都忽略的矛盾摆出来:URDF 声明的整机峰值功率,和电池包能提供的功率,差了三个数量级。
5.1 同时性悖论:109 C 的电池包不存在
G1 的 29 个关节声明扭矩与峰值速度逐项相乘求和,得到 46,062 W。它的官方电池包规格是 9000 mAh / 421.2 Wh / 46.8 V 标称 / 54.6 V 充电上限(H1 同理,15 Ah / 864 Wh / 67.2 V 上限)。由 54.6 ÷ 13 = 4.200 V/cell 可反推这是 13S 锂电组。如果 46,062 W 全部由这个包提供:
$$I = \frac{P}{V} = \frac{46062}{46.8} = 984 \text{ A}, \qquad C = \frac{I}{Q} = \frac{984}{9.0} = \mathbf{109\text{C}}$$
109 C 意味着这个包在 0.55 分钟(33 秒)内放空,而且没有任何商用锂电组能持续输出 109 C(高倍率 LiPo 的极限在 20–50 C 脉冲)。所以结论只有一个:URDF 里的 effort 从来不是按「所有关节同时到峰值」设计的,它是单关节的独立上限。
| 机器人 | 电池包 | 串数 S | Σ 峰值功率 (W) | 等效电流 (A) | 等效 C 率 | 可持续时间 | 2h 平均功率预算 (W) | 占 Σ 峰值比例 |
|---|---|---|---|---|---|---|---|---|
| Unitree G1 | 46.8 V / 9 Ah / 421.2 Wh(官方 ~2h 续航) | 13S(4.200 V/cell) | 46,062 | 984 | 109 C | 0.55 min | 210.6 | 0.46% |
| Unitree H1 | 57.6 V / 15 Ah / 864 Wh(67.2 V 上限) | 16S(4.200 V/cell) | 36,720 | 638 | 42.5 C | 1.41 min | 432.0 | 1.18% |
| RoboParty ATOM01 | 48 V / 15 Ah / 720 Wh(BOM 明列) | 13S 级 | 8,488 | 177 | 11.8 C | 5.1 min | 360.0 | 4.24% |
这张表里 「2h 平均功率预算」和「Σ 峰值功率」的比例是 0.46%–4.24%。这个巨大的落差给出了整机能耗设计的真正判据:
判据一:续航由平均功率决定,不由峰值功率决定。G1 跑 2 小时只需要平均 210.6 W,而它的单关节峰值就能到 2,816 W(髋 pitch,88 Nm × 32 rad/s = 60.2 A = 6.69 C)。也就是说,单个关节的一次蹬地就已经是整机 2 小时平均功率的 13 倍。行走是脉冲式负载:摆动期几乎不耗能,支撑期蹬地瞬间打满,中间靠电机的反电动势和连杆的弹性回收一部分。
判据二:可交付峰值由 BMS 的 C 率上限决定,不由电池包的 Wh 决定。720 Wh 的 ATOM01 比 421 Wh 的 G1 能量多 71%,但它的 Σ 峰值功率只有 G1 的 18%。反过来,一个 400 Wh 但能持续 10 C 的包(4,000 W)在步态性能上远胜一个 800 Wh 只能 2 C 的包(1,600 W)。选电池时先问 C 率,再问 Wh。
判据三:辅助负载才是续航的真正杀手。210.6 W 的平均预算里,机载计算机(BHL 用 BeeLink N95 NUC,典型 10–25 W)、视觉传感器(深度相机 3–8 W)、散热风扇、通信、舵机抱闸保持电流加起来很容易占到 50–80 W,也就是平均预算的 25–40%。行走本身反而不是最大头。这解释了为什么很多演示机「站着不动也只能撑 2 小时」——站着不动时关节保持电流 + 全部辅助负载照样在烧。
ATOM01 的 720 Wh 包在不同平均功率下的续航可以直接算出来($t = E/P$),这张表可以作为整机能耗预算的模板:
| 平均功率 (W) | 等效 C 率 | 续航 (min) | 续航 (h) | 典型工况 |
|---|---|---|---|---|
| 1,200 | 1.67 C | 36 | 0.60 | 激烈动态步态 + 全传感器 + 高负载操作 |
| 800 | 1.11 C | 54 | 0.90 | 持续行走 + 操作 |
| 720 | 1.00 C | 60 | 1.00 | 1C 基准点(多数商用包的安全持续线) |
| 600 | 0.83 C | 72 | 1.20 | 常规行走 |
| 400 | 0.56 C | 108 | 1.80 | 慢速行走 + 计算负载 |
| 200 | 0.28 C | 216 | 3.60 | 准静态站立/坐姿操作(G1 的 2h 预算在这一档附近) |
| 100 | 0.14 C | 432 | 7.20 | 待机 + 计算(关节不通电) |
({
"_height": "400px",
"backgroundColor": "transparent",
"grid": { "left": 70, "right": 40, "top": 46, "bottom": 50 },
"tooltip": {
"trigger": "axis",
"axisPointer": { "type": "shadow" },
"backgroundColor": "rgba(15,23,42,0.95)",
"borderColor": "#f0708a",
"borderWidth": 1,
"textStyle": { "color": "#e2e8f0" },
"formatter": function (p) {
var d = p[0];
var ex = {
"G1": "46,062 W ÷ 46.8 V = 984 A ÷ 9 Ah
421.2 Wh 包 → 0.55 min 放空",
"H1": "36,720 W ÷ 57.6 V = 638 A ÷ 15 Ah
864 Wh 包 → 1.41 min 放空",
"ATOM01": "8,488 W ÷ 48 V = 177 A ÷ 15 Ah
720 Wh 包 → 5.1 min 放空"
};
return "" + d.name + "
等效 " + d.value + "C
" + (ex[d.name] || "");
}
},
"xAxis": {
"type": "category",
"data": ["G1", "H1", "ATOM01"],
"axisLabel": { "color": "#94a3b8", "fontSize": 13 },
"axisLine": { "lineStyle": { "color": "#334155" } }
},
"yAxis": {
"type": "log",
"min": 1,
"max": 200,
"name": "等效 C 率(对数)",
"nameTextStyle": { "color": "#94a3b8" },
"axisLabel": { "color": "#94a3b8" },
"splitLine": { "lineStyle": { "color": "rgba(148,163,184,0.15)" } }
},
"series": [{
"type": "bar",
"barWidth": "40%",
"data": [
{ "value": 109.4, "itemStyle": { "color": "#f0708a" } },
{ "value": 42.5, "itemStyle": { "color": "#f0708a" } },
{ "value": 11.8, "itemStyle": { "color": "#e0b341" } }
],
"label": { "show": true, "position": "top", "color": "#e2e8f0", "formatter": "{c} C" },
"markLine": {
"symbol": "none",
"lineStyle": { "color": "#3ddc97", "type": "dashed", "width": 2 },
"label": { "color": "#3ddc97", "formatter": "1C = 商用包安全持续线" },
"data": [{ "yAxis": 1.0 }]
}
}]
})
5.2 电池包本体:串数、电芯、封装、布置
人形机器人的电池包参数范围已经收敛得比较清楚了:包电压 48–96 V(Tesla Optimus 约 52 V,Figure 02 为 48 V),能量 1–5 kWh,12S–24S 加并联组,电芯用 NMC 或 LFP 的 18650 / 21700 / 软包,通信走 CAN / SMBus / I²C。三家参照机全部落在这个区间内(G1 13S/46.8 V,H1 16S/57.6 V,ATOM01 48 V)。
串数选择的判据是母线电压与关节模组供电电压匹配。第 1.5 节表里的模组供电档位是 24 / 42 / 48 / 72 VDC,这不是随便定的:48 V 是安全特低电压(SELV)上限附近的工程甜点,既能让 88–222 Nm 级模组拿到足够电流($I = P/V$,同样功率下 48 V 的电流是 24 V 的一半,铜损 $I^2R$ 降到四分之一),又不需要高压绝缘防护和高压作业资质。13S 满电 54.6 V 正好在 48 V 模组的输入范围内,这也是为什么 G1 和 ATOM01 都收敛到 13S 级。更高的串数(24S ≈ 88 V)只在需要 3 kW 以上单关节的超大机器上才划算,代价是绝缘、爬电距离、维修安全全套要求升级。
电芯选型的核心分歧是 NMC vs LFP:NMC 能量密度高(200–280 Wh/kg 电芯级)适合追求续航和减重,但热失控起始温度低;LFP 能量密度低(140–180 Wh/kg)但热稳定性好、循环寿命长(3000+ 次 vs 800–1500 次)、放电平台平。人形机器人在室内与人共处,热安全权重高于续航,LFP 是有理由的选择;但 LFP 的平坦放电曲线让 SOC 估算变难(见 5.3),需要更强的库仑计数和更频繁的重标定。供应商侧,BYD(刀片电池 + 自研 BMS)、Grepow(LiPo / 半固态,机器人高倍率包主力)、Molicel(高放电倍率)、Saft、EnerTech 是这一层的货架来源;高倍率场景优先看 Molicel/Grepow,能量密度场景看 BYD。
体积能量密度这一项可以直接算,而且它决定了电池在整机里的物理占比。G1的包尺寸是 120 × 80 × 182 mm = 1.747 L,装 421.2 Wh,即 241 Wh/L。这个数字意味着:421 Wh 就要占掉 1.75 L 的躯干容积,还要留出散热间隙和结构加强。想把续航翻倍,躯干体积要翻倍,而躯干体积翻倍会改变质量分布和转动惯量,进而改变第 1.2 节的全部扭矩需求。这是「加电池」从来不是局部改动的原因。能量密度提升(半固态、锂金属)对整机设计的影响,远大于对续航数字的影响。
5.3 BMS:器件栈与双路径电流采样
BMS 不是「一个芯片」,是五类器件加一颗 MCU 的栈。这是目前公开资料里能确认的器件级选型:
| 功能块 | 作用 | 代表器件 | 选型判据 |
|---|---|---|---|
| 电芯监测 AFE | 逐节测电压/温度,是 BMS 的感官 | TI BQ79616(16 节)、BQ76952(3–16 节,电压精度 <10 mV,含自主均衡);ADI LTC6813-1;1–4 颗级联覆盖 12S–24S | 每颗管 12–16 节;级联通信要走隔离;电压精度决定 SOC 精度 |
| 电量计(fuel gauge) | SOC / SoH 估算 | TI BQ34Z100-G1;ADI LTC2944(库仑计数) | LFP 平坦曲线必须靠库仑计数,不能只靠 OCV 查表 |
| 保护 FET 驱动 | 过压/欠压/过流/过温时切断 MOSFET | TI BQ29700;Renesas ISL94202;Ablic/Seiko S-8261 | 必须是硬件路径,不能依赖 MCU 软件判断 |
| 均衡器 | 抹平节间电压差 | ADI LTC3300-1(变压器式双向主动均衡,单颗 6 节、最大 10 A 均衡电流、电荷转移效率最高 92%,可堆叠到 >1000 V);BQ76952 内置的是被动均衡(耗散型) | 被动均衡把能量烧成热,13S 以上建议主动均衡——它能在节间搬能量,均衡电流不随节数线性变热 |
| 隔离电流采样 | 测母线电流 | TI AMC1311(隔离放大器);Allegro ACS770(霍尔) | 分流器方案精度高但要隔离;霍尔方案天然隔离但漂移大 |
| 温度监测 | 电芯/模组/环境三点测温 | TI TMP117(±0.1 °C 数字)+ NTC 阵列 | 温度梯度决定热管理策略,单点测温不够 |
| BMS MCU | 状态机、SoP 计算、通信 | STM32(主流);TI TMS570LC4357、Renesas RH850、Infineon AURIX(车规/功能安全) | 需要功能安全认证时选带 lockstep 核的车规件 |
这个栈里最关键、也最少被讨论的是电流采样的双路径架构。Renesas 人形机器人 BMS 参考设计把这条线画得很明确:块图里「Comparators + Current Sense Amp + Gate Driver + Circuit Breaker/E-Fuse」与「Battery Front End + MCU」是两组独立器件,前者是微秒级的硬件保护路径,后者是毫秒级的测量与控制路径——两条都接在同一个分流器上,并联存在,不合一。该页面还给出了针对 24 V 与 48 V 两种母线架构的器件选型清单。
flowchart LR P["电池包 13S / 421 Wh"] --> SH["分流电阻
shunt"] SH --> FAST["路径 A:快速硬件保护
模拟比较器
→ 栅极驱动器
→ 切断 MOSFET"] SH --> MEAS["路径 B:ADC 测量
隔离放大器 AMC1311
→ MCU ADC"] MEAS --> SOP["SoP 计算
可交付功率上限"] MEAS --> SOC["库仑计数 SOC
ΔQ = ∫I(t)dt"] AFE["电芯监测 AFE
BQ79616 × N
逐节 V / T"] --> MCU["BMS MCU
STM32 / 车规件
状态机 + 重标定"] SOP --> MCU SOC --> MCU MCU --> BUS["CAN / SMBus / I²C
→ 上位机"] FAST -.->|不经过 MCU
零软件延迟| P
这个设计对机器人有特别的意义,因为它对应三种真实工况:① 行走脉冲放电(蹬地瞬间 6.7 C,持续几十毫秒,属于正常峰值,不能触发保护);② 持续操作放电(手臂长时间保持力矩,中等电流长时间,属于热累积问题,要按 SoP 降额);③ 安全关键的故障恢复爆发(跌倒后爬起,需要瞬时大功率,此时如果 BMS 因为电压跌落触发欠压保护就会锁死,机器人再也起不来)。第三种工况最难:BMS 必须区分「电池真的没电」和「大电流导致的瞬时压降」,前者要保护,后者要放行。判据是 SoP(State of Power,可交付功率上限)而不是瞬时电压——SoP 由 SOC、温度、内阻、老化程度共同算出,这正是路径 B 存在的理由。
SOC 估算本身是个带漂移的积分:$\Delta Q = \int I(t)\,dt$,电流采样误差和时间基准误差都会累积,所以需要周期性用 OCV(开路电压)重标定。而重标定要求电池静置——机器人不能停机静置 30 分钟等 SOC 校准。LFP 的平坦放电曲线让 OCV 重标定的可用窗口更窄。工程解法是:在充电阶段(此时机器人静止)做完整重标定,放电阶段只靠库仑计数 + AFE 电压做软约束。这也意味着充电策略是 BMS 设计的一部分,不是附属功能。
合规与安全标准这一层不能跳过:IEC 62133(便携二次电池安全)、UL 2054(家用与商用电池组)、IEC 61508(功能安全 SIL 定级),人机共处场景还要看 ISO 13482(个人护理机器人)。Renesas 人形机器人 BMS 参考设计把电气与热故障的快速保护列为系统收益的第一条,实际意义是:BMS 的硬件保护路径(图 16 路径 A)是过这些认证的核心证据,纯软件保护很难通过。自研电池包最大的隐性成本不是电芯,是认证。
最后是热管理。Renesas 那套参考设计把「Active Cooling Control + 专用 MCU + 3-Ph Gate Driver」单独画成一个功能块,也就是说主动散热是被当成一个独立子系统设计的,不是外挂风扇。原因是人形的躯干既是最大容积所在(1.75 L 的包必须放这里),也是最难散热的位置(被外壳包住、靠近电机热源、没有气流)。6.7 C 的蹬地脉冲在 9 Ah 包上就是 60 A,按内阻 20 mΩ 算瞬时热功率 $I^2R = 72$ W——虽然只持续几十毫秒,但重复几百次就是持续的热输入。没有主动热控的电池包,其 C 率上限会被温度迅速压下来,SoP 降额,步态性能随之衰减。这在实验室里表现为「跑 10 分钟一切正常,跑 30 分钟开始无力」,而且日志上看不出来,因为电压没到保护线。
第六层:软件控制、驱动与下位板卡——控制频率是被总线和接口算出来的
这一层要做三件事,而且必须按这个顺序:① 关节内的 FOC 电流环(kHz 级)→ ② 关节间的 CAN 总线(500 Hz–1 kHz)→ ③ 机载计算机上的策略推理(50–100 Hz)。三个频率层级相差一到两个数量级,各自有自己的物理上限,而整机性能由最低的那一层决定。
6.1 FOC:为什么必须是矢量控制
无刷电机的换向有三个层级,BHL 的 FOC 文档把它们讲得很清楚。六步换向(six-step)把三相逆变器分成 8 个状态(其中 6 个有效),每个状态给两相通电,转子每转 60° 电角度切换一次。优点是简单,缺点是扭矩脉动大(每 60° 一个台阶)、低速抖动、无法做力控。人形机器人的关节需要在零速附近输出精确扭矩(保持姿态),六步换向在这里直接失效。
矢量控制(FOC)的做法是通过 Clarke 与 Park 变换把三相电流投影到与转子同步旋转的 $dq$ 坐标系:
$$\begin{bmatrix} i_d \\ i_q \end{bmatrix} = \frac{2}{3}\begin{bmatrix} \cos\theta & \cos(\theta - \tfrac{2\pi}{3}) & \cos(\theta + \tfrac{2\pi}{3}) \\ -\sin\theta & -\sin(\theta - \tfrac{2\pi}{3}) & -\sin(\theta + \tfrac{2\pi}{3}) \end{bmatrix} \begin{bmatrix} i_a \\ i_b \\ i_c \end{bmatrix}$$
在这个坐标系里,$d$ 轴电流产生磁通(对扭矩无贡献,是纯损耗),$q$ 轴电流产生扭矩,两者解耦。于是「控制扭矩」退化成「把 $i_q$ 控到目标值、把 $i_d$ 控到 0」的两个独立 PI 环:
$$\tau = \frac{3}{2} p \left( \psi_f i_q + (L_d - L_q) i_d i_q \right), \qquad u_d = R i_d + L_d \frac{di_d}{dt} - \omega_e L_q i_q, \qquad u_q = R i_q + L_q \frac{di_q}{dt} + \omega_e (L_d i_d + \psi_f)$$
其中 $p$ 是极对数,$\psi_f$ 是永磁体磁链,$\omega_e$ 是电角速度。第三式里的 $\omega_e \psi_f$ 就是反电动势项,它是前馈补偿的关键——不做前馈时,电流环在高速段会因为反电动势追不上电压裕度而失去扭矩能力,表现为「低速扭矩准、高速扭矩塌」。这也解释了 1.3 节那个 $K_V$ 实测比标称低 15% 的问题:反电动势系数直接进这个方程,用标称值算前馈会有 15% 的系统误差。
电流环带宽的物理上限由电机时间常数决定:$\tau_e = L/R$。BHL 的 M6C12 是 $L = 0.0325$ mH、$R = 0.1886\ \Omega$,即 $\tau_e = 0.172\ \mu s$——这个时间常数极小,意味着电流环本身可以做到几十 kHz,真正的瓶颈不在电机,在采样与计算:ADC 采样 + Clarke/Park + 两个 PI + 反 Park + SVPWM,全套要在一个 PWM 周期内跑完。BHL 的固件跑在 160 MHz MCU 上、-O2 编译(Recoil FOC),而它的位置环被 78 µs 的 I²C 编码器读取卡死在 12 kHz 量级。这就是「算力不是瓶颈,接口才是」的完整证据链。
6.2 CAN 总线:一条总线最多挂几个关节
关节之间用 CAN 通信,这是全行业共识(RS485 用于低速/远距离的传感支路)。CAN 帧长与总线负载可以直接算。BHL 用的是 CANOpen 风格的帧结构:11 位 ID = 4 位功能码 + 7 位节点号,帧总长 111 / 119 / 135 bit(取决于数据长度与是否填充),波特率 1 Mbps。功能码覆盖 NMT(网络管理)、SDO(参数配置)、PDO1–4(周期数据),其中 PDO2 传位置+速度的指令与反馈(fp32),PDO3 传位置 + 前馈扭矩。
总线负载率 $\rho = N \cdot f \cdot L / R$,其中 $N$ 是节点数、$f$ 是每节点帧率、$L$ 是帧长(bit)、$R$ 是波特率。按 119 bit 帧、1 Mbps 算:
| 一条总线上的节点数 | 500 Hz 时负载率 | 1000 Hz 时负载率 | 70% 负载率下每节点可达频率 | 可行性 |
|---|---|---|---|---|
| 5 | 29.8% | 59.5% | 1,176 Hz | 舒适,可到 1 kHz |
| 6 | 35.7% | 71.4% | 980 Hz | 1 kHz 刚好触线 |
| 7 | 41.6% | 83.3% | 840 Hz | 1 kHz 超载,只能 500–800 Hz |
| 12 | 71.4% | 142.8% | 490 Hz | 不可行,500 Hz 已到极限 |
| 22(BHL 全身) | 130.9% | 261.8% | 267 Hz | 物理上不可能 |
最后一行是这一节最重要的数字:把 22 个关节挂在一条 CAN 总线上、跑 500 Hz,负载率是 130.9%——超过 100% 意味着帧根本发不完,总线会持续积压直到溢出。单总线单节点的物理上限只有 267 Hz,这对力控来说太低了。
BHL 的实际方案(见其 CAN 通信文档与关节 ID 映射)给出了标准答案:一条总线服务一条肢体。它用 4 路 CAN——CAN0 / CAN1 各接一条手臂(每条 5 个节点),CAN2 / CAN3 各接一条腿(每条 6 个节点)。按上表,5 节点是 29.8%、6 节点是 35.7%,都留有 2–3 倍裕度,可以稳定跑 500 Hz 甚至 1 kHz。每个关节的 CAN ID 与名字、行程范围(deg)、方向符号一起做成映射表,这张表就是 sim-to-real 的关键接口——仿真里的关节顺序和真机上的 CAN ID 必须一一对应,错一个就是左右手反向。
flowchart TD NUC["机载计算机
BeeLink N95 NUC · Ubuntu 22.04
策略推理 50 Hz(ONNX)"] USB["USB-CAN 适配器 ×4"] NUC -->|以太网/USB| USB USB --> B0["CAN0 · 左臂 5 节点
负载 29.8% @500Hz"] USB --> B1["CAN1 · 右臂 5 节点
负载 29.8% @500Hz"] USB --> B2["CAN2 · 左腿 6 节点
负载 35.7% @500Hz"] USB --> B3["CAN3 · 右腿 6 节点
负载 35.7% @500Hz"] B0 --> J0["关节 MCU
FOC 电流环 kHz 级
位置环 ≤12.8 kHz
(受 I²C 78µs 限制)"] B2 --> J2["关节 MCU
FOC 电流环 kHz 级"] J0 -.->|PDO2: pos+vel 指令/反馈 fp32
PDO3: pos + 前馈扭矩| J2 BMS["电池 BMS
独立 CAN / SMBus"] -.->|SoP / SOC / 故障| NUC IMU["IMU(IM10A)
USB 直连"] -.-> NUC
这套拓扑的普适规律是:节点数 ≤6,频率 ≥500 Hz,一条总线一条肢体。超过 6 个节点就要加总线或升级到 CAN FD(数据段可到 5–8 Mbps,同样节点数下负载率降一个量级)。这也解释了 1.5 节里睿尔曼 WHG 模组为什么标配 CAN FD——30 关节的整机如果坚持经典 CAN 1 Mbps,需要 5–6 条总线;换成 CAN FD 可以压到 2–3 条,省掉适配器和线束重量。EtherCAT 是另一条路线(魔法原子 H70 支持 CAN/EtherCAT 双模),它是主从式实时以太网,单链路可串几十个节点、周期可到 1 kHz 以上,代价是主站复杂度高、需要专用芯片(ESC)、且对线序和屏蔽要求严苛。开源社区几乎全用 CAN,工业整机正在向 CAN FD / EtherCAT 迁移。
6.3 三层控制的职责划分
| 层级 | 运行位置 | 典型频率 | 做什么 | 物理上限来自 |
|---|---|---|---|---|
| 电流环 / FOC | 关节内 MCU | 10–40 kHz | $i_q \to$ 扭矩、$i_d \to 0$,SVPWM 输出 | PWM 频率 + ADC 采样 + MCU 主频 |
| 关节伺服环 | 关节内 MCU | 1–12.8 kHz | 位置/速度 PID + 前馈扭矩,读编码器 | 编码器接口(I²C 78 µs → 12.8 kHz) |
| 总线通信 | CAN 链路 | 500 Hz – 1 kHz | PDO 收发指令与反馈 | 节点数 × 帧长 ÷ 波特率 |
| 全身控制 / WBC | 机载计算机 | 500 Hz – 1 kHz | 力矩分配、接触约束、平衡 | 求解器规模(QP 迭代次数) |
| RL 策略推理 | 机载计算机(ONNX) | 50 Hz | 观测 → 目标关节位置 | 网络规模(LSTM [32] 级很小,瓶颈在数据搬运) |
| 感知 / 视觉 | 机载计算机(GPU/NPU) | 10–30 Hz | 深度图 → 地形高度图 | 相机帧率 + 推理算力 |
这张表的读法是「上层给下层设目标,下层给上层设带宽」。50 Hz 的策略输出目标关节位置,500 Hz 的总线把它送到关节,1 kHz 的伺服环做位置闭环,10 kHz 的电流环做扭矩闭环。频率每降一级都要做插值/滤波,否则下层会看到阶梯指令而产生冲击。G1 配置里的 action_scale=0.25 和 decimation=4 正是这个衔接:策略每 4 个仿真步(即 50 Hz,若仿真跑 200 Hz)输出一次动作,动作值乘 0.25 后加到默认关节角上——0.25 这个系数限制了单帧的关节位移,防止策略输出跳变打穿下层伺服环的跟随能力。
PD 增益的物理意义在这一层要说清楚:$K_p$(刚度)决定「偏离目标位置多少就出多大力」,$K_d$(阻尼)决定「速度多快就出多大阻力」。G1 的 stiffness/damping的分组是髋 $K_p=100, K_d=2$、膝 $K_p=150, K_d=4$、踝 $K_p=40, K_d=2$(单位 Nm/rad 与 N·m·s/rad)。结合第 1.4 节的惯量比值就能看出这不是随便调的:膝(连杆主导,比值 0.4×)给最高刚度,因为它要扛 61.9 Nm 静力矩且转子惯量不构成阻碍;踝(电机主导,比值 22.8×)给最低刚度,因为它是接触关节,硬了会把地面冲击直接打进基座,还会让电机主导的关节在接触瞬间产生大电流尖峰。仿真里调出来的增益能不能直接上真机,取决于真机的反射惯量和仿真模型是否一致——这是 sim-to-real 最隐蔽的失配源之一。
第七层:仿真训练、sim-to-sim 与 sim-to-real
这一层是前面六层的收口。仿真训练的意义不是「先在电脑里跑一跑」,而是把硬件的不确定性转换成策略的鲁棒性:你在真机上测不准的摩擦系数、装不准的质量分布、算不出的杆臂误差,全部通过域随机化在训练时变成策略必须应对的分布,而不是上机后再去调。
7.1 训练环境:Isaac Lab 的完整链路
BHL 公开了目前最完整的一条可复现训练链路(Training Environment 文档 + 代码仓库),版本是钉死的:Isaac Lab 2.1.0 + Isaac Sim 4.5.0 + PyTorch 2.5.1 (cu121)。任务注册成两个 Gym 环境:
| 环境名 | 自由度 | 覆盖范围 | 用途 |
|---|---|---|---|
Velocity-Berkeley-Humanoid-Lite-v0 | 22 | 全身(双腿 12 + 双臂 10) | 整机速度跟踪行走 |
Velocity-Berkeley-Humanoid-Lite-Biped-v0 | 12 | 仅双腿,手臂锁定 | 先训步态,降低搜索空间 |
「先训 12 dof 双腿、再训 22 dof 全身」这个顺序不是偷懒,是必须的。22 维动作空间的策略搜索难度不是 12 维的 1.83 倍,而是指数级的;而手臂对行走稳定性的贡献主要是摆动惯量补偿,可以在腿部策略收敛后再加进去。这也解释了 X1 的 URDF 为什么把手臂焊成 fixed——那不是缺陷,那正是这个训练阶段的标准做法(见图 12)。
训练预算是 6000 iterations ≈ 2 小时(单张消费级 GPU)。训完用 play.py 导出 ONNX 模型和一份 configs/policy_latest.yaml 配置,这两个文件就是 sim-to-real 的全部交付物。ONNX 是关键选择:它让策略在真机上不依赖 Python/PyTorch 运行时,用 ONNX Runtime C++ 就能跑,避免 GC 停顿和依赖地狱。
G1 的 legged_gym 配置给出了网络与奖励的完整细节,可以作为调参基线:
| 项 | 取值 | 含义与陷阱 |
|---|---|---|
| 网络结构 | ActorCriticRecurrent,LSTM hidden [32] | 用 LSTM 是为了从历史观测里隐式估计不可测量(速度、地形、摩擦) |
| 观测 / 特权 / 动作 | 47 / 50 / 12 | 特权观测只在仿真可得,需蒸馏到 actor |
| 迭代次数 | 10,000 | BHL 只用 6,000 ≈ 2h;不同任务收敛速度差数倍 |
| 噪声标准差 | 0.8 | 观测噪声注入,模拟真机传感器误差 |
| 熵系数 | 0.01 | 探索强度,过大会导致动作抖动上真机 |
| action_scale / decimation | 0.25 / 4 | 策略 50 Hz,物理 200 Hz;0.25 限制单帧关节位移 |
7.2 域随机化:把测不准的东西随机掉
G1 的 domain_rand 配置里的随机化范围非常克制,每一项都对应一个真机上测不准的物理量:
| 随机化项 | 范围 | 对应真机的哪个不确定性 | 与硬件层的关联 |
|---|---|---|---|
| 地面摩擦系数 | [0.1, 1.25] | 地板材质、灰尘、湿度 | 决定第 1.2 节 CoP 能压多远而不打滑——低摩擦时踝扭矩再大也没用 |
| 基座附加质量 | [−1, +3] kg | 负载变化、URDF 质量标定误差 | 直接改变 $\tau = mgd$ 的全部扭矩需求和反射惯量比值 |
| 外力推搡 | 每 5 s 一次,最大 1.5 m/s | 碰撞、被人推 | 决定了第 2.1 节 IMU 杆臂伪加速度的实际工况上限($\dot\omega$ 50–100 rad/s²) |
| 观测噪声 | std 0.8 | IMU/编码器噪声 + 状态估计误差 | 注意这比 BNO085 的真实噪声底(0.00157 m/s²)大好几个量级——随机化的不是传感器噪声,是估计误差 |
最后一条特别值得注意。域随机化的量级不是照抄传感器数据表,而是照抄「整个感知链路的误差」。IMU 噪声底是 0.00157 m/s²,但状态估计器输出的基座速度误差在真机上是 0.1 m/s 量级(接触检测误判 + 足底打滑 + 积分漂移),所以随机化按后者设。这正好回到第 2 层的结论:杆臂伪加速度(1.39–9.85 g)比噪声底大 10³–10⁴ 倍,它才是估计误差的真正来源。把 IMU 装错位置,域随机化范围就得扩大,策略就得学得更保守,性能就下降——这条因果链是从结构图一路连到奖励函数的。
7.3 奖励函数:每一项都在对应一个硬件约束
G1 的奖励权重是硬件约束的镜像。把负权重的几项挑出来看:
| 奖励项 | 权重 | 惩罚的是什么 | 对应的硬件约束 |
|---|---|---|---|
tracking_lin_vel | +1.0 | —(唯一大正项,任务目标) | 速度指令跟踪 |
alive | +0.15 | —(活着就给分) | 摔倒代价极高,因为会损坏最贵的谐波减速器 |
base_height | −10.0 | 躯干高度偏离目标 | 过低=深蹲,会把髋关节推到裕度边缘(BHL 只有 0.9×);过高=膝伸直,无法吸收冲击 |
feet_swing_height | −20.0 | 摆动脚抬得过高/过低 | 抬太高浪费能量(撞第 5.1 节的平均功率预算);太低会拖地磨脚掌(第 3.4 节的磨耗件) |
dof_acc | −2.5e-7 | 关节角加速度 | 直接对应峰值扭矩 $= J\dot\omega + mgd$ 里的动态项,压它就是压第 1.2 节的 effort 需求 |
dof_acc 这一项的权重是 $-2.5\times10^{-7}$,数值极小,因为角加速度的量级是 $10^3$–$10^4$ rad/s²(平方后 $10^6$–$10^8$),乘上这个系数才落到与其他项可比的量级。它是硬件与软件之间最直接的一条线:仿真里惩罚角加速度,真机上就是在降低对关节峰值扭矩和电池 C 率的需求。把这个权重设为 0,策略会学会用剧烈甩腿来快速跟踪速度指令——仿真里表现更好(tracking 奖励高),真机上直接打爆电流限幅、触发 BMS 过流保护、烧电机。
这就是「仿真指标好 ≠ 真机能跑」的机制解释,也是为什么 sim-to-sim 这一步不能省。
7.4 sim-to-sim:用第二个物理引擎当验收测试
BHL 的 sim2sim 流程是:把 Isaac Lab 训出的 ONNX 策略放到 MuJoCo 里跑,用摇杆发速度指令,开两个线程(摇杆线程 + 策略推理线程)通过 UDP 与物理仿真通信——刻意模仿真机上的进程与网络结构,而不是在同一个进程里直接调用。
这一步的价值比看上去大得多。Isaac 用 PhysX,MuJoCo 用广义坐标动力学 + 凸优化接触求解,两者的接触模型、摩擦锥近似、求解器刚度都不同。一个只在 PhysX 里能走的策略,换到 MuJoCo 就摔,说明它学到的是 PhysX 的接触模型特性,不是真实的行走物理。sim-to-sim 是一次零成本的过拟合检测,它能在你花几周装配真机之前就告诉你策略是否学到了可迁移的东西。
用 UDP + 多线程而不是直接函数调用,是为了暴露真机上必然存在的三类问题:通信延迟、丢包、线程调度抖动。策略如果依赖「指令与反馈严格同步」,在 sim2sim 里就会先崩。真机上的 500 Hz CAN 总线(第 6.2 节)和 50 Hz 策略推理之间同样存在这种异步,而且 NUC 的 Linux 调度抖动比仿真环境更差。
flowchart LR A["① Isaac Lab 训练
Isaac Sim 4.5.0 + Lab 2.1.0
PhysX · 4096 并行环境
6000 iter ≈ 2 h"] B["② 导出
play.py → ONNX
+ policy_latest.yaml"] C["③ sim2sim 验收
MuJoCo(第二物理引擎)
摇杆线程 + 推理线程
经 UDP 通信"] D["④ sim2real
BeeLink N95 NUC
Ubuntu 22.04 · ONNX Runtime
4 路 CAN → 22 关节"] E["⑤ 遥操作数据采集
SteamVR 动捕
→ 操作策略模仿学习"] A --> B --> C --> D --> E C -.->|摔了 → 域随机化不足
或过拟合 PhysX| A D -.->|抖/偏 → 杆臂误差、编码器映射错、
CAN 丢帧、增益不匹配| A
7.5 sim-to-real 的真实失败模式清单
把前面六层的约束汇总成一张排查表(每一条的验证口径都对应上文引用的公开文档:电机表征、关节 ID 映射、sim2sim 验收)。这张表是本文最想留下的东西——真机上机出问题时,按这个顺序查,能覆盖绝大多数情况:
| 症状 | 最可能的原因 | 对应本文哪一层 | 验证方法 |
|---|---|---|---|
| 静止站立正常,一转身就发散 | IMU 杆臂未补偿,或 URDF 的 imu 帧坐标与真机安装位置不符 | 第 2 层 | 录 $\dot\omega$ 与加速度计读数,检查 $|\vec a_P - \vec a_O|$ 是否随 $\dot\omega$ 线性增长 |
| 左右动作镜像反了 / 某关节反向 | 关节 ID ↔ CAN ID ↔ 方向符号映射表错 | 第 6.2 节 | 逐关节单点给小位置指令,肉眼确认方向;核对映射表的 sign 列 |
| 低频抖动 / 指令卡顿 | CAN 总线超载或丢帧(节点数 >6 或频率过高) | 第 6.2 节 | 算负载率 $N f L / R$,应 <70%;用 CAN 分析仪看 error frame 计数 |
| 低速扭矩准、高速扭矩塌 | 反电动势前馈用了标称 $K_V$(实测偏低 15%) | 第 1.3 / 6.1 节 | 做电机表征,把实测 R/L/$K_t$ 写进固件 |
| 位置环频率上不去 | 编码器接口瓶颈(I²C 78 µs → 12.8 kHz 上限) | 第 1.3 节 | 示波器量单次读取耗时,换 SPI 或增量式 |
| 跑 10 分钟正常、30 分钟无力 | 电池热失控前的 SoP 降额,电压未到保护线 | 第 5.3 节 | 记录电芯温度与 SoP 上报值,看是否随时间下降 |
| 跌倒后爬不起来(BMS 锁死) | 瞬时压降被误判为欠压,未用 SoP 判据 | 第 5.3 节 | 检查保护逻辑是走硬件比较器还是 MCU 的 SoP 判断 |
| 策略把自己手臂撞进躯干 | 仿真模型缺碰撞体(X1 是 3/58) | 第 3.3 节 | 数 URDF 里的 collision 元素数量,补齐连杆包络 |
| 深蹲姿态下髋关节堵转/报警 | 静力矩需求超出声明 effort(BHL 髋裕度 0.9×) | 第 1.2 节 | 用 CoP/静力平衡模型复算,在奖励里加 base_height 惩罚 |
| 仿真指标很好但真机剧烈甩腿 | dof_acc 惩罚为 0 或过小 | 第 7.3 节 | 看真机电流峰值是否触碰限幅/BMS 过流线 |
| 上电即垮塌 | 缺多圈绝对值编码器或电磁抱闸 | 第 1.5 节 | 断电后手动检查关节是否保持;核对编码器位数 |
| 偶发 CAN 丢帧,与关节运动同步 | 动力线与信号线同束走线,PWM 共模干扰 | 第 3.3 节 | 示波器看 CAN 差分对上的共模噪声;分开走线 |
这张表里 12 个症状,只有 3 个(第一、二、十条)是「策略/软件」问题,其余 9 个全部是硬件标定或物理约束问题。这就是为什么「sim-to-real gap」这个词在工程上是有误导性的——绝大多数所谓的 gap 不是仿真不够真,是硬件没标定准。而硬件标定准的前提,是你在设计阶段就把上面六层的约束算清楚了。
收口:从一句话需求到一台机器的约束传递
把七层串起来看,一台人形机器人的设计不是七个独立决策,是一条单向的约束传递链。用一个具体例子走完全程:
| 步骤 | 决策 | 由什么决定 | 决定了什么下游 | 本文对应数字 |
|---|---|---|---|---|
| 1 | 步态类型:平踩式 or 脚尖蹬地 | 任务需求 | 踝扭矩下限 | CoP 力臂需 ≥ 脚掌长:ATOM01 只到 39%,X1 到 144% |
| 2 | 踝 effort = 18 / 50 / 80 Nm | 步骤 1 + 整机质量 + 脚掌长 | 踝模组选型(电机 + 减速比) | $d_{cop}^{max} = \tau/(mg)$ |
| 3 | 减速比 n 与电机 $K_t$ | 踝扭矩 + 反驱性要求 | 反射惯量 $n^2J_r$、所需电流 | M6C12 ×15 → 0.0224 kg·m²、1.378 Nm/A → 20 Nm 需 14.5 A |
| 4 | 关节数量与分布 | 任务(腿 12 + 臂 10) | CAN 总线拓扑 | 22 节点单总线 130.9% → 必须拆成 4 路,每路 5–6 节点 |
| 5 | 控制频率 500 Hz | 总线负载率 + 编码器接口 | 驱动器 MCU 与接口选型 | I²C 78 µs → 12.8 kHz 位置环上限 |
| 6 | 单关节峰值功率 | effort × velocity | 电池包 C 率下限 | G1 膝 2,780 W = 6.6 C(单关节) |
| 7 | 电池包 Wh 与串数 | 平均功率 × 目标续航 + 模组电压档 | 躯干容积与质量分布 | G1 421 Wh = 1.747 L = 241 Wh/L;13S/46.8 V 匹配 48 V 模组 |
| 8 | BMS 双路径架构 | 步骤 6 的脉冲电流 + 安全合规 | 可交付峰值(SoP)与故障行为 | 硬件比较器路径独立于 MCU;IEC 62133 / UL 2054 |
| 9 | IMU 安装位置 | 躯干容积(电池占了大头)+ 杆臂最小化 | 状态估计误差量级 | r = 0.683 m → 34.15 m/s² = 噪声底的 21,752× |
| 10 | 域随机化范围 | 步骤 9 的估计误差 + 摩擦 + 负载不确定 | 策略鲁棒性与保守度 | 摩擦 [0.1,1.25]、质量 [−1,+3] kg、每 5 s 推 1.5 m/s |
| 11 | 奖励权重 | 步骤 2/3/6 的硬件上限 | 真机电流峰值是否触限 | dof_acc −2.5e-7 直接压峰值功率需求 |
这条链是单向的,所以设计顺序也是单向的。(本文的逐步复算以 BHL 论文 arXiv:2504.17249 为样本,因为它同时公开了硬件 BOM、固件与训练配置。)先定步态和质量分布,再定关节扭矩,再定电机和减速比,再定总线拓扑,再定电池,再定 IMU 位置,最后才是训练配置。绝大多数失败的自研项目是反着来的:先跑通了一个仿真策略(网上下载的开源配置),再去买电机,然后发现扭矩不够;先买了便宜的 IMU 装在头部(好装配),然后发现转身就发散;先定了小电池包(躯干塞不下),然后发现蹬地时 BMS 过流保护。每一次「回头改」的成本都比顺着做高一个数量级,因为改关节扭矩意味着改结构件、改结构件意味着改质量分布、改质量分布意味着改 IMU 杆臂、改杆臂意味着重训策略。
而这一切的最上游,是那个最不技术的决策:这台机器要做什么样的步态。踝关节能不能压到脚尖,决定了它能不能起步蹬地;能不能蹬地,决定了它能不能跑;能不能跑,决定了它需不需要 1000 W/kg 的功率密度;而这又决定了电池、总线、散热和成本。X1 把髋 pitch 配到 8 rad/s、ATOM01 把踝配到 18 Nm,都不是工程失误,是它们各自把「稳定行走的操作平台」而不是「动态运动」定为目标后的正确取舍。读一台机器的 URDF,本质上是在读它的产品定位。
数据来源与解析口径
本文所有数字都可复算,来源分四类:
| 类别 | 具体来源 | 解析方式 | 覆盖的本文数字 |
|---|---|---|---|
| 模型文件 | Berkeley Humanoid Lite URDF(22 revolute,另有 MJCF)、Unitree G1 URDF(29 dof)、Unitree H1 URDF(10 dof)、AgiBot 灵犀 X1 URDF + MJCF(xyber_x1_serial.xml)、RoboParty ATOM01 URDF(23 revolute) | xml.etree.ElementTree 逐 joint/link 解析 effort、velocity、mass、inertia、origin xyz;反射惯量按平行轴定理沿运动链累加 | 第 1.1–1.4、2.1、3.1、7.5 节全部扭矩/惯量/质量数字;图 2、3、5、7 |
| BOM 文件 | X1 三版 BOM(xlsx,仓库按日期分目录:首版 2024-10-24 / v3 2025-03-07)、ATOM01 散件清单 xlsx(内部 D-BOM 与量产 ZZEBOM 两份价格口径) | openpyxl 逐单元格读取,材质与单价逐行归类 | 第 3.1–3.2 节材质迁移、成本结构;图 10、11、12 |
| 厂商官方规格 | Unitree G1 电池包(9000 mAh / 421.2 Wh / 46.8 V / 54.6 V / 120×80×182 mm / ~2h)、Unitree H1 电池包(15 Ah / 864 Wh / 标称 57.6 V / 最高 67.2 V,由 864÷15 与 67.2÷4.2 反推 16S)、BHL 官方文档(电机表征、CAN 通信、FOC、IMU 对比、关节 ID 映射、固件执行时序、3D 打印与装配、训练与sim2sim、机载计算机) | 逐项抄录,串数由充电上限电压 ÷ 4.200 V/cell 反推 | 第 1.3、2.3、5.1–5.2、6.1–6.2、7.1–7.4 节;图 4、13–17 |
| 行业公开资料 | TI / ADI / Renesas 人形机器人 BMS 参考设计(块图、器件清单与 24 V / 48 V 选型)、人形机器人 BOM 成本行业数据(约 3.5 万美元/台 → 2030–2035 年 1.3–1.7 万美元;执行器占 40–60%、减速器占单执行器 30–50%;绿的谐波占国内谐波市场 30–40%)、RobotWorld 知识库已收录的 873 条零部件档案(关节模组 166 / 执行器 140 / 减速器 65 / 传感器 200 / 丝杠 202 / 灵巧手 64 条) | 器件型号与规格逐条核对,零部件参数取知识库 specs 字段 | 第 1.5、3.2、4.2、5.2–5.3 节的全部型号与规格;图 16 |
计算口径:重力加速度取 $g = 9.80665$ m/s²;准静态 CoP 模型假设单腿支撑、整机重量由该腿承担、CoP 沿脚掌纵向移动;40° 屈膝姿态的膝/髋静力矩按 URDF 的 link mass 与质心位置做二维静力平衡逐段累加;峰值功率按 $\sum_i \tau_i^{peak} \cdot \omega_i^{peak}$ 计算,这是「全关节同时峰值」的理论上限,不是实际工况(第 5.1 节已证明它在物理上不可达);CAN 负载率按 $\rho = N f L / R$,帧长取 119 bit,波特率 1 Mbps,工程可接受上限取 70%;电池续航按 $t = E/P$ 理想放电,未计入 Peukert 效应与温度降额;能量密度按包级(含结构与 BMS)而非电芯级计算。
本文的局限,也说清楚。一,五台机器中只有 BHL 公开了完整的电机表征、固件与训练配置,因此第 1.3、6.1、7.1–7.4 节的实测数字全部来自 BHL,其他机器只能从 URDF 声明值反推——声明值与实测值的系统性偏差(如 $K_V$ 低 15%)在其他机器上未经验证。二,G1 / H1 的电池包参数来自厂商官方规格,但 BMS 的具体器件型号未公开,第 5.3 节的器件栈是行业通用选型而非这两台机器的实际用料。三,准静态 CoP 模型不含动态项($J\dot\omega$、科氏力、地面反力分布),因此「裕度倍数」是静力口径,动态工况下膝关节需求会显著上升——第 1.2 节的结论三正是从这个矛盾反推出来的。四,本文不对任何机器的设计做优劣判定:所有「欠配」(如 BHL 髋 0.9×、H1 踝 0.58×)都是在各自目标定位下的合理取舍,不是缺陷。
相关站内资料:谐波 / 行星 / RV / 摆线四类减速器的详细选型对比,见站内已有的《机器人关节模组选型》一文,本文不重复该部分;873 条零部件档案(含各型号完整规格与厂商链接)在站内零部件库中可按类别检索。


