从“仿真能跑”到“真机能走”:一套轮腿机械狗强化学习系统的工程化实践

从"仿真能跑"到"真机能走":一套轮腿机械狗强化学习系统的工程化实践

强化学习真正困难的地方,往往不是"把 PPO 跑起来",而是让仿真中的机器人学到的东西,能够被真实机器人理解。

最近完整梳理了一套 Z1W-V2 轮腿机械狗的强化学习系统。

整个过程让我对机器人强化学习有了一个比较深的认识:

训练成功 ≠ 机器人成功。

一个真正可落地的机器人学习系统,至少需要同时解决四件事情:

  1. 仿真模型是否足够接近真实机器人;
  2. 观测、动作、奖励是否真正对应控制目标;
  3. 训练出来的策略是否与真机部署架构一致;
  4. 仿真与真实世界之间的差异是否被系统性处理。

这篇文章不讨论具体代码,而是从工程角度梳理整个系统,以及在实际项目中遇到的一些容易被忽略的问题。


一、先建立一个正确认识:机器狗强化学习到底在学什么?

很多人第一次接触强化学习控制机器人时,会产生一个直觉:

"我给机器人一个前进速度,它是不是就自己知道应该怎么控制 16 个电机?"

从最终效果来看,确实如此。

但中间实际上存在一个非常重要的闭环。
#mermaid-svg-lXMvDM85K0TAQ3Z5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .error-icon{fill:#552222;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .marker.cross{stroke:#333333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lXMvDM85K0TAQ3Z5 p{margin:0;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .cluster-label text{fill:#333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .cluster-label span{color:#333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .cluster-label span p{background-color:transparent;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .label text,#mermaid-svg-lXMvDM85K0TAQ3Z5 span{fill:#333;color:#333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .node rect,#mermaid-svg-lXMvDM85K0TAQ3Z5 .node circle,#mermaid-svg-lXMvDM85K0TAQ3Z5 .node ellipse,#mermaid-svg-lXMvDM85K0TAQ3Z5 .node polygon,#mermaid-svg-lXMvDM85K0TAQ3Z5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .rough-node .label text,#mermaid-svg-lXMvDM85K0TAQ3Z5 .node .label text,#mermaid-svg-lXMvDM85K0TAQ3Z5 .image-shape .label,#mermaid-svg-lXMvDM85K0TAQ3Z5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .rough-node .label,#mermaid-svg-lXMvDM85K0TAQ3Z5 .node .label,#mermaid-svg-lXMvDM85K0TAQ3Z5 .image-shape .label,#mermaid-svg-lXMvDM85K0TAQ3Z5 .icon-shape .label{text-align:center;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .node.clickable{cursor:pointer;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .arrowheadPath{fill:#333333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lXMvDM85K0TAQ3Z5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lXMvDM85K0TAQ3Z5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lXMvDM85K0TAQ3Z5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .cluster text{fill:#333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .cluster span{color:#333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lXMvDM85K0TAQ3Z5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .icon-shape,#mermaid-svg-lXMvDM85K0TAQ3Z5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .icon-shape p,#mermaid-svg-lXMvDM85K0TAQ3Z5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .icon-shape .label rect,#mermaid-svg-lXMvDM85K0TAQ3Z5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lXMvDM85K0TAQ3Z5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lXMvDM85K0TAQ3Z5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lXMvDM85K0TAQ3Z5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 速度指令 vx vy wz
强化学习 Policy
机器人自身状态
16维动作
关节/轮子控制器
机器人运动

强化学习策略本身并不是一个"导航系统"。

它更像一个运动技能控制器

给它"我想向前走多快",再告诉它"我现在身体是什么状态",它负责计算下一时刻腿和轮子应该怎么运动。

因此,一个成熟的机器人系统通常会把任务拆成不同层级。
#mermaid-svg-AeyU1OR5qgGnDSXd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AeyU1OR5qgGnDSXd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AeyU1OR5qgGnDSXd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AeyU1OR5qgGnDSXd .error-icon{fill:#552222;}#mermaid-svg-AeyU1OR5qgGnDSXd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AeyU1OR5qgGnDSXd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AeyU1OR5qgGnDSXd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AeyU1OR5qgGnDSXd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AeyU1OR5qgGnDSXd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AeyU1OR5qgGnDSXd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AeyU1OR5qgGnDSXd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AeyU1OR5qgGnDSXd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AeyU1OR5qgGnDSXd .marker.cross{stroke:#333333;}#mermaid-svg-AeyU1OR5qgGnDSXd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AeyU1OR5qgGnDSXd p{margin:0;}#mermaid-svg-AeyU1OR5qgGnDSXd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-AeyU1OR5qgGnDSXd .cluster-label text{fill:#333;}#mermaid-svg-AeyU1OR5qgGnDSXd .cluster-label span{color:#333;}#mermaid-svg-AeyU1OR5qgGnDSXd .cluster-label span p{background-color:transparent;}#mermaid-svg-AeyU1OR5qgGnDSXd .label text,#mermaid-svg-AeyU1OR5qgGnDSXd span{fill:#333;color:#333;}#mermaid-svg-AeyU1OR5qgGnDSXd .node rect,#mermaid-svg-AeyU1OR5qgGnDSXd .node circle,#mermaid-svg-AeyU1OR5qgGnDSXd .node ellipse,#mermaid-svg-AeyU1OR5qgGnDSXd .node polygon,#mermaid-svg-AeyU1OR5qgGnDSXd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-AeyU1OR5qgGnDSXd .rough-node .label text,#mermaid-svg-AeyU1OR5qgGnDSXd .node .label text,#mermaid-svg-AeyU1OR5qgGnDSXd .image-shape .label,#mermaid-svg-AeyU1OR5qgGnDSXd .icon-shape .label{text-anchor:middle;}#mermaid-svg-AeyU1OR5qgGnDSXd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-AeyU1OR5qgGnDSXd .rough-node .label,#mermaid-svg-AeyU1OR5qgGnDSXd .node .label,#mermaid-svg-AeyU1OR5qgGnDSXd .image-shape .label,#mermaid-svg-AeyU1OR5qgGnDSXd .icon-shape .label{text-align:center;}#mermaid-svg-AeyU1OR5qgGnDSXd .node.clickable{cursor:pointer;}#mermaid-svg-AeyU1OR5qgGnDSXd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-AeyU1OR5qgGnDSXd .arrowheadPath{fill:#333333;}#mermaid-svg-AeyU1OR5qgGnDSXd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-AeyU1OR5qgGnDSXd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-AeyU1OR5qgGnDSXd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AeyU1OR5qgGnDSXd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-AeyU1OR5qgGnDSXd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AeyU1OR5qgGnDSXd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-AeyU1OR5qgGnDSXd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-AeyU1OR5qgGnDSXd .cluster text{fill:#333;}#mermaid-svg-AeyU1OR5qgGnDSXd .cluster span{color:#333;}#mermaid-svg-AeyU1OR5qgGnDSXd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-AeyU1OR5qgGnDSXd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-AeyU1OR5qgGnDSXd rect.text{fill:none;stroke-width:0;}#mermaid-svg-AeyU1OR5qgGnDSXd .icon-shape,#mermaid-svg-AeyU1OR5qgGnDSXd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-AeyU1OR5qgGnDSXd .icon-shape p,#mermaid-svg-AeyU1OR5qgGnDSXd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-AeyU1OR5qgGnDSXd .icon-shape .label rect,#mermaid-svg-AeyU1OR5qgGnDSXd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-AeyU1OR5qgGnDSXd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-AeyU1OR5qgGnDSXd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-AeyU1OR5qgGnDSXd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务目标
导航层
路径规划
速度指令 vx vy wz
RL Locomotion Policy
腿部/轮子控制
真实机器人
雷达
相机
IMU
关节编码器

