2024电子设计竞赛自动驾驶小车寻迹抖动问题分析与PID控制优化

1次阅读
没有评论

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

image.webp

现象观察:红外信号的噪声之谜

第一次用示波器抓取红外对管信号时,我看到的波形像心电图一样疯狂跳动。明明小车在直线赛道上,ADC 读数却在±200 范围内波动(12 位分辨率下),这种噪声直接导致电机频繁正反转,车子走起来像喝醉了一样左右摇摆。

2024 电子设计竞赛自动驾驶小车寻迹抖动问题分析与 PID 控制优化

通过频谱分析仪可以看到两个主要干扰源:

  • 50Hz 工频干扰(来自实验室供电系统)
  • 200-300Hz 的高频噪声(电机碳刷火花导致)

三大解决方案实战对比

1. 纯阈值判断法:简单但危险

if(adc_left > threshold) turn_right();
else if(adc_right > threshold) turn_left();
  • 优点:代码简单,不占资源
  • 致命缺陷:在阈值附近会剧烈震荡,实测抖动幅度达±5cm

2. 加权滑动平均滤波:有所改善但不够

// 5 点加权平均滤波示例
int filtered_val = (last_val[0]*3 + last_val[1]*2 + last_val[2]*1) / 6;
  • 响应速度比普通平均滤波快 20%
  • 但机械延迟导致的过冲依然存在,直角弯容易冲出赛道

3. PID 控制:最终选择的方案

重点说说微分项的神奇作用:当检测到赛道突然左拐时,微分项会立即给出一个反向制动信号,提前抵消小车的惯性摆动。这就像老司机过弯时会提前收油门一样自然。

Arduino 代码全解析

红外信号预处理(带死区的环形缓冲)

#define BUFFER_SIZE 8
int adc_buffer[BUFFER_SIZE];
int buffer_index = 0;

int get_filtered_adc(int raw_adc) {
  // 更新环形缓冲区
  adc_buffer[buffer_index] = raw_adc;
  buffer_index = (buffer_index + 1) % BUFFER_SIZE;

  // 死区过滤微小波动
  if(abs(raw_adc - last_val) < DEAD_ZONE) 
    return last_val;

  // 计算中位数
  int temp[BUFFER_SIZE];
  memcpy(temp, adc_buffer, sizeof(temp));
  bubble_sort(temp); // 省略排序实现
  return temp[BUFFER_SIZE/2];
}

时间复杂度:O(n) 排序,但对小规模数据完全可接受

增量式 PID 核心算法

// 匈牙利命名法:b_表示布尔型,f_表示浮点型
float f_PID_Control(float fCurrentError) {
  static float fLastError = 0, fIntegral = 0;

  // 比例项:当前偏差
  float fProportional = fKp * fCurrentError;

  // 积分项:历史偏差累积(带抗饱和)fIntegral += fKi * fCurrentError;
  fIntegral = constrain(fIntegral, -fMaxIntegral, fMaxIntegral);

  // 微分项:变化趋势预测
  float fDerivative = fKd * (fCurrentError - fLastError);
  fLastError = fCurrentError;

  return fProportional + fIntegral + fDerivative;
}

实战测试数据

赛道材质 最大抖动幅度 (cm) 恢复时间 (ms)
白纸 0.8 120
木地板 1.5 200
磨砂玻璃 2.1 300

直角弯测试时,传统方法平均偏移 15cm,PID 控制可将偏差控制在 5cm 内。

六个血泪教训

  1. 传感器离地高度保持在 1.5-2cm 最佳,间距建议等于赛道黑线宽度
  2. 锂电池电压从 8.4V 降到 7V 时,需动态调整 PWM 最大值:
    pwm_max = map(analogRead(VOLTAGE_PIN), 0, 1023, 200, 255);
  3. 遇到长直道时,积分项会累积过大,必须加入 clamping 限制
  4. 电机两端一定要并联续流二极管!我们烧过 3 个 L298N 才明白
  5. 差分安装红外对管(一前一后)可提前感知弯道趋势
  6. 轮胎打滑时,可以临时增大微分系数抑制振荡

进阶思考

当赛道出现交叉线时,单纯依靠红外会完全失效。这时候 MPU6050 的角速度数据就能帮大忙——通过记录小车的历史转向习惯,可以预测下一秒可能的路径走向。比如连续左转 300ms 后,突然丢失黑线,大概率需要继续左转寻找新路径。

这个方案我们正在试验中,感兴趣的可以一起探讨如何融合多传感器数据。下次准备尝试用卡尔曼滤波来优化,不过那是另一个复杂的故事了 …

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