公司动态
智能车竞赛十字路口识别与通过策略:从传感器处理到状态机实战
1. 项目概述与核心挑战“十字路口”和“斜入十字路口”这两个词对于刚接触智能车循迹竞赛的新手来说简直是又爱又恨的存在。爱的是它们标志着赛道元素从简单的直道、弯道进入了更复杂的组合是算法能力的一次重要跃升恨的是处理不好你的小车就会在这里上演“鬼探头”或者“原地打转”的迷惑行为让之前所有的调试功亏一篑。我记得我第一次让小车跑十字路口时它像个喝醉的舞者在十字中心犹豫不决最后横着冲出了赛道。今天这篇日记我就把自己从“翻车”到“稳过”的完整调试思路、代码实现和那些踩过的坑毫无保留地分享出来。无论你是正在备赛21届、22届智能车竞赛的队员还是对嵌入式控制和图像处理感兴趣的爱好者这篇关于十字路口处理的实战记录都能给你提供一套可直接复现的解决方案。简单来说十字路口的核心挑战在于“特征消失”和“决策时机”。当小车沿着一条黑线行驶突然进入一个四条黑线交汇的区域时摄像头或电感采集到的赛道中线信息会瞬间变得模糊甚至中断。小车必须准确识别出“我正进入一个十字路口”而不是“我丢线了”然后根据预设的策略直行、左转、右转做出快速、稳定的决策并在驶出路口后迅速恢复正常的循迹控制。斜入十字则更刁钻它要求小车在非垂直角度切入路口时依然能保持姿态稳定平滑过渡这对传感器的前瞻性和控制算法的鲁棒性提出了更高要求。下面我们就从最基础的传感器数据处理开始一步步拆解这个难题。2. 传感器数据预处理与赛道特征提取处理复杂路口的首要前提是获得干净、可靠的赛道信息。无论是摄像头组还是电磁组原始数据都充满了噪声和干扰直接用于决策无异于“盲人摸象”。2.1 摄像头图像处理流程对于摄像头组我们通常使用灰度或二值化图像。我的车用的是OV7725全局快门摄像头输出灰度图像进行后续处理。第一步图像二值化与降噪。这是最关键的一步二值化的阈值直接决定了能否稳定地提取出黑线。我采用动态阈值法而非固定阈值以适应赛场光线变化。具体做法是统计图像中下方靠近车体光线相对稳定若干行的像素灰度值计算其平均值和标准差将“平均值 - N * 标准差”作为阈值。实测下来N取2到3之间效果比较稳健。二值化后使用中值滤波或形态学开运算先腐蚀后膨胀去除小的噪点比如赛道上可能存在的灰尘或反光点。注意阈值不能取得太“激进”。如果阈值设得过高在光线较暗或黑线反光时可能导致黑线断裂尤其在十字路口中心断开的线段会被误判为普通弯道引发错误转向。我的经验是宁可让黑线稍微“胖”一点连通性好也不要让它“瘦”到断开。第二步赛道边线提取与中线计算。最经典的方法是“边线扫描法”。从图像底部开始从左到右或从右到左扫描每一行找到从白色背景跳变到黑色赛道左边缘和从黑色赛道跳变到白色背景右边缘的像素点坐标。然后取左右边缘的中点作为该行的赛道中心点。将所有行的中心点从上到下或从下到上存储在一个数组中就得到了赛道的“中线”。这个中线数组是我们所有控制算法的输入。在十字路口问题来了当扫描到路口区域时一行内可能会出现多个“白-黑-白”的跳变。简单的左右边缘查找算法会失效。因此必须在扫描逻辑中加入对十字路口的预判断。2.2 电磁信号处理与归一化对于电磁组核心是处理来自工字电感或运放电路的电压信号。十字路口的电磁场分布与直道截然不同。信号采集与滤波通常使用多个电感呈水平或竖直排列。原始ADC信号需要经过硬件RC滤波和软件滤波如均值滤波、卡尔曼滤波。我的经验是软件上做一个滑动平均窗口滤波窗口大小取5-7能在保证实时性的前提下有效平滑噪声。信号归一化与差和比计算单个电感的绝对值受距离、电池电压影响很大因此我们更关心电感值的相对大小。常用的方法是“差和比”计算。例如对于左右两个水平电感计算偏差 (左电感值 - 右电感值) / (左电感值 右电感值)。这个值被归一化到[-1, 1]区间非常适合于作为方向控制的输入。在十字路口由于磁场叠加多个电感的值可能会同时升高导致“和”值巨大进而使计算出的“偏差”反而变小模拟出“直道”的特征这就是电磁车在十字路口容易直冲出去的原因之一。因此必须引入额外的路口检测逻辑。3. 十字路口的识别算法设计识别是决策的前提。我们需要设计一个可靠的“触发器”告诉主控程序“注意前方是十字路口准备执行特殊策略”。3.1 基于摄像头的十字路口识别摄像头的优势在于信息丰富可以“看到”路口的形状。我采用了以下几种特征综合判断有效行数锐减在正常赛道上从图像底部向上扫描通常能连续找到多行比如20行以上的赛道中线。当进入十字路口时由于横向黑线的干扰扫描算法在路口中心区域可能无法找到有效的左右边缘导致成功找到中线的“有效行数”突然大幅减少。可以设置一个阈值当连续多行的扫描失败且失败行数超过阈值例如从图像中部往上超过10行找不到中线则触发十字路口疑似标志。边线宽度突变在十字路口中心横向黑线会导致扫描到的“赛道宽度”右边缘X坐标 - 左边缘X坐标远大于正常直道或弯道的宽度。通过实时计算每一行的宽度并监测其是否超过一个设定的最大宽度阈值这个阈值需要通过实验测量正常弯道最宽处的宽度来确定可以有效地识别路口。横向黑线检测这是最直接的特征。可以在图像中上部划定一个“检测区域”对这个区域的图像进行纵向列方向的投影或扫描。如果在这个区域内检测到一条连续的、具有一定像素宽度的横向黑线那么就可以确定前方是十字路口。为了提高抗干扰能力可以要求这条横向黑线在水平方向上连续跨越一定的像素范围比如超过图像宽度的60%。我的策略是将这三个条件进行“与”或者“或”的逻辑组合。例如当“有效行数锐减”和“边线宽度突变”同时发生时才判定为十字路口。这样可以避免因赛道上有大的污渍或光线造成的局部干扰而导致的误触发。3.2 基于电磁信号的十字路口识别电磁组的识别更依赖于对信号模式的解读。水平和竖直电感值同时饱和这是最典型的特征。在十字路口中心水平布置的电感负责左右偏差和竖直布置的电感负责前瞻的感应电压会同时达到很高的值甚至接近ADC的量程上限。我们可以设置一个较高的电压阈值当检测到水平和竖直电感的值都超过该阈值并维持一段时间例如连续3-5个控制周期即可认为进入十字路口。偏差值失效如前所述在路口中心由于磁场叠加计算出的左右偏差可能接近于零但此时电感的总和值非常大。因此可以监测“偏差绝对值”和“电感总和值”。当“偏差绝对值”很小例如小于0.1但“电感总和值”却很大超过直道正常值的1.5倍以上时这很可能就是十字路口的特征。多电感配置的辅助判断如果使用了更多电感如左斜、右斜45度电感可以通过观察这些电感值的变化模式来辅助判断。例如在直行进入十字时左斜和右斜电感的值会呈现特定的对称变化规律。我采用的电磁车方案中将“水平电感值饱和”作为主要条件将“偏差值接近零且总和值大”作为辅助验证条件两者同时满足则进入十字路口处理状态。4. 十字路口的通过策略与控制实现识别出路口的瞬间就要立刻切换控制模式。核心思想是在路口区域内暂时放弃基于赛道中线的PD循迹转而执行一个预设的、开环或半开环的“通过动作”。4.1 直行通过十字路口这是最基本也是最常见的情况。策略是“无视横向黑线继续保持前进方向”。摄像头组实现锁定方向在识别到十字路口的瞬间立即记录下当前时刻的赛道方向角可以通过计算中线数组的斜率得到或者直接记录当前的转向舵机打角值。保持动作在接下来的N个控制周期内这个N需要通过实验测定是小车从识别点开始到完全驶离路口所需的时间舵机控制不再依赖实时计算的中线偏差而是固定输出之前锁定的那个打角值。对于差速车则保持左右轮差速不变。恢复循迹设置一个“出口检测”。当检测到有效行数恢复且边线宽度回归正常范围时认为小车已经驶出路口。此时清空路口标志位切换回正常的PD循迹控制。电磁组实现惯性通过识别到路口后同样锁定当前的电机差速比或舵机角度。计时或距离控制由于电磁信号在路口中心会“失灵”可以采用计时法保持当前状态运行200-300毫秒或者通过编码器估算行走距离保持当前状态前进20-30厘米来控制通过过程。信号恢复检测当检测到水平电感值从饱和状态下降且偏差计算重新变得有效时逐步切换回正常循迹。实操心得“保持时间”或“保持距离”是调参关键。时间太短车还没完全通过路口就恢复循迹可能会被残留的横向黑线干扰而偏转时间太长车可能已经冲过头在出口处纠偏过猛。最好的方法是实地测试让小车以比赛速度通过用串口打印出从识别到恢复的各个时间点反复调整至通过过程最平滑。4.2 转弯通过十字路口左转/右转有些赛道规则要求小车在十字路口进行转向。这需要更精确的控制。预识别与减速在进入路口前就需要识别出这是需要转弯的十字路口通常通过路口的路径选择或赛前预设策略决定。识别后应适当降低电机速度为转向提供更稳定的底盘。执行转向动作进入路口后直接给舵机一个固定的、较大幅度的左转或右转打角例如直接输出最大打角限幅值的一半。同时差速车需要配合输出差速。转向角度控制纯靠开环打角和计时很难精确转过90度。可以结合陀螺仪IMU的Z轴角速度积分Yaw角来闭环控制。例如设定目标为旋转90度当陀螺仪积分角度达到85度时开始减小打角并准备寻找出口赛道线。出口搜索与恢复转向动作后期开始启用摄像头或电感搜索预期出口方向的赛道线。一旦搜索到立即切入到对该新赛道的循迹控制中。4.3 斜入十字路口的特殊处理斜入十字的难点在于小车进入路口时车身与路口轴线存在夹角传统的“锁定进入角度”策略会失效因为锁定的角度本身就是斜的直接保持会导致小车沿着斜线切出路口可能压到边线。应对策略更早的识别需要比垂直进入更早地识别出前方是十字路口以便有足够时间调整车身姿态。路径规划在识别到斜入十字后控制目标不再是“保持进入角”而是“规划一条平滑穿过路口的曲线”。一个简单实用的方法是在路口识别点根据当前车身偏角和速度计算出一个虚拟的“路径点”这个点位于路口另一侧的出口中心线上。然后使用纯追踪算法控制小车朝向这个虚拟点行驶。分段控制将斜入通过过程分为两段。第一段微调方向使车头尽可能对准目标出口的中心这是一个粗略对准。第二段当车身大部分进入路口后执行类似于直行通过的“保持”策略但保持的角度是经过第一段调整后的新角度。强化出口恢复斜入后小车与出口赛道的夹角可能更大因此出口恢复循迹时的PD参数可能需要临时调整例如增大D项以防止振荡或者采用更激进的“截线”策略快速贴合新赛道。5. 状态机与程序框架设计可靠的路口处理离不开清晰的状态机设计。不能让路口处理逻辑和正常循迹逻辑混杂在一起。我设计的状态机通常包含以下几个状态NORMAL正常循迹默认状态执行基于中线偏差的PD控制。ENTER_CROSS进入十字识别到十字路口特征置位标志记录当前状态参数如角度、速度。IN_CROSS在十字中执行通过策略如直行保持、转向。在此状态下屏蔽正常循迹计算。EXIT_CROSS离开十字检测到路口出口特征开始尝试恢复循迹。这是一个过渡状态可能涉及参数的平滑过渡。LOST丢线备用状态如果在任何状态下长时间找不到赛道进入丢线处理如减速、原地旋转搜索。程序主循环中根据传感器输入判断状态转移条件。例如switch (car_state) { case NORMAL: // 正常循迹代码 if (detect_crossroad()) { car_state ENTER_CROSS; save_current_angle(); } break; case ENTER_CROSS: car_state IN_CROSS; cross_timer 0; // 启动通过计时器 break; case IN_CROSS: execute_cross_strategy(); // 执行保持或转向 cross_timer; if (cross_timer CROSS_TIME_TH || detect_exit()) { car_state EXIT_CROSS; } break; case EXIT_CROSS: // 平滑恢复控制权 if (recovery_done()) { car_state NORMAL; } break; // ... 其他状态 }这样的框架逻辑清晰易于调试和维护。每个状态职责单一通过串口打印当前状态可以非常方便地观察小车在路口的行为逻辑是否正确。6. 调试技巧与常见问题排查理论终须实践检验。调试十字路口功能是智能车制作中最磨人但也最有成就感的环节之一。6.1 调试方法虚拟示波器与图像上位机这是最重要的工具。将摄像头二值化后的图像、识别出的中线、边线宽度、有效行数、路口标志位等关键数据实时发送到电脑上位机。你可以清晰地看到小车“眼中”的赛道是什么样子路口特征是否被正确捕捉。参数固化与微调先将小车放在十字路口前静态调试识别算法。调整宽度阈值、有效行数阈值等确保能稳定识别。然后进行低速动态测试重点调整“通过时间/距离”和“出口恢复”参数。分段测试不要一开始就追求全速通过。先确保低速如1m/s下能100%稳定通过再逐步提高速度每次提速后微调相关参数。6.2 常见问题与解决方案下表总结了我遇到过的典型问题及排查思路问题现象可能原因排查与解决方案在路口犹豫、画圈路口识别不稳定时而触发时而退出导致状态在NORMAL和IN_CROSS间反复横跳。1.检查识别条件是否过于敏感尝试将多个识别条件设为“与”逻辑或增加去抖机制连续多次检测到才触发。2.检查传感器数据上位机观察图像或电感值在路口是否干净、特征明显。可能需要优化图像二值化或电磁滤波参数。直冲出去不拐弯识别失败或识别后控制策略未生效。1.确认识别标志位通过串口打印确认在进入路口瞬间标志位是否置起。2.检查状态机是否成功从NORMAL状态切换到IN_CROSS状态3.检查控制输出在IN_CROSS状态下舵机或电机输出是否按预设策略改变了还是依然输出循迹计算值通过后剧烈摆动出口恢复循迹时偏差过大PD参数不适应。1.优化出口检测确保小车车身基本摆正后才恢复循迹避免在车身还有较大夹角时强行纠偏。2.调整恢复策略在EXIT_CROSS状态可以采用一段时间的“强P弱D”参数或使用“截线”算法快速减小横向偏差。斜入时切外圈压线保持的角度不对或路径规划不合理。1.校准进入角记录确保记录的是车身相对于赛道的前进方向而不是原始的舵机打角。2.引入路径规划尝试使用纯追踪算法在路口内追踪一个虚拟的前方点。3.提前调整在ENTER_CROSS状态不是直接锁定角度而是先进行一个小幅度的方向修正使车头更对准出口中心。电磁车在路口信号紊乱路口磁场复杂导致电感值跳变。1.加强软件滤波在路口识别和通过阶段对电感ADC值采用更强的滤波如增大滑动平均窗口。2.采用融合判断结合多个电感的数值和变化趋势进行综合判断而不是依赖单一条件。3.使用备用策略如果信号过于混乱可以短暂切换到基于编码器和陀螺仪的惯性导航通过。7. 性能优化与进阶思路当基础功能稳定后可以追求更快、更稳的通过性能。动态参数调整根据小车进入路口时的速度动态调整“通过时间”和“保持角度”。速度越快通过所需时间越短但惯性越大需要更精确的控制。预测与提前动作利用摄像头的前瞻性在距离路口还有一段距离时就提前识别出路口类型直行/转弯并开始进行速度规划如入弯减速和路径规划实现更平滑的过渡。多传感器融合对于要求极高的场景可以融合摄像头和电磁传感器。例如以摄像头识别为主用电磁信号在路口中心进行辅助定位和验证提高系统的鲁棒性。机器学习辅助识别对于更复杂的赛道元素如环岛、车库等可以尝试使用简单的机器学习分类算法如支持向量机SVM对提取的图像特征进行分类提高识别准确率。但这需要一定的数据处理和模型训练能力。十字路口的处理从最初的“必然翻车”到后来的“十拿九稳”这个过程让我深刻体会到智能车竞赛不仅仅是拼硬件和代码更是拼解决问题的系统化思维和耐心调试的工匠精神。每一个参数的背后可能都是数十次甚至上百次的测试与调整。当你看到小车以流畅的姿态稳稳穿过十字路口时那种成就感是无与伦比的。希望我的这些“踩坑”经验和实践总结能帮你少走一些弯路更快地征服这个经典的赛道元素。记住调试没有捷径上位机是你的眼睛数据是你的语言耐心是你最好的伙伴。