LQR控制算法及代码实践

背景

假设有一个线性系统能用状态向量的形式表示成:
在这里插入图片描述
在这里插入图片描述
设计一个状态反馈控制器:
u = − K x u=−Kx u=Kx
则此时状态方程可以写为:
在这里插入图片描述
由于让系统稳定的条件是矩阵Acl的特征值的实部均为负数,因此我们可以手动选择几个满足上述条件的特征值,然后反解出K,从而得到控制器。
那么问题来了,我们该如何选择特征值,才能让控制器的控制效果最好呢?现在我们定义一种代价函数:
在这里插入图片描述
其中,Q和R是两个对角参数矩阵,Q为半正定矩阵, R为正定矩阵。分别决定了状态向量 x 和输入向量 u 的重要性。显然,J是一个二次型函数,这也是LQR中“Q”的由来。
我们希望的是在满足系统稳定的前提下,通过设计合适的K,让代价函数J最小。
下面我们来分析代价函数的意义。

代价函数的意义

参考这一篇文章:
链接: link
概括来说就是:调节Q的大小可以控制系统状态收敛的快慢;调节R的大小可以控制让系统达到稳态所需输入的大小;

Apollo2.0 LQR控制算法解读

车辆动力学模型的推导可以看这篇:
链接: link

  1. 当推导出车辆动力学模型后,选取横向偏差、横向偏差变化率,横摆角角度偏差,横摆角角度偏差变化率作为状态量建立状态空间方程:
    在这里插入图片描述
  2. 建立目标函数:
    在这里插入图片描述
  3. 其中Q为状态权重系数,R为控制量权重系数。当上述目标函数最小时就得到最优的状态反馈矩阵K,此时的K可以保证求出最佳控制量,即最佳前轮转角。

在这里插入图片描述4. 上图表示求出最佳转角之后,只能保证(A-BK)x那部分达到稳态,所以还需要增加一个前馈控制量,试另一部分趋近于0.在这里插入图片描述
4. 这个前馈控制量试可以通过纵向车速Vx和道路的半径R计算得到
5. 最终的前轮转角的控制量为最优状态反馈控制量与前馈控制前轮转角之和。计算的出前轮转角经过上下限的限幅后进行输出。
参考链接: link
link

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: LQR(Linear Quadratic Regulator)控制算法是一种广泛应用于控制系统设计的经典控制算法。该算法通过最小化系统状态的二次性能指标来设计控制器,在满足系统稳定性的前提下,实现对系统的最佳控制。 LQR控制算法的Matlab代码如下所示: ```Matlab % 定义系统的状态空间表示 A = [1, 1; 0, 1]; % 系统的状态转移矩阵 B = [0; 1]; % 输入矩阵 C = [1, 0]; % 输出矩阵 D = 0; % 前馈矩阵 % 定义系统的权重矩阵 Q = [1, 0; 0, 1]; % 状态误差的权重矩阵 R = 1; % 控制输入的权重矩阵 % 使用lqr函数计算最优控制器增益矩阵 K = lqr(A, B, Q, R); % 定义系统初始状态和目标状态 x0 = [0; 0]; % 初始状态 x_des = [1; 0]; % 目标状态 % 定义控制器输出 u = -K * (x - x_des); % 计算控制输入 % 使用ode45函数模拟系统响应 [t, x] = ode45(@(t, x) (A - B * K) * x, tspan, x0); % 绘制系统的状态响应曲线 plot(t, x(:, 1), 'r', t, x(:, 2), 'b'); xlabel('时间'); ylabel('系统状态'); legend('状态1', '状态2'); ``` 以上代码中,我们首先定义系统的状态空间表示,并根据系统的权重矩阵定义目标控制性能。然后使用lqr函数计算最优控制器增益矩阵K。接着我们定义系统的初始状态和目标状态,并通过计算控制器输出来实现对系统的最佳控制。最后使用ode45函数模拟系统的状态响应,并绘制系统状态的变化曲线。 ### 回答2: LQR(线性二次调节)控制算法是一种广泛应用于控制系统设计中的优化控制方法。其基本思想是通过设计一个最优的状态反馈控制器来使得系统满足一定的性能指标。 在Matlab中,可以使用控制工具箱中的lqr函数来实现LQR控制算法。下面是lqr函数的基本使用方法: ```matlab % 定义系统的状态方程 A = [A1, A2, ..., An]; B = [B1, B2, ..., Bn]; C = [C1, C2, ..., Cn]; D = [D1, D2, ..., Dn]; sys = ss(A, B, C, D); % 定义LQR控制器的权重矩阵 Q = [Q1, Q2, ..., Qn]; R = [R1, R2, ..., Rm]; % 计算LQR增益矩阵K K = lqr(sys, Q, R); % 将LQR增益矩阵K应用于系统 sys_with_control = ss(A - B * K, B, C, D); % 模拟系统的响应 t = 0:dt:T; % 时间向量,dt为采样时间步长,T为总仿真时间 u = ...; % 输入信号向量 [y, t, x] = lsim(sys_with_control, u, t, x0); % 绘制系统的响应曲线 plot(t, y); xlabel('时间'); ylabel('输出'); title('系统响应'); ``` 在代码中,需要首先定义系统的状态方程,即A、B、C和D矩阵。然后,通过选择合适的权重矩阵Q和R,利用lqr函数计算出最优的LQR增益矩阵K。将该增益矩阵应用于系统后,可以使用lsim函数模拟系统的响应,并通过plot函数绘制出输出的响应曲线。 需要注意的是,在使用LQR控制算法时,权重矩阵Q和R的选择对于控制效果非常重要。可以通过调整权重矩阵来实现对系统性能的不同要求,例如快速响应、稳定性等。 总之,通过以上的Matlab代码,可以实现LQR控制算法,并对系统进行优化控制。具体的参数和权重矩阵的选择需要根据具体的控制系统进行调整。 ### 回答3: LQR(Linear Quadratic Regulator)控制算法是一种优化控制算法,通过调整控制器的参数来最小化系统状态和控制输入之间的误差。其基本思想是基于线性系统模型,使用二次代价函数来定义系统的性能评估指标,并通过最小化这个指标来设计控制器。 LQR控制算法的核心是利用系统的状态空间模型和增广控制器来构建一个代价函数,然后通过求解代价函数的最小值问题来确定最优的控制器参数。这个最小值问题可以通过Riccati方程的求解来实现。 在MATLAB中,可以利用控制系统工具箱提供的lqr()函数来实现LQR控制器的设计。该函数的基本语法如下: [K, S, E] = lqr(A, B, Q, R) 其中,A和B分别为系统的状态空间模型的矩阵形式,Q和R是用户定义的代价权重矩阵。 函数的输出结果有三个,K为最优控制器的增益矩阵,S为Riccati方程的解,E为系统特征值的向量。 具体步骤如下: 1. 定义系统的状态空间模型矩阵A和B,以及代价权重矩阵Q和R; 2. 调用lqr()函数,输入参数为A、B、Q和R; 3. 获取输出的最优控制器增益矩阵K、Riccati方程的解S和系统特征值的向量E; 4. 将K作为闭环控制器的增益矩阵,实现对系统的控制。 总结而言,LQR控制算法可以通过MATLAB中的lqr()函数来实现,具体步骤包括定义系统的状态空间模型和代价权重矩阵,然后通过函数调用获取最优控制器的增益矩阵和解。最后,将增益矩阵应用于闭环控制系统中,实现对系统的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值