智能车竞赛调参血泪史:从串级PID到并行PID,我是如何让直立车‘稳如老狗’的

张开发
2026/5/6 13:03:46 15 分钟阅读
智能车竞赛调参血泪史:从串级PID到并行PID,我是如何让直立车‘稳如老狗’的
智能车竞赛调参血泪史从串级PID到并行PID我是如何让直立车稳如老狗的去年第一次参加智能车竞赛时我的直立车像个醉汉一样左摇右晃最夸张的一次直接冲出赛道撞翻了裁判的咖啡。经过三个月地狱式调参现在这辆车不仅能稳稳直立还能以2m/s的速度过弯不飘——这中间踩过的坑、熬过的夜、掉过的头发值得用万字长文记录下来。1. 直立车控制的核心PID到底在调什么很多人把PID简单理解为三个参数Kp、Ki、Kd的排列组合但真正理解每个环的物理意义才是调参的前提。我的第一版控制架构是这样的// 经典串级PID结构 void control_loop() { speed_pid_out pid_speed(target_speed, current_speed); angle_target speed_pid_out; // 速度环输出是角度目标 angle_pid_out pid_angle(angle_target, imu_angle); gyro_target angle_pid_out; // 角度环输出是角速度目标 pwm_output pid_gyro(gyro_target, imu_gyro); }这个结构最大的问题是环间耦合当车体需要转向时转向力矩会破坏直立平衡而直立环的调节又会干扰转向。那段时间我的车就像个蹒跚学步的孩子直行时勉强能站稳一转弯就摔得四脚朝天。关键认知串级PID各环的响应速度必须严格遵循内环外环的原则。实测表明角速度环的响应时间应该控制在5ms内角度环20ms速度环则可以放宽到100ms。2. 从串级到并行解耦的艺术在连续三天调参无果后我决定重构整个控制架构。并行PID的核心思想是将直立控制与转向控制分离左电机PWM 基础PWM 转向修正PWM 右电机PWM 基础PWM - 转向修正PWM具体实现时这两个PID通道需要完全独立调参。我的参数整定顺序是这样的先调直立通道只接角速度环内环Kp0.5, Ki12, Kd0加入角度环外环Kp25, Ki0, Kd0.8最后加速度环Kp0.3, Ki0.05, Kd0再调转向通道转向角速度环Kp1.2, Ki15, Kd0转向角度环Kp8, Ki0, Kd0.3实测对比数据指标串级PID并行PID直立稳态误差±3°±0.8°转向响应时间320ms180ms最大抗扰速度1.2m/s2.5m/s这个阶段最大的收获是发现角速度环必须Ki主导——如果像传统教程说的用P控制车体会有持续微幅振荡。后来用频域分析才发现电机本身的滞后特性需要积分项来补偿。3. 那些教科书不会告诉你的实战技巧在实验室能跑通的控制算法到了比赛现场可能完全失效。以下是几个用惨痛教训换来的经验IMU安装位置最初把陀螺仪放在车体中部结果电机振动导致噪声太大。后来改到电池上方并用硅胶垫隔离信噪比提升了40%PWM死区补偿当电机需要反向转动时发现车体会突然下坠。在代码中加入这个判断后问题解决if(pwm_direction_changed()) { apply_brake(20ms); // 先短时刹车 }动态参数调整直线行驶和过弯时需要不同的PID参数。我的方案是根据转向角速度动态调节实际Kp 基础Kp * (1 0.3*abs(转向角速度))最玄学的是轮胎气压——有次调了一周参数都不理想最后发现是轮胎慢漏气导致接地面积变化。现在我的工具箱里永远备着一个数字胎压计。4. 进阶当四环控制还不够用时在晋级全国赛后面对更复杂的赛道地形我尝试在角速度环内又加入了一个角加速度环速度环 - 角度环 - 角速度环 - 角加速度环这个四环结构的调试要点角加速度环的Ki要足够大我的设定值是30角速度环的Kd现在变得重要设为0.5需要更高精度的IMU采样率至少500Hz虽然调参难度指数级上升但效果也是显著的——在通过连续S弯时车体倾斜角的波动幅度从±8°降到了±3°。不过要提醒的是除非必要不建议新手贸然增加控制环数。5. 调试工具链的自我修养好的工具能让调参效率提升十倍。我的工作站配置包括实时曲线工具用JScope同时监控8个关键变量参数热更新通过无线串口即时调整PID值自动测试脚本批量运行不同参数组合并记录数据3D运动仿真在MATLAB里先做算法验证最有用的反而是个低成本改装在车顶加装激光笔黑暗环境中能直观看到车体晃动轨迹。这个方法帮我发现了传统传感器看不出的低频振荡。现在回头看那些凌晨三点的实验室最宝贵的不是奖杯而是深刻理解了一个道理PID调参不是数学而是工程——需要理论指导但最终要靠实验说话。下次如果你看到一辆智能车在赛道上稳如泰山别忘了它背后可能藏着上百次失败的参数组合。

更多文章