2024年电赛自动驾驶小车:从传感器融合到控制算法的全栈技术解析

1次阅读
没有评论

共计 2368 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点:电赛小车的典型失效场景

在 2024 年电赛自动驾驶小车的开发过程中,我们遇到了几个典型的失效场景,这些问题直接影响小车的稳定性和比赛成绩。

2024 年电赛自动驾驶小车:从传感器融合到控制算法的全栈技术解析

  1. 光电传感器误判 :在强光环境下,光电传感器容易受到环境光干扰,导致赛道识别错误。特别是在赛道反光率较高时,误判率显著上升。

  2. 陀螺仪漂移 :长时间运行后,陀螺仪数据会出现漂移现象,导致姿态解算不准确,影响小车的路径规划和控制精度。

  3. 电机响应延迟 :在坡道工况下,电机响应速度不足,导致小车无法及时调整速度和方向,容易冲出赛道。

  4. 电池电压跌落 :锂电池在放电过程中电压会逐渐下降,尤其在高速运行时,电压跌落可能导致控制系统供电不足,引发意外停机。

技术选型:传感器方案的实时性与成本平衡

在选择传感器方案时,我们对比了 OpenCV+YOLO 视觉方案和激光雷达方案,以下是两者的优缺点分析:

  1. OpenCV+YOLO 视觉方案
  2. 优点:成本较低,适合预算有限的团队;能够识别复杂的赛道标志和障碍物。
  3. 缺点:实时性较差,处理延迟较高;受光照条件影响较大。

  4. 激光雷达方案

  5. 优点:实时性高,测距精度高;不受光照条件影响。
  6. 缺点:成本较高,对硬件资源要求较高。

基于以上分析,我们给出了传感器选型矩阵,供团队参考:

方案 实时性 成本 环境适应性
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 参数。以下是实现逻辑:

  1. 坡度检测 :通过 IMU 数据检测当前坡度,判断是否为坡道工况。

  2. 参数调整 :根据坡度大小,动态调整 PID 的比例、积分和微分参数。例如,上坡时增加比例参数,提高电机响应速度。

  3. 参数平滑过渡 :为避免参数突变导致控制不稳定,采用平滑过渡算法,逐步调整参数至目标值。

避坑指南:常见问题与解决方案

电机 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);

锂电池电压跌落时的应急处理策略

锂电池电压跌落是小车运行中的常见问题,尤其是在高速运行时。我们采取了以下应急处理策略:

  1. 电压监测 :实时监测电池电压,当电压低于阈值时,触发应急处理程序。

  2. 降速运行 :降低电机转速,减少电流消耗,延长电池续航时间。

  3. 紧急停车 :当电压过低时,立即停车并发出警报,避免电池过放损坏。

性能验证:实测数据与分析

我们在 8 字赛道上进行了多次测试,记录了平均圈速和定位误差等数据。以下是实测结果:

  1. 平均圈速 :在优化后的控制算法下,小车的平均圈速为 15 秒,较优化前提升了 20%。

  2. 定位误差 :通过互补滤波算法,小车的定位误差控制在±2cm 以内,满足了比赛要求。

  3. 稳定性测试 :在连续运行 10 圈后,小车未出现明显的控制偏差或失效现象。

开放性问题

在赛道反光率 >70% 时,光电管阵列的标定方法需要重新调整。我们抛出一个开放性问题供大家思考: 当赛道反光率 >70% 时,光电管阵列应如何重新标定?

欢迎在评论区分享你的解决方案和经验!

正文完
 0
评论(没有评论)