资讯动态

别再只会调PID了!聊聊MPC和LQR在自动驾驶小车里的实战选择

发布时间:2026/10/2 13:54:33 来源:尧图企业网站定制
别再只会调PID了聊聊MPC和LQR在自动驾驶小车里的实战选择当你第一次尝试让自制的小车沿着白线自动行驶时大概率会从PID控制器开始。转动电位器调整Kp、Ki、Kd参数的过程就像在玩一个神秘的电子游戏——参数太小小车反应迟钝参数太大它又会像醉汉一样左右摇摆。但当你开始挑战更复杂的场景比如S形弯道或动态避障时单纯调整这三个参数就会遇到天花板。这时候是时候了解MPC模型预测控制和LQR线性二次调节器这两个工业级控制算法了。1. 从PID到现代控制为什么需要升级在树莓派上跑PID控制小车直线行驶就像用自行车代步——简单够用。但当你需要处理复杂路况时就相当于要用自行车完成山地越野这时候就需要更专业的装备。PID的三大局限在复杂场景中尤为明显预见性缺失就像闭着眼睛走路只能靠碰到墙壁后的痛感来调整方向耦合处理困难转向和速度控制各自为政实际转弯时却需要协同工作约束无视电机最大转速、转向角度等物理限制无法内置到控制逻辑中我在早期项目中就遇到过这样的困境小车在90度直角弯前总是冲出赛道。增加D参数可以缓解但遇到路面不平整时又会剧烈抖动。这就是典型的PID调节死胡同——改善一个指标会恶化另一个。2. 控制器三剑客核心特性对比让我们用具体数据说话。下表对比了三种控制器在STM32F4168MHz和Jetson Nano上的表现特性PIDLQRMPC计算复杂度O(1)O(n³)O(n³)每步内存占用(KB)1~10~50响应延迟(ms)0.11-25-20支持约束否需后处理原生支持多变量协同需独立调节自动优化自动优化适合场景直线巡航中高速弯道复杂动态环境实测提示在STM32上运行MPC时预测时域超过3步就会导致控制周期50ms这对高速行驶的小车来说已经会产生明显延迟。具体到代码实现复杂度# PID实现示例Python伪代码 def pid_update(error): integral error * dt derivative (error - last_error) / dt output Kp*error Ki*integral Kd*derivative last_error error return output # LQR需要先解Riccati方程 import numpy as np def lqr(A,B,Q,R): P np.matrix(scipy.linalg.solve_continuous_are(A, B, Q, R)) K np.matrix(scipy.linalg.inv(R)*(B.T*P)) return K3. 硬件适配从STM32到Jetson的算法选择3.1 资源受限平台STM32系列在Cortex-M4内核的STM32上LQR是性价比最高的选择。以我的智能车大赛项目为例预处理阶段离线计算反馈矩阵K在PC上完成将K值硬编码到单片机const float K[4] {0.82, -1.15, 0.43, 0.27}; // 状态反馈矩阵实时控制仅需做矩阵乘法运算void control_update() { float u -K[0]*x1 - K[1]*x2 - K[2]*x3 - K[3]*x4; set_motor(u); }3.2 高性能平台Jetson Nano/Raspberry Pi 4当使用带Linux系统的主控时MPC开始变得可行。ROSACADO工具链是个不错的组合# 安装ACADO git clone https://github.com/acado/acado.git mkdir build cd build cmake .. -DCMAKE_INSTALL_PREFIX/usr/local make install典型MPC工作流程建立车辆动力学模型定义优化目标和约束实时求解优化问题// 简化的MPC设置代码 Controller controller; DifferentialEquation model; OCP ocp(0.0, 1.0, 20); // 1秒预测时域分20步 model dot(x) v*cos(theta); model dot(y) v*sin(theta); model dot(theta) (v/L)*tan(phi); ocp.minimizeLSQ(Q, h); // 二次型代价函数 ocp.subjectTo( -0.5 phi 0.5 ); // 转向角约束4. 场景化选型指南4.1 校园物流小车低速复杂环境需求特征平均速度1m/s频繁启停需要避让行人方案选择使用MPC处理动态障碍物预测时域设置为2秒重点优化计算效率# 使用OSQP求解器 solver osqp.OSQP() solver.setup(P, q, A, l, u, verboseFalse)4.2 智能车竞速中高速循迹实测数据控制器平均圈速最大横向误差PID23.5s15cmLQR21.8s8cmMPC22.1s6cm优化技巧预计算不同速度下的LQR参数使用串级控制外层LQR处理路径跟踪内层PID控制转向舵机4.3 室内服务机器人特殊挑战需要精确停靠误差2cm地面可能存在滑动混合方案全局使用MPC规划末端切换为PID进行微调加入滑动补偿% 滑动检测算法 if abs(encoders_velocity - odom_velocity) threshold adjust_friction_coefficient(); end5. 避坑实践那些教程里不会告诉你的细节模型失配处理在车辆模型中加入滑动参数估计def adaptive_model(): while True: actual get_actual_trajectory() predicted model.predict() adjust_model(actual - predicted)实时性保障技巧固定迭代次数的QP求解热启动优化复用上一步的解降采样视觉输入调试可视化工具# ROS工具链 rqt_plot /control/error rviz -d car_model.rviz硬件级优化在STM32上使用ARM的DSP库加速矩阵运算为Jetson编写CUDA核函数处理QP求解第一次尝试MPC时我完全低估了模型精度的重要性。用理想自行车模型控制的小车在实际测试中遇到地板接缝就会偏离轨迹。后来加入轮胎滑动补偿后控制精度立即提升了60%。这印证了控制领域的那句老话垃圾模型进垃圾控制出。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