这也是为什么:

雷达和相机并不一定需要直接输入强化学习策略。

它们可以属于上层导航系统,而 RL 只负责"怎么走"。


二、第一课:不要相信教程,要相信实际运行的系统

这是整个项目中非常重要的一条工程经验。

最开始对训练教程和项目代码进行对比时,发现教程与实际配置存在多处差异。

其中一个比较典型的问题,是奖励函数。

最初看到某个奖励配置类时,很容易直接得出:

"这个类定义了某个奖励,所以训练一定使用了这个奖励权重。"

但继续追踪之后才发现:

定义 ≠ 实例化 ≠ 最终运行配置。

真正决定训练行为的,是环境最终实例化以后实际生效的配置。

这件事情看起来非常简单,但在大型机器人项目中极其重要。
#mermaid-svg-cuoJnHk98S7nHwU3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cuoJnHk98S7nHwU3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cuoJnHk98S7nHwU3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cuoJnHk98S7nHwU3 .error-icon{fill:#552222;}#mermaid-svg-cuoJnHk98S7nHwU3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cuoJnHk98S7nHwU3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cuoJnHk98S7nHwU3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cuoJnHk98S7nHwU3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cuoJnHk98S7nHwU3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cuoJnHk98S7nHwU3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cuoJnHk98S7nHwU3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cuoJnHk98S7nHwU3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cuoJnHk98S7nHwU3 .marker.cross{stroke:#333333;}#mermaid-svg-cuoJnHk98S7nHwU3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cuoJnHk98S7nHwU3 p{margin:0;}#mermaid-svg-cuoJnHk98S7nHwU3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cuoJnHk98S7nHwU3 .cluster-label text{fill:#333;}#mermaid-svg-cuoJnHk98S7nHwU3 .cluster-label span{color:#333;}#mermaid-svg-cuoJnHk98S7nHwU3 .cluster-label span p{background-color:transparent;}#mermaid-svg-cuoJnHk98S7nHwU3 .label text,#mermaid-svg-cuoJnHk98S7nHwU3 span{fill:#333;color:#333;}#mermaid-svg-cuoJnHk98S7nHwU3 .node rect,#mermaid-svg-cuoJnHk98S7nHwU3 .node circle,#mermaid-svg-cuoJnHk98S7nHwU3 .node ellipse,#mermaid-svg-cuoJnHk98S7nHwU3 .node polygon,#mermaid-svg-cuoJnHk98S7nHwU3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cuoJnHk98S7nHwU3 .rough-node .label text,#mermaid-svg-cuoJnHk98S7nHwU3 .node .label text,#mermaid-svg-cuoJnHk98S7nHwU3 .image-shape .label,#mermaid-svg-cuoJnHk98S7nHwU3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-cuoJnHk98S7nHwU3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cuoJnHk98S7nHwU3 .rough-node .label,#mermaid-svg-cuoJnHk98S7nHwU3 .node .label,#mermaid-svg-cuoJnHk98S7nHwU3 .image-shape .label,#mermaid-svg-cuoJnHk98S7nHwU3 .icon-shape .label{text-align:center;}#mermaid-svg-cuoJnHk98S7nHwU3 .node.clickable{cursor:pointer;}#mermaid-svg-cuoJnHk98S7nHwU3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cuoJnHk98S7nHwU3 .arrowheadPath{fill:#333333;}#mermaid-svg-cuoJnHk98S7nHwU3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cuoJnHk98S7nHwU3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cuoJnHk98S7nHwU3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cuoJnHk98S7nHwU3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cuoJnHk98S7nHwU3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cuoJnHk98S7nHwU3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cuoJnHk98S7nHwU3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cuoJnHk98S7nHwU3 .cluster text{fill:#333;}#mermaid-svg-cuoJnHk98S7nHwU3 .cluster span{color:#333;}#mermaid-svg-cuoJnHk98S7nHwU3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cuoJnHk98S7nHwU3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cuoJnHk98S7nHwU3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-cuoJnHk98S7nHwU3 .icon-shape,#mermaid-svg-cuoJnHk98S7nHwU3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cuoJnHk98S7nHwU3 .icon-shape p,#mermaid-svg-cuoJnHk98S7nHwU3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cuoJnHk98S7nHwU3 .icon-shape .label rect,#mermaid-svg-cuoJnHk98S7nHwU3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cuoJnHk98S7nHwU3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cuoJnHk98S7nHwU3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cuoJnHk98S7nHwU3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 教程说明
最终训练行为
配置类定义
继承关系
初始化覆盖
运行时参数

如果只看其中一层,就很容易误判。

机器人项目中的"真值来源"应该是最终运行时状态,而不是某一个文档、某一个配置类或者某一段注释。

因此,分析一个强化学习项目时,我现在更倾向于按照下面的顺序检查:

文档 → 配置定义 → 继承关系 → 初始化覆盖 → 实际启动参数 → 训练日志

只有这些链路能够闭合,才能认为某个参数真的被使用。


三、第二课:16 个关节,不等于 16 个当前控制量

这套 Z1W-V2 机械狗一共有:

  • 4 条腿;
  • 每条腿 3 个腿部关节;
  • 每条腿 1 个轮子关节。

因此:

4 × 4 = 16 个关节。

也就是说,真实机器人有 16 个电机。

但是强化学习控制空间最初只有 12 维。

原因是:

  • 12 个腿部关节由 RL 主动控制;
  • 4 个轮子最初采用被动滚动方式。

这实际上是一个非常典型的机器人系统概念:

机械自由度、执行器数量、观测维度、动作维度,是四个完全不同的概念。

不能因为机器人有 16 个电机,就认为神经网络必须输出 16 个动作。


四、为什么后来需要把轮子加入 RL?

项目后续的目标发生了变化:

原来希望:

腿负责运动,轮子只是辅助滚动。

后来希望:

主动利用轮子行走,腿部负责姿态调节和缓冲。

