ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

智能驾驶竞赛实战:从感知到控制的FSM与RL融合决策方案

智能驾驶竞赛实战:从感知到控制的FSM与RL融合决策方案 1. 从零到国赛一场智能无人车竞赛的完整复盘去年我带着团队从校赛打起一路闯进“2022 CCF智能无人车大赛”的国赛最终拿到了季军。这个成绩背后远不止是捧回一个奖杯那么简单。更让我和团队成员们兴奋的是凭借这个成绩我们获得了线下参加“CCF NCCA 2022 第37届中国计算机应用大会”的资格。在那几天里我们见到了9位院士和近40位长江学者现场聆听了最前沿的科技成果报告参与了高密度的学术论文交流。对于一个还在校园里摸索的学生团队来说这种从“埋头调车”到“抬头看路”与领域内顶尖大脑同处一室的机会其冲击力和启发价值可能比奖牌本身还要大。今天我想抛开那些光鲜的领奖瞬间把聚光灯打回备赛的实验室、调试到凌晨的赛道旁以及那些让我们抓狂又兴奋的技术细节上。这篇文章就是一份关于如何从零开始准备并冲击一项高水平智能车竞赛的实战手册。无论你是对智能车感兴趣的新手还是正在备赛寻找突破的老兵希望我们踩过的坑、总结的经验能给你带来一些实实在在的帮助。我们的赛道任务是“智能驾驶虚拟仿真挑战赛”核心是在高度仿真的城市道路环境中让无人车完成安全、高效、合规的自动驾驶。这听起来很“AI”但落地过程却是算法、工程、调试与心态的全面较量。2. 赛题核心与我们的技术选型思路2.1 赛题本质不是炫技是解决实际问题很多同学一听到“智能无人车”、“自动驾驶”第一反应就是堆砌最前沿、最复杂的算法模型。我们最初也犯过这个错误但很快就被现实教育了。CCF这道赛题的场景设定在一个包含十字路口、环岛、行人、非机动车、他车的复杂城市仿真环境中。评分标准多维且严格任务完成度、行驶安全性、通行效率、交通规则遵守率。这意味着什么意味着一个单纯追求极限速度的“莽夫”策略会因频繁碰撞而得零分一个过于保守、处处刹车的“懦夫”策略则会因超时被淘汰。赛题的本质是考察我们如何设计一个均衡、鲁棒、可解释的自动驾驶决策与控制体系在多重约束下找到最优解。它更像一个工程问题而非单纯的算法研究。注意这是第一个关键认知转变。不要把比赛当成算法模型的“秀场”而要当成一个需要交付稳定可靠“产品”的工程项目。稳定性、可调试性往往比模型的“新颖度”更重要。2.2 技术栈选型务实基础上的创新基于以上认知我们搭建了“感知-决策-控制”的经典三层架构但在每个环节的选型上都做了大量务实的权衡。感知层相机规则放弃昂贵的激光雷达仿真。赛会提供了相机RGB图像和激光雷达LiDAR点云两种传感器数据。虽然点云在物体检测和距离估计上更精确但其数据量大、处理耗时且对我们的硬件普通游戏本和算法实时性提出了更高要求。经过实测在仿真环境中基于相机的目标检测算法我们选用YOLOv5s轻量化模型配合简单的逆透视变换IPM来估算车道线和可行驶区域其精度和速度已经能够满足决策需求。我们将节省下来的计算资源全部投入到了更关键的决策规划模块中。决策规划层分层状态机FSM为主局部引入强化学习RL微调。这是我们的核心创新点也是花费精力最多的地方。完全基于规则的FSM例如定义“直行”、“左转等待”、“借道超车”等状态逻辑清晰、行为可预测、调试方便但面对连续、复杂的交互场景如无保护左转时策略会显得僵硬。而端到端的强化学习虽然潜力巨大但训练不稳定、样本效率低、黑箱难以调试在有限的备赛周期内风险极高。我们的折中方案是用FSM搭建决策主干确保基本行为的正确性和稳定性在FSM的某些关键子状态例如“汇入车流”、“交叉口博弈”中引入一个轻量级的强化学习模型作为“策略优化器”。具体来说FSM负责宏观任务分解和状态切换比如识别到前方有慢车切换到“准备超车”状态而进入“准备超车”状态后具体的横向偏移量、加速度曲线等微操则由一个预先在简单场景中训练好的PPO近端策略优化网络来输出。这样既保证了系统的整体鲁棒性又在关键环节引入了自适应和优化能力。控制层纯经典控制追求极致稳定。决策规划层输出期望的路径点和速度控制层负责让车辆精准地跟踪。这里我们没有使用任何学习的方法而是采用了经过工业界千锤百炼的纯追踪Pure Pursuit算法配合PID控制。原因很简单控制是执行的最后一道关卡必须绝对可靠。PID参数虽然需要精细调试但一旦调好其稳定性远超任何神经网络控制器。我们花了整整一周在各种曲率、速度下反复调试横向的纯追踪预瞄距离和纵向的PID参数直到车辆能够丝滑地跟踪任何给定路径。3. 核心模块的魔鬼细节与实操要点3.1 感知模块轻量化与后处理的艺术使用YOLOv5s做目标检测只是第一步如何让检测结果更好地服务于下游规划才是难点。1. 目标跟踪与ID维持检测框是逐帧独立的但决策需要知道“刚才那个行人是不是正在横穿马路”。我们采用了简单的SORTSimple Online and Realtime Tracking算法。它的核心是卡尔曼滤波预测下一帧位置再通过匈牙利算法进行IOU匹配。实现起来不复杂但能极大提升决策的连续性。例如一个被短暂遮挡的行人通过跟踪可以维持其ID避免决策系统误以为行人消失而做出危险动作。2. 逆透视变换IPM的陷阱为了从2D图像中获取车道线的3D位置信息我们使用了IPM。但这里有个大坑IPM假设地面是绝对平坦的。而仿真环境中其实有细微的坡度起伏。直接应用IPM会导致远处车道线位置估算严重失真。我们的解决方案是动态IPM在车辆启动时进行一次标定获取初始的变换矩阵在行驶过程中结合车辆自身的俯仰角可从仿真器或IMU数据获取对变换矩阵进行微调。虽然增加了复杂度但换来了全路段可用的车道线感知。3. 传感器融合的“软融合”虽然我们主要依赖视觉但仿真器提供的LiDAR点云也并非完全无用。我们将其用于碰撞校验。规划模块生成一条未来轨迹后我们会将这条轨迹“投射”到点云空间中检查轨迹上的点是否与障碍物点云有交集。这是一种低计算成本的“最后一公里”安全校验多次帮我们避免了因感知漏检导致的潜在碰撞。3.2 决策规划模块FSM的设计哲学与RL的驯服之道1. 状态机FSM设计化繁为简明确优先级我们的FSM顶层只有几个大状态LANE_KEEP车道保持、LANE_CHANGE变道、INTERSECTION_NAV路口导航、EMERGENCY_STOP紧急停车。关键不在于状态数量而在于状态转移条件必须绝对明确、无歧义并且要设置严格的优先级。例如EMERGENCY_STOP的优先级最高任何其他状态下只要前向碰撞时间TTC低于阈值必须无条件切换。INTERSECTION_NAV的优先级高于LANE_KEEP。我们使用一个独立的“仲裁器”模块来持续评估所有转移条件并执行最高优先级的转移避免了状态冲突和“卡死”。2. 行为规划Behavior Planning基于规则的代价函数在LANE_CHANGE或INTERSECTION_NAV状态下需要评估多个候选行为如“左变道”、“右变道”、“跟驰”。我们为每个行为设计了一个多维度代价函数安全代价与周围所有障碍物的最小距离倒数。效率代价预计到达目标的时间。规则代价是否压虚线、是否在实线区变道等违反则代价无穷大。舒适度代价加速度和加加速度jerk的平方和。 每次决策时计算所有可行行为的代价总和选择代价最小的执行。这套方法逻辑透明调试时可以通过调整权重来改变车辆的“性格”激进或保守。3. 运动规划Motion Planning局部路径生成确定了行为如“向左变道”后需要生成一条具体、平滑、动力学可行的路径。我们采用了多项式螺旋线Polynomial Spiral来连接当前状态和目标状态。相比于简单的圆弧或直线螺旋线可以通过调整多项式系数方便地约束起终点的位置、航向角、曲率甚至曲率变化率从而生成非常平滑的轨迹这对控制跟踪和乘坐舒适性至关重要。4. 强化学习RL微调如何让“黑箱”可控在“无保护左转”这种需要与他车博弈的场景纯规则很难写好。我们训练了一个小型的PPO网络其输入是高度抽象的状态自车与路口中心相对位置、自车速度、主要冲突方向来车的距离和速度等约20维。输出是几个离散动作加速通过、匀速通过、减速让行、停车等待。关键技巧在于奖励函数Reward Function的设计稀疏奖励是灾难只在成功通过时给正奖励失败给负奖励网络几乎学不到东西。我们的奖励是密集且分层的生存奖励每存活一帧0.01鼓励探索。进度奖励朝向目标点的前进距离鼓励前进。安全惩罚与冲突车辆的TTC过小时的负奖励鼓励安全。效率惩罚耗时惩罚鼓励快速。最终奖励成功通过100碰撞-100。 通过这种精心设计的奖励我们在大约10万步的训练后得到了一个在简单交叉口场景下表现优于固定规则的策略。然后我们将这个RL策略作为一个“插件”只在FSM进入“无保护左转”子状态时调用它。3.3 控制与调试将理论转化为稳定表现1. 纯追踪Pure Pursuit的“预瞄距离”自适应预瞄距离是纯追踪算法的核心参数固定值无法适应所有速度。我们实现了一个简单的自适应公式预瞄距离 基础距离 速度 * 增益系数。这样在低速弯道时车辆会“看近一点”跟踪更精确在高速直道时会“看远一点”行驶更平稳。2. PID调试的“两步法”调PID是个体力活我们总结了一个高效方法第一步开环调试。在车辆静止或匀速直线行驶时给一个阶跃的目标速度或横向偏移指令观察响应。先调P比例让系统有反应再调I积分消除静差最后调D微分抑制超调震荡。记录下几组不同大小指令下的“最佳”参数。第二步闭环验证与微调。将上述参数用于实际的路径跟踪。在赛道的典型弯道、直道、S弯上反复跑。重点关注控制量的输出是否平滑是否有高频抖动。微调D项和加入低通滤波器是消除抖动、提升乘坐品质仿真中也重要的关键。3. 仿真中的“加速回放”与“场景录制”仿真平台最大的优势是可重复。我们大量使用了场景录制与回放功能。一旦在某次测试中发生碰撞或违规立即保存当前场景的所有初始状态车辆位置、周围交通参与者状态。然后我们可以在修复代码后精确地复现这个场景进行测试极大提升了调试效率。此外我们还编写脚本进行“加速测试”让仿真以2倍、5倍速运行快速验证长期运行的稳定性。4. 备赛全流程从组队到冲刺的六个阶段4.1 阶段一团队组建与知识扫盲第1-2周这不是一个人的战斗。我们团队4人角色明确算法岗2人主攻感知、决策、规划算法需要熟悉OpenCV、PyTorch/TensorFlow、ROS。控制与仿真岗1人负责车辆动力学模型、控制器实现、仿真环境搭建与调试需要熟悉C/Python、控制理论。工程与调试岗1人负责代码框架整合、模块接口、可视化工具开发、性能优化是团队的“粘合剂”。 组队完成后第一件事不是写代码而是集体研读比赛规则、评分细则和技术文档并跑通官方提供的基线Baseline代码确保每个人都能在自己的电脑上运行起仿真环境。4.2 阶段二框架搭建与基线改进第3-5周我们基于ROS机器人操作系统搭建了模块化的框架定义了清晰的话题Topic和服务Service接口。然后对官方基线进行“外科手术式”改进替换掉基线中性能较差的感知模型如HOGSVM为YOLOv5。重写决策逻辑从一堆if-else改为清晰的FSM。优化控制接口实现更平滑的速度跟踪。 这个阶段的目标是拥有一个稳定、可运行、且性能明显优于原始基线的系统。不要追求完美先解决“有无问题”。4.3 阶段三核心算法攻关与迭代第6-10周这是最艰苦、也最出成果的阶段。按照“感知 - 决策规划 - 控制”的顺序逐个模块进行深度优化。每周设定一个明确的主题例如“本周解决交叉口停车让行问题”。每日站会早上15分钟同步昨天进度、今天计划、遇到什么阻塞。代码版本管理严格使用Git每个功能一个分支合并前必须通过核心场景测试。可视化调试工具我们开发了一个简单的PyGame界面能实时显示感知结果、规划路径、决策状态这对调试至关重要。4.4 阶段四集成测试与性能调优第11-12周所有模块初步完成后进入全天候的集成测试。我们构建了一个测试场景库包含必过场景规则要求的基本任务。边缘场景极端天气仿真中、传感器噪声、突然出现的障碍物。压力场景高密度车流、连续多个复杂路口。 每天的任务就是让车在场景库中反复跑收集数据分析失败案例定位问题模块然后打补丁。同时开始进行性能剖析Profiling找出计算瓶颈往往是感知或规划搜索算法进行代码级优化确保系统能在规定时间内通常是实时或10Hz完成一次处理循环。4.5 阶段五模拟赛与策略固化第13周比赛前通常会有一到两次线上模拟赛。这是最重要的练兵机会。模拟赛的环境、规则、评分系统与正式比赛几乎一致。我们的策略是用稳定版本跑第一次获取一个基准分数和排名了解自身定位。分析排行榜研究前排队伍的得分项分析他们可能采用的策略虽然看不到代码但可以从完成时间、违规项倒推。进行有限度的冒险在第二次模拟赛中尝试一些新的、略有风险的优化策略如更激进的超车逻辑测试其上限和下限。 模拟赛后除非发现致命BUG否则不再进行大的架构改动只做参数微调和BUG修复进入“策略固化”阶段全力保证现有系统的稳定性。4.6 阶段六决赛准备与临场应对第14周决赛通常是线上提交代码由组委会在统一环境中评测。准备工作包括环境复现在本地尽可能复现官方的评测环境操作系统、库版本、GPU驱动等。代码封装与提交检查严格按照要求打包代码编写清晰的README。在本地运行提交脚本确保无报错。制定应急方案如果第一次提交成绩不理想如崩溃、超时快速回退到哪个稳定版本作为“保底提交”。心态调整提醒团队成员比赛结果有不确定性我们已经做到了能力范围内的最好享受过程。5. 那些踩过的坑与救命的技巧5.1 算法与工程上的典型陷阱坑1过度依赖端到端学习。早期我们尝试过用CNN直接从图像映射到方向盘和油门控制模仿学习。结果发现车辆在训练集场景上表现完美一旦遇到未见过的道路拓扑或障碍物布局行为就完全不可预测且无法调试。教训在安全关键的系统中可解释性和可调试性必须优先于模型复杂度。坑2规划轨迹的动力学可行性被忽视。我们曾用A*搜索出一条最短路径但这条路径的曲率不连续导致控制模块根本无法跟踪车辆剧烈摇摆。教训运动规划器必须考虑车辆的运动学甚至动力学约束。后来我们改用基于状态栅格State Lattice的搜索或直接使用样条曲线从根本上保证了生成轨迹的平滑性。坑3多线程/进程间的数据竞争。感知、规划、控制通常运行在不同的线程或节点中。如果时间戳处理不当规划模块可能用的是上一帧的感知结果而控制模块用的是上上一帧的规划路径导致系统“精神分裂”。教训务必使用带时间戳的消息并在关键处理环节检查数据的新鲜度或者采用同步回调机制。5.2 团队协作与项目管理的心得技巧1文档即代码。我们要求每个模块在提交时必须同步更新一个简明的接口文档和核心算法原理说明Markdown格式。这在新成员加入或模块间联调时节省了大量沟通成本。技巧2自动化测试是生命线。我们搭建了一个简单的CI持续集成流程每晚自动拉取最新代码在10个核心测试场景上跑一遍生成测试报告通过率、平均得分、失败场景截图。第二天早上大家第一件事就是看报告快速定位昨晚谁的提交引入了回归错误。技巧3可视化可视化还是可视化。除了用于调试的实时可视化工具我们还大量使用日志绘图。将关键数据如速度、加速度、与障碍物距离、决策状态ID随时间变化的曲线画出来与仿真视频同步播放。任何异常行为在图表上都一目了然比看代码和打印信息高效十倍。技巧4保持与比赛方的沟通。对规则有任何模糊不清的地方立即通过官方渠道邮件、QQ群提问并关注公告。我们曾因为对一个“停车让行”标志的理解有偏差白费了一周功夫后来才发现是规则解读问题。6. 国赛现场与学术大会眼界与思维的飞跃拿到国赛季军获得了参加CCF NCCA大会的资格这对我们而言是另一个维度的收获。在大会上我们听到了院士们关于人工智能未来走向、算力基础设施、新型网络架构的宏观思考也听到了长江学者、青年才俊们在具体领域如边缘智能、联邦学习、具身智能等方面的最新突破。最触动我的不是某项具体的技术而是两种思维模式的碰撞在实验室和赛场上我们追求的是在既定规则下的最优解思维是收敛的、工程的、解决具体问题的。在学术前沿研究者们探索的是规则的可能性边界思维是发散的、科学的、提出新问题的。例如我们为无人车设计复杂的规则来处理“中国式过马路”而一位学者分享的研究则是如何让智能体通过大模型和常识推理真正“理解”交通参与者的意图。这让我们意识到我们精心雕琢的FSM和代价函数只是智能驾驶漫长征途中的一个坚实脚印。这次经历让我深刻理解竞赛是锤炼工程能力和解决问题能力的绝佳战场而学术会议则是打开视野、触碰未来的窗口。两者结合才能让人既脚踏实地又仰望星空。对于在校生而言积极参加高水平竞赛并争取走到线下与顶尖学者交流其价值远超一纸证书。它为你建立了一个高质量的学习循环用比赛驱动你去深入掌握技术再用学术视野帮你思考技术的下一步方向。这段经历无疑为我们团队每个人后续的深造或就业都打下了极为坚实的基石也留下了无比珍贵的回忆。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进