第一次接触智能车控制是在2015年的全国大学生智能车竞赛上,当时我们团队的小车在直道上跑得飞快,但一到弯道就各种"蛇形走位"。后来才发现,问题出在控制算法上——我们简单套用了教科书上的PID参数,结果完全不适合实际赛道。这也让我意识到,PID控制看似简单,但要用好却需要大量实战经验。
PID控制(比例-积分-微分控制)是智能车运动控制中最基础也最核心的算法。它的核心思想是通过三个环节的配合来消除系统误差:
在智能车应用中,PID控制主要解决两个核心问题:
PID控制器的标准形式可以用微分方程表示:
u(t) = K_p e(t) + K_i ∫e(t)dt + K_d de(t)/dt
其中:
在实际智能车应用中,我们常用离散化的增量式PID:
Δu(k) = K_p[e(k)-e(k-1)] + K_i e(k) + K_d[e(k)-2e(k-1)+e(k-2)]
这种形式计算量小,且不会产生积分饱和问题。我在STM32F4上的实测表明,即使10kHz的控制频率,计算耗时也不超过50μs。
参数整定是PID应用的核心难点。经过多次比赛验证,我总结出以下实用方法:
临界比例法(Ziegler-Nichols)
试凑法优化流程
c复制// 典型调试步骤示例
void tunePID() {
set_Kp(0.5); // 先设较小P值
while(1) {
observeResponse();
if(overshoot > 20%) {
reduce_Kp(10%);
increase_Kd(20%);
}
else if(settling_time > 1s) {
increase_Ki(15%);
}
delay(1000);
}
}
自整定算法实现
现代智能车常采用自适应PID,如模糊PID。其核心是通过误差和误差变化率动态调整参数:
c复制// 模糊规则片段
if (error is PB && delta_error is NS) {
Kp = Kp_table[5][3];
Ki = Ki_table[5][3];
Kd = Kd_table[5][3];
}
速度控制直接影响加速性能和能耗。我们的冠军车方案采用双闭环结构:
关键参数经验值(针对370电机):
| 参数 | 范围 | 影响效果 |
|---|---|---|
| Kp_speed | 80-120 | 加速响应速度 |
| Ki_speed | 0.1-0.5 | 消除稳态误差 |
| Kd_speed | 300-500 | 抑制过冲 |
重要提示:电机参数差异很大,建议先用示波器捕获反电动势波形确定电机特性
方向控制需要处理图像处理延迟和机械滞后。我们开发了"预测PID"方法:
典型问题解决方案:
我们测试过多种MCU的PID性能:
| 型号 | 主频 | 计算延时 | 适用场景 |
|---|---|---|---|
| STM32F103 | 72MHz | 120μs | 基础组别 |
| STM32F407 | 168MHz | 45μs | 摄像头组 |
| K66 | 180MHz | 30μs | 高速组 |
| ESP32 | 240MHz | 150μs | 无线调试 |
速度检测精度直接影响控制效果:
实测表明,对于1:3减速比的电机,至少需要500线编码器才能保证低速(<0.2m/s)控制稳定。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机抖动 | Kp过大或Kd过小 | 减小Kp 20%,增大Kd 50% |
| 速度跟踪滞后 | Ki不足或采样周期过长 | 增大Ki,缩短控制周期至5ms |
| 转向过冲 | 微分项噪声大 | 加入10-20Hz低通滤波 |
| 直道偏移 | 机械不对称或I累积误差 | 加入误差清零机制 |
我们的调试工具箱通常包含:
高阶方案常采用分层PID结构:
这种结构的通信延迟需要特别注意。我们采用CAN总线可以保证1ms内的同步精度。
最新尝试是用强化学习自动优化参数:
python复制# 伪代码示例
def reward_function(params):
set_pid_params(params)
run_test_lap()
return -abs(tracking_error) - 0.1*control_effort
ppo.learn(reward_function,
param_ranges=[(0,200),(0,1),(0,1000)])
实测这种方法能找到人工难以发现的参数组合,但需要数千次迭代训练。
在2023年比赛中,我们通过以下PID策略获得优势:
关键数据记录:
这些优化使圈速提升了12%,同时电池续航延长了15%。