这时候动作空间自然发生变化。
#mermaid-svg-4mUjmmM3G4H3ua2k{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4mUjmmM3G4H3ua2k .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4mUjmmM3G4H3ua2k .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4mUjmmM3G4H3ua2k .error-icon{fill:#552222;}#mermaid-svg-4mUjmmM3G4H3ua2k .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4mUjmmM3G4H3ua2k .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4mUjmmM3G4H3ua2k .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4mUjmmM3G4H3ua2k .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4mUjmmM3G4H3ua2k .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4mUjmmM3G4H3ua2k .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4mUjmmM3G4H3ua2k .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4mUjmmM3G4H3ua2k .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4mUjmmM3G4H3ua2k .marker.cross{stroke:#333333;}#mermaid-svg-4mUjmmM3G4H3ua2k svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4mUjmmM3G4H3ua2k p{margin:0;}#mermaid-svg-4mUjmmM3G4H3ua2k .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4mUjmmM3G4H3ua2k .cluster-label text{fill:#333;}#mermaid-svg-4mUjmmM3G4H3ua2k .cluster-label span{color:#333;}#mermaid-svg-4mUjmmM3G4H3ua2k .cluster-label span p{background-color:transparent;}#mermaid-svg-4mUjmmM3G4H3ua2k .label text,#mermaid-svg-4mUjmmM3G4H3ua2k span{fill:#333;color:#333;}#mermaid-svg-4mUjmmM3G4H3ua2k .node rect,#mermaid-svg-4mUjmmM3G4H3ua2k .node circle,#mermaid-svg-4mUjmmM3G4H3ua2k .node ellipse,#mermaid-svg-4mUjmmM3G4H3ua2k .node polygon,#mermaid-svg-4mUjmmM3G4H3ua2k .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4mUjmmM3G4H3ua2k .rough-node .label text,#mermaid-svg-4mUjmmM3G4H3ua2k .node .label text,#mermaid-svg-4mUjmmM3G4H3ua2k .image-shape .label,#mermaid-svg-4mUjmmM3G4H3ua2k .icon-shape .label{text-anchor:middle;}#mermaid-svg-4mUjmmM3G4H3ua2k .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4mUjmmM3G4H3ua2k .rough-node .label,#mermaid-svg-4mUjmmM3G4H3ua2k .node .label,#mermaid-svg-4mUjmmM3G4H3ua2k .image-shape .label,#mermaid-svg-4mUjmmM3G4H3ua2k .icon-shape .label{text-align:center;}#mermaid-svg-4mUjmmM3G4H3ua2k .node.clickable{cursor:pointer;}#mermaid-svg-4mUjmmM3G4H3ua2k .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4mUjmmM3G4H3ua2k .arrowheadPath{fill:#333333;}#mermaid-svg-4mUjmmM3G4H3ua2k .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4mUjmmM3G4H3ua2k .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4mUjmmM3G4H3ua2k .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4mUjmmM3G4H3ua2k .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4mUjmmM3G4H3ua2k .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4mUjmmM3G4H3ua2k .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4mUjmmM3G4H3ua2k .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4mUjmmM3G4H3ua2k .cluster text{fill:#333;}#mermaid-svg-4mUjmmM3G4H3ua2k .cluster span{color:#333;}#mermaid-svg-4mUjmmM3G4H3ua2k div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4mUjmmM3G4H3ua2k .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4mUjmmM3G4H3ua2k rect.text{fill:none;stroke-width:0;}#mermaid-svg-4mUjmmM3G4H3ua2k .icon-shape,#mermaid-svg-4mUjmmM3G4H3ua2k .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4mUjmmM3G4H3ua2k .icon-shape p,#mermaid-svg-4mUjmmM3G4H3ua2k .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4mUjmmM3G4H3ua2k .icon-shape .label rect,#mermaid-svg-4mUjmmM3G4H3ua2k .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4mUjmmM3G4H3ua2k .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4mUjmmM3G4H3ua2k .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4mUjmmM3G4H3ua2k :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RL Policy
12维腿部动作
4维轮子动作
腿部位置控制
轮子速度控制
机器人运动

这里有一个很重要的控制理论区别。

腿适合位置控制

腿部关节需要维持相对稳定的姿态,因此可以让策略输出目标关节位置。

轮子更适合速度控制

轮子是连续旋转执行器。

如果使用位置控制:

"轮子转到 100°。"

这个命令本身没有太大的物理意义。

因为机器人真正关心的是:

"轮子以多快的速度转?"

所以轮子的动作应该表达为:

目标角速度。

这也是为什么轮腿机器人中经常会出现:

腿:Position Action

轮:Velocity Action

这种混合动作空间。

最终形成:

12 维腿部位置控制 + 4 维轮子速度控制 = 16 维动作。


五、第三课:Sim2Real 最大的问题不是"网络不够大"

很多人第一次做 Sim2Real 时,会把注意力集中在:

  • 网络结构;
  • PPO 参数;
  • 训练时间;
  • 并行环境数量。

这些当然重要。

但是从工程角度看,更危险的问题往往是:

你训练的机器人,和真实机器人是不是同一个机器人?

这句话听起来很荒谬。

但实际项目中非常常见。


六、电机参数不是"随便填一个差不多的值"

最开始的仿真参数中,部分电机参数是按照已有机器人或者经验值推导出来的。

后来拿到真实电机规格书后,重新建立了真实参数映射。

最终对应关系大致是:

执行机构 真实电机 减速比 输出峰值力矩 输出空载速度
Hip SETZ90CI-1FF 18.655 144 Nm 144.5 rpm
Thigh SETZ120CI-1ID 16.227 320 Nm 137.5 rpm
Calf SETZ120CI-1JD 21.333 420 Nm 104.5 rpm
Wheel SETZ90CI-1DB 6 48 Nm 433 rpm

这里最值得注意的不是这些具体数字。

而是:

真实电机 → 减速器 → 输出轴 → 关节

这一整条动力链必须在仿真中有对应关系。


七、为什么减速比如此重要?

假设真实电机存在较大的减速比。

那么:
#mermaid-svg-Gcj9PNEHib7QntS7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Gcj9PNEHib7QntS7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Gcj9PNEHib7QntS7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Gcj9PNEHib7QntS7 .error-icon{fill:#552222;}#mermaid-svg-Gcj9PNEHib7QntS7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Gcj9PNEHib7QntS7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Gcj9PNEHib7QntS7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Gcj9PNEHib7QntS7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Gcj9PNEHib7QntS7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Gcj9PNEHib7QntS7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Gcj9PNEHib7QntS7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Gcj9PNEHib7QntS7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Gcj9PNEHib7QntS7 .marker.cross{stroke:#333333;}#mermaid-svg-Gcj9PNEHib7QntS7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Gcj9PNEHib7QntS7 p{margin:0;}#mermaid-svg-Gcj9PNEHib7QntS7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Gcj9PNEHib7QntS7 .cluster-label text{fill:#333;}#mermaid-svg-Gcj9PNEHib7QntS7 .cluster-label span{color:#333;}#mermaid-svg-Gcj9PNEHib7QntS7 .cluster-label span p{background-color:transparent;}#mermaid-svg-Gcj9PNEHib7QntS7 .label text,#mermaid-svg-Gcj9PNEHib7QntS7 span{fill:#333;color:#333;}#mermaid-svg-Gcj9PNEHib7QntS7 .node rect,#mermaid-svg-Gcj9PNEHib7QntS7 .node circle,#mermaid-svg-Gcj9PNEHib7QntS7 .node ellipse,#mermaid-svg-Gcj9PNEHib7QntS7 .node polygon,#mermaid-svg-Gcj9PNEHib7QntS7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Gcj9PNEHib7QntS7 .rough-node .label text,#mermaid-svg-Gcj9PNEHib7QntS7 .node .label text,#mermaid-svg-Gcj9PNEHib7QntS7 .image-shape .label,#mermaid-svg-Gcj9PNEHib7QntS7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-Gcj9PNEHib7QntS7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Gcj9PNEHib7QntS7 .rough-node .label,#mermaid-svg-Gcj9PNEHib7QntS7 .node .label,#mermaid-svg-Gcj9PNEHib7QntS7 .image-shape .label,#mermaid-svg-Gcj9PNEHib7QntS7 .icon-shape .label{text-align:center;}#mermaid-svg-Gcj9PNEHib7QntS7 .node.clickable{cursor:pointer;}#mermaid-svg-Gcj9PNEHib7QntS7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Gcj9PNEHib7QntS7 .arrowheadPath{fill:#333333;}#mermaid-svg-Gcj9PNEHib7QntS7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Gcj9PNEHib7QntS7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Gcj9PNEHib7QntS7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Gcj9PNEHib7QntS7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Gcj9PNEHib7QntS7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Gcj9PNEHib7QntS7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Gcj9PNEHib7QntS7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Gcj9PNEHib7QntS7 .cluster text{fill:#333;}#mermaid-svg-Gcj9PNEHib7QntS7 .cluster span{color:#333;}#mermaid-svg-Gcj9PNEHib7QntS7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Gcj9PNEHib7QntS7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Gcj9PNEHib7QntS7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-Gcj9PNEHib7QntS7 .icon-shape,#mermaid-svg-Gcj9PNEHib7QntS7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Gcj9PNEHib7QntS7 .icon-shape p,#mermaid-svg-Gcj9PNEHib7QntS7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Gcj9PNEHib7QntS7 .icon-shape .label rect,#mermaid-svg-Gcj9PNEHib7QntS7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Gcj9PNEHib7QntS7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Gcj9PNEHib7QntS7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Gcj9PNEHib7QntS7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 电机
减速器
关节

