1. 项目概述智能车竞赛中的“右圆环”挑战在智能车竞赛的赛场上环岛元素一直是检验车辆感知与控制算法综合能力的“硬骨头”。不同于简单的直道和弯道环岛要求智能车不仅要识别出特殊的道路结构更要精确判断入口、行驶路径和出口完成一个完整的绕行。而“右圆环”特指需要车辆从环岛右侧入口驶入并沿逆时针方向绕行的环岛类型。这听起来似乎只是方向问题但在实际比赛中它带来的挑战是全方位的感知上需要区分环岛与普通弯道、十字路口决策上需要规划出平滑的入环、贴边行驶和出环轨迹控制上则要求电机和舵机在连续变化的曲率下保持稳定。很多队伍在直道上风驰电掣却往往在环岛前“翻车”或“迷路”问题根源大多在于对环岛元素的判断逻辑不够鲁棒。今天我们就来深入拆解“右圆环”的判断逻辑分享一套经过实战检验的、从传感器数据处理到最终决策输出的完整方案。2. 核心思路与传感器选型解析2.1 为什么传统“边线追踪”在环岛会失效大多数基础智能车采用电感、摄像头或激光雷达进行边线或中线追踪。在直道和普通弯道这套逻辑运行良好传感器检测到道路边缘的偏移控制器计算出转向角进行纠正。然而当车辆接近环岛时道路几何形状发生了根本性变化。首先道路宽度突变。环岛入口处道路通常会显著变宽形成一个“喇叭口”。对于只追踪单边线或中线的算法它会突然发现“路变宽了”如果处理不当可能会误判为需要大幅转向以寻找消失的边线导致车辆冲出去。其次曲率不连续。从直道接入环岛圆弧路径曲率会发生跳变。简单的PID控制器若参数针对直道优化在曲率突变时极易产生超调或振荡导致车辆在环岛入口处画龙甚至甩尾。最后出口判断困难。车辆绕行环岛一周后需要准确识别出口并果断驶离。如果仅依靠边线很难区分“即将到来的出口”和“环岛的另一段圆弧”容易导致车辆在环岛内无限绕圈或者提前误出环。因此处理环岛的核心思路必须从简单的“线追踪”升级为“元素识别与状态机管理”。我们需要让智能车“知道”自己正在接近一个环岛正在环岛内行驶以及即将离开环岛。2.2 传感器方案对比与选型考量针对环岛识别常见的传感器方案有摄像头、电磁电感、激光雷达Lidar和红外对管阵列。每种方案都有其优劣选择取决于比赛规则、成本和对环境的要求。1. 摄像头方案原理通过CMOS或CCD传感器采集赛道图像进行灰度化、二值化、边缘检测等处理提取赛道左右边线和中线。优势信息丰富能直观“看到”环岛的完整形状理论上最容易实现环岛特征的识别如识别环岛中心的圆斑、圆弧的连续性。劣势受光照影响极大。室外赛阳光直射、阴影、黄昏时光线变化都是巨大挑战。图像处理算法复杂计算量大对主控MCU性能要求高。在高速情况下图像拖影也会影响判断。环岛判断适用性高。可以直接通过图像识别环岛入口的“八字形”展开、环岛圆弧的曲率特征。2. 电磁电感方案原理赛道中心线下埋有通有20kHz~100kHz交流电的导线车上的电感线圈通过电磁感应检测磁场强度从而确定车辆相对于导线的位置。优势不受光照影响稳定性极高。电路相对简单成本较低。是智能车竞赛中最经典、最成熟的方案之一。劣势获得的是“点”信息每个电感一个电压值而非“面”信息。无法直接“看到”环岛形状必须通过多个电感值的组合与变化规律来间接推断。环岛判断适用性中。需要精心设计电感排布如水平电感、垂直电感、斜电感和算法通过电感值的变化模式如某一侧电感值突然剧增然后衰减来特征化环岛。3. 激光雷达方案原理通过发射激光束并接收反射来测量周围物体的距离生成点云图。优势测距精确能直接获取赛道边界的三维信息不受电磁和光照干扰。劣势成本高昂数据处理极其复杂点云分割、聚类、拟合对计算资源消耗巨大在低成本嵌入式平台上难以实时运行。且容易受雨雾、强光影响。环岛判断适用性理论上高但实际在竞赛中因复杂度和成本较少采用。4. 红外对管/灰度传感器阵列原理一排红外发射接收管照射地面根据黑线低反射率和白底高反射率返回的模拟电压值判断黑线位置。优势简单、直接、响应快成本极低。劣势探测距离短受地面反光影响。同样获得的是“线”信息需要从多个传感器的状态组合推断道路形状。环岛判断适用性中。类似于电感方案需要从传感器阵列的状态跳变中总结环岛特征。实操心得对于绝大多数参赛队伍尤其是新手电磁电感方案是平衡稳定性、成本和实现难度的最佳选择。它避免了摄像头令人头疼的光照问题其信号特征虽然抽象但一旦摸清规律非常可靠。下文我们将主要基于电磁电感方案来阐述“右圆环”的判断逻辑。2.3 我们的方案多电感融合与有限状态机FSM我们最终确定的方案核心是使用多个不同角度安装的电感线圈采集其幅值信号经过AD转换和归一化处理提取特征值。然后设计一个有限状态机Finite State Machine, FSM让车辆在“直道/弯道”、“环岛入口”、“环岛内行驶”、“环岛出口”这几个状态间清晰切换每个状态对应不同的控制策略。具体来说我们会在车头布置至少4个电感左前水平电感L1主要检测左边线。右前水平电感R1主要检测右边线。左前斜电感L2向左前方倾斜约45度安装用于提前感知左前方的道路变化是识别右圆环入口的关键。右前斜电感R2向右前方倾斜45度安装用于辅助判断和抗干扰。通过L1和R1的差值我们可以进行常规的PD控制。而L2和R2的数值变化则是我们判断特殊元素如环岛、十字的“侦察兵”。3. 右圆环的特征提取与判断逻辑实现3.1 电感信号在右圆环前的典型变化规律要判断首先要定义“什么是右圆环的信号特征”。我们通过反复在赛道上测试记录车辆以不同速度、不同位置接近和通过右圆环时各个电感值的变化曲线总结出以下规律阶段一接近环岛直道末端车辆在直道上行驶即将到达右圆环入口。此时赛道向右前方车辆的右前方展开。L1左水平值较小且稳定因为左边线距离较远。R1右水平值较大且稳定车辆正跟踪右边线。关键信号 L2左斜其值会开始出现一个缓慢而持续的增长。这是因为左斜电感指向左前方随着车辆接近环岛其指向的方向逐渐从赛道外空地指向了环岛外侧的圆弧距离导线越来越近。R2右斜其值可能因为赛道向右展开而略有下降或波动但不是主要特征。阶段二进入环岛入口车辆开始右转驶入环岛。此时右边线也是环岛外圈的曲率中心在车辆左侧。L1值开始增加因为车辆右转左边线此时变为环岛的内圈或远侧相对靠近。R1值达到一个峰值后可能开始下降因为车辆正在切入环岛与初始右边线的角度关系改变。关键信号 L2其值急剧上升并达到一个全局最大值。这是因为此时左斜电感几乎正对着环岛外侧的圆弧距离最近。这个峰值是触发“环岛入口”判断的黄金标志。R2值可能降至很低。阶段三环岛内贴边行驶车辆成功入环并开始沿环岛外侧右侧逆时针绕行。目标是保持一个固定的较小距离贴着环岛外圈行驶。L1保持一个相对稳定、中等偏大的值对应与环岛内圈的距离。R1需要控制其稳定在一个目标值这个目标值比直道跟踪时的值要小代表我们允许车辆更靠近外圈但不能撞上。L2和R2两者的值会进入一个动态平衡状态随着车辆在圆弧上的位置变化而周期性波动但幅度小于入口阶段。阶段四寻找并驶出环岛出口绕行接近一周需要识别出口并驶离。出口可以看作是环岛圆弧的一个“断点”。关键信号 R1在持续跟踪环岛外圈的过程中R1值会突然出现一个陡降。这是因为出口处原本连续的外圈导线中断了车辆右侧突然“空旷”了。辅助信号 L1和摄像头/其他传感器R1的陡降需要结合其他信息确认防止误判例如因颠簸产生的信号抖动。可以用L1值是否同步发生特定变化或者用额外的传感器如一个朝向右前方的电感来检测出口处是否存在“向前延伸”的直道导线。3.2 有限状态机FSM的设计与实现基于以上特征我们设计一个四状态有限状态机状态 NORMAL正常行驶默认状态。执行普通的PD控制跟踪赛道边线。持续监控L2的值。进入条件上电初始化或从其他状态完成转换后。退出条件当L2值持续增长超过一个阈值L2_ENTER_THRESHOLD并且维持一定时间防抖动则触发EVENT_IN_APPROACH进入APPROACH状态。状态 APPROACH接近环岛确认可能正在接近环岛车辆控制可以加入轻微的预调整如提前减速。进入条件收到EVENT_IN_APPROACH事件。监控重点持续监控L2值。若L2值开始从上升转为下降且下降前达到一个更高的峰值阈值L2_PEAK_THRESHOLD则触发EVENT_IN_ENTRY。退出条件误判回退如果一段时间内L2值没有达到峰值反而回落至低水平则可能是误判如弯道触发EVENT_FALSE_ALARM回到NORMAL状态。状态 IN_LOOP环岛内行驶确认已进入环岛。切换控制模式为“环岛内贴边控制”。进入条件收到EVENT_IN_ENTRY事件。控制策略不再使用普通的PD跟踪。改为设定一个环岛内目标距离例如让R1值等于LOOP_TARGET_VALUE通过一个独立的环岛专用PID控制器进行调节。同时开始一个软件计时器或通过编码器记录绕行距离。监控重点持续监控R1值并检查绕行是否已超过一定角度如270度防止在出口前过早触发。退出条件当绕行角度满足条件且R1值发生陡降低于EXIT_THRESHOLD时触发EVENT_FIND_EXIT进入EXIT状态。状态 EXIT驶出环岛识别到出口执行出环动作。进入条件收到EVENT_FIND_EXIT事件。控制策略执行一个“出环补线”策略。由于出口处右边线消失车辆需要根据历史路径或惯性主动向左打一个固定角度并持续一小段时间确保车头对准出口直道。同时切换传感器主导权例如从R1切回L1和R1差值控制。退出条件出环补线动作完成且车辆传感器重新稳定检测到正常的直道或弯道特征触发EVENT_EXIT_DONE回到NORMAL状态。// 状态机伪代码示例 typedef enum { STATE_NORMAL, STATE_APPROACH, STATE_IN_LOOP, STATE_EXIT } CarState_t; typedef enum { EVENT_IN_APPROACH, EVENT_IN_ENTRY, EVENT_FIND_EXIT, EVENT_EXIT_DONE, EVENT_FALSE_ALARM } CarEvent_t; CarState_t current_state STATE_NORMAL; void state_machine_handler(CarEvent_t event) { switch(current_state) { case STATE_NORMAL: if(event EVENT_IN_APPROACH) { current_state STATE_APPROACH; // 执行接近环岛的预处理如减速 speed_target LOOP_APPROACH_SPEED; } break; case STATE_APPROACH: if(event EVENT_IN_ENTRY) { current_state STATE_IN_LOOP; // 切换为环岛内控制模式 control_mode LOOP_MODE; loop_enter_angle get_motor_encoder(); // 记录入环角度 } else if(event EVENT_FALSE_ALARM) { current_state STATE_NORMAL; speed_target NORMAL_SPEED; } break; case STATE_IN_LOOP: if(event EVENT_FIND_EXIT) { current_state STATE_EXIT; // 执行出环动作 steer_output EXIT_STEER_ANGLE; // 固定舵机打角 start_exit_timer(); } break; case STATE_EXIT: if(event EVENT_EXIT_DONE) { current_state STATE_NORMAL; control_mode NORMAL_MODE; steer_output pd_control_calculate(); // 回归PD控制 } break; } } // 在主循环中根据传感器数据判断并触发事件 void main_loop() { // ... 读取电感值 AD_L2, AD_R1 ... // ... 计算滤波后的值 L2_filtered, R1_filtered ... // 判断逻辑 switch(current_state) { case STATE_NORMAL: if(L2_filtered L2_ENTER_THRESHOLD sustain_time TIME_DEBOUNCE) { state_machine_handler(EVENT_IN_APPROACH); } break; case STATE_APPROACH: if(L2_filtered L2_PEAK_THRESHOLD) { peak_detected true; } if(peak_detected L2_filtered L2_PEAK_THRESHOLD * 0.8) { state_machine_handler(EVENT_IN_ENTRY); } // 超时回退 if(approach_timer APPROACH_TIMEOUT) { state_machine_handler(EVENT_FALSE_ALARM); } break; case STATE_IN_LOOP: current_angle get_motor_encoder() - loop_enter_angle; if(current_angle MIN_LOOP_ANGLE R1_filtered EXIT_THRESHOLD) { state_machine_handler(EVENT_FIND_EXIT); } break; case STATE_EXIT: if(exit_timer_finished() is_on_normal_track()) { state_machine_handler(EVENT_EXIT_DONE); } break; } // ... 根据 current_state 和 control_mode 执行相应的控制计算 ... }4. 控制策略的切换与参数整定4.1 不同状态下的控制律设计状态机解决了“何时做什么”的问题而每个状态下的“怎么做”则依赖于对应的控制策略。NORMAL状态使用经典的PD控制。误差error 目标位置 - 当前电感偏移量。输出steer Kp * error Kd * d_error。这里的Kp和Kd需要针对直道和普通弯道进行调优保证高速稳定性。APPROACH状态可以在PD控制的基础上引入一个前馈量或直接降低目标速度。例如speed_target * 0.7。目的是让车辆以更稳妥的速度进入环岛避免因速度过快在入口处失控。IN_LOOP状态这是控制的核心切换。我们不再追踪动态的中线而是追踪一个固定的环岛内偏移量。设定目标我们的目标是让R1电感的值稳定在LOOP_TARGET_VALUE。这个值需要通过实验确定让车在环岛内手动控制到一个你觉得距离外圈合适的位置记录下此时R1的AD值这就是目标值。独立PID为此目标值单独设计一组PID参数Kp_loop, Ki_loop, Kd_loop。误差loop_error LOOP_TARGET_VALUE - AD_R1。转向输出steer Kp_loop * loop_error Ki_loop * sum_error Kd_loop * d_error。速度控制环岛内速度不宜过高。可以设定一个固定的环岛速度LOOP_SPEED或者根据环岛曲率动态微调。EXIT状态采用开环控制或简化的PD控制。开环打角在触发出口事件的瞬间直接给舵机一个固定的左打角值EXIT_STEER_ANGLE并保持一定时间EXIT_HOLD_MS。这个角度和时间需要实验确保车辆能平滑切出环岛对准出口直道。快速切换在出环动作执行后半段或完成后迅速将控制权交还给NORMAL状态的PD控制器利用其自适应性重新捕获直道。4.2 关键参数整定经验与避坑指南参数整定是算法落地最耗时的一环。以下是一些关键参数的经验值范围和调试技巧参数名含义经验范围/调试方法注意事项L2_ENTER_THRESHOLD触发接近环岛的L2阈值约为直道时L2平均值的1.5~2倍。设太低易误触发弯道误判设太高可能导致入环判断滞后。L2_PEAK_THRESHOLD确认环岛入口的L2峰值阈值约为L2_ENTER_THRESHOLD的1.2~1.5倍。必须确保是明显的峰值可结合“上升后下降”的拐点判断。LOOP_TARGET_VALUE环岛内R1电感的目标AD值通过实验确定。通常比直道跟踪时R1的值小100~300取决于AD范围。目标值决定了车辆离环岛外圈多近。太小会撞太大会切内圈。Kp_loop, Kd_loop环岛内控制的PD参数Kp_loop通常比正常Kp大因为环岛内需要更灵敏的纠偏。Kd_loop可以适当减小以抑制振荡。务必单独调试不要套用正常PD参数。先在低速下让车在环岛内跑调稳后再提速。MIN_LOOP_ANGLE最小绕行角度防误出至少270度对应3/4圈。可以用编码器脉冲数或陀螺仪积分角度表示。确保车辆不会刚进去就误认为找到出口。EXIT_THRESHOLD触发出口的R1下降阈值约为环岛内R1平均值的50%~70%。需要配合MIN_LOOP_ANGLE使用。可加入短时滤波防止信号毛刺误触发。EXIT_STEER_ANGLE出环固定打角值一个左打角值例如-30具体看舵机极性。需要和EXIT_HOLD_MS配合调试。角度太小出不去太大会甩尾。EXIT_HOLD_MS出环打角保持时间200ms ~ 500ms与车速强相关。时间太短车头还没转出去就切回PD控制容易回环。时间太长会冲向左边的赛道外。避坑指南电感安装位置是基础斜电感L2的角度和高度需要反复试验。角度太陡信号变化不明显太平提前量不够。一般与水平面呈30-60度角为宜。信号滤波至关重要原始的AD值噪声很大必须滤波。推荐使用一阶滞后滤波或滑动平均滤波。filtered_val alpha * raw_val (1-alpha) * last_filtered_val。alpha取值0.1~0.3在响应速度和平滑度间取舍。防误判机制所有阈值判断都要加延时去抖。例如L2超过阈值后持续20ms才认为事件有效。出口判断可以要求R1低于阈值连续3个采样周期。速度与控制的耦合高速下一切都会变得困难。环岛入口速度一定要降下来。可以设计速度规划距离环岛一定距离开始减速入环后保持低速出环后再加速。离线数据分析用蓝牙或无线模块将关键电感数据L2, R1和状态机状态实时发送到电脑上位机绘制曲线。这是调试的“眼睛”能直观看到信号特征和状态切换点是否准确。5. 系统集成、调试与实战问题排查5.1 软件架构与模块化设计一个健壮的系统需要清晰的架构。建议将程序模块化传感器驱动层(sensor.c/.h)负责ADC采样、滤波、计算各电感归一化后的值。特征提取层(feature.c/.h)从处理后的传感器数据中计算用于判断的特征量如L2的斜率、R1的下降沿。决策层状态机(decision.c/.h)包含状态机实现和事件判断逻辑输出当前车辆状态和目标控制模式。控制层(control.c/.h)根据决策层输出的状态和模式选择相应的控制算法正常PD、环岛PID、出环开环计算舵机和电机输出。执行层(actuator.c/.h)负责PWM输出控制舵机和电机。调试与日志层(debug.c/.h)实现数据通过串口发送用于上位机绘图。5.2 实地调试流程实录调试环岛功能必须上赛道。流程如下静态标定车放赛道上手动推到环岛入口、环岛内、出口等关键位置通过调试助手观察并记录各电感值初步确定阈值。单步测试手动推车关闭电机手动缓慢推车走过整个右圆环路径。观察上位机曲线验证L2峰值、R1下降等特征是否出现状态机切换是否按预期进行。这是成本最低、最有效的逻辑验证方法。低速闭环测试以很低的速度如0.3m/s让车自动跑。重点关注能否稳定进入环岛环岛内是否贴边能否找到并驶出出口根据问题调整阈值和PID参数。中高速测试逐步提高速度。速度提升后可能会出现新的问题入口判断晚了导致撞外圈、环岛内振荡、出环过冲等。此时需要回头调整速度规划、控制参数以及状态判断的延时参数。压力测试在不同起始位置偏左、偏右、不同速度下反复测试确保成功率在95%以上。尝试在环岛前放置其他元素如坡道测试抗干扰能力。5.3 常见问题与排查技巧速查表现象可能原因排查与解决思路根本进不了环岛在入口处直冲出去。1.L2_ENTER_THRESHOLD太高。2. 状态未及时切换到IN_LOOP。3. 入环速度太快控制响应不过来。1. 降低L2_ENTER_THRESHOLD或检查L2电感安装是否合理。2. 检查状态机逻辑确保EVENT_IN_ENTRY能被正确触发。3. 在APPROACH状态大幅减速。入环后撞外圈或切内圈1.LOOP_TARGET_VALUE设置不当。2. 环岛内PID参数 (Kp_loop) 不合适。3. 入环瞬间舵机响应太猛。1. 重新标定LOOP_TARGET_VALUE。2. 调大Kp_loop使响应更快或加入前馈。3. 检查从APPROACH到IN_LOOP切换时舵机输出是否平滑过渡。在环岛内画龙振荡环岛内PID微分项 (Kd_loop) 太小或太大。适当增加Kd_loop以抑制振荡。如果增加后系统变迟钝可能是Kp_loop太大需综合调整。提前出环未满一圈就出去1.MIN_LOOP_ANGLE设置太小。2.EXIT_THRESHOLD太高易误触发。3. 环岛内R1信号有波动。1. 增大MIN_LOOP_ANGLE。2. 降低EXIT_THRESHOLD。3. 对R1信号进行更强的滤波。错过出口在环岛里绕圈1.EXIT_THRESHOLD太低。2. R1下降沿不明显可能因为车速慢或贴外圈不紧。3. 出环打角EXIT_STEER_ANGLE太小或保持时间EXIT_HOLD_MS太短。1. 适当提高EXIT_THRESHOLD。2. 确保环岛内控制稳定使R1值维持在较高水平这样下降才明显。3. 增大出环打角和/或保持时间。出环后左右摇摆无法稳定出环动作结束后切换回正常PD控制的时机或参数不当。1. 延长出环开环控制的时间让车体更充分地进入直道再切换。2. 切换后暂时使用一组更“柔和”的PD参数待稳定后再恢复激进参数。偶尔误判弯道为环岛L2_ENTER_THRESHOLD太低或去抖时间太短。提高阈值增加判断的持续时长要求。可以增加辅助判断例如同时检测R1的变化模式是否与环岛特征相符。调试是一个“观察-假设-调整-验证”的循环。务必善用数据可视化工具将传感器数据和状态信息实时图形化这是快速定位问题的关键。每一个参数的调整都要理解其物理意义和对系统的影响避免盲目试错。最后智能车的稳定性是调出来的更是测出来的大量的重复测试是成功的唯一捷径。