从"仿真能跑"到"真机能走":一套轮腿机械狗强化学习系统的工程化实践
强化学习真正困难的地方,往往不是"把 PPO 跑起来",而是让仿真中的机器人学到的东西,能够被真实机器人理解。
最近完整梳理了一套 Z1W-V2 轮腿机械狗的强化学习系统。
整个过程让我对机器人强化学习有了一个比较深的认识:
训练成功 ≠ 机器人成功。
一个真正可落地的机器人学习系统,至少需要同时解决四件事情:
- 仿真模型是否足够接近真实机器人;
- 观测、动作、奖励是否真正对应控制目标;
- 训练出来的策略是否与真机部署架构一致;
- 仿真与真实世界之间的差异是否被系统性处理。
这篇文章不讨论具体代码,而是从工程角度梳理整个系统,以及在实际项目中遇到的一些容易被忽略的问题。
一、先建立一个正确认识:机器狗强化学习到底在学什么?
很多人第一次接触强化学习控制机器人时,会产生一个直觉:
"我给机器人一个前进速度,它是不是就自己知道应该怎么控制 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 的鸿沟。
因此,一个真正完整的机器人学习闭环应该是:
真实机器人 → 参数辨识 → 仿真建模 → 强化学习 → 策略验证 → 状态估计 → 真机部署 → 误差分析 → 再回到仿真。
这才是机器人强化学习真正的工程闭环。
🤖 训练只是开始。
真正的终点,是让仿真中学到的策略在真实机器人身上可靠地工作。