电机端看到的是:

高速 + 较小力矩

关节端看到的是:

低速 + 放大的输出力矩

如果仿真直接把电机当成关节直驱:

那么机器人在仿真中看到的动力学特性就已经发生了根本变化。

这不是简单的参数误差。

而是:

动力学模型的结构错误。

所以在 Sim2Real 中,减速器参数的优先级非常高。


八、摩擦同样不能忽略

仿真中如果把关节摩擦设置得过低,机器人会表现得非常"灵活"。

它可以:

  • 非常细微地调整关节;
  • 很轻松地改变姿态;
  • 几乎没有机械阻力。

但真实机器人不是这样。

真实关节存在:

  • 静摩擦;
  • 库仑摩擦;
  • 粘滞摩擦;
  • 减速器损耗;
  • 轴承阻力;
  • 结构变形。

于是可能出现一种非常典型的 Sim2Real 问题:

仿真里机器人可以做出非常精细的小动作,真机却"动不起来"。

这就是为什么:

"仿真机器人动作很漂亮"不代表"真机一定能复现"。


九、PD 参数是连接神经网络和真实机械结构的桥梁

强化学习策略通常不会直接控制真实电机电流。

更常见的结构是:
#mermaid-svg-OKm7Ecqlx90dILoB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OKm7Ecqlx90dILoB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OKm7Ecqlx90dILoB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OKm7Ecqlx90dILoB .error-icon{fill:#552222;}#mermaid-svg-OKm7Ecqlx90dILoB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OKm7Ecqlx90dILoB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OKm7Ecqlx90dILoB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OKm7Ecqlx90dILoB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OKm7Ecqlx90dILoB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OKm7Ecqlx90dILoB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OKm7Ecqlx90dILoB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OKm7Ecqlx90dILoB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OKm7Ecqlx90dILoB .marker.cross{stroke:#333333;}#mermaid-svg-OKm7Ecqlx90dILoB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OKm7Ecqlx90dILoB p{margin:0;}#mermaid-svg-OKm7Ecqlx90dILoB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OKm7Ecqlx90dILoB .cluster-label text{fill:#333;}#mermaid-svg-OKm7Ecqlx90dILoB .cluster-label span{color:#333;}#mermaid-svg-OKm7Ecqlx90dILoB .cluster-label span p{background-color:transparent;}#mermaid-svg-OKm7Ecqlx90dILoB .label text,#mermaid-svg-OKm7Ecqlx90dILoB span{fill:#333;color:#333;}#mermaid-svg-OKm7Ecqlx90dILoB .node rect,#mermaid-svg-OKm7Ecqlx90dILoB .node circle,#mermaid-svg-OKm7Ecqlx90dILoB .node ellipse,#mermaid-svg-OKm7Ecqlx90dILoB .node polygon,#mermaid-svg-OKm7Ecqlx90dILoB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OKm7Ecqlx90dILoB .rough-node .label text,#mermaid-svg-OKm7Ecqlx90dILoB .node .label text,#mermaid-svg-OKm7Ecqlx90dILoB .image-shape .label,#mermaid-svg-OKm7Ecqlx90dILoB .icon-shape .label{text-anchor:middle;}#mermaid-svg-OKm7Ecqlx90dILoB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OKm7Ecqlx90dILoB .rough-node .label,#mermaid-svg-OKm7Ecqlx90dILoB .node .label,#mermaid-svg-OKm7Ecqlx90dILoB .image-shape .label,#mermaid-svg-OKm7Ecqlx90dILoB .icon-shape .label{text-align:center;}#mermaid-svg-OKm7Ecqlx90dILoB .node.clickable{cursor:pointer;}#mermaid-svg-OKm7Ecqlx90dILoB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OKm7Ecqlx90dILoB .arrowheadPath{fill:#333333;}#mermaid-svg-OKm7Ecqlx90dILoB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OKm7Ecqlx90dILoB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OKm7Ecqlx90dILoB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OKm7Ecqlx90dILoB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OKm7Ecqlx90dILoB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OKm7Ecqlx90dILoB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OKm7Ecqlx90dILoB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OKm7Ecqlx90dILoB .cluster text{fill:#333;}#mermaid-svg-OKm7Ecqlx90dILoB .cluster span{color:#333;}#mermaid-svg-OKm7Ecqlx90dILoB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OKm7Ecqlx90dILoB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OKm7Ecqlx90dILoB rect.text{fill:none;stroke-width:0;}#mermaid-svg-OKm7Ecqlx90dILoB .icon-shape,#mermaid-svg-OKm7Ecqlx90dILoB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OKm7Ecqlx90dILoB .icon-shape p,#mermaid-svg-OKm7Ecqlx90dILoB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OKm7Ecqlx90dILoB .icon-shape .label rect,#mermaid-svg-OKm7Ecqlx90dILoB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OKm7Ecqlx90dILoB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OKm7Ecqlx90dILoB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OKm7Ecqlx90dILoB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RL Action
目标关节位置
PD Controller
真实关节状态
电机力矩
机器人

因此,RL 输出的是目标。

真正把目标转换成物理力矩的,是底层控制器。

如果仿真使用一组 PD 参数:

而真实机器人使用另一组参数:

那么即使:

RL 输出完全一样

最终产生的:

实际关节运动也可能完全不同。

所以 Sim2Real 中,PD 参数实际上是一个非常重要的"接口"。


十、真实参数应该按照优先级逐步加入

结合这次项目,可以把 Sim2Real 参数大致分成三层。

第一层:必须准确

🔴 动力学核心参数

  • 电机输出力矩;
  • 电机速度;
  • 减速比;
  • PD 参数;
  • 机械摩擦;
  • 机器人质量;
  • 真实站立高度。

第二层:强烈建议校准

🟡 控制系统参数

  • 控制频率;
  • 通信延迟;
  • 编码器特性;
  • 轮地摩擦;
  • 滚动阻力。

第三层:进一步提高鲁棒性

🟢 传感器与随机性

  • IMU 噪声;
  • 编码器量化噪声;
  • 延迟随机化;
  • 摩擦随机化;
  • 质量随机化。

这实际上就是一个非常典型的:

从"动力学正确"到"控制正确",再到"传感器正确"。


十一、为什么当前训练不需要雷达和相机?

这是一个很容易产生误解的地方。

当前策略主要使用:

  • 机身线速度;
  • 机身角速度;
  • 重力方向;
  • 速度指令;
  • 16 个关节位置;
  • 16 个关节速度。

