共计 2368 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:电赛小车的典型失效场景
在 2024 年电赛自动驾驶小车的开发过程中,我们遇到了几个典型的失效场景,这些问题直接影响小车的稳定性和比赛成绩。

-
光电传感器误判 :在强光环境下,光电传感器容易受到环境光干扰,导致赛道识别错误。特别是在赛道反光率较高时,误判率显著上升。
-
陀螺仪漂移 :长时间运行后,陀螺仪数据会出现漂移现象,导致姿态解算不准确,影响小车的路径规划和控制精度。
-
电机响应延迟 :在坡道工况下,电机响应速度不足,导致小车无法及时调整速度和方向,容易冲出赛道。
-
电池电压跌落 :锂电池在放电过程中电压会逐渐下降,尤其在高速运行时,电压跌落可能导致控制系统供电不足,引发意外停机。
技术选型:传感器方案的实时性与成本平衡
在选择传感器方案时,我们对比了 OpenCV+YOLO 视觉方案和激光雷达方案,以下是两者的优缺点分析:
- OpenCV+YOLO 视觉方案 :
- 优点:成本较低,适合预算有限的团队;能够识别复杂的赛道标志和障碍物。
-
缺点:实时性较差,处理延迟较高;受光照条件影响较大。
-
激光雷达方案 :
- 优点:实时性高,测距精度高;不受光照条件影响。
- 缺点:成本较高,对硬件资源要求较高。
基于以上分析,我们给出了传感器选型矩阵,供团队参考:
| 方案 | 实时性 | 成本 | 环境适应性 |
|---|---|---|---|
| OpenCV+YOLO | 中 | 低 | 中 |
| 激光雷达 | 高 | 高 | 高 |
核心实现:数据融合与控制算法
基于互补滤波的 IMU 数据融合算法
IMU(惯性测量单元)是小车姿态解算的核心传感器,但其数据存在噪声和漂移问题。我们采用互补滤波算法,结合加速度计和陀螺仪的数据,实现高精度的姿态解算。以下是 C 语言代码片段:
// 互补滤波算法实现
float complementaryFilter(float accelAngle, float gyroRate, float dt) {
const float alpha = 0.98; // 滤波系数
static float angle = 0.0;
angle = alpha * (angle + gyroRate * dt) + (1 - alpha) * accelAngle;
return angle;
}
动态 PID 参数调节在坡道工况下的实现逻辑
在坡道工况下,小车的负载变化较大,固定的 PID 参数无法满足控制需求。我们实现了动态 PID 参数调节功能,根据小车的实时状态调整 PID 参数。以下是实现逻辑:
-
坡度检测 :通过 IMU 数据检测当前坡度,判断是否为坡道工况。
-
参数调整 :根据坡度大小,动态调整 PID 的比例、积分和微分参数。例如,上坡时增加比例参数,提高电机响应速度。
-
参数平滑过渡 :为避免参数突变导致控制不稳定,采用平滑过渡算法,逐步调整参数至目标值。
避坑指南:常见问题与解决方案
电机 PWM 死区设置对控制精度的影响
PWM 死区时间是电机控制中的重要参数,设置不当会导致电机响应延迟或抖动。我们通过示波器观察 PWM 波形,优化死区时间设置。以下是优化后的 STM32 寄存器配置代码:
// STM32 PWM 死区设置
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 500; // 占空比 50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
// 设置死区时间
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = 0x10; // 死区时间设置
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
锂电池电压跌落时的应急处理策略
锂电池电压跌落是小车运行中的常见问题,尤其是在高速运行时。我们采取了以下应急处理策略:
-
电压监测 :实时监测电池电压,当电压低于阈值时,触发应急处理程序。
-
降速运行 :降低电机转速,减少电流消耗,延长电池续航时间。
-
紧急停车 :当电压过低时,立即停车并发出警报,避免电池过放损坏。
性能验证:实测数据与分析
我们在 8 字赛道上进行了多次测试,记录了平均圈速和定位误差等数据。以下是实测结果:
-
平均圈速 :在优化后的控制算法下,小车的平均圈速为 15 秒,较优化前提升了 20%。
-
定位误差 :通过互补滤波算法,小车的定位误差控制在±2cm 以内,满足了比赛要求。
-
稳定性测试 :在连续运行 10 圈后,小车未出现明显的控制偏差或失效现象。
开放性问题
在赛道反光率 >70% 时,光电管阵列的标定方法需要重新调整。我们抛出一个开放性问题供大家思考: 当赛道反光率 >70% 时,光电管阵列应如何重新标定?
欢迎在评论区分享你的解决方案和经验!
