前言
PID 控制器和 LQR 控制器各有优劣。LQR 控制器更依赖物理模型的建立,属于白盒实验,需要知道系统内部参数再进行调参;而 PID 控制器通常被视为黑盒实验,即不需要精确的物理模型,根据输出响应直接调参即可。虽然 PID 也有白盒情况,但工程上多为经验调参。
一、实验目的
在二轮平衡小车的项目中,落地 LQR 线性二次型算法。
二、MATLAB 仿真验证
与卡尔曼滤波算法验证不同,LQR 控制器的设计最终需要反馈增益矩阵 K 值。K 值是给定值,不是在代码里在线计算,而是离线进行仿真计算。因此,需要先离线在 MATLAB 中进行仿真,再将 K 值代入到代码里进行在线验证。
1. 系统状态方程
a. 理论

b. 代码
因为是离线控制,所以推导 K 的代码没有在 STM32 中。输入参数为举例,并不代表本项目实际使用的输入参数。在 MATLAB 代码中,建立系统方程的步骤如下:
m =0.035; r =0.0672/2; i =0.5*m*r^2; M =0.757-2*m; L =0.5*0.0903; J_p =(1/12)*M*(0.0903^2+0.0530^2); d =0.1612; J_delta =(1/12)*M*(0.0930^2+0.0530^2); g =9.8; Q_eq = J_p*M+(J_p+M*L^2)*(2*m+2*i/r^2); A_23 =-(M^2*L^2*g)/Q_eq; A_43 = M*L*g*(M+2*m+2*i/r^2)/Q_eq; B_21 =(J_p+M*L^2+M*L*r)/(Q_eq*r); B_22 = B_21; B_41 =-(M*L/r+M+2*m+2*i/r^2)/Q_eq; B_42 = B_41; B_61 =1/(r*(m*d+i*d/r^2+2*J_delta/d)); B_62 =-B_61; A =[010000;00 A_23 000;000100;00 A_43 000;000001;000000]; B =(i/r)*[00; B_21 B_22;00; B_41 B_42;00; B_61 B_62];
c. 分析

状态方程中,状态转移矩阵内 A 和输入矩阵 B 的具体推导过程需参考相关理论资料。
2. 性能指标
a. 理论
性能泛函包含两项,一是系统的积累跟踪误差,二是控制能量。显然它着重权衡和惩罚大的跟踪积累误差和大的控制能量。泛函 J 取得极小值的含义是:在没有过大控制能量消耗的前提下,使系统输出量 Y(t) 尽量接近理想输出量 r(t),即跟踪误差最小。根据以上条件,最优控制存在且唯一。

b. 代码
Q =[100000000;000000;000000;000100000;000010000;000000]; R =[10;01];
c. 分析
Q 的设置体现控制优先级:代码中 Q(1,1)=1000(位移误差)、Q(4,4)=1000(俯仰角速度误差)、Q(5,5)=1000(转向角误差),说明优先保证这三个状态的精度。R 的设置限制控制量:R=eye(2) 表示左 / 右轮力的代价相同,避免电机输出过大(如急加速导致的不稳定)。





