1. 项目概述:从“困难”到“攻克”的B车之旅
如果你正在准备或已经投身于全国大学生智能车竞赛的四轮组,尤其是面对那台让人又爱又恨的B型车模,那么这篇文章或许能让你少走一些弯路。这不是一篇官方的技术手册,而是一个从无数次深夜调车、代码报错、硬件冒烟中爬出来的老队员的实战复盘。标题里的“进击的四轮”和“在困难中攻克b车”,精准地概括了这条赛道的核心体验——它从来不是一条坦途,更像是一场与机械、电路、代码以及自身耐心的持久战。B车,作为竞赛中的经典平台,以其相对亲民的成本和足够的可玩性,成为了无数队伍的首选,同时也因其独特的机械结构和调参复杂性,成为了许多新手的“入门劝退器”。
我最初接触B车时,和大多数人一样,满脑子都是摄像头里流畅的循迹画面和赛道上风驰电掣的幻想。但现实很快给了我一记重拳:车子要么在直道上画龙,要么在弯道直接冲出赛道;PD参数调来调去,不是震荡就是响应迟钝;更别提那些神出鬼没的硬件故障,一个接触不良的接线可能就会让你一整天的调试成果归零。这种挫败感是真实的,但回过头看,每一次解决这些问题的过程,恰恰是能力提升最快的时候。所谓“战胜自我”,不仅仅是最终让车跑起来,更是在这个过程中,学会了如何系统性地分析问题、如何耐心地排查故障、以及如何在无数次失败后依然保持解决问题的热情。
这篇文章,我将结合自身和身边队伍的真实经历,拆解在B车四轮组备赛中,从机械、硬件到算法、调试各个层面最常遇到的“困难”与“挫折”,并分享我们是如何一步步“攻克”它们的。最后,我会给出一份针对新手的、可落地的入门建议清单。我们的目标是:让你手里的B车,从一个不听使唤的“玩具”,变成赛道上稳定可靠的“战士”。
2. B车机械结构的“先天特性”与调校实战
很多新手拿到B车套件,组装完成后就迫不及待地开始写循迹代码,这是最大的误区之一。B车的性能天花板,一半以上是由机械状态决定的。如果不理解其机械特性并做好基础调校,再优秀的控制算法也是事倍功半。
2.1 核心机械难点:差速与阿克曼转向
B车采用后轮差速驱动,前轮阿克曼转向的经典结构。这带来了两个核心挑战:
- 差速器调校:差速器的松紧度直接影响车辆的转弯性能。过紧的差速器会导致转弯时内外侧轮转速差不足,产生转向不足(推头),车子像推土机一样往外侧滑;过松的差速器则会导致动力损失,直线加速无力,且急转弯时内侧驱动轮容易空转打滑。我们的经验是,差速器螺丝需要调整到一个“临界点”——用手握住一个后轮,另一只手转动另一个后轮时,能感觉到明显的阻力,但又能相对顺畅地转动。这个状态需要在平地上实际跑动测试,观察车子在绕“8”字或小半径弯道时,后轮是否有异常的跳动或啸叫声。
- 前轮前束与主销内倾:B车的前轮转向机构存在虚位,且默认的前束角(Toe-in)往往不是最优的。前束角不正确会直接导致车辆直线行驶不稳定(需要不断微调方向才能走直),俗称“画龙”。一个简易的调整方法是:将车子前轮摆正,测量左右前轮最前端和后端的距离差。理想状态下,我们倾向于设置微小的前束(前端距离略小于后端),这能增强直线稳定性。调整需要通过转向拉杆的长度来实现,这是一个需要极耐心的细活,每次调整幅度要小(如四分之一圈),调整后必须上路测试。
注意:所有机械调整必须在底盘保持水平、轮胎气压一致的情况下进行。建议购买一个小型水平仪和胎压计。机械调校是后续一切的基础,这个阶段多花一两天时间,能为后面节省无数个通宵。
2.2 减震与重心的平衡艺术
B车的悬架相对简单,但重心分配对动态性能影响巨大。
- 电池位置:电池是车上最重的单体。常见的做法是将电池尽可能放低、并靠近车体几何中心。降低重心能减少过弯时的侧倾,提升稳定性;靠近中心则有助于前后轴载荷平衡,使加速和制动更平顺。我们试过将电池横置在底盘中部下方,效果比竖放在车尾好很多。
- 减震器硬度:原装减震通常偏软。在高速过弯时,软减震会导致车身侧倾严重,内侧车轮可能离地,丧失抓地力。可以尝试更换更硬的弹簧或调节减震油。我们的方案是使用浓度更高的硅油填充减震器,并剪短一小段弹簧以增加预压量。调整后,车身在弯中的姿态明显更稳。
- 轮胎处理:新轮胎表面通常有一层脱模剂,非常滑。务必用酒精或细砂纸轻轻打磨轮胎表面,直到露出橡胶本色,这能极大提升抓地力。比赛前,根据赛道材质(通常是PVC或亚克力),还可以选择性地在轮胎上涂抹微量松香酒精溶液(比例约1:10),但需提前测试,避免过粘。
机械调校没有一劳永逸的“标准答案”,它需要你像一名赛车工程师一样,根据自己车辆的动态反馈(是转向不足还是过度?是直线抖动还是弯道侧滑?)进行反复迭代。建立一个检查清单,每次大调算法前,都先快速过一遍机械状态,能避免很多无谓的折腾。
3. 硬件系统搭建:从稳定供电到可靠感知
硬件是智能车的躯体,一个不稳定的硬件系统会让软件算法的一切努力付诸东流。B车平台的硬件搭建,核心追求是“稳定”和“低噪声”。
3.1 电源树设计与噪声抑制
这是最容易被忽视,也最容易引发诡异问题的环节。B车上通常有核心单片机(如STM32)、摄像头/电感传感器、舵机、电机驱动等多个模块,它们的电压和电流需求各不相同。
- 分层供电:绝对不要将所有模块都直接并联到同一块电池上。我们采用典型的二级供电架构:第一级,电池(7.4V或12V)直接给大电流的电机驱动模块供电;第二级,通过一个高效的DC-DC降压模块(如LM2596)将电池电压降至5V,这个5V总线单独给舵机供电(舵机动作时电流冲击很大);第三级,再通过另一个线性稳压芯片(如AMS1117-3.3)从5V总线产生出干净的3.3V,供给单片机和摄像头等核心敏感器件。这样做的目的是隔离数字噪声和电机、舵机产生的大电流噪声。
- 布线规范:电源线(特别是电池到电机驱动的线路)要尽量粗、短。信号线(如摄像头SCCB/I2C、串口)要远离电源线和电机线,如果必须交叉,请尽量垂直交叉。所有电源输入端和芯片的电源引脚附近,都必须并联一个10uF以上的钽电容和一个0.1uF的陶瓷电容,以滤除不同频率的噪声。我们在早期曾因为摄像头电源线过长且未加滤波电容,导致图像出现规律性横条纹,排查了整整两天。
- 接地策略:确保整个系统有一个统一的“地”(GND)。建议使用星型接地或单点接地,将所有模块的地线最终汇集到电池的负极,避免形成地环路引入噪声。
3.2 传感器选型与安装:摄像头篇
对于四轮循迹组,摄像头是绝对的“眼睛”。目前主流选择有数字摄像头(如OV7725、MT9V034)和串口摄像头(如一些厂家推出的集成处理模块)。
- OV7725等数字摄像头:性价比高,需要单片机进行图像采集和处理,对单片机算力有一定要求。优点是帧率高(可达120fps以上),控制延时极低。难点在于需要自己编写或调试图像采集驱动程序(通常用DCMI接口),并实现图像处理算法(二值化、寻线等)。安装时,要保证摄像头光轴与地面垂直,且视野中心线与车体中心线重合。高度决定了视野大小和前瞻距离,一般通过实验确定,在能看清足够远赛道的同时,也要保证近处弯道的识别率。
- 串口摄像头模块:模块内部集成了处理器,直接通过串口输出处理好的赛道数据(如中线位置、边界等)。优点是极大减轻了单片机负担,开发门槛低。缺点是通常帧率较低(30-60fps),且存在固定的通信和处理延时,对于高速车控可能需要更复杂的预测算法。安装要求与数字摄像头类似。
- 我们的选择与心得:在追求极致性能的赛车上,我们选择了OV7725。因为它能让我们完全掌控从采集到处理的每一个环节。为了降低单片机压力,我们采用了“区域扫描”而非全帧处理:只对图像中可能包含赛道的几行像素进行采样。例如,只采集第30、60、90、120行的像素数据,这能在保证控制精度的同时,将图像处理开销减少80%以上。摄像头一定要用硬连接固定,杜绝任何晃动。我们曾用扎带固定,在高速过弯时摄像头因惯性轻微扭转,导致寻线出错,车子直接撞墙。
3.3 执行机构:舵机与电机的控制基础
- 舵机:选择响应速度快的数字舵机。舵机的控制信号是PWM,但核心不在于PWM频率,而在于脉冲宽度。标准舵机的中位脉冲宽度通常是1.5ms。在代码中,你需要一个精准的定时器来产生这个脉冲。舵机安装要居中,并且其旋转中心应尽量与车辆转向主销轴线重合,以减少不必要的力矩。给舵机供电的线路一定要粗,且最好单独从电池经过降压模块供电,避免因电压波动导致舵机抽风。
- 电机与驱动:B车常用的N20电机或370电机,配合TB6612或DRV8833等驱动芯片。电机驱动电路的关键是电流余量。芯片标称的连续电流一定要远大于电机堵转电流。例如,电机堵转电流可能达到2A,那么驱动芯片的连续输出电流最好在3A以上。同时,电机驱动芯片的电源输入端必须加一个大容量(如470uF)的电解电容,以吸收电机启停时产生的反向电动势和电流冲击。我们烧过好几个驱动芯片,最后发现都是因为电容没加或太小。
硬件搭建阶段,一定要养成“上电前测量”的习惯:用万用表测量各供电节点的电压是否正常,是否存在短路。每连接一个模块,就测试一下基本功能。这样能最大程度避免“烟花事故”。
4. 核心算法:循迹与控制策略的层层递进
当机械和硬件准备就绪,就进入了算法的世界。这是将物理信号转化为控制指令的大脑。
4.1 图像处理与赛道信息提取
对于摄像头方案,第一步是从原始图像中提取出赛道边界和中线。
- 二值化:这是最关键的一步。常用的有固定阈值法和动态阈值法(如大津法)。在室内光线相对稳定的赛场,固定阈值简单有效。但为了应对光线变化,我们采用了“自适应阈值”:在图像中划分多个横向区域,对每个区域单独计算阈值。例如,将图像从上到下分成4个区域,分别计算阈值并二值化,这样即使图像上部反光和下部阴影,也能较好地提取出赛道。
- 边线搜索:从图像底部(车头前方)开始,向左向右搜索黑白跳变点,作为赛道左右边界的起点。然后采用“爬线法”向上逐行搜索:以上一行的边界点为中心,在一个设定的搜索窗口内寻找本行的边界点。这样可以有效过滤掉图像中的噪点(如赛道上的污渍)。
- 中线计算与曲率预估:得到左右边界后,中点即是该行的赛道中线。采集多行(如4-8行)的中线点后,可以利用这些点进行拟合。最简单的是一次线性拟合,得到的是一个偏移量误差。更高级的做法是进行二次曲线拟合(
y = Ax^2 + Bx + C),其中二次项系数A可以反映赛道的曲率(弯道弯度),一次项系数B可以反映车头方向与赛道切线的夹角。这为后面的控制提供了更丰富的状态信息。
4.2 舵机PD控制与“提前转向”
舵机控制直接决定了过弯的平顺性。
- P(比例)控制:核心是纠正当前误差。误差
error= 图像中最近一行(车头处)的中线位置与图像中心位置的像素差。P_out = Kp * error。Kp过大,车子会在直道上高频小幅摆动(画龙);Kp过小,转向迟钝,过弯时撞外环。 - D(微分)控制:核心是预测未来误差变化趋势,抑制振荡。
D_out = Kd * (error - last_error)。这里的last_error是上一次的误差。D项能有效抑制画龙,让转向更平滑。但Kd过大,会对噪声异常敏感,引起高频抖动。 - “提前转向”策略:这是高速循迹的秘诀。不要只盯着车头处的误差,要关注更远处(前瞻)的赛道信息。例如,使用图像中较远一行(第120行)的中线误差作为控制输入的一部分,或者使用拟合出的曲率信息。这样,车子在进入弯道之前就已经开始预打方向,实现了平滑入弯。我们的策略是:舵机控制量 =
Kp_near * error_near + Kp_far * error_far + Kd * d_error。其中error_near是近处误差,负责快速响应;error_far是远处误差,负责提前预判。两者的权重需要根据车速动态调整,车速越快,远处误差的权重应适当增加。
4.3 电机PID控制与速度规划
电机控制的目标是让车子按照我们设定的速度曲线运行,并且在弯道能自动减速。
- 速度闭环PID:通过编码器测量电机实际转速,与目标转速比较形成闭环。
PID_out = Kp * e + Ki * ∫e dt + Kd * de/dt。其中,I(积分)项用于消除静差(例如,爬坡时维持速度),但要注意积分饱和问题,需要设定积分限幅。D项在速度控制中要谨慎使用,因为编码器读数可能有噪声。 - 弯道减速:这是提升过弯稳定性和速度的关键。我们根据赛道曲率(从图像拟合得到)来动态设定目标速度。在直道上,给一个较高的目标速度;进入弯道时,随着曲率增大,线性或指数地降低目标速度;出弯时,再逐步加速。可以建立一个简单的映射表:
目标速度 = 直道速度 - 减速系数 * |曲率|。这个策略能防止车子因速度过快而在弯道离心力作用下甩出去。 - 起步与制动:起步时不要一下子给最大占空比,应采用一个斜坡函数,让速度平缓上升,避免车轮打滑和电流冲击。制动时,可以让电机驱动短接刹车,或者施加反向脉冲,实现快速减速。
算法调试是一个“参数海洋”里游泳的过程。务必使用分段调试法:先让车子在直道上低速跑,调好舵机的P和D,让它能稳定走直线;然后过一个固定半径的弯道,调整舵机参数和弯道减速系数;最后再整体提升速度,进行微调。使用蓝牙模块或无线串口将关键数据(如误差、曲率、控制量、实际速度)实时发送到电脑上位机进行可视化,是最高效的调试手段,没有之一。
5. 调试、排错与性能优化实战
理论上的算法落实到车上,总会遇到各种意想不到的问题。这一章分享我们踩过的坑和解决问题的具体思路。
5.1 经典故障排查链路
当车子行为异常时,遵循从硬件到软件、从底层到上层的排查顺序:
- 现象:车子完全不动,单片机可能复位。
- 排查:首先检查所有电源电压(电池、5V、3.3V)是否正常。用示波器观察3.3V电源线上是否有大幅毛刺(电机启动时)。检查程序是否进入了硬件错误中断(HardFault)。大概率是电源噪声导致单片机复位,重点检查电源滤波电容和布线。
- 现象:舵机抽搐,不按指令运动。
- 排查:用示波器测量舵机信号线PWM波形,看脉宽是否准确、稳定。检查舵机供电电压是否足够(满载时不低于4.8V)。如果波形正确,供电正常,可能是舵机本身损坏或机械卡死。
- 现象:电机一个转一个不转,或转速不一致。
- 排查:交换两个电机的驱动信号线。如果问题跟随信号线走,是软件或单片机引脚问题;如果问题依旧在原电机,是电机、编码器或驱动电路问题。检查电机驱动芯片的输入逻辑电平、输出电流是否正常。
- 现象:摄像头图像错乱、卡顿。
- 排查:检查摄像头时钟线(XCLK)和数据线(D0-D7)的波形是否清晰。降低摄像头输出帧率测试。检查单片机DCMI接口和DMA配置是否正确,内存是否够用。如果是串口摄像头,检查波特率是否匹配,接收缓冲区是否溢出。
- 现象:车子在特定位置总是跑偏或冲出赛道。
- 排查:这不是随机故障,大概率与赛道特征或环境光有关。回放保存的赛道图像数据,分析在出错位置,图像二值化是否失效(例如,赛道颜色和背景颜色过于接近)。考虑在该位置增加特殊的图像处理策略,或引入辅助传感器(如电磁电感)进行冗余判断。
5.2 上位机:不可或缺的调试利器
“盲调”是效率最低的方式。我们强烈建议开发或使用一个简单的上位机软件。
- 需要发送的数据:原始图像中的几行灰度值、二值化后的图像、识别到的左右边界点坐标、计算出的中线点、拟合的曲线参数、当前的误差error、PD控制输出量、目标速度、实际速度、编码器计数等。
- 可视化:在上位机上绘制出图像、边界线、中线曲线。将误差、速度等数据以波形图形式实时显示。这样,你可以清晰地看到,当车子即将冲出赛道时,是图像识别先出错,还是控制算法计算出了错误的转向指令。
- 参数在线调试:进阶功能是让上位机通过无线串口向单片机发送调参指令。这样你可以在车子运行过程中,实时修改Kp、Kd等参数,并立即观察车子的响应变化,效率提升十倍不止。我们基于Qt写了一个简单的上位机,实现了这些功能,这成为了我们后期调车的核心武器。
5.3 性能优化:从“能跑”到“跑得快”
当车子能稳定跑完全程后,就可以追求极限了。
- 代码优化:使用查表法代替复杂的浮点运算(如三角函数)。将频繁调用的函数声明为内联(
inline)。优化图像处理循环,使用指针操作,减少不必要的数组索引计算。确保中断服务函数(ISR)尽可能短小,只做最必要的操作(如读取数据、设置标志位),复杂的处理放到主循环中。 - 控制频率提升:提高主控制循环的频率。例如,将控制周期从10ms(100Hz)缩短到5ms(200Hz)。更高的控制频率意味着系统能更及时地响应误差,允许使用更大的控制参数,从而获得更敏捷的动态性能。但这需要算法足够高效,确保能在5ms内完成一次完整的图像处理和控制计算。
- 赛道记忆与学习:对于规则赛道,可以尝试“赛道记忆”算法。第一圈以保守速度慢跑,记录下每个位置(通过编码器里程或时间戳索引)应有的舵机打角和电机速度。第二圈开始,就按照记忆的“最优路径”来跑,同时用摄像头进行实时纠偏。这能实现非常激进且平滑的跑法。
6. 给新手队员的入门建议清单
如果你刚刚组队,面对B车一片茫然,可以按照这个清单一步步来,它会帮你建立一个清晰的路径,避免在初期陷入混乱。
心态准备:
- 放弃幻想,准备战斗:智能车竞赛是工程实践,不是理论考试。你会遇到无数课本上没写的问题。耐心、细心和强大的信息检索能力(善用搜索引擎、技术论坛、往届技术报告)比单纯的聪明更重要。
- 团队协作:明确分工(机械、硬件、软件、算法),但也要互相了解对方的工作。定期开会同步进度,记录问题。使用Git等版本管理工具管理代码,避免“最后一晚合代码”的悲剧。
知识储备:
- 单片机:精通C语言,掌握你所用单片机(如STM32)的基本外设:GPIO、定时器(PWM、输入捕获)、中断、串口、ADC、DMA。这是硬件控制的基础。
- 电路基础:能看懂原理图,会用万用表、示波器。理解电源、接地、信号完整性的基本概念。
- 控制理论:理解PID控制原理(比例、积分、微分各自的作用)。不必深究公式推导,但要明白每个参数对系统动态特性的影响。
- 图像处理基础:了解灰度图、二值化、边缘检测、滤波等基本概念。
实操路线图:
- 第1-2周:组装车模,不装任何电子设备。手动推车,感受机械结构,调整差速、前束,确保车轮转动顺滑,转向灵活无卡滞。
- 第3-4周:搭建最小系统。让单片机点灯、串口打印“Hello World”。然后驱动舵机,能让它随着按键左右转动。再驱动电机,能让它正反转、调速。最后连接编码器,能读取并计算速度。
- 第5-6周:接入摄像头。先让摄像头能输出图像(在电脑上显示或通过串口发送灰度值)。实现最简单的二值化和一行中线的查找,并让舵机根据这一行的误差进行P控制,让车子能跟着一条直胶带缓慢移动。
- 第7-8周:实现多行扫描、边线跟踪、中线拟合。引入舵机的D控制,抑制摆动。让车子能以较低速度(如0.5m/s)稳定跑完一个包含直道和弯道的简单赛道。
- 第9周及以后:加入速度闭环PID控制。实现弯道减速逻辑。开始调参,逐步提升速度。同时,开发上位机用于可视化调试。这个阶段是漫长的迭代优化过程。
工具与资源:
- 硬件:万用表、示波器(必备)、电烙铁、热风枪、各种规格的螺丝刀、钳子。
- 软件:Keil/IAR/STM32CubeIDE,串口调试助手(如SSCOM、XCOM),版本管理工具(Git),简单的上位机开发环境(如Qt、Python PyQt)。
- 资源:逐飞科技、龙邱科技等赞助商的开源资料库,CSDN、博客园上往届选手的技术博客,B站上的调车视频。最重要的资源是上一届学长学姐的技术报告和代码,但切记要理解,而不是照抄。
最后,记住一点:智能车竞赛的魅力不在于最后那几十秒的冲刺,而在于这几个月里,你和队友们为了一个小车能跑起来,所付出的所有努力、经历的所有挫折、以及解决每一个问题后的那份喜悦。这个过程带给你的工程思维、解决问题能力和团队协作经验,远比一张奖状珍贵。所以,放手去做,享受这个“进击”的过程吧。当你看着自己调教的小车终于稳稳地飞驰在赛道上时,你会明白,所有在困难中的攻克,在挫折中的坚持,都是值得的。