也就是说,它主要依赖本体感知
#mermaid-svg-5icYZu6lzkeayJCW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5icYZu6lzkeayJCW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5icYZu6lzkeayJCW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5icYZu6lzkeayJCW .error-icon{fill:#552222;}#mermaid-svg-5icYZu6lzkeayJCW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5icYZu6lzkeayJCW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5icYZu6lzkeayJCW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5icYZu6lzkeayJCW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5icYZu6lzkeayJCW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5icYZu6lzkeayJCW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5icYZu6lzkeayJCW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5icYZu6lzkeayJCW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5icYZu6lzkeayJCW .marker.cross{stroke:#333333;}#mermaid-svg-5icYZu6lzkeayJCW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5icYZu6lzkeayJCW p{margin:0;}#mermaid-svg-5icYZu6lzkeayJCW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5icYZu6lzkeayJCW .cluster-label text{fill:#333;}#mermaid-svg-5icYZu6lzkeayJCW .cluster-label span{color:#333;}#mermaid-svg-5icYZu6lzkeayJCW .cluster-label span p{background-color:transparent;}#mermaid-svg-5icYZu6lzkeayJCW .label text,#mermaid-svg-5icYZu6lzkeayJCW span{fill:#333;color:#333;}#mermaid-svg-5icYZu6lzkeayJCW .node rect,#mermaid-svg-5icYZu6lzkeayJCW .node circle,#mermaid-svg-5icYZu6lzkeayJCW .node ellipse,#mermaid-svg-5icYZu6lzkeayJCW .node polygon,#mermaid-svg-5icYZu6lzkeayJCW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5icYZu6lzkeayJCW .rough-node .label text,#mermaid-svg-5icYZu6lzkeayJCW .node .label text,#mermaid-svg-5icYZu6lzkeayJCW .image-shape .label,#mermaid-svg-5icYZu6lzkeayJCW .icon-shape .label{text-anchor:middle;}#mermaid-svg-5icYZu6lzkeayJCW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5icYZu6lzkeayJCW .rough-node .label,#mermaid-svg-5icYZu6lzkeayJCW .node .label,#mermaid-svg-5icYZu6lzkeayJCW .image-shape .label,#mermaid-svg-5icYZu6lzkeayJCW .icon-shape .label{text-align:center;}#mermaid-svg-5icYZu6lzkeayJCW .node.clickable{cursor:pointer;}#mermaid-svg-5icYZu6lzkeayJCW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5icYZu6lzkeayJCW .arrowheadPath{fill:#333333;}#mermaid-svg-5icYZu6lzkeayJCW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5icYZu6lzkeayJCW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5icYZu6lzkeayJCW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5icYZu6lzkeayJCW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5icYZu6lzkeayJCW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5icYZu6lzkeayJCW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5icYZu6lzkeayJCW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5icYZu6lzkeayJCW .cluster text{fill:#333;}#mermaid-svg-5icYZu6lzkeayJCW .cluster span{color:#333;}#mermaid-svg-5icYZu6lzkeayJCW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5icYZu6lzkeayJCW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5icYZu6lzkeayJCW rect.text{fill:none;stroke-width:0;}#mermaid-svg-5icYZu6lzkeayJCW .icon-shape,#mermaid-svg-5icYZu6lzkeayJCW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5icYZu6lzkeayJCW .icon-shape p,#mermaid-svg-5icYZu6lzkeayJCW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5icYZu6lzkeayJCW .icon-shape .label rect,#mermaid-svg-5icYZu6lzkeayJCW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5icYZu6lzkeayJCW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5icYZu6lzkeayJCW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5icYZu6lzkeayJCW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} IMU
本体状态
关节编码器
速度指令
RL Policy
运动控制

这类策略可以理解成:

"盲走策略"。

它并不直接知道:

  • 前面有没有墙;
  • 前面有没有楼梯;
  • 哪条路可以走;
  • 目标在哪里。

这些任务交给上层系统。


十二、真正完整的机器人系统应该这样分层

#mermaid-svg-C5e2fcQEYYzDtX3h{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-C5e2fcQEYYzDtX3h .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-C5e2fcQEYYzDtX3h .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-C5e2fcQEYYzDtX3h .error-icon{fill:#552222;}#mermaid-svg-C5e2fcQEYYzDtX3h .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-C5e2fcQEYYzDtX3h .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-C5e2fcQEYYzDtX3h .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-C5e2fcQEYYzDtX3h .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-C5e2fcQEYYzDtX3h .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-C5e2fcQEYYzDtX3h .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-C5e2fcQEYYzDtX3h .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-C5e2fcQEYYzDtX3h .marker{fill:#333333;stroke:#333333;}#mermaid-svg-C5e2fcQEYYzDtX3h .marker.cross{stroke:#333333;}#mermaid-svg-C5e2fcQEYYzDtX3h svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-C5e2fcQEYYzDtX3h p{margin:0;}#mermaid-svg-C5e2fcQEYYzDtX3h .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-C5e2fcQEYYzDtX3h .cluster-label text{fill:#333;}#mermaid-svg-C5e2fcQEYYzDtX3h .cluster-label span{color:#333;}#mermaid-svg-C5e2fcQEYYzDtX3h .cluster-label span p{background-color:transparent;}#mermaid-svg-C5e2fcQEYYzDtX3h .label text,#mermaid-svg-C5e2fcQEYYzDtX3h span{fill:#333;color:#333;}#mermaid-svg-C5e2fcQEYYzDtX3h .node rect,#mermaid-svg-C5e2fcQEYYzDtX3h .node circle,#mermaid-svg-C5e2fcQEYYzDtX3h .node ellipse,#mermaid-svg-C5e2fcQEYYzDtX3h .node polygon,#mermaid-svg-C5e2fcQEYYzDtX3h .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-C5e2fcQEYYzDtX3h .rough-node .label text,#mermaid-svg-C5e2fcQEYYzDtX3h .node .label text,#mermaid-svg-C5e2fcQEYYzDtX3h .image-shape .label,#mermaid-svg-C5e2fcQEYYzDtX3h .icon-shape .label{text-anchor:middle;}#mermaid-svg-C5e2fcQEYYzDtX3h .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-C5e2fcQEYYzDtX3h .rough-node .label,#mermaid-svg-C5e2fcQEYYzDtX3h .node .label,#mermaid-svg-C5e2fcQEYYzDtX3h .image-shape .label,#mermaid-svg-C5e2fcQEYYzDtX3h .icon-shape .label{text-align:center;}#mermaid-svg-C5e2fcQEYYzDtX3h .node.clickable{cursor:pointer;}#mermaid-svg-C5e2fcQEYYzDtX3h .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-C5e2fcQEYYzDtX3h .arrowheadPath{fill:#333333;}#mermaid-svg-C5e2fcQEYYzDtX3h .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-C5e2fcQEYYzDtX3h .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-C5e2fcQEYYzDtX3h .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C5e2fcQEYYzDtX3h .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-C5e2fcQEYYzDtX3h .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C5e2fcQEYYzDtX3h .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-C5e2fcQEYYzDtX3h .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-C5e2fcQEYYzDtX3h .cluster text{fill:#333;}#mermaid-svg-C5e2fcQEYYzDtX3h .cluster span{color:#333;}#mermaid-svg-C5e2fcQEYYzDtX3h div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-C5e2fcQEYYzDtX3h .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-C5e2fcQEYYzDtX3h rect.text{fill:none;stroke-width:0;}#mermaid-svg-C5e2fcQEYYzDtX3h .icon-shape,#mermaid-svg-C5e2fcQEYYzDtX3h .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C5e2fcQEYYzDtX3h .icon-shape p,#mermaid-svg-C5e2fcQEYYzDtX3h .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-C5e2fcQEYYzDtX3h .icon-shape .label rect,#mermaid-svg-C5e2fcQEYYzDtX3h .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C5e2fcQEYYzDtX3h .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-C5e2fcQEYYzDtX3h .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-C5e2fcQEYYzDtX3h :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 相机 / 激光雷达
感知
SLAM / 定位
地图
路径规划
速度指令
RL Locomotion
IMU
关节编码器
16维动作
电机控制器
真实机器人

于是整个系统形成:

感知 → 定位 → 规划 → 速度指令 → 强化学习运动控制 → 电机

这比单纯把"雷达数据塞进神经网络"更加模块化。


十三、但是这里出现了一个更严重的问题:训练网络和真机网络可能不一致

这是整个项目分析过程中最值得警惕的发现之一。

当前 Isaac Lab 中训练的是一个相对简单的前馈 MLP。

它没有显式记忆过去的状态。

但真机已有的部署程序中,却发现了:

  • RL 状态机;
  • ONNX 推理;
  • 时序编码器;
  • Actor;
  • 历史动作;
  • 隐状态传递。

也就是说,真机部署侧存在明显的时序策略结构

这意味着:

"Isaac Lab 能成功训练"并不代表"训练出来的模型可以直接替换现有真机策略"。

这两个系统必须做接口级对齐。


十四、为什么真机需要知道自己的"位姿"?

这里需要区分两个概念:

全局位姿

