以無人駕駛小車車為例子深刻理解MPC
前言:
這個倉庫建立的目的主要是為了記錄學習筆記,記錄的目的是加深我對MPC和軌跡最佳化理解。我本人主要專注足試機器人的控制,玩自動駕駛這個主要是為了學習。 主要原因相對起來低速情況下的車模型控制相對簡單一些(三個變數,三維)。注意該倉庫主要參考來自[DhruvaKumar MPC](
https://
github。com/DhruvaKumar/
model-predictive-control
)。 的倉庫。當然我會包括一些原倉庫沒有做的內容,畢竟是筆記也會更詳細一些,歡迎大家和我交流和並支援我。
結果如下:使用MPC進行自動駕駛控制
程式碼已上傳倉庫:
GitHub - Musyue/mpc_self_car_practice
整個倉庫包括的內主要是:
1。 如何使用cppad 解微分方程。
2。 如何使用CPPAD 中的ipopt來解非線性問題的。
3。 無人車的線性和非線性模型推導。
4。 基於線性模型的凸最佳化QP求解的MPC(暫時還沒做完)
5。 基於非線性模型IPOPT求解的MPC。
6。 最後使用來自參考倉庫使用的模擬平臺進行實時模擬[self-driving-car-sim](
https://
github。com/udacity/self
-driving-car-sim
)
這裡使用的車模型,腳踏車模型,主要針對低速情況
。
腳踏車模型簡化了無人車前輪轉向角和曲率之間的幾何關係,方便建立模型,但注意該模型沒有考慮高速情況下的側滑等情況。因此如果想要在無人車上高速情況下進行更高精度的控制,這個需要建立新的動力學模型。
線性模型如下:
無人車使用雅克比把非線性系統轉化為線性系統,當然這個線性系統只能在很小的範圍內生效,這也是線性化的通病,無人車的速度主要是靠油門控制,反向主要靠方向盤,也就是可以理解為兩個輸入。把動力學模型寫成如下公式:
假設在運動過程中的某個s點進行雅克比(泰勒級數,省去高階項)線性化處理得:
整理可以得到如下系統方程:
假設控制週期為
,那麼可以近似得到:
其中:
使用MPC來做預測未來h步的線性模型如下:
寫成緊湊型如下:
其中引數矩陣如下:
非線性模型的MPC
其離散差分模型,其中差分時間間隔或者控制週期為dt如下:
e 為橫向誤差,車與目標軌跡的距離
這裡無人車追蹤的目標軌跡是一個三階曲線:
,這裡需要把軌跡轉到車本體座標系下,這裡的每個連續點,可以看成一個個離散的點,我們目的就是讓車與軌跡中的
儘量靠近重合,方向和切線方向上重合。而第k 次的橫向誤差和偏航角誤差如下:
對於一個預測步長為h的MPC控制器求解問題,根據倉庫所述最佳化目標函式如下,主要分成三層,和目標變數的誤差最小,系統輸入越小越好,系統輸入之間不能有太大波動:
需要滿足動態模型約束為:
結論:
從實驗效果看,mpc表示還是可以的,但是在控制過程中會出現抖動,有可能是我沒有調好引數。Python版本的我也進行了嘗試,很可惜不知道為啥只能收資料,不能發資料到模擬平臺。
參考文獻(Reference):
1。 [self-driving-car-sim](
https://
github。com/udacity/self
-driving-car-sim
)
2。 [DhruvaKumar MPC](
https://
github。com/DhruvaKumar/
model-predictive-control
)
3。 [windSes Blog](
https://
windses。blog。csdn。net/a
rticle/details/103519721#comments_20178791
)
4。 [QSQP](
https://
osqp。org/docs/examples/
index。html
)
5。 [Jesse_stanly_method](
https://
blog。csdn。net/renyushua
i900/article/details/98460758
)
6。 [Gnuplot](
http://
stahlke。org/dan/gnuplot
-iostream/
)
7。 [matplotlib_cpp](
https://
github。com/lava/matplot
lib-cpp
)
8。 無人駕駛演算法——使用Stanley method實現無人車軌跡追蹤