本仓库是故障机器人队在 2026 腾讯开悟/大学生服务外包创新创业大赛 D02 赛道“四足机器人强化学习挑战”中的代码实现。
- 队伍名称:
故障机器人 - 比赛结果:
北部赛区第十名 晋级区域赛决赛
当前主线是一个轻量 PPO 策略网络。整体结构可以概括成:
局部空间输入 (11 x 21 x 21)
+ 标量输入 (50 维)
+ 5-token 轻量实体引导注意力
-> 融合层
-> actor head
-> critic head
其中:
- 空间分支负责学习局部地图结构,例如障碍、污渍、充电桩、危险区、访问热度、狭窄通道等
- 标量分支负责表达全局上下文,例如电量、剩余步数、已清扫比例、回桩状态、打转风险、NPC 风险等
- 注意力分支用 5 类 query token 去读空间特征,分别对应:
chargerprogressdangerloopcontext
这套结构背后的核心思路不是“把网络堆复杂”,而是先让策略看到正确、对齐、能驱动决策的状态:
- 第一阶段先修状态语义
- 修正充电桩坐标理解错误
- 修正地图写回时的方向反拿问题
- 把原本过度压扁的弱统计特征,改成空间分支 + 标量分支
- 后续阶段再逐步补:
- 回桩相关语义
- frontier / reachable 等推进语义
- NPC 当前危险和预测危险
- 门口、窄通道、回桩路径风险
简单说,我们最后的方案并不是靠某一个“神奇网络结构”取胜,而是靠“观测修对 + reward 对齐 + PPO 稳定化 + 动作层约束”这一整套闭环把系统做稳。
赛后复盘后,我们认为项目里有一类问题非常典型:我们有时不是在“帮助 PPO 更容易学对”,而是在“替 PPO 做决策”。
其中一个最明显的例子,就是对 nearest_charger、nearest_npc 这类手工挑出来的“最近实体”特征依赖过重。这样做的问题是:
- “最近”本身就是人工定义后的压缩结果,容易在压缩时丢掉关键信息
- 一旦最近目标算得不准,后面的 reward shaping 和规则补丁都会建立在错误输入上
- 会诱导我们继续堆更多规则和特征,试图修补最初的信息损失
- 工程会越来越膨胀,但策略本身不一定真的学得更好
这也是我们后来反思最深的一点:如果输入给网络的信息一开始就不完整、不稳定,那么后面再怎么补 reward 和逻辑,都会越来越偏。
如果继续沿这条线迭代,我们认为一个更干净、更值得优先尝试的方向是:
不应该只把“最近的那个”实体抽出来喂给模型。更合理的方式是:
- 直接把所有候选目标的坐标都传进去
- 让网络自己学习哪些目标当前更重要
- 不再由人工先做一次强压缩,再让策略去接收这个被压缩后的结果
我们现在更倾向于下面这种更简单的结构:
所有 charger / npc / 其他关键实体的相对坐标
-> 小 MLP 做逐点编码
-> max pooling 做集合聚合
-> 与空间分支、全局标量一起融合
这样做的好处是:
- 输入信息更完整,不会因为只取最近目标而丢失多目标结构
- 对实体数量变化更自然
- 比现在这套围绕若干 hand-crafted nearest feature 的设计更直接
- 工程复杂度更低,也更符合“让 PPO 自己学”而不是“我们先替它判断”
对于这个题目,我们目前的判断是:不需要专门造 nearest_charger 或 nearest_npc 这样的特征;把所有坐标直接传进去,再做一层 max pooling,其实就已经足够了。