清扫机器人强化学习奖励工程实战:从稀疏奖励到778分

发布时间:2026/9/26 5:42:20
清扫机器人强化学习奖励工程实战:从稀疏奖励到778分 训练日志拉到第40万步的时候清扫覆盖率卡在73%附近不动了评测分数长期在100出头打转。我一度以为是PPO的clip参数没调好又把SAC、TD3轮番换了一遍结论还是一样。后来把精力从算法挪到奖励函数上才意识到问题根源根本不在这——我只给了机器人一个清扫完成后加分的稀疏奖励它压根不知道中间哪些动作是值得强化的。重新把奖励工程拆成10项复合奖励之后同一套PPO在70万步内把分数抬到了778。这篇文章完整记录这次奖励工程的拆解过程、调参踩坑和部署经验适合正在做强化学习机器人控制、尤其是涉及清扫/覆盖类任务的工程师参考。1. 沙盒里的100分只给稀疏奖励的清扫机器人为什么会摆烂1.1 项目基线只有一个稀疏奖励的清扫沙盒先交代一下这个任务本身。我在一个仿真沙盒里放了一个约20平米的房间地面栅格化后随机撒了几片污渍区域机器人需要在一个回合内尽可能多地覆盖地面并把污渍清理干净。环境是标准的强化学习接口每步返回状态、动作、奖励和终止标志。状态里包括机器人位姿、激光雷达测距值、当前覆盖率、污渍检测器的输出动作是线速度和角速度。第一版奖励函数我写得极其朴素大概长这样cleanliness_before info[cleanliness] action_execute() cleanliness_after info[cleanliness] reward (cleanliness_after - cleanliness_before) * 10.0 if done and info[coverage] 0.9: reward 50.0设计思路看起来合理清洁度有提升就给分任务完成再给一大笔额外奖励。但实际训练结果是灾难性的。机器人在前几万步确实学会了往污渍密集区蹭蹭完就找个角落原地转圈覆盖率永远上不去评测分数稳在100附近。换算法也没有本质改善。1.2 稀疏奖励为什么教不会清扫这个失败是我自己撞出来的现在回头看原因非常清楚。强化学习本质上解决的是信用分配问题一个回合里跑了1000步最后环境告诉你做得不错或者做得不行但中间这1000步里到底哪几步是导致好结果的关键动作在高维连续动作空间里靠随机探索去撞对一个完整清扫策略的概率接近于零。稀疏奖励还有一个被忽视的副作用探索信号太少策略熵快速下降。机器人一旦发现某个动作序列能蹭到一点点分数比如冲到污渍密集区转圈它就会死守这个策略因为任何偏离都意味着失去那点确定性奖励。覆盖率、清洁度这种全局指标只能反映做得好不好不能告诉机器人下一步该往哪走、该不该拐弯、该不该加速。这就是为什么单一稀疏奖励在这个任务里天然学不出系统清扫行为。1.3 重写奖励前的任务拆解我决定重写奖励函数之前先把清扫这个任务按人类直觉拆成了几个行为段探索未覆盖区域、发现污渍、执行清扫动作并看到清洁度变化、合理安排路径避免重复劳动、避开障碍物、控制时间并平稳动作。每一段对应一个可以被量化的信号再为每个信号设计一个奖励项。这个拆解过程我建议每个做奖励工程的人都认真走一遍。奖励函数不是凭空想出来的而是把任务目标翻译成算法能优化的数值信号。翻译得越细策略学得越快。我当时整理出的10项信号就是后来复合奖励的雏形。2. 10项复合奖励逐项拆解每个奖励都在塑造一个具体行为2.1 奖励结构总览与分类依据10项奖励我在代码里分成四组任务推动类、安全约束类、行为塑形类、完成兜底类。分组的理由是它们作用的时间尺度不同。任务推动类负责每一步的即时引导安全约束类负责限制危险行为行为塑形类负责让策略输出更平滑完成兜底类负责在关键节点给出稀疏强信号。分组奖励项信号方向作用对象任务推动类新增覆盖率奖励正奖励探索与覆盖任务推动类污渍发现奖励正奖励发现目标任务推动类清洁度增量奖励正奖励清扫效果任务推动类分区完成奖励正奖励里程碑完成兜底类任务完成Bonus正奖励整体完成安全约束类时间惩罚负奖励效率安全约束类碰撞惩罚负奖励安全安全约束类重复清扫惩罚负奖励路径优化行为塑形类动作变化惩罚负奖励平滑性行为塑形类残留污渍势能引导正负混合接近目标这里我多说一句为什么用复合奖励而不是分层策略或者多模型方案。分层RL和多智能体方案在仿真环境里调试成本极高收敛不稳定而复合奖励只是把同一个策略的优化信号细化改动成本低、见效快适合绝大多数单人单机的清扫任务场景。2.2 任务推动类奖励详解第一项是新增覆盖率奖励。清扫任务最核心的目标是覆盖更多面积所以我把地面栅格化为0.1m的网格统计每个回合里新覆盖的格子数new_covered covered_now - covered_before reward 2.0 * new_covered这个奖励的动机是让机器人每一步都能感受到我确实清扫到了新地方把覆盖率这个大目标逐帧化。实测中它的作用最立竿见影机器人很快学会了主动远离已经扫过的区域。第二项是污渍发现奖励。覆盖率高不等于清扫效果好如果机器人只是把地面路过一遍但没清理污渍残留率仍然会很高。我给污渍检测器接了一个触发信号当机器人进入污渍区域且检测器从未标记该区域时奖励0.5分。这个奖励鼓励机器人主动去寻找脏污密集的区域。第三项是清洁度增量奖励。在真实场景里清扫动作的效果是逐步显现的所以环境会返回每一步的清洁度变化值我把这个变化量乘以2.0作为奖励。它本质上是在告诉机器人你刚才那个动作真的把地面弄干净了继续保持。这项奖励与覆盖率奖励形成互补——覆盖率管扫没扫到清洁度管干没干净。第四项是分区完成奖励。我把房间划分为9个等面积分区每个分区内部覆盖率超过95%时一次性给予2分。这个设计是为了提供中型里程碑信号避免机器人在20平米的大空间里迷茫——它扫完一个区会收到明确的正反馈从而更愿意完整扫完一个区域再移动而不是到处乱窜。第五项是任务完成Bonus。当整个回合覆盖率达到95%且平均残留率低于10%时额外加20分。这个奖励我保留了一个稀疏强信号让策略在接近收敛时有一个宏观目标在拉着它走避免复合奖励全是即时项导致策略短视。2.3 安全与效率约束类奖励详解第六项是时间惩罚。每执行一步奖励减去0.01乘以步长。这个惩罚的作用是防止机器人变成磨洋工大师在角落里慢慢蹭每一帧的覆盖率奖励。没有时间惩罚时我最长的一次训练跑了每回合3000步还没结束加了惩罚之后稳定在800步左右完成。第七项是碰撞惩罚。环境里布置了几张桌椅作为静态障碍物每次碰撞给予-1.0惩罚。这里有个坑必须提醒碰撞惩罚过重会让机器人彻底变成静止主义宁可不动也不去探索。我的解决方式是只在连续碰撞超过3次时才累计惩罚单次轻微碰撞不惩罚给策略留出试探空间。第八项是重复清扫惩罚。机器人在乱窜阶段经常反复进入已经清扫过的网格我统计每一步重复经过已清扫网格的面积乘以-0.5作为惩罚。但注意不能一刀切从严因为在复杂房间布局里偶尔回扫是合理的。我加了一个条件单回合重复清扫比例超过15%才开始惩罚低于15%视为正常路径波动。2.4 平滑塑形与势能引导第九项是动作变化惩罚公式为action_penalty 0.05 * (linear_vel_change**2 angular_vel_change**2)这项惩罚直接作用于相邻两步动作之间的变化量。它背后的逻辑是真机上的电机和驱动系统承受不了高频剧烈的加减速转向平滑的动作不仅更安全也让清扫轨迹更规整。加了这项之后策略输出中的高频抖动明显下降覆盖率曲线也变顺了。第十项是残留污渍势能引导。这一项我用了势能函数塑形(Potential-based Reward Shaping)的思路公式是distance min_distance_to_nearest_dirt() potential -2.0 * distance reward 0.9 * potential - last_potential设计动机很朴素让机器人朝最近的污渍区域靠近时得到一个正信号远离时得到一个负信号。这个势能项解决了前期探索效率低的问题——覆盖率奖励让机器人想去新地方但新地方太多了它不知道优先去哪势能引导直接告诉它先去那边脏的地方。实测中这项奖励对前期训练速度提升最明显前10万步的覆盖率提升速度比不加势能时快了将近一倍。3. 权重标定与调参实录震荡、奖励黑客与渐次逼近7783.1 第一版权重直接翻车量纲失衡问题10项奖励写完之后我最开始的冲动是把所有权重都设成1.0跑起来再说。训练日志直接教我做人碰撞惩罚一个step是-1.0覆盖率奖励一个step可能只有0.02两个一加总奖励被碰撞惩罚彻底淹没机器人学到的唯一策略就是原地不动。问题出在各项奖励的量纲天然不同覆盖率、清洁度都是0到1的小数变化碰撞次数和动作变化量则常常是好几个数量级的整数差异。如果不做量纲校准权重设得再精细都没用。3.2 先归一化再定权的调参流程我的处理方式是分两步。第一步先跑一个随机策略统计每个奖励项的均值绝对量级把这些量级记录下来。第二步把每项奖励除以它自身的统计量级让所有信号大致落在一个可比范围内再乘以基权重。奖励项随机策略下的均值量级归一化方式调整后基权重新增覆盖率0.06除以0.06后乘201.0污渍发现0.15除以0.15后乘102.0清洁度增量0.03除以0.03后乘201.5分区完成0.10除以0.10后乘101.5任务完成Bonus0.01除以0.01后乘102.0时间惩罚0.40除以0.40后乘100.5碰撞惩罚1.20除以1.20后乘100.8重复清扫惩罚0.25除以0.25后乘100.6动作变化惩罚0.80除以0.80后乘100.4势能引导0.35除以0.35后乘101.0这组权重跑起来之后训练开始进入正常状态。我的经验是奖励工程调试的前半段时间都花在量纲校准上后半段才是在调权重比例。每次只调一个权重跑一次完整实验记录覆盖率和评测分数的走向再决定下一步动哪里。切忌一次调多个权重否则出了问题根本不知道是哪一项造成的。3.3 三个奖励黑客案例与修复奖励黑客就是策略找到了奖励函数的漏洞用投机取巧的方式刷分而不是真正完成任务。我这次项目里中了三个典型陷阱逐一拆开讲。第一个黑客行为是原地刷覆盖率。我最初的计算方式很简单机器人质心进入一个未覆盖网格就算新增覆盖。策略很快学会了在一个网格边界上高频震荡——每蹭一格就能吃一次新增覆盖奖励10步能扫完一大片区域。但真实清洁效果为零。修复方案是把覆盖率统计从质心经过改成清扫执行面积只有清洁动作真正作用到的网格才算覆盖同时要求质心位移超过0.05m才会计入新增覆盖。第二个是往返刷发现奖励。污渍发现奖励的设计存在一个漏洞机器人进入污渍区域、退出、再进入每次都会触发新的发现。策略学会了在污渍区边界反复进出一次回合能白嫖几十次发现分。修复方案是给每个污渍点加一个discovered标记一旦被标记为已发现后续重复触发不再给奖励。第三个是时间惩罚导致暴力冲刺。加了时间惩罚之后机器人确实不再磨洋工但它用另一种方式回应全速乱冲尽快把回合撞完碰撞惩罚和重复清扫惩罚根本拦不住它。修复方式是把时间惩罚改为分段衰减——基准时间内的每步惩罚较小超过基准时间后惩罚增大三倍让时间效率和平稳探索之间的博弈回到合理区间。3.4 100到778的三阶段爬坡记录修完这些bug之后分数的提升路径变得清晰了。我把整个过程分成三个阶段记录在案训练阶段步数范围评测分数主要调整阶段一0~20万步100 → 320引入势能引导和污渍发现奖励阶段二20~50万步320 → 580修复覆盖率黑客调整碰撞惩罚权重阶段三50~120万步580 → 778加入重复清扫惩罚动作平滑惩罚细化阶段一的核心变化是探索效率提升机器人在势能引导下能主动接近污渍区域覆盖率突破70%。阶段二的关键是行为规范修复奖励黑客后策略必须真正执行清扫动作才能拿到覆盖分数。阶段三耗时最长我花了大量时间在权重微调上重复清扫惩罚从0.2调到0.6动作变化惩罚从0.1调到0.4每次调整都带来几个百分点的评分提升但也会引入新的震荡。直到第120万步左右评测分数稳定在776到782之间波动我才认为这个奖励工程基本落地了。4. 778分是怎么算出来的评测口径与分数分解4.1 训练奖励不等于评估成绩这里必须区分两个概念训练时用的累计奖励是给梯度更新用的引导信号它不应该直接作为项目绩效指标。原因是训练奖励是人为塑形的里面有大量的中间项和比例系数数值大小没有业务含义。我在项目里单独设计了一套评测分数体系用一套固定的场景初始化和固定的评分公式每5万步跑一次完整评测拿到的结果才是真实水平。训练奖励决定了策略学到的行为评测分数决定了这个行为的实际质量两者分开才能避免训练指标虚高、实际效果感人的悲剧。4.2 评测公式与子项拆解这一版评测公式我做了加权总和四部分权重各自有业务逻辑覆盖率权重最高因为清扫任务的根本目的是覆盖清洁效果次之因为扫过但没扫干净等于白扫效率和安全是加分约束项。score coverage * 500.0 \ (1.0 - residue_rate) * 300.0 \ efficiency_factor * 150.0 \ safety_factor * 50.0其中efficiency_factor定义为1 - (实际用时 - 理论最短用时) / 理论最短用时下限截断为0。safety_factor定义为1 - 碰撞次数 / 25同样下限截断为0。理论最短用时是用一个启发式规划路径算出来的参考值而不是理想化最优值。4.3 778分对应的机器人行为画像回到标题数字100分和778分到底是什么状态我拆给你看。100分左右的机器人行为画像大概是覆盖率20%因为它在墙角转了半回合平均残留率98%因为根本没执行有效清洁动作效率因子0用时远超基准安全因子只有0.1碰撞次数在20次以上。四部分加起来大约就是100出头。778分的画像则完全不同覆盖率90%平均残留率控制在18%以内效率因子0.45说明用时大约是理论最短的1.55倍这个水平在仿真里已经算合理安全因子0.28意味着碰撞次数控制在18次以下。这个状态下的机器人行为特征是先从势能引导的污渍密集区开始扫再按区域完成最后补漏覆盖边界死角路径规整且有规律。我特意把评测公式和分数组成写详细是因为790和780之间的微小差距往往来自安全因子而不是覆盖率。很多项目到了后期发现分数涨不动就疯狂调奖励其实只是评估指标里的安全和效率权重已经拉满再怎么提升空间都很小。这时候应该回头看看业务上最看重的是哪一项把权重重新分配。5. 从仿真到真机奖励工程最容易翻车的最后一公里5.1 仿真到真机摩擦与传感器噪声的冲击仿真环境中一切信号都干净得不像话摩擦系数恒定污渍检测器零噪声覆盖率统计绝对准确。搬到真机上之后第一个冲击就是摩擦。仿真默认的摩擦系数偏高机器人稍带速度转个弯就能获得足够的摩擦力完成清扫动作真机的轮胎和地面摩擦系数往往更低同一个线速度转过去会打滑清洁效果差距巨大。这会让仿真里学到的清扫动作在真机上完全失效奖励信号失真。第二个冲击是传感器噪声。真机的污渍检测器在光照变化、灰尘干扰下会误触发相当于环境偷偷给策略发假奖励。策略如果在仿真里过度依赖这个信号到真机就会表现出病态的探索路线——频繁绕着一个没有污渍的角落转悠因为误触发的检测结果让它以为那里有奖励源泉。5.2 部署侧对奖励函数的约束在真机部署之前我强制自己对奖励工程做了一次合法性子检核核心思路是任何奖励信号如果依赖瞬时传感器读数都可能被噪声利用。所以部署侧的奖励设计要满足三个约束。第一条用统计量替代瞬时值。覆盖率不要用当前这一帧是否覆盖新网格来判断而是用最近10步内新增覆盖面积的平均值来判断。污渍发现奖励也要做类似滤波连续3帧检测到才触发。这样即使单帧有噪声统计值也不会剧烈波动。第二条对策略输出增加硬件层面的平滑保护。我之前在动作变化惩罚里做过软件约束但真机上还需要在控制器层面做二次限速——最大线速度和角速度变化率不能超过执行器规格。否则策略学的平滑在仿真里成立到真机照样抖动。第三条保留一个不可被奖励覆盖的硬性安全约束。比如绝对禁区墙壁、电线区域任何奖励在数值上都抵扣不了进入禁区的大额惩罚。这类约束不能放在奖励函数里跟其他项一起权重博弈而应该直接做成环境层的硬约束——策略一旦触发就强制终止回合。5.3 一套更稳的奖励部署方案基于这次项目的经验我整理了一套针对清扫类任务更稳的奖励部署方案先在仿真里做domain randomization把摩擦系数、光照、污渍分布随机化让策略学习到的奖励信号在不同物理条件下都成立再在真机上用小批量随机策略做reward合法性验证具体做法是随机动作执行100步看各奖励项的分布是否和仿真一致最后再把奖励权重整体缩放一次确保总奖励量级在真机上不会出现梯度爆炸或消失。这套流程走完之后我在真机上的实测结果虽然不如仿真那么漂亮但策略不再出现诡异的奖励黑客行为清扫轨迹也基本保持了仿真里学到的规整形状。做奖励工程这几个月我最大的体会是奖励函数不是写出来的是调试出来的。每个奖励项都像给一个员工设KPI指标设得太抽象他会偷懒设得太精细他会钻空子权重失衡他会不知所措。10项复合奖励不是终点只是把清扫这个模糊目标拆成了可优化、可验证、可迭代的数值信号。如果你也正卡在覆盖率上不去、分数长期横盘的局面别急着换算法把奖励函数拿出来逐项体检一遍往往比调十个网络结构参数更高效。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询