
为什么Microduck RL的策略不加动作滤波训练与部署必须一致的铁律【免费下载链接】microduck_rlRL training environments for Microduck (mjlab)项目地址: https://gitcode.com/GitHub_Trending/mi/microduck_rlMicroduck RL 是一个为 ~800 g 微型双足机器人打造的强化学习训练环境基于 mjlab / MuJoCo Warp 与 PPO策略以 50 Hz 训练并导出 ONNX 部署。很多新手会问为什么不在策略输出上加个低通滤波器让动作更平滑答案藏在项目的一条铁律里——训练与部署必须严格一致。什么是动作滤波新手为什么总想加它策略网络每 50 ms 输出一次 14 维关节目标角度直接驱动舵机。由于神经网络输出天然带抖动新手最容易想到的捷径就是加一个 EMA 或低通滤波器把动作抹平——看起来零成本立竿见影。⚠️ 但滤波器是一个有延迟、有相位滞后的动态系统加了滤波之后策略以为自己发出的指令和舵机实际收到的指令已经不是同一个信号了。策略从未见过这个滤波后的自己它在仿真里学到的整套动作→身体响应的耦合关系会被悄悄改变。Microduck RL 的做法用奖励塑形替代滤波项目里根本没有滤波环节而是把平滑当成一个学习目标用奖励函数教给策略。核心是action_rate_l2惩罚项它计算相邻两步动作的差值并平方求和动作跳变得越快扣分越多——策略为了拿分会自己学会输出平滑的轨迹。以行走任务为例平滑惩罚并非一步到位而是走课程学习curriculum权重从 -0.1 起步到第 1500 轮迭代才升到 -1.0让策略先学会走、再学会走得稳行走microduck_velocity_env_cfg.py差分计算实现mdp.py拾取任务慢速精细动作平滑权重更重-2.0因为慢而稳对它最有利microduck_ground_pick_env_cfg.py 平滑惩罚的权重还因任务而异这是项目用真实训练事故换来的经验站起任务曾把平滑惩罚的终点加重到 -1.2结果直接冻死了翻身恢复动作——因为过重的平滑惩罚本质上是运动阻断器会压制策略探索所需的动态动作。详见教训记录microduck_standup_env_cfg.py部署侧证据ONNX 输出直接生效零后处理部署链路的设计反过来印证了这条原则。在官方部署彩排脚本 infer_policy.py 中ONNX 推理出来的动作原样加到默认姿态上写入控制目标target_positions default_pose action × action_scale中间没有任何滤波、插值或平滑层唯一的可选处理是模拟训练时域随机化的命令延迟这正是训练里存在的环节所以加它是一致的。策略导出侧export.py 会把观测归一化器烘焙进 ONNX 图保证部署时策略看到的数值分布与训练时完全相同——连归一化都不允许在部署端偷改何况滤波。铁律训练与部署必须一致双向都会坏项目的协作守则 AGENTS.md 把这条规则写成了硬性不变量invariantPolicies are UNFILTEREDno action low-pass in training. Dont add EMA filtering without a matched runtime flag and a transfer test — trained-with / deployed-withouteither directionbreaks transfer. 策略不做滤波。没有配套的运行时开关和迁移测试就不要加 EMA 滤波——训练时加了而部署时没加或反过来都会破坏 sim2real 迁移。注意双向都会坏这五个字场景会发生什么训练有滤波、部署没滤波策略习惯了延迟版的指令真机上动作响应错拍步态抖动甚至摔倒训练没滤波、部署有滤波滤波吃掉指令的瞬态分量策略发出的快速修正被抹掉等效于换了个从没训练过的系统如果某天你确实必须加滤波比如硬件延迟问题正确姿势是给训练环境加上同款滤波模型并跑迁移测试验证。项目里就有这种拿仿真策略直接上真机验证的基准单自由度 XL330 测试台环境刻意复用了与行走任务完全相同的观测噪声与动作平滑配方不做域随机化以便学到的策略能零修改转到真实舵机上再用 testbench_sim2real.py 对比仿真与真机轨迹。配方本身见 testbench_env_cfg.py。不加滤波动作为什么还是稳的三层保险1️⃣ 奖励塑形策略内部平滑action_rate_l2惩罚让少抖成为策略的收益最大解而不是外部强加的约束。2️⃣ 执行器自身的物理惯性Microduck 用的是电压控制的 XL330 舵机项目通过 BAM 模型把它建模到电压控制律、反电动势和负载相关摩擦这一级friction_dr_bam.py。动作是目标位置而非力矩舵机本身就是一个天然的机械低通——它物理上跳变不了所以仿真里和真机上都如此天然对称。3️⃣ 域随机化对时序抖动免疫训练时每个环境都会随机化电池电压、负载压降、命令延迟和摩擦大小见 README.md 的 Actuator model 一节策略学到的是对时序微抖鲁棒的策略而不是依赖指令精确同步到达的脆弱策略。新手检查清单部署策略前核对这 5 点✅ 只使用scripts/export.py导出的 ONNX归一化器已烘焙不要手动转换 checkpoint✅ 动作通路零后处理不加滤波、不加插值与 infer_policy.py 的写法保持一致✅ 控制频率与训练一致50 Hz✅ 观测契约保持 61 维48 维本体感知 13 维命令这是多策略热切换的基础✅ 上真机前先跑一遍 sim2real 对比testbench_sim2real.py确认轨迹吻合一句话总结滤波不是不能加而是必须训练侧和部署侧一起加、并用迁移测试背书。Microduck RL 选择更干净的路线——把平滑写进奖励让策略自己学会稳从而训练和部署两侧共用同一条无滤波的直通链路把 sim2real 的坑提前填掉。【免费下载链接】microduck_rlRL training environments for Microduck (mjlab)项目地址: https://gitcode.com/GitHub_Trending/mi/microduck_rl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考