智能车竞赛控制策略:直道、弯道与十字路口的核心算法与调参实战
1. 从赛道元素到控制逻辑:一个车手的视角
全国大学生智能汽车竞赛,对于每一个参赛队员来说,最核心的战场就是那条铺在地上的赛道。它由一条简单的黑色引导线和白色的背景组成,但在这条线上,却演化出直道、弯道、十字路口等千变万化的元素。对于四轮车组别,如何让车在这条线上又快又稳地跑起来,是贯穿整个备赛周期的核心课题。今天,我们不谈复杂的算法理论,就从最接地气的角度,聊聊如何让我们的“小车”看懂并征服直道、弯道和十字这三个最基础的赛道元素。这不仅仅是代码的堆砌,更是对传感器数据、车辆动力学和控制逻辑的深刻理解与融合。
很多新手队伍一开始容易陷入一个误区:拿到一套开源代码,调调参数,车就能跑了。但往往在直道上就左右摇摆,过弯时要么冲出赛道要么速度骤降,遇到十字更是直接“迷路”。其根本原因在于,没有理解不同赛道元素下,控制策略需要进行的根本性切换和适配。直道求稳、弯道求顺、十字求准,这背后对应的是完全不同的控制目标和参数集。本文将围绕这三个核心场景,拆解从图像识别到控制输出的完整链路,分享我们在实际调车中积累的、那些代码注释里不会写的“手感”和“经验”。
2. 直道控制:速度与稳定的基石
直道是赛道的主体,也是车辆积累速度优势、为弯道做准备的关键路段。很多人觉得直道简单,不就是让车沿着线走吗?但实际上,直道控制的好坏,直接决定了整个赛程的平均速度和控制器的稳定性。一个在直道上都左右抖动的车,进入弯道后失控的概率会大大增加。
2.1 图像处理与中线提取的“净度”
直道控制的首要前提,是获得一条干净、连续的中线。摄像头采集到的原始图像包含大量噪声:光线不均、赛道反光、背景干扰等。我们的第一步,是通过一套可靠的图像处理流程来提取赛道黑色引导线的边缘。
通常,我们会进行灰度化、二值化(动态阈值或大津法)、然后进行扫描寻线。在直道上,由于引导线曲率近乎为0,我们可以采用一种高效的“中线拟合”策略。具体来说,在图像ROI(感兴趣区域)的底部几行,向左向右扫描找到赛道左右边沿,取中点作为底部基准点。然后向上逐行扫描,但在直道区域,可以适当减少横向搜索的宽度和行数,因为边沿基本是垂直的。将得到的多个中点,使用最小二乘法进行直线拟合,这条拟合出的直线,就是当前直道的“中线”。
注意:这里的“直道”是感知结果。我们的判断依据是拟合出的直线误差小,且曲率计算值低于某个阈值(例如0.001)。即使赛道物理上是微微弯曲的,只要曲率很小,我们都将其纳入“直道控制模式”来处理,这是为了控制策略的平滑切换。
得到这条拟合中线后,我们并不是直接使用其上的每个点,而是将其转换到以车模为中心的世界坐标系(或车身坐标系)下。最关键的一个输出量是横向偏差(Lateral Error),即车模当前位置到该拟合中线的垂直距离。在直道中,这就是我们PID控制器最主要的输入量。
2.2 纯追踪与PID的权衡:为什么不用更复杂的算法?
对于直道跟踪,最经典、最有效的莫过于PID控制。横向偏差e作为输入,方向盘转角(或差速)作为输出。但这里有几个细节决定了直道的稳定性:
- P项(比例):这是主力。参数
Kp直接决定了系统对偏差反应的灵敏度。Kp太大,车会在中线附近高频振荡,像“画龙”;Kp太小,反应迟钝,遇到微小弯曲时纠偏无力,容易累积误差。在直道上,由于期望偏差长期为0,我们可以采用相对较大的Kp以获得快速纠偏能力。 - D项(微分):这是“阻尼器”,输入是横向偏差的变化率
de/dt。它能有效预测偏差的趋势,抑制振荡。在高速直道上,D项至关重要。例如,车由于惯性开始向左偏,D项会在偏差e还未变大时,就根据偏左的速度de/dt产生一个向右的纠正力矩,从而抑制超调。Kd的调参需要精细,太小不起作用,太大则会让系统对噪声(如图像处理的抖动)过于敏感,引起高频抖动。 - I项(积分):直道中需谨慎使用。积分项用于消除静态误差,但如果赛道本身是绝对笔直的,且车辆对称性良好,理论静态误差为0。引入
I项容易因为传感器零漂或微小不对称而累积,导致车辆缓慢偏向一侧。通常,我们只在长期存在固定偏置(如摄像头安装有轻微角度偏差)时才启用一个很小的Ki,并且需要设置积分限幅和抗饱和处理。
那么,为什么在直道不用更高级的算法如纯追踪(Pure Pursuit)?纯追踪的本质是前瞻,它计算一个预瞄点,然后控制车辆转向去逼近那个点。在直道上,预瞄点可以设得很远,这本身能带来更好的平滑性。但在竞速场景下,纯追踪在直道的“绝对居中”性能上不如PID直接。PID的目标是让当前横向偏差归零,响应更直接。而纯追踪为了平滑,会容忍当前时刻微小的不居中。我们的策略往往是:在直道使用以横向偏差为输入的PID,追求极致的中线对齐;在弯道切换至以预瞄点偏差为输入的纯追踪或PID,追求平滑过渡。这就涉及到模式切换的逻辑。
2.3 直道下的速度规划:为弯道蓄力
直道不仅是控制稳定的舞台,更是速度发挥的区间。一个优秀的速度控制器,会让车在直道上加速到当前赛道和车辆性能允许的安全极限。这个“极限”如何确定?
首先,需要根据直道的长度进行规划。通过摄像头或编码器累积距离,识别出进入长直道后,可以命令速度环(另一个PID)的目标值逐步攀升至最高速V_max。但V_max不是一个固定值,它受限于:
- 电机性能与电池电压:随着比赛进行,电池电压下降,最大输出功率也会下降。
- 轮胎与地面摩擦系数:不同场地(木板、地毯、PVC)的抓地力不同,最大加速度和可承受的侧向力也不同。
- 车辆机械稳定性:速度过高,微小的转向抖动都可能被放大,导致车辆“发飘”。
因此,我们通常会在赛前测试中,通过多次实验,找到一个在不同电量下都相对安全的直道最高速。更高级的做法是引入加速度前馈:在速度PID输出的基础上,叠加一个基于目标加速度计算的前馈量,可以极大改善速度跟踪的动态响应,让加速更跟脚。
一个关键的实操经验是:直道末端的速度管理。在进入弯道前,必须在直道上完成减速。减速点需要提前量。我们不能等到图像识别出弯道才开始刹车,那样为时已晚。通常的做法是,结合赛道记忆或前瞻性判断:当识别到前方一定距离的赛道曲率开始持续增大(即使当前还在直道),就启动平滑减速程序,让车速在入弯点前降到预设的过弯安全速度。这个“曲率-速度”映射表,是调车时最重要的经验数据之一。
3. 弯道控制:平滑与速度的博弈
弯道是展现控制算法精髓的地方,也是超车和拉开差距的关键。弯道控制的核心矛盾是:如何在有限的摩擦圆内,平衡纵向速度(想快)和横向转向需求(要转弯),保证车辆不冲出赛道。
3.1 弯道识别与曲率估计:从像素到弧度
首先,车需要知道自己即将进入一个弯道,并且知道这个弯有多“弯”。在图像处理阶段,我们不再用直线拟合,而是需要提取一条能反映弯曲趋势的中线。这时,可以采用滑动窗口搜索法,或者对提取的点集进行二次曲线甚至高次曲线拟合。
曲率C的计算是关键。对于离散的中线点集(x_i, y_i),我们可以使用三点求曲率公式,或者对拟合的曲线方程求二阶导。一个更工程化的方法是计算弦切角变化率。取车前方一段固定距离的弧段,计算弧段起点和终点处中线切向角的变化量Δθ,除以弧长L,即得到平均曲率C ≈ Δθ / L。这个C值就是弯道缓急的量化指标。
根据C的大小,我们可以对弯道进行分级:小弯(C较小)、中弯、急弯(C很大,如锐角弯)。不同等级的弯道,对应完全不同的控制参数集。
3.2 控制策略切换:PID、纯追踪与差速的协同
进入弯道,控制策略必须切换。
转向控制:在弯道,继续使用以当前横向偏差为目标的PID会非常危险。因为车辆具有惯性,在弯道中,为了跟随曲线,车辆需要有一个持续的、朝向弯心的转角。如果只用当前偏差控制,车会不断“追着”中线跑,产生画龙式的振荡,极易在弯心处因转向过度而甩尾。
- 纯追踪(Pure Pursuit)成为主流选择:它的思想非常符合人类驾驶——眼睛看着远方的一个点(预瞄点),打方向让车朝那个点开。预瞄距离
Ld是一个动态参数,它与车速v正相关(Ld = k * v),这样车速快时看得远,车速慢时看得近。通过调整车前方Ld处的中线点作为目标点,计算该点与车体的横向偏差,再用一个PID控制器去消除这个偏差,车辆就能平滑地跟随弯道。 - 预瞄点的选择艺术:
k值的设定是调参的重点。k太大,预瞄点太远,在急弯中车会“切弯”,可能内侧压线甚至切到赛道外;k太小,预瞄点太近,车会显得“迟钝”,转向动作滞后,走线不够平滑。我们的经验是,k值需要与弯道曲率联动:大曲率(急弯)时,适当减小k,让预瞄点近一些,转向更及时;小曲率时,增大k,让行驶更平滑。
- 纯追踪(Pure Pursuit)成为主流选择:它的思想非常符合人类驾驶——眼睛看着远方的一个点(预瞄点),打方向让车朝那个点开。预瞄距离
差速控制:对于四轮车,尤其是后轮差速驱动的车型,差速控制是过弯的“神器”。阿克曼转向模型告诉我们,车辆转弯时,内外侧车轮应具有速度差。我们可以根据转向角度
δ和轮距W,计算理论的内外轮速比。在软件中,我们通过给左右轮电机设定不同的目标速度来实现差速。- 差速系数:设定一个差速系数
d,例如d = 0.1。则左轮目标速 = 基础目标速 * (1 - d * 转向比例),右轮目标速 = 基础目标速 * (1 + d * 转向比例)。这里的转向比例是归一化的方向盘转角。 - 差速的效果:适当的差速可以减小转弯半径,让过弯更灵活;更重要的是,它能减少轮胎的滑动摩擦,降低过弯时的能量损耗,并提升出弯加速的响应。但差速过大,会导致内侧轮拖拽,反而增加不稳定因素。
- 差速系数:设定一个差速系数
3.3 弯道速度规划:慢进快出
“慢进快出”是赛道驾驶的黄金法则,对智能车同样适用。弯道速度规划的目标,是在不冲出赛道的前提下,最大化平均速度。
入弯减速:如前所述,减速必须在直道末端完成。入弯点的速度
V_in由弯道曲率C决定。我们通过实验建立一张C-V_max表,即不同曲率下车辆能安全通过的最高速度。入弯速度应略低于这个V_max以留出安全余量。减速过程必须是平滑的,急减速会导致车辆重心前移,前轮抓地力增加而后轮抓地力减小,容易诱发转向过度(甩尾)。弯中速度维持:进入弯道后,速度应保持相对稳定。剧烈的加减速会改变轮胎的纵向和侧向力分配,影响过弯稳定性。通常,在弯道中段,我们保持一个恒定的、较低的速度。
出弯加速:这是争夺时间的关键。出弯加速点不能等到车辆完全摆正才开始,那样会损失大量时间。应该在车辆通过弯心(apex)后,方向盘开始回正的过程中,就逐步、线性地增加目标速度。此时,转向角减小,轮胎的侧向力需求降低,富余的抓地力可以用于纵向加速。出弯加速的斜率需要仔细调校,太猛会导致驱动轮打滑(尤其是前驱或后驱车),太慢则损失时间。
一个常见的坑是:弯道中的图像丢失。在急弯处,摄像头可能因为视角问题,只能拍到一侧边沿,甚至完全拍不到线(“丢线”)。这时,控制算法必须要有丢线处理机制。我们的策略是:进入弯道前,记录下最后一次有效中线的方向和曲率。一旦丢线,就根据记录的曲率,结合编码器里程计,进行死 reckoning(航位推算),持续生成一段预测的中线,并基于此进行控制。同时,扩大图像搜索范围,积极尝试重新捕线。这个预测的时长和权重,是保证弯道鲁棒性的关键。
4. 十字路口处理:策略与鲁棒性的双重考验
十字路口是赛道元素的重大切换点,也是很多车辆“翻车”的地方。处理十字的核心难点在于:图像特征的剧变,以及路径选择的不确定性(虽然竞赛中十字通常是直行,但算法需要能稳定识别并处理)。
4.1 十字路口的图像特征识别
摄像头在十字路口看到的,不再是单一的引导线,而是一个黑色的“十字形”或“T字形”区域。常规的边沿扫描算法会失效,因为会扫到多个边沿。识别十字的关键在于特征判断:
- 横向扫描发现多个跳变点:在图像中间行进行横向扫描,正常情况下(直道/弯道),只会找到两个跳变点(左边缘、右边缘)。而在十字路口,由于横线的存在,可能会找到四个甚至更多跳变点。
- 有效行数突然减少:从图像底部向上逐行扫描时,在十字横线以下的部分,可以正常找到左右边沿。但扫描到横线所在行时,该行可能全是黑色(横线),导致无法找到有效的左右边沿,从而造成“有效行”数量锐减。
- 补线趋势发生突变:当底部行识别到左右边沿后,向上寻线。在十字区域,向上寻线可能会沿着横线向左或向右走,导致补线计算出的中线方向突然发生90度左右的变化。
基于这些特征,我们可以设计一个十字路口的状态机:
- 状态0(巡航):正常寻线。
- 状态1(十字疑似):检测到横向多跳变点或有效行数开始异常减少。进入此状态后,可以启动一个短时的计时器或距离计数器。
- 状态2(十字确认):在计数器范围内,持续检测到十字特征(如有效行数低于阈值,或中线方向持续异常)。确认为十字路口。
- 状态3(十字通过):进入十字处理逻辑。
- 状态4(十字恢复):离开十字区域,尝试重新捕获纵向引导线,回归正常巡航状态。
4.2 通过策略:直行与转向的抉择
对于最常见的十字直行,策略相对明确:忽略横向的干扰,坚持原来的方向前进。
- 惯性导航通过法:一旦确认进入十字路口(状态2),立即锁定进入十字前的最后时刻的车身朝向角(由陀螺仪积分得到)和速度。在状态3(十字通过)期间,暂时屏蔽摄像头的中线识别结果,控制策略切换为“保持航向角”模式。使用陀螺仪的角速度进行PD控制,努力保持车辆沿着进入十字前的方向直线行驶。同时,结合编码器里程计,估算车辆穿过十字区域所需的距离或时间。
- 补线预测通过法:不完全依赖惯性,而是在进入十字时,根据历史中线点,预测出一条穿过十字的虚拟中线。在十字区域内,控制器就跟踪这条虚拟中线。这种方法对陀螺仪的零漂不敏感,但要求预测算法足够鲁棒。
无论哪种方法,一个关键点是退出十字的判断。不能等到图像完全恢复正常才退出十字模式,那样可能会因为处理滞后而导致车辆在十字后走偏。通常,我们使用编码器计算车辆从进入十字点开始行驶的距离,当距离超过十字的大致物理宽度(例如30cm)后,就主动切换到“恢复模式”(状态4)。在恢复模式下,控制器尝试重新捕获纵向引导线,但控制权重会从虚拟路径/惯性导航逐步过渡到真实的图像中线,实现平滑切换。
如果是十字转弯(在某些赛题中出现),则需要更复杂的处理:需要在十字中心点进行路径切换。这通常依赖于精确的赛道元素地图和定位。在十字中心,根据任务要求(左转/右转),将跟踪的目标路径切换到新的方向。这涉及到全局路径规划,是更高阶的挑战。
4.3 十字区域的特殊调参与避坑指南
十字路口是对系统鲁棒性的终极测试,这里有几个血泪教训:
- 速度管理:必须以一个保守的、稳定的速度通过十字。高速通过十字时,任何微小的方向偏差或处理延迟都会被放大,极易导致车辆斜着冲出去。通常,十字通过速度会设定为略低于弯道速度。
- 控制参数切换:进入十字模式后,转向PID的参数通常需要调整。因为此时跟踪的可能是虚拟路径或惯性角度,与跟踪真实图像中线的动态特性不同。可能需要降低
P和D的增益,防止因信号源切换而产生的突变和振荡。 - 传感器融合的重要性:在十字区域,摄像头信息可能短暂失效或混乱,此时陀螺仪和编码器的价值就凸显出来了。一个校准良好的陀螺仪,能在短时间内提供相对可靠的航向角变化信息,是惯性通过法的基石。编码器则提供了距离基准,用于判断通过状态。
- 防误触发机制:赛道上的其他干扰,如起跑线、斑马线(虽然规则一般不允许)或者光线造成的阴影,可能产生类似十字的特征。因此,十字判定条件不能太宽松。需要结合多个特征综合判断(如多跳变点+有效行数减少+方向突变),并且特征需要持续一定时间或距离,才能确认。同时,可以设置一个最小触发间隔,防止短时间内反复误入十字状态。
5. 状态融合与切换:让车拥有“驾驶意识”
至此,我们分别讨论了直道、弯道、十字的控制。但一辆智能车在赛道上是一个连续运行的整体,它需要自动地在这些状态间无缝、平滑地切换。这需要一个顶层的决策与状态管理模块。
5.1 基于曲率与特征的状态判别
这个模块的输入,是图像处理层输出的特征:当前中线的曲率C、拟合误差、有效行数、是否检测到十字特征等。输出则是当前应处的驾驶状态(直道、弯道、十字)。
一个简单的判别逻辑流如下:
- 十字优先:持续检测十字特征。一旦满足十字确认条件,立即进入“十字通过”状态,并屏蔽其他状态转换。
- 曲率判别:若非十字状态,则计算中线曲率
C。- 若
|C| < C_threshold_straight,且持续一段时间,则判定为直道。 - 若
|C| >= C_threshold_straight,则判定为弯道。还可根据C的大小进一步细分为小弯、中弯、急弯。
- 若
- 状态保持与滞后:为了防止在状态边界附近频繁切换(例如直道末端曲率稍微波动就切弯道),需要加入滞后区间和最小保持时间。例如,从直道进入弯道的曲率阈值
C_in要略大于从弯道回到直道的阈值C_out(C_in > C_out)。并且,进入一个新状态后,必须在该状态保持至少N个控制周期(如50ms)才能再次切换。
5.2 控制参数的平滑过渡
状态切换不仅仅是逻辑的切换,更是控制参数的切换。例如,从直道(PID参数组A)进入弯道(参数组B),如果直接硬切换,会导致控制量突变,车辆顿挫甚至失控。
因此,需要实现参数的平滑过渡(插值)。在状态切换的过渡期内(例如0.5秒内),当前的参数值由旧参数组和新参数组根据时间或距离进行线性(或其它曲线)插值得到。
// 伪代码示例 if (状态 == 切换中) { float factor = elapsed_time / transition_time; // 过渡因子,0->1 current_Kp = old_Kp * (1 - factor) + new_Kp * factor; current_Kd = old_Kd * (1 - factor) + new_Kd * factor; // ... 其他参数 }同样,对于预瞄距离Ld、目标速度V_target等,也需要平滑过渡。这保证了车辆行为是连续的,乘坐感(虽然没人乘)更平滑,也更符合物理规律。
5.3 实战中的调试心法
理论最终要落到调车上。面对直道、弯道、十字,调试顺序有讲究:
- 先调直道:在绝对平直的地面上,让车慢速运行,只使用很小的
P值,目标是让车能稳定地沿着线走,不振荡。然后逐步提高速度,同时调整P和D,直到在最高速下直道运行依然稳定。直道是基础,基础不牢,地动山摇。 - 再调小弯道:找一个弧度不大的弯道,测试纯追踪算法。先固定一个较低的速度,调整预瞄距离系数
k,让车能平滑转过弯道,走线合理(既不切内线也不甩外线)。然后微调转向PID的参数。 - 加入差速:在弯道中引入差速控制,从小系数开始,观察过弯是否更顺畅、更快速。差速和转向控制是耦合的,调整差速后,可能需要回头微调一下转向参数。
- 调试弯道速度规划:建立初步的曲率-速度表。在弯道入口处设置减速点,调试减速的平滑度;在弯心后调试出弯加速的时机和斜率。这是一个反复迭代的过程,需要大量测试来找到速度和稳定性的平衡点。
- 最后攻克十字:在直道和弯道都稳定后,再测试十字。首先确保十字识别要非常可靠,不能误触发。然后以很低的速度测试通过策略,重点观察通过十字后能否迅速、准确地重新捕获引导线。逐步提高通过速度,并调整十字区域的控制参数。
- 全局联调与优化:让车跑完整圈,记录每个弯道的曲率和实际通过速度,优化速度规划表。观察状态切换点是否平滑,有无顿挫。使用上位机软件实时绘制跟踪曲线、偏差曲线、速度曲线,是分析问题不可或缺的手段。
调车没有银弹,每一个参数背后都是对车辆动力学和传感器特性的理解。最好的老师就是赛道本身,多跑、多观察、多分析数据,不断迭代,你的车就会越来越聪明,越来越快。记住,稳定是快的前提,一个能稳稳跑完全程的方案,远比一个极限速度很高但十次有八次冲出赛道的方案更有竞争力。