机器人在地图中的:

  • X;
  • Y;
  • Yaw。

这属于:

定位 / SLAM / 导航系统。

本体状态

机器人当前:

  • 身体倾斜程度;
  • 角速度;
  • 运动速度;
  • 关节位置;
  • 关节速度。

这属于:

运动控制系统。

RL locomotion 策略主要需要的是第二类。

所以它不一定需要知道:

"我现在在地图的 X=10 米、Y=5 米。"

它更关心:

"我的身体现在向左倾了多少?"

"腿现在分别是什么位置?"

"我现在正在向哪个方向运动?"

"我刚才执行了什么动作?"


十五、状态估计器就是 RL 的"感觉系统"

真实机器人不会直接告诉神经网络:

"这是机器人真实世界状态。"

它需要通过传感器估计。
#mermaid-svg-oWsOf6RcHj8QoSXM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oWsOf6RcHj8QoSXM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oWsOf6RcHj8QoSXM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oWsOf6RcHj8QoSXM .error-icon{fill:#552222;}#mermaid-svg-oWsOf6RcHj8QoSXM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oWsOf6RcHj8QoSXM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oWsOf6RcHj8QoSXM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oWsOf6RcHj8QoSXM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oWsOf6RcHj8QoSXM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oWsOf6RcHj8QoSXM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oWsOf6RcHj8QoSXM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oWsOf6RcHj8QoSXM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oWsOf6RcHj8QoSXM .marker.cross{stroke:#333333;}#mermaid-svg-oWsOf6RcHj8QoSXM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oWsOf6RcHj8QoSXM p{margin:0;}#mermaid-svg-oWsOf6RcHj8QoSXM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-oWsOf6RcHj8QoSXM .cluster-label text{fill:#333;}#mermaid-svg-oWsOf6RcHj8QoSXM .cluster-label span{color:#333;}#mermaid-svg-oWsOf6RcHj8QoSXM .cluster-label span p{background-color:transparent;}#mermaid-svg-oWsOf6RcHj8QoSXM .label text,#mermaid-svg-oWsOf6RcHj8QoSXM span{fill:#333;color:#333;}#mermaid-svg-oWsOf6RcHj8QoSXM .node rect,#mermaid-svg-oWsOf6RcHj8QoSXM .node circle,#mermaid-svg-oWsOf6RcHj8QoSXM .node ellipse,#mermaid-svg-oWsOf6RcHj8QoSXM .node polygon,#mermaid-svg-oWsOf6RcHj8QoSXM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oWsOf6RcHj8QoSXM .rough-node .label text,#mermaid-svg-oWsOf6RcHj8QoSXM .node .label text,#mermaid-svg-oWsOf6RcHj8QoSXM .image-shape .label,#mermaid-svg-oWsOf6RcHj8QoSXM .icon-shape .label{text-anchor:middle;}#mermaid-svg-oWsOf6RcHj8QoSXM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oWsOf6RcHj8QoSXM .rough-node .label,#mermaid-svg-oWsOf6RcHj8QoSXM .node .label,#mermaid-svg-oWsOf6RcHj8QoSXM .image-shape .label,#mermaid-svg-oWsOf6RcHj8QoSXM .icon-shape .label{text-align:center;}#mermaid-svg-oWsOf6RcHj8QoSXM .node.clickable{cursor:pointer;}#mermaid-svg-oWsOf6RcHj8QoSXM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oWsOf6RcHj8QoSXM .arrowheadPath{fill:#333333;}#mermaid-svg-oWsOf6RcHj8QoSXM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oWsOf6RcHj8QoSXM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oWsOf6RcHj8QoSXM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oWsOf6RcHj8QoSXM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oWsOf6RcHj8QoSXM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oWsOf6RcHj8QoSXM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oWsOf6RcHj8QoSXM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oWsOf6RcHj8QoSXM .cluster text{fill:#333;}#mermaid-svg-oWsOf6RcHj8QoSXM .cluster span{color:#333;}#mermaid-svg-oWsOf6RcHj8QoSXM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oWsOf6RcHj8QoSXM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oWsOf6RcHj8QoSXM rect.text{fill:none;stroke-width:0;}#mermaid-svg-oWsOf6RcHj8QoSXM .icon-shape,#mermaid-svg-oWsOf6RcHj8QoSXM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oWsOf6RcHj8QoSXM .icon-shape p,#mermaid-svg-oWsOf6RcHj8QoSXM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oWsOf6RcHj8QoSXM .icon-shape .label rect,#mermaid-svg-oWsOf6RcHj8QoSXM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oWsOf6RcHj8QoSXM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oWsOf6RcHj8QoSXM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oWsOf6RcHj8QoSXM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} IMU
State Estimator
Joint Encoder
Motor State
机器人本体状态
Observation Builder
RL Policy

所以从系统角度来看:

状态估计器不是 RL 的附属品。

它是 RL 策略能够在真机运行的重要基础设施。


十六、训练真正成功的标准是什么?

这次训练日志中出现了:

  • Actor 网络正常建立;
  • Critic 网络正常建立;
  • 训练迭代持续推进;
  • GPU 吞吐正常;
  • 没有崩溃;
  • PPO 开始进行策略更新。

这些只能说明:

训练系统成功运行。

不能说明:

机器人已经学会走路。

这是两个完全不同的概念。

真正判断策略是否学会,需要继续观察:

  • 速度跟踪误差;
  • 角速度跟踪误差;
  • episode length;
  • base contact;
  • 姿态稳定性;
  • action noise;
  • reward 曲线;
  • 最终策略在 Play 环境中的实际运动效果。

所以:

"训练程序跑完"只是工程链路的一个节点,不是最终验收标准。


十七、项目整理本身也是机器人研发的一部分

这个项目还有一个看起来与强化学习无关,但实际上非常重要的工程问题:

项目目录。

最开始:

text 复制代码
训练代码
模型资产
Isaac Lab
教程
脚本

散落在不同目录。

后来统一成项目根目录:

text 复制代码
z1w_v2_project/
├── README
├── docs/
├── scripts/
├── assets/
└── rl_training/

这个过程还遇到了一个非常典型的问题:

目录嵌套。

原本实际文件位于更深一层目录,而 Docker 挂载的是上一层目录。

结果就是:

宿主机"文件存在",容器里却"文件不存在"。

这类问题非常容易被误判成:

  • Python 路径问题;
  • Docker 问题;
  • Isaac Lab 问题;
  • 权限问题。

实际上只是:

挂载点和真实目录结构不一致。

最终通过整理目录结构,同时保留原有 Docker 所依赖的路径兼容关系,才真正解决。

这让我再次意识到:

机器人研发不是只有算法。Docker、文件系统、模型资产、训练脚本、部署程序,任何一个环节出问题,最终都可能表现成"机器人算法不工作"。


十八、从这次项目可以总结出一套机器人 RL Debug 方法论

