那还是去年冬天的事,一辆测试车在园区十字路口左转时,明明感知系统已经框出了对面直行车,预测模块也给出了未来3秒轨迹,可决策模块愣是让车停在路中间,后方安全员一脚刹车接管。我盯着log看了半天,发现决策模块在“等待可穿越间隙”和“减速让行”两个状态之间来回跳,每帧都在切换,车辆当然会一顿一顿。这不是预测不准,也不是感知漏检,纯粹是Agent决策逻辑里状态机搞得太脆,阈值设得跟纸糊的一样。今天就把自动驾驶里Agent决策那点破事翻出来聊聊,特别是那种你以为写对了,实际跑起来就翻车的地方。
先说清楚“Agent决策”在车上到底管哪一段。感知给的是“世界现在长什么样”,预测给的是“世界接下来可能长什么样”,决策要回答的其实是“我他妈现在该干什么”。很多论文喜欢把决策和规划混在一起,但真做工程的时候,决策通常拆成两层:一层是行为决策,管“跟车、超车、停车、绕障”这种语义级动作;另一层是运动规划,管“方向盘打多少、油门踩多深”。Agent决策一般指前者,输出的是一个离散的动作意图,再加上对应的目标状态或者约束,交个下层规划器去算轨迹。
我踩过最深的坑,是把决策当成一个普通的if-else状态机来写。状态机本身没问题,问题出在状态迁移条件上。你写“当目标车速度大于5m/s且距离小于30米时,从跟车切到减速”,听起来很合理,但实际路上目标车可能在5m/s上下抖动,距离在29.9到30.1之间来回跳,你的状态就跟着来回切。我在日志里看到过一秒钟切换二十多次的奇葩场景,方向盘咔咔响。后来学乖了,状态切换必须加滞回,也就是进入条件比退出条件要更严一点。比如进入减速要“速度大于6且距离小于25”,退出减速要“速度小于4或距离大于35”。这样虽然逻辑看着有点脏,但车不抽风了。这叫“迟滞区间”,控制里常用,决策里一样用。
比状态机更扛不住的是“世界