# 模型預測控制(Model predictive control、MPC) ## 最佳控制(optimal control) 動機: 在給定的限制下達到最佳的表現 例如: 在車輛控制下, ![image](https://hackmd.io/_uploads/rJ7oI_Ligg.png) 假設有兩個軌跡(紅線和綠線),哪個最好,在此範例紅色會比綠色好,原因是較舒服,軌跡規劃內會有cost function當作標準。 ![image](https://hackmd.io/_uploads/B11lvuUsel.png) 但當有障礙物(紫色區塊→限制條件),出現則綠線為最優的方案。 ## Single input Single output (SISO) ![image](https://hackmd.io/_uploads/HkKiqOUolg.png) Cost function(objective function): 目標或是代價函數 $$\min_{u} J$$ 設計一個控制系$u$讓J有最小值,$J$為 $$J=\int_{0}^{t} w\times e^2 + v \times u^2 dt$$ $w$和$v$是調整兩項變數之間的權重,看我們希望哪個比較重要 假設 $$ \begin{align} w>>v: 誤差比較重要\\ v>>w: 輸入比較重要 \end{align} $$ ## Multiple input Multiple output (MIMO) 狀態空間方程式 $$ \begin{align} \frac{dX}{dt}=AX+Bu\\ Y=CX \end{align} $$ $X$: 系統狀態變量 $Y$: 系統輸出 $$J=\int_{0}^{\infty} (E^TQE) + (u^T R u)dt$$ example: $$ \frac{d}{dt} \begin{bmatrix}x_1\\x_2\end{bmatrix} = A\begin{bmatrix}x_1\\x_2\end{bmatrix} + B \begin{bmatrix}u_1\\u_2\end{bmatrix} $$ $$ \begin{bmatrix}y_1\\y_2\end{bmatrix} = \begin{bmatrix}x_1\\x_2\end{bmatrix} (假設C=1) $$ $$ R(參考)=\begin{bmatrix}r_1\\r_2\end{bmatrix} = \begin{bmatrix}0\\0\end{bmatrix} $$ $$ E=\begin{bmatrix}e_1\\e_2\end{bmatrix} = \begin{bmatrix}y_1-r_1\\y_2-r_2\end{bmatrix}= \begin{bmatrix}x_1\\x_2\end{bmatrix} $$ $$ \begin{align} E^TQE = \begin{bmatrix}x_1\\x_2\end{bmatrix}^T\begin{bmatrix}q_1&0\\0&q_2\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix} = q_1x_1^2+q_2x_2^2\\ u^TRu=\begin{bmatrix}u_1\\u_2\end{bmatrix}^T\begin{bmatrix}r_1&0\\0&r_2\end{bmatrix}\begin{bmatrix}u_1\\u_2\end{bmatrix} = r_1u_1^2+r_2u_2^2 \end{align} $$ $Q$和$R$:調節矩陣 ($q_1、q_2、r_1、r_2$權重係數) ## MPC 模型預測 通過模型來預測系統在某一未來時間段內的表現來進行優化控制。 多用於數位控制,所以大多採用離散型態狀空間表達形式 $$ X_{k+1} = AX_k + B U_k $$ 分為三個步驟 在k時間點 step 1. 估計/量測當前的系統狀態 step 2. 基於$U_k, U_{k+1}, ..., U_{k+n}$來進行最佳化 $$J=\sum_{k}^{k+n} (E_k^TQE_k) + (U_k^T R U_k) + (E_n^T+FE_n)$$ $E_n^T+FE_n$ : Terminal cost function ![image](https://hackmd.io/_uploads/Sk-qDK8sxg.png) step 3. 只進行$U_k$動作 Receding horizon control(滾動最佳化控制): 下一次預測和執行則是整個window往後移,繼續最佳化 ![image](https://hackmd.io/_uploads/rkzF_KUixe.png) # 二次規劃(Quadratic Programming) 一般型態: $$\min Z^TQZ + C^TZ$$ 系統 $$ X_{k+1} = A X_k + B U_k $$ $X$和$U$都是多維度($d\times1$)。 在k時間點 $$ 輸入: U_k= \begin{bmatrix}u(k|k)\\u(k+1|k)\\...\\u(k+n-1|k)\end{bmatrix} $$ $$ 狀態: X_k= \begin{bmatrix}x(k|k)\\x(k+1|k)\\x(k+2|k)\\...\\x(k+n|k)\end{bmatrix} $$ 假設 輸出:$y=x$參考: $R=0$ → 誤差: $E=y-R=x-0=x$ 目標函數 Cost function: $$J = x(k+n|k)^TFx(k+n|k) + \sum_{i=0}^{n-1} [x(k+i|k)^TQx(k+i|k) + u(k+i|k)^TRu(k+i|k)] $$ $x(k+i|k)^TQx(k+i|k)$: 誤差加權和 $u(k+i|k)^TRu(k+i|k)$: 輸入加權和 $x(k+n|k)^TFx(k+n|k)$: 終端誤差 **主要是找輸入$U$**,所以要想辦法把$x$取去掉,所以我們看一下$x(k+i|k)$之間的關聯。 $$ \begin{align} &x(k|k) = x_k (初始條件)\\ &x(k+1|k) = Ax(k|k)+Bu(k|k) = Ax_k + B u(k|k)\\ &x(k+2|k) = Ax(k+1|k)+Bu(k+1|k) = A^2x_k + AB u(k|k)+Bu(k+1|k)\\ &...\\ &x(k+n|k) = A^nx_k + A^{n-1}B u(k|k)+...+Bu(k+n-1|k)\\ \end{align} $$ 從上面我們整理出,狀態$X_k$為 $$ X_k=\begin{bmatrix}I\\A\\A^2\\...\\A^n\end{bmatrix} x_k + \\ \begin{bmatrix}0&0&...&0\\ B&0&...&0\\ AB&B&...&0\\ ...\\ A^{n-1}B&A^{n-2}B&...&B\end{bmatrix}\begin{bmatrix}u(k|k)\\u(k+1|k)\\...\\u(k+n-1|k)\end{bmatrix}\\ $$ $$ X_k=Mx_k+CU_k $$ $$ J = x(k+n|k)^TFx(k+n|k) + \sum_{i=0}^{n-1} [x(k+i|k)^TQx(k+i|k) + u(k+i|k)^TRu(k+i|k)]\\ $$ $$ \begin{align} &x(k+n|k)^TFx(k+n|k) + \sum_{i=0}^{n-1} [x(k+i|k)^TQx(k+i|k) \\ &=\begin{bmatrix}x(k|k)\\x(k+1|k)\\...\\x(k+n|k)\end{bmatrix}\begin{bmatrix}Q&0&...&0\\ 0&Q&0&...&0\\ 0&0&Q&...&0\\ &&&...&\\ 0&0&0&...&F\end{bmatrix}\begin{bmatrix}x(k|k)\\x(k+1|k)\\...\\x(k+n|k)\end{bmatrix}\\ &=X_k^T\bar{Q}X_k \end{align} $$ $$ \begin{align} &J=X_k^T\bar{Q}X_k+U_k^T\bar{R}U_k\\ &=(x_k^TM^T+U_k^TC^T)\bar{Q}(Mx_ k+CU_k)+U_k^T\bar{R}U_k\\ &=x_k^TM^T\bar{Q}Mx_k+2x_k^TM\bar{Q}CU_k + U_k^TC^T\bar{Q}CU_k + U_k^T\bar{R}U_k \end{align} $$ 令 $M^T\bar{Q}M=G$ $M\bar{Q}C=E$ $C^T\bar{Q}C+R=H$ $$ J=x_k^TGx_k+2x_k^TEU_k + U_k^THU_k $$ 因此為對於$U_k$的二次式,可以套用最佳化演算法求解→程式碼。 # 範例 $$ x(k+1) = Ax(k)+Bu(k) $$ $x(k+1)\in R^{n\times1}$、$u(k)\in R^{p\times1}$、$A\in R^{n\times n}$、$B\in R^{n\times p}$ $$ \begin{bmatrix}x_1(k+1)\\x_2(k+1)\end{bmatrix}=\begin{bmatrix}0&0.1\\0&2\end{bmatrix}\begin{bmatrix}x_1(k)\\x_2(k)\end{bmatrix}+\begin{bmatrix}0\\0.5\end{bmatrix}u(k) $$ $$ X(k) = Mx(k)+CU(k) $$ $A=\begin{bmatrix}0&0.1\\0&2\end{bmatrix}$ $B=\begin{bmatrix}0\\0.5\end{bmatrix}$ 假設$n=3$ $$ X(k) =\begin{bmatrix}x(k|k)\\x(k+1|k)\\x(k+2|k)\\x(k+3|k)\end{bmatrix}, U(k) =\begin{bmatrix}u(k|k)\\u(k+1|k)\\u(k+2|k)\end{bmatrix} $$ $$ M = \begin{bmatrix} I \\ A\\A^2\\A^3\end{bmatrix}, A^2= \begin{bmatrix} 0&0.1 \\ 0 & 2\end{bmatrix}\begin{bmatrix} 0&0.1 \\ 0 & 2\end{bmatrix}=\begin{bmatrix} 1&0.3 \\ 0 & 4\end{bmatrix}, A^3=\begin{bmatrix} 0&0.7 \\ 0 & 8\end{bmatrix} $$ $AB=\begin{bmatrix} 1&0.1\\0&2\end{bmatrix}\begin{bmatrix} 0\\0.5\end{bmatrix}=\begin{bmatrix} 0.05\\1\end{bmatrix}$ $A^2B=\begin{bmatrix} 1&0.3 \\ 0 & 4\end{bmatrix}\begin{bmatrix} 0\\0.5\end{bmatrix}=\begin{bmatrix} 0.15\\2\end{bmatrix}$ $$ C=\begin{bmatrix} 0&0&0\\ 0&0&0\\ 0&0&0\\ B&0&0\\ AB&B&0\\ A^2B&AB&B \end{bmatrix}=\begin{bmatrix} 0&0&0\\ 0&0&0\\ 0&0&0\\ 0.5&0&0\\ 0.05&0.5&0\\ 1&0&0\\ 0.01&0.05&0\\ 2&1&0.5 \end{bmatrix} $$ 目標函數 $$ J = x(k)^TGx(k)+U(k)^THU(k)+2x(k)^TEU(k) $$ $$ \begin{align} &G=M^T \bar{Q}M\\ &E = C^T \bar{Q}M\\ &H = C^T \bar{Q}C+\bar{R} \end{align} $$ $$ \bar{Q}=\begin{bmatrix} Q&...& \\ \vdots&Q&\vdots \\...&...&F\end{bmatrix};\bar{R}=\begin{bmatrix} R&...& \\\vdots &\ddots &\vdots \\...&...&R\end{bmatrix} $$ 已經將目標函數轉成二次式,可以套用最佳化演算法求解→程式碼 # 程式範例 程式實作,首先我們要 1. 設定矩陣$A, B, Q, R, F$, 狀態矩陣用的 $A$: 狀態的權重矩陣 $B$: 輸入的權重矩陣 損失函數用的 $Q$: 誤差加權的權重矩陣 $R$: 輸入的權重矩陣 $R$: 終端狀態的的權重 2. 設定$k$的最大值 3. 給定初始狀態$x_0$ 4. 初始化$X_k$和$U_k$矩陣,設定預設區間$n$ 5. 根據上述公式推算係數矩陣$G, E, H$ 6. call最佳化方法解二次式,對$X_k$進行更新。 ###### tags: `Learning`