matlab用diag直接使用错误_Matlab玩转车辆控制(三)

db3a00d88c0eeb0674a05f919b2f4972.png

张三:考研复试!@#¥%……&*~

李四:惊雷*&……%¥#@!~

王五:我先静静......


正文

主要内容:利用LQR控制器控制二自由度车辆状态

根据余志生老师《汽车理论》上的两条经典微分方程,可以建立如下的状态空间表达式

设两个状态的期望值分别为

,则系统的两个误差分别为

以下是整理过程,难免疏漏和错误...

整理的得到

以上即为误差模型,为什么要转化为这种模型呢(ps:第一次这么敲latex,颇为难受...)

因为LQR的目标函数如下所示:

74d03521b34bc529509def6df12d6cd8.png

而状态跟踪,或者参考轨迹跟踪的核心任务是要减少跟踪误差,因此,上式中的状态x需要变成误差。

进一步,求解关于目标函数的黎卡提方程:

95005cc13c3f92e2d7b17c44375fd9ab.png

得到增益k:

7c53e02b3cf44e853e379a94e595da6c.png

手动求解上述方程较麻烦,利用matlab的lqr函数可以自动获得。

最终得到状态反馈形式的控制率u = -kx。

对于改进后的模型,可以发现,输入由一维变成了五维,而实际的输入应该是第一维,即前轮转角,但是,现在可以这么理解:原来的开环模型,引入参考量后,形成了闭环,可见原则上,需要把参考量作为输入(较土的理解)

接下来利用lqr函数进行增益求取:

>> u = 8.33;%m/s
>> a = 1.2;
>> b = 1.5;
>> kf = -30000;
>> kr = -50000;
>> m = 1500;
>> Iz = 2500;
>> A = [(kf+kr)/m/u (a*kf-b*kr)/m/u-u;(a*kf-b*kr)/m/Iz,(a^2*kf+b^2*kr)/Iz/u];
>> B = [-kf/m;-a*kf/Iz];
>> B = [B A [-1 0;0 -1]];
>> Q = [20,0;0,20];
>> R = diag([1,0.01,0.01,0.01,0.01]) %真实需要约束的控制为前轮转角
>> k = lqr(A,B,[20,0;0,20],diag([1,0.01,0.01,0.01,0.01]))
k =

    0.9009    0.5363
  -39.7529   15.1953
  -14.6615  -40.0694
   -6.2051    2.3619
    2.3619   -7.0048

于是我们得到实际的状态反馈矩阵k,并利用u = -kx作为车辆状态空间的输入。

仿真结果如下:

2d3b417368bbe7f106ae9707794e6350.png

由右侧结果可知,控制器基本能够追踪参考量,但是存在稳态误差,通过调整Q矩阵的大小,可以对应减小和增大误差,但是稳态误差始终存在,这是因为控制率u = -kx = -ke等价于引入了一个比例控制(p控制),无法消除稳态误差,详细说明可见如下链接(一位博士大神,他的所有视频均值得一看);同时过大的Q可能会显著增大控制率u,直接增大能耗和实际控制器负担。

【自动控制原理】4_ 比例控制器_燃烧卡路里(2)_Matlab/Simulink_Proportional Control_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
3fae9f7cde60d261244bbb4a006c951a.png

仿真需要注意的点:

  1. -k*u 用product模块相乘时,需要改为矩阵乘法模式。
  2. 为便于观察输出,状态空间需要是多输出,因此模块中D矩阵不能再是0,需要是一个零矩阵。

更多精彩内容,欢迎关注公众号:豪杰仿真科技

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值