2020-12-18 Matlab LQR 推導及簡單應用
Matlab LQR 推導及簡單應用
本文主要介紹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)是小車位置,θ是倒立擺的角度。系統結構如程式所示:
A = [0 1 0 0
0 0 -1 0
0 0 0 1
0 0 9 0];
B = [0;0.1;0;-0.1];
C = [0 0 1 0]; %觀測角度
D = 0;
Q = [1 0 0 0
0 1 0 0
0 0 10 0
0 0 0 10
];
R = 0.1;
%由上面這個系統,可以計算出K
K = lqr(A,B,Q,R);
Ac = A - B*K;
%對系統進行模擬
x0 = [0.1;0;0.1;0]; %初始狀態
t = 0:0.05:20;
u = zeros(size(t));
[y,x]=lsim(Ac,B,C,D,u,t,x0);
figure
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§ion=ControlStateSpace
3.http://ctms.engin.umich.edu/CTMS/index.php?example=InvertedPendulum§ion=ControlStateSpace
相關文章
- matlab練習程式(LQR路徑跟蹤)Matlab
- Lucene介紹及簡單應用
- 貝塞爾曲線原理、推導及Matlab實現Matlab
- 01 . SaltStack部署配置及簡單應用
- cJSON學習及簡單應用小結JSON
- UDP 協議簡單瞭解及應用UDP協議
- thymeleaf 簡單應用
- div 簡單應用
- 設計模式 | 簡單工廠模式及典型應用設計模式
- 正規表示式理解及簡單應用舉例
- Kafka應用實戰——Kafka安裝及簡單使用Kafka
- C# 官方文件導讀及推薦書單C#
- 01 . Shell詳細入門介紹及簡單應用
- pythontonado框架簡單應用Python框架
- jsp的簡單應用JS
- 加推時序系統RTS實現原理及應用簡介
- Rainbond ubuntu20.04單主機(allinone)部署及簡單應用構建AIUbuntuNone
- kmp 演算法簡介及 next 陣列推導KMP演算法陣列
- jquery datatables各引數詳細說明及簡單應用jQuery
- pythontornodo的簡單應用1Python
- 快應用簡單瞭解
- Nginx 簡單應用(Windows os)NginxWindows
- gRPC的Golang簡單應用RPCGolang
- 簡單的 Selenium 爬蟲應用及定時桌面提示圖示爬蟲
- WebSocket 簡介及應用例項Web
- windbg sx命令與簡單應用
- jQuary中ajax的簡單應用
- @Autowire/@Qualifilter/@Resource的簡單應用Filter
- easypoi 讀取 Excel 簡單應用Excel
- 並查集的簡單應用並查集
- Android中mmap原理及應用簡析Android
- 2020-12-18
- 簡單計算器(棧的應用)
- 一個簡單的 indexedDB 應用示例Index
- Rust GUI庫 egui 的簡單應用RustGUI
- Disruptor的簡單介紹與應用
- redis訊息佇列簡單應用Redis佇列
- 簡單的Java二維碼應用Java