以后再遇到类似问题,我会按照下面的顺序排查。
#mermaid-svg-uGtIzylNhgD5qH6l{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uGtIzylNhgD5qH6l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uGtIzylNhgD5qH6l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uGtIzylNhgD5qH6l .error-icon{fill:#552222;}#mermaid-svg-uGtIzylNhgD5qH6l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uGtIzylNhgD5qH6l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uGtIzylNhgD5qH6l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uGtIzylNhgD5qH6l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uGtIzylNhgD5qH6l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uGtIzylNhgD5qH6l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uGtIzylNhgD5qH6l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uGtIzylNhgD5qH6l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uGtIzylNhgD5qH6l .marker.cross{stroke:#333333;}#mermaid-svg-uGtIzylNhgD5qH6l svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uGtIzylNhgD5qH6l p{margin:0;}#mermaid-svg-uGtIzylNhgD5qH6l .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uGtIzylNhgD5qH6l .cluster-label text{fill:#333;}#mermaid-svg-uGtIzylNhgD5qH6l .cluster-label span{color:#333;}#mermaid-svg-uGtIzylNhgD5qH6l .cluster-label span p{background-color:transparent;}#mermaid-svg-uGtIzylNhgD5qH6l .label text,#mermaid-svg-uGtIzylNhgD5qH6l span{fill:#333;color:#333;}#mermaid-svg-uGtIzylNhgD5qH6l .node rect,#mermaid-svg-uGtIzylNhgD5qH6l .node circle,#mermaid-svg-uGtIzylNhgD5qH6l .node ellipse,#mermaid-svg-uGtIzylNhgD5qH6l .node polygon,#mermaid-svg-uGtIzylNhgD5qH6l .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uGtIzylNhgD5qH6l .rough-node .label text,#mermaid-svg-uGtIzylNhgD5qH6l .node .label text,#mermaid-svg-uGtIzylNhgD5qH6l .image-shape .label,#mermaid-svg-uGtIzylNhgD5qH6l .icon-shape .label{text-anchor:middle;}#mermaid-svg-uGtIzylNhgD5qH6l .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uGtIzylNhgD5qH6l .rough-node .label,#mermaid-svg-uGtIzylNhgD5qH6l .node .label,#mermaid-svg-uGtIzylNhgD5qH6l .image-shape .label,#mermaid-svg-uGtIzylNhgD5qH6l .icon-shape .label{text-align:center;}#mermaid-svg-uGtIzylNhgD5qH6l .node.clickable{cursor:pointer;}#mermaid-svg-uGtIzylNhgD5qH6l .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uGtIzylNhgD5qH6l .arrowheadPath{fill:#333333;}#mermaid-svg-uGtIzylNhgD5qH6l .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uGtIzylNhgD5qH6l .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uGtIzylNhgD5qH6l .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uGtIzylNhgD5qH6l .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uGtIzylNhgD5qH6l .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uGtIzylNhgD5qH6l .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uGtIzylNhgD5qH6l .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uGtIzylNhgD5qH6l .cluster text{fill:#333;}#mermaid-svg-uGtIzylNhgD5qH6l .cluster span{color:#333;}#mermaid-svg-uGtIzylNhgD5qH6l div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uGtIzylNhgD5qH6l .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uGtIzylNhgD5qH6l rect.text{fill:none;stroke-width:0;}#mermaid-svg-uGtIzylNhgD5qH6l .icon-shape,#mermaid-svg-uGtIzylNhgD5qH6l .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uGtIzylNhgD5qH6l .icon-shape p,#mermaid-svg-uGtIzylNhgD5qH6l .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uGtIzylNhgD5qH6l .icon-shape .label rect,#mermaid-svg-uGtIzylNhgD5qH6l .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uGtIzylNhgD5qH6l .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uGtIzylNhgD5qH6l .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uGtIzylNhgD5qH6l :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否







机器人 RL 出问题
训练是否启动?
检查环境 / Docker / 路径 / 依赖
策略是否学习?
检查观测 / 动作 / 奖励 / 终止条件
仿真运动是否合理?
检查动力学模型
真机是否一致?
校准电机 / 减速器 / 摩擦 / PD / 延迟
检查状态估计 / 通信 / 控制频率
Sim2Real

这套方法最大的价值在于:

不要一看到机器人摔倒,就马上改奖励函数。

机器人摔倒可能来自:

  • 模型质量错误;
  • 电机力矩错误;
  • 减速比错误;
  • PD 错误;
  • 摩擦错误;
  • 状态估计错误;
  • 动作缩放错误;
  • 控制频率错误;
  • 网络输入输出不一致。

奖励函数只是其中一个可能原因。


十九、真正成熟的机器人强化学习架构

把整个项目抽象到最高层,可以得到下面这套架构:
#mermaid-svg-MQIgkohZ6JYbcRWq{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MQIgkohZ6JYbcRWq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MQIgkohZ6JYbcRWq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MQIgkohZ6JYbcRWq .error-icon{fill:#552222;}#mermaid-svg-MQIgkohZ6JYbcRWq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MQIgkohZ6JYbcRWq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MQIgkohZ6JYbcRWq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MQIgkohZ6JYbcRWq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MQIgkohZ6JYbcRWq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MQIgkohZ6JYbcRWq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MQIgkohZ6JYbcRWq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MQIgkohZ6JYbcRWq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MQIgkohZ6JYbcRWq .marker.cross{stroke:#333333;}#mermaid-svg-MQIgkohZ6JYbcRWq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MQIgkohZ6JYbcRWq p{margin:0;}#mermaid-svg-MQIgkohZ6JYbcRWq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-MQIgkohZ6JYbcRWq .cluster-label text{fill:#333;}#mermaid-svg-MQIgkohZ6JYbcRWq .cluster-label span{color:#333;}#mermaid-svg-MQIgkohZ6JYbcRWq .cluster-label span p{background-color:transparent;}#mermaid-svg-MQIgkohZ6JYbcRWq .label text,#mermaid-svg-MQIgkohZ6JYbcRWq span{fill:#333;color:#333;}#mermaid-svg-MQIgkohZ6JYbcRWq .node rect,#mermaid-svg-MQIgkohZ6JYbcRWq .node circle,#mermaid-svg-MQIgkohZ6JYbcRWq .node ellipse,#mermaid-svg-MQIgkohZ6JYbcRWq .node polygon,#mermaid-svg-MQIgkohZ6JYbcRWq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MQIgkohZ6JYbcRWq .rough-node .label text,#mermaid-svg-MQIgkohZ6JYbcRWq .node .label text,#mermaid-svg-MQIgkohZ6JYbcRWq .image-shape .label,#mermaid-svg-MQIgkohZ6JYbcRWq .icon-shape .label{text-anchor:middle;}#mermaid-svg-MQIgkohZ6JYbcRWq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MQIgkohZ6JYbcRWq .rough-node .label,#mermaid-svg-MQIgkohZ6JYbcRWq .node .label,#mermaid-svg-MQIgkohZ6JYbcRWq .image-shape .label,#mermaid-svg-MQIgkohZ6JYbcRWq .icon-shape .label{text-align:center;}#mermaid-svg-MQIgkohZ6JYbcRWq .node.clickable{cursor:pointer;}#mermaid-svg-MQIgkohZ6JYbcRWq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MQIgkohZ6JYbcRWq .arrowheadPath{fill:#333333;}#mermaid-svg-MQIgkohZ6JYbcRWq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MQIgkohZ6JYbcRWq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MQIgkohZ6JYbcRWq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MQIgkohZ6JYbcRWq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MQIgkohZ6JYbcRWq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MQIgkohZ6JYbcRWq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MQIgkohZ6JYbcRWq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MQIgkohZ6JYbcRWq .cluster text{fill:#333;}#mermaid-svg-MQIgkohZ6JYbcRWq .cluster span{color:#333;}#mermaid-svg-MQIgkohZ6JYbcRWq div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MQIgkohZ6JYbcRWq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MQIgkohZ6JYbcRWq rect.text{fill:none;stroke-width:0;}#mermaid-svg-MQIgkohZ6JYbcRWq .icon-shape,#mermaid-svg-MQIgkohZ6JYbcRWq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MQIgkohZ6JYbcRWq .icon-shape p,#mermaid-svg-MQIgkohZ6JYbcRWq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MQIgkohZ6JYbcRWq .icon-shape .label rect,#mermaid-svg-MQIgkohZ6JYbcRWq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MQIgkohZ6JYbcRWq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MQIgkohZ6JYbcRWq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MQIgkohZ6JYbcRWq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 真实机器人
部署层
学习层
仿真层
URDF / USD
真实质量
真实电机参数
减速器
摩擦
控制器
Observation
Reward
PPO
Policy
ONNX / Policy
State Estimator
Motor Controller
IMU
编码器
16个执行器

