zoukankan      html  css  js  c++  java
  • LQR (线性二次型调节器)的直观推导及简单应用

    转自:https://blog.csdn.net/heyijia0327/article/details/39270597

    本文主要介绍LQR的直观推导,说明LQR目标函数J选择的直观含义以及简单介绍矩阵Q,R的选取,最后总结LQR控制器的设计步奏,并将其应用在一个简单的倒立摆例子上。      

          假设有一个线性系统能用状态向量的形式表示成:

               

                           ( 1 )

    其中 ,初始条件是. 并且假设这个系统的所有状态变量都是可测量到的。

          在介绍LQR前,先简单回顾一下现代控制理论中最基本的控制器--全状态反馈控制。

          全状态反馈控制系统图形如下:

                     

    我们要设计一个状态反馈控制器

                 

    使得闭环系统能够满足我们期望的性能。我们把这种控制代入之前的系统状态方程得到

                               ( 2 )

    对于(1)式的开环系统,由现代控制理论我们知道开环传递函数的极点就是系统矩阵A的特征值。(传递函数的分母是|sI -A|,|·|表示行列式)

    现在变成了(2)的闭环形式,状态变换矩阵A变成了(A-BK)。因此通过配置反馈矩阵K,可以使得闭环系统的极点达到我们期望的状态。注意,这种控制器的设计与输出矩阵C,D没有关系。

           那么,什么样的极点会使得系统性能很棒呢?并且,当系统变量很多的时候,即使设计好了极点,矩阵K也不好计算。

           于是,LQR为我们设计最优控制器提供了一种思路。

    在设计LQR控制器前,我们得设计一个能量函数,最优的控制轨迹应该使得该能量函数最小。一般选取如下形式的能量函数。

              ,其中Q是你自己设计的半正定矩阵,R为正定矩阵。

    可是,为什么能量函数(或称系统的目标函数)得设计成这个样子呢?

           首先假设状态向量x(t)是1维的,那么其实就是一个平方项 Qx^2 >= 0,同理. 能量函数J要最小,那么状态向量x(t),u(t)都得小。J最小,那肯定是个有界的函数,我们能推断当t趋于无穷时,状态向量x(t)将趋于0,这也保证了闭环系统的稳定性。那输入u(t)要小是什么意思呢?它意味着我们用最小的控制代价得到最优的控制。譬如控制电机,输入PWM小,将节省能量。

           再来看看矩阵Q,R的选取,一般来说,Q值选得大意味着,要使得J小,那x(t)需要更小,也就是意味着闭环系统的矩阵(A-BK)的特征值处于S平面左边更远的地方,这样状态x(t)就以更快的速度衰减到0。另一方面,大的R表示更加关注输入变量u(t),u(t)的减小,意味着状态衰减将变慢。同时,Q为半正定矩阵意味着他的特征值非负,R为正定矩阵意味着它的特征值为正数。如果你选择Q,R都是对角矩阵的话,那么Q的对角元素为正数,允许出现几个0.R的对角元素只能是正数。

           注意LQR调节器是将状态调节到0,这与轨迹跟踪不同,轨迹跟踪是使得系统误差为0.

            知道了背景后,那如何设计反馈矩阵K使得能量函数J最小呢?很多地方都是从最大值原理,Hamilton函数推导出来。这里用另外一种更容易接受的方式推导。

    将u = -Kx 代入之前的能量函数得到:

                  ( 3 )

    为了找到K,我们先不防假设存在一个常量矩阵P使得:

        (4)

    代入(3)式得:

          (5)

    注意,我们已经假设闭环系统是稳定的,也就是t趋于无穷时,x(t)趋于0.

    现在把(4)式左边的微分展开,并把状态变量x的微分用(2)式替代得到:

                    

    这个式子要始终成立的话,括号里的项必须恒等于0.

           

    这是一个关于K的二次型等式,当然这个二次型是我们不愿看到的,因为计算复杂。现在只要这个等式成立,我们何必不选择K使得两个二次项正好约掉了呢?这样既符合了要求,又简化了计算。

    代入上式得:

                (6)

    K的二次项没有了,可K的取值和P有关,而P是我们假设的一个量,P只要使得的(6)式成立就行了。而(6)式在现代控制理论中极其重要,它就是有名的Riccati 方程。

    现在回过头总结下LQR控制器是怎么计算反馈矩阵K的:

           1.选择参数矩阵Q,R

           2.求解Riccati 方程得到矩阵P

           3.计算

    再看看LQR的结构图:

                  

    关于它的应用呢,比较典型的就是倒立摆控制器的设计。

    倒立摆的状态变量为,其中p(t)是小车位置,θ是倒立摆的角度。系统结构如程序所示:

     

     1 A = [0 1 0 0
     2      0 0 -1 0
     3      0 0 0 1
     4      0 0 9 0];
     5 B = [0;0.1;0;-0.1];
     6 C = [0 0 1 0];   %观测角度
     7 D = 0;
     8 
     9 Q = [1 0 0 0
    10      0 1 0 0
    11      0 0 10 0
    12      0 0 0 10
    13     ];
    14 R = 0.1;
    15 %由上面这个系统,可以计算出K
    16 K = lqr(A,B,Q,R);
    17 Ac = A - B*K;
    18 %对系统进行模拟
    19 x0 = [0.1;0;0.1;0]; %初始状态
    20 t = 0:0.05:20;
    21 u = zeros(size(t));
    22 [y,x]=lsim(Ac,B,C,D,u,t,x0); 
    23 plot(t,y);

    最后看到角度回到0,即平衡位置,控制器起到了作用,你可以选择不同的Q,R进行对比。

           文章为总结性文章,有纰漏,请指出,谢谢。

    reference:

    1.F.L. Lewis .<< Linear Quadratic Regulator (LQR) State Feedback Design >>

    2.http://ctms.engin.umich.edu/CTMS/index.php?example=InvertedPendulum&section=ControlStateSpace

    3.http://ctms.engin.umich.edu/CTMS/index.php?example=InvertedPendulum&section=ControlStateSpace

  • 相关阅读:
    第9章 线程编程(7)_线程同步4:信号量
    第9章 线程编程(6)_线程同步3:条件变量
    第9章 线程编程(5)_线程同步2:读写锁
    第9章 线程编程(4)_线程同步1:互斥锁
    第9章 线程编程(3)_线程清理和控制函数
    第9章 线程编程(2)_线程创建和终止
    第9章 线程编程(1)_线程概念和线程标识
    第8章 信号(6)_贯穿案例2:mini shell(3)
    第8章 信号(5)_信号集和信号屏蔽
    第8章 信号(4)_中断的系统调用和函数可重入性
  • 原文地址:https://www.cnblogs.com/zhj868/p/13794716.html
Copyright © 2011-2022 走看看