
去年这个时候我还在实验室里对着那辆自己亲手调了快一年的智能车一遍遍地跑着赛道。东北赛区的阳光从窗户斜射进来照在车身上也照在电脑屏幕上密密麻麻的代码和波形图上。从省赛的两次“省三”到最终站在东北赛区的赛场上距离国赛只差一步之遥这段经历远不止是技术上的打磨更像是一次关于工程实践、团队协作和个人成长的完整复盘。很多人以为智能车竞赛就是写写代码、调调参数车能跑起来就行。但真正投入进去才会发现从“能动”到“能稳定地快”再到“能在任何情况下都稳定地快”中间隔着无数个需要亲手填平的坑。硬件选型、传感器融合、控制算法、机械结构、甚至是一个螺丝的松紧都可能成为压垮骆驼的最后一根稻草。这次我想抛开那些宏大的技术名词从一个亲历者的角度聊聊在“单车定向”这个赛题下我们到底经历了什么又错过了什么。这不仅仅是一篇技术报告更是一份给后来者的“避坑指南”和“工程化思考笔记”。1. 从“省三”到赛区赛我们到底在解决什么问题拿到“单车定向”这个题目时第一感觉是兴奋因为它看起来“酷”——一个两轮自平衡小车要像真正的自行车一样在保持平衡的同时完成循迹、定向任务。但很快兴奋就被现实的复杂性冲淡了。我们最初的理解和大多数新手团队一样停留在功能层面让车站起来让车沿着线走让车识别路标。1.1 功能实现 ≠ 问题解决我们花了大量时间让车“站”起来。调PID参数让陀螺仪和加速度计的数据融合得更平滑车在平地上终于能巍然不动了。我们以为解决了核心问题。接着是循迹摄像头采集图像二值化提取中线再用一套PID去控制转向。车也能歪歪扭扭地走了。这时我们觉得“成了”。但第一次模拟省赛车在起跑线就倒了。问题不是算法是供电。电机启动瞬间的电流冲击导致主控芯片电压瞬间跌落传感器数据紊乱平衡算法崩溃。我们解决了“平衡算法”这个技术问题但没有解决“在真实、动态的供电环境下稳定平衡”这个工程问题。这就是第一个认知转折竞赛考察的不是单一功能的实现而是在一个不确定的、资源受限的、存在干扰的真实环境中让一套复杂系统可靠运行的综合能力。你的代码可能很优雅但一个劣质的电容、一条过长的导线、一个虚焊的接口就能让一切归零。1.2 “定向”任务的深层挑战状态估计与决策耦合“定向”任务要求小车在特定位置如十字路口、环岛做出转向决策。这听起来像是简单的“if-else”看到十字路口就左转或右转。但实际赛道中光照变化、赛道反光、车体抖动会导致图像识别出现误判或延迟。更棘手的是决策时机与车身状态强耦合。当你识别到路口时车可能已经因为惯性冲过了决策点或者车身正处于一个大幅度的平衡调整中此时强行转向极易失稳。我们最初的方案是“感知-决策-控制”的串行流水线摄像头看到路口 - 决策模块发出转向指令 - 控制模块执行。结果就是转向动作总是“慢半拍”且“很生硬”。后来我们意识到必须引入状态估计和预测。不仅要知道“现在看到了什么”还要估计“以当前速度0.2秒后车会在什么位置”并基于这个预测位置来提前决策。同时决策指令不能是简单的“左转90度”而应该是一个与当前平衡控制环路相融合的“期望姿态轨迹”让转向动作平滑地“生长”出来。这个过程的教训是在动态系统中感知、决策、控制必须是紧密耦合、相互反馈的闭环而不是各自为政的开环模块。2. 硬件那些容易被忽略的“非算法”细节软件决定上限硬件决定下限。在极限性能比拼中硬件平台的稳定性和一致性往往是比算法更基础的保障。2.1 电源管理系统的生命线如前所述电源是我们的第一个“老师”。我们总结了一套电源检查清单主电源滤波电机驱动电源与主控、传感器电源必须隔离并使用大容量如470uF以上的电解电容和多个104瓷片电容进行退耦。电压监测必须在程序中实时监测电池电压。当电压低于阈值如7.2V时应降低电机PWM占空比或进入保护模式防止因电压过低导致控制紊乱。上电时序有些传感器如某些型号的IMU对电源稳定性要求极高。必要时可以通过MOS管控制其供电时序确保主控稳定后再给传感器上电。2.2 传感器布局与机械振动陀螺仪的噪声除了本身性能极大程度上来源于机械振动。我们将IMU模块用海绵双面胶粘贴在车体中心位置并尝试用软硅胶进行整体灌封以吸收高频振动。 摄像头支架必须牢固。我们曾因支架轻微松动在车体加减速时摄像头发生肉眼难以察觉的抖动导致图像模糊中线提取出现毛刺进而引发转向振荡。2.3 线束与接插件赛前最后一次调试车突然失控。排查半天发现是一根编码器线的接口在反复弯折后内部断裂时通时断。从此我们规定所有信号线尽量使用排线或硅胶线避免单股硬线。接插件必须选择可靠的型号如JST、XT30并且打上热熔胶固定。线束用扎带妥善固定避免与运动部件干涉。这些看似“低级”的工作耗费了我们大量的调试时间但也正是这些时间让车从“偶尔能跑完”变成了“十次有八次能稳定跑完”。3. 软件架构从“面条代码”到可调试的系统初期我们的代码是典型的“面条式”——所有功能都在main.c的超级循环里中断服务程序(ISR)里塞满了处理逻辑。状态变量全局满天飞改一个参数可能引发意想不到的连锁反应。3.1 模块化与任务拆分我们进行了重构将系统拆分为相对独立的模块感知层摄像头图像采集与处理在摄像头中断中完成、IMU数据读取与滤波在定时器中断中完成。状态估计层融合图像和IMU信息估算车速、位置、姿态角。这部分在定时器中断中调用频率与控制周期一致。决策层根据当前状态和赛道元素识别结果生成目标轨迹期望路径、期望速度。这部分运行频率可以稍低。控制层平衡控制PD、方向控制PID、速度控制PID。这是最高优先级的实时任务在定时器中断中必须执行完毕。每个模块通过清晰的接口结构体变量、函数调用交换数据而不是直接操作全局变量。这带来了巨大的好处我们可以单独测试每个模块。例如可以屏蔽决策层手动注入一个预设的轨迹专门测试控制层的跟踪性能。3.2 数据可视化与日志系统调车不能靠“猜”。我们利用蓝牙模块或无线串口将关键数据实时发送到上位机。波形显示实时显示车身倾角、期望倾角、电机输出、转向舵机角度、图像中线偏差等。PID参数的效果一目了然。图像透传将摄像头采集的原始图像或处理后的二值化图像传回电脑确认图像处理算法是否正确。事件日志在代码关键节点如识别到路口、开始转向、完成动作打印日志结合视频回放可以精准定位问题发生的时间点。这套“可观测性”系统将调试从“黑盒摸索”变成了“白盒分析”效率提升数倍。4. 比赛现场为什么平时行比赛就不行我们自认为准备充分实验室里成功率已经很高。但到了东北赛区赛场问题接踵而至。4.1 环境适应性光与电的挑战赛场灯光和实验室完全不同存在频闪、亮度不均、色温差异等问题。我们的图像二值化阈值是实验室固定值导致在现场赛道提取不全或噪声巨大。解决方案必须实现动态阈值或更鲁棒的特征提取方法如边缘检测结合灰度梯度。我们赛前准备了自适应阈值算法但集成测试时间不足未敢在比赛时启用。这是一个战略失误——对于关键传感器必须有应对环境变化的B方案。赛场供电是统一的稳压电源但多个队伍同时用电电网可能存在细微波动。我们的电源电路对这类低频波动抑制不足。解决方案除了硬件滤波软件上应增加对电源纹波的监测和软件滤波。同时所有关键控制量如PID输出都应做限幅和缓变处理避免因单次数据异常导致系统突变。4.2 流程与心态最后一公里的管理比赛不光是技术的比拼也是流程和心态的考验。检录与调试时间赛程紧张留给每支队伍的现场调试时间极短。你必须提前准备好“快速检查清单”电源连接、传感器初始化、参数加载、基本功能自检。我们因为一个接插件没插牢在检录后调试时才发现浪费了宝贵时间。参数备份与恢复赛场电脑可能被清空。所有最终版的程序、配置文件、上位机软件必须在多个U盘和云端备份。我们目睹了有队伍因程序丢失而弃赛。心态管理前两次跑车失败后容易陷入“拼命改参数”的焦虑。此时最应该做的是冷静记录现象回传数据分析是感知错误、决策错误还是控制失效。盲目调参往往让情况更糟。我们就是在第二次失败后匆忙加大了一个PID参数导致第三次跑车因超调而冲出赛道。5. 复盘我们距离国赛到底差了什么最终我们以微弱的差距无缘国赛。回顾整个周期技术上的差距或许有但更多是工程化和项目管理的差距。5.1 技术纵深不足缺乏冗余设计我们的方案是一个“单点最优”方案在实验室特定环境下表现良好。但没有为关键环节准备备用方案或降级策略。例如图像处理只有一套算法阈值自适应方案未经验证。状态估计严重依赖IMU未考虑在IMU短暂异常时如何仅凭编码器和图像进行短时估计。决策逻辑是硬编码的无法应对赛道临时微调虽然规则不允许但心理准备不足。国赛级别的队伍其系统往往具有容错性和韧性。主传感器失效辅助传感器能顶上一段时间主算法异常有更保守的备份算法保证完赛。5.2 测试不充分尤其是边界和压力测试我们在实验室的测试大多是在“理想”条件下进行的。缺乏长时间疲劳测试连续跑50圈看系统是否会因为内存泄漏、变量溢出、电机过热而性能下降。极端输入测试用手突然推一下车模拟碰撞用强光手电照射摄像头模拟现场光干扰。蒙特卡洛式随机测试随机改变赛道上几个点的颜色用纸条遮挡测试系统的纠错能力。测试不是为了证明系统能工作而是为了发现系统会在什么情况下失效。我们在这方面做得远远不够。5.3 对“智能”的理解停留在感知与控制缺乏“认知”层“单车定向”的“定向”本质上是一个简单的路径规划问题。但更深一层智能车应该具备一定的“认知”能力即对自身状态和赛道环境的理解并基于此进行预测和规划。我们实现了“看到路口-转向”的反射式智能但缺乏“记忆赛道-提前规划-平滑执行”的认知式智能。例如如果能记住上一个弯道的急缓就可以提前预测下一个直道的长度从而规划更合理的速度曲线。这需要将赛道的空间信息进行建模和记忆而这正是我们技术栈的空白。6. 给后来者的建议如何打造一辆有竞争力的智能车基于一年的教训我总结了一个“四阶推进法”这或许比具体的技术细节更有参考价值。6.1 第一阶段搭建最小可行系统MVP目标让车最基本的运动功能跑通。硬件确保电源、电机、核心传感器如一个编码器、一个IMU可靠工作。软件实现最基础的平衡控制和速度闭环。关键不要追求性能追求稳定。哪怕车走得慢只要它能重复、稳定地站立和移动这一阶段就成功了。6.2 第二阶段实现核心赛题功能目标完成比赛规则要求的所有基本动作。在MVP基础上集成所有必需传感器如摄像头实现循迹、元素识别如路口、环岛、基本动作执行。关键模块化开发每增加一个功能都要确保原有功能不受影响。建立数据可视化调试系统。6.3 第三阶段优化与鲁棒性提升目标让车跑得快、跑得稳、适应性强。性能优化通过参数整定、算法改进如使用更优的滤波、预测控制器、机械调整降低重心、调整轮距提升速度。鲁棒性加固硬件加强滤波完善安装。软件增加软件看门狗关键数据校验异常状态处理如卡死重启。算法引入自适应、抗干扰机制。全面测试进行边界测试、压力测试、不同环境测试。6.4 第四阶段工程化与竞赛准备目标让车成为一个可靠的“产品”能应对比赛现场的各种不确定性。系统集成固化所有代码和参数制作一键烧录、一键配置的脚本。文档与流程编写详细的调试手册、故障排查清单、赛前检查表。预案准备为可能出现的传感器故障、环境变化准备备用参数集或降级模式。模拟实战在实验室完全模拟比赛流程包括限时调试进行多次演练。智能车竞赛车是载体“智能”是目标而“竞赛”是场景。它残酷地告诉你一个理论上完美的方案在现实世界中可能脆弱不堪。它也更深刻地教会你如何将一个复杂的想法通过硬件、软件、机械的协同一步步变成稳定运行的实体。错过国赛固然遗憾但这一年来在实验室里熬过的夜、调通的每一个模块、解决的每一个故障所获得的关于系统工程的真实体感远比一张证书更为厚重。这大概就是工程实践的魅力所在你永远在和不确定性打交道而你的作品就是你所有思考与努力最直接的映射。