而雷达和相机则位于更高一级:
#mermaid-svg-w86JQGGoZ7glDC6e{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-w86JQGGoZ7glDC6e .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-w86JQGGoZ7glDC6e .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-w86JQGGoZ7glDC6e .error-icon{fill:#552222;}#mermaid-svg-w86JQGGoZ7glDC6e .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-w86JQGGoZ7glDC6e .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-w86JQGGoZ7glDC6e .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-w86JQGGoZ7glDC6e .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-w86JQGGoZ7glDC6e .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-w86JQGGoZ7glDC6e .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-w86JQGGoZ7glDC6e .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-w86JQGGoZ7glDC6e .marker{fill:#333333;stroke:#333333;}#mermaid-svg-w86JQGGoZ7glDC6e .marker.cross{stroke:#333333;}#mermaid-svg-w86JQGGoZ7glDC6e svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-w86JQGGoZ7glDC6e p{margin:0;}#mermaid-svg-w86JQGGoZ7glDC6e .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-w86JQGGoZ7glDC6e .cluster-label text{fill:#333;}#mermaid-svg-w86JQGGoZ7glDC6e .cluster-label span{color:#333;}#mermaid-svg-w86JQGGoZ7glDC6e .cluster-label span p{background-color:transparent;}#mermaid-svg-w86JQGGoZ7glDC6e .label text,#mermaid-svg-w86JQGGoZ7glDC6e span{fill:#333;color:#333;}#mermaid-svg-w86JQGGoZ7glDC6e .node rect,#mermaid-svg-w86JQGGoZ7glDC6e .node circle,#mermaid-svg-w86JQGGoZ7glDC6e .node ellipse,#mermaid-svg-w86JQGGoZ7glDC6e .node polygon,#mermaid-svg-w86JQGGoZ7glDC6e .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-w86JQGGoZ7glDC6e .rough-node .label text,#mermaid-svg-w86JQGGoZ7glDC6e .node .label text,#mermaid-svg-w86JQGGoZ7glDC6e .image-shape .label,#mermaid-svg-w86JQGGoZ7glDC6e .icon-shape .label{text-anchor:middle;}#mermaid-svg-w86JQGGoZ7glDC6e .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-w86JQGGoZ7glDC6e .rough-node .label,#mermaid-svg-w86JQGGoZ7glDC6e .node .label,#mermaid-svg-w86JQGGoZ7glDC6e .image-shape .label,#mermaid-svg-w86JQGGoZ7glDC6e .icon-shape .label{text-align:center;}#mermaid-svg-w86JQGGoZ7glDC6e .node.clickable{cursor:pointer;}#mermaid-svg-w86JQGGoZ7glDC6e .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-w86JQGGoZ7glDC6e .arrowheadPath{fill:#333333;}#mermaid-svg-w86JQGGoZ7glDC6e .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-w86JQGGoZ7glDC6e .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-w86JQGGoZ7glDC6e .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-w86JQGGoZ7glDC6e .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-w86JQGGoZ7glDC6e .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-w86JQGGoZ7glDC6e .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-w86JQGGoZ7glDC6e .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-w86JQGGoZ7glDC6e .cluster text{fill:#333;}#mermaid-svg-w86JQGGoZ7glDC6e .cluster span{color:#333;}#mermaid-svg-w86JQGGoZ7glDC6e div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-w86JQGGoZ7glDC6e .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-w86JQGGoZ7glDC6e rect.text{fill:none;stroke-width:0;}#mermaid-svg-w86JQGGoZ7glDC6e .icon-shape,#mermaid-svg-w86JQGGoZ7glDC6e .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-w86JQGGoZ7glDC6e .icon-shape p,#mermaid-svg-w86JQGGoZ7glDC6e .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-w86JQGGoZ7glDC6e .icon-shape .label rect,#mermaid-svg-w86JQGGoZ7glDC6e .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-w86JQGGoZ7glDC6e .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-w86JQGGoZ7glDC6e .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-w86JQGGoZ7glDC6e :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Camera / LiDAR
Perception
SLAM
Navigation
Velocity Command
RL Locomotion
Motor Control
Robot

这才是一个完整的:

感知 → 导航 → 运动策略 → 执行器

机器人系统。


二十、这次项目最大的技术成长,不是"把训练跑起来"

如果只看结果:

"机械狗强化学习训练成功了。"

这个结论其实非常普通。

真正有价值的是,在这个过程中逐渐建立了几种工程能力。

1. 从"看代码"变成"追踪实际运行链路"

不再简单相信某个配置类、教程或者注释,而是追踪:

定义 → 继承 → 覆盖 → 实例化 → 启动 → 日志。


2. 从"参数能用"变成"参数必须真实"

电机参数不再使用经验值,而是逐步回到:

真实规格书 → 减速器 → 输出参数 → 仿真模型。


3. 从"训练算法"变成"系统架构"

开始理解:

RL 并不是整个机器人。

它只是运动控制层的一部分。


4. 从"仿真成功"开始关注 Sim2Real

真正需要解决的问题已经从:

"机器人能不能学会?"

变成:

"机器人在仿真中学到的东西,真实机器人能不能执行?"


5. 从"代码能跑"变成"工程系统可维护"

项目目录、Docker、Git、模型资产、教程、训练脚本最终统一管理。

这实际上是从:

算法 Demo

向:

机器人研发工程

迈出的重要一步。


结语:强化学习最难的不是训练,而是闭环

对于机器人强化学习来说,最容易展示的是:

一段漂亮的训练视频。

但真正困难的东西藏在视频背后:

  • 机器人模型是否准确;
  • 电机参数是否真实;
  • 减速器是否建模;
  • 摩擦是否合理;
  • PD 是否一致;
  • 观测是否可靠;
  • 状态估计是否稳定;
  • 动作接口是否匹配;
  • 训练网络和部署网络是否一致;
  • 通信是否可靠;
  • 控制频率是否一致;
  • 最终能否跨越 Sim2Real 的鸿沟。

因此,一个真正完整的机器人学习闭环应该是:

真实机器人 → 参数辨识 → 仿真建模 → 强化学习 → 策略验证 → 状态估计 → 真机部署 → 误差分析 → 再回到仿真。

这才是机器人强化学习真正的工程闭环。

🤖 训练只是开始。

真正的终点,是让仿真中学到的策略在真实机器人身上可靠地工作。

相关推荐
爱知菜1 小时前
Transformer vs Diffusion:为什么扩散模型更擅长捕捉细节?
人工智能·深度学习·transformer·扩散模型
xp_xht1231 小时前
Day1 概率机器学习 信息论
人工智能·机器学习·信息论
chuan.bai1 小时前
Java RAG 实战(第 3 篇):从交互式聊天到多轮上下文
java·人工智能·macos·ai
雪隐1 小时前
个人电脑玩AI-16让5060 Ti给你打工——MiniMax H3 提速实录:从"泡杯茶等视频"到"视频等你",一张 5060 Ti 的自我修养
前端·人工智能·后端
深兰科技1 小时前
深兰科技亮相天津医疗器械创新生态大会,DeepAgent智能体赋能医疗医美并签约天津OPC项目
人工智能·科技·r语言·symfony·视觉大模型·深兰科技·deepagent智能体
cxr8281 小时前
从“对象本体”到“关系本体”
人工智能·架构
shxjnpl1 小时前
Whisper + CAM++ + 本地大模型:一套完全离线的AI会议处理链路
人工智能·机器学习·whisper
小润nature1 小时前
AI 与嵌入式三时简报|早报
人工智能
今天AI了吗1 小时前
MCP 协议打通 AI 与国产数据库,SQL 调优全流程一站式闭环
数据库·人工智能·sql