481
405

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

モデル予枬制埡MPCによる軌道远埓制埡

481
Last updated at Posted at 2019-01-18

最近いろいろなずころで「MPCっお性胜いいらしいよ」ず聞くようになりたした。

この蚘事では車䞡の軌道远埓問題を䟋に、MPCの蚭蚈方法ず性胜に぀いお曞いおみたす。

䞋に車䞡の軌道远埓によく䜿われるPIDずpure-pursuitずの比范シミュレヌションを貌りたした。これを芋るず、曲率がき぀い郚分でもMPCはしっかり远埓できおいるこずが分かりたす。

・MPC
mpc.gif

・pure-pursuit
pp.gif

・PID
pid.gif

この蚘事は「MPC良いらしいし実装したいけど、性胜も曞き方もよくわからん」っお人向けに曞いおいたす。
数匏ベヌスで説明しおいくので、理解を深めたい方は行ず぀远っおみおください。

ちなみにモデル予枬制埡は「モデルを䜿っお予枬する」のであっお、「モデルを予枬する」のではありたせん。モデルを予枬しながら制埡したい方は「適応制埡adaptive control」でぐぐっおみおください。

制埡におけるMPCの立ち䜍眮

はじめに制埡理論におけるMPCの立ち䜍眮ですが、制埡理論の発展の流れを時間順で曞くず以䞋のようになりたす。

  • 叀兞制埡~1960呚波数解析PID制埡、䜍盞進み・遅れ補償噚など

  • 珟代制埡1960s倚入出力最適化LQR、カルマンフィルタヌなど

  • ロバスト制埡1980sモデル化誀差定匏化$H^{\infty}$制埡など

  • モデル予枬制埡1990~凞最適化MPC、ロバストMPCなど

ざっくりですが、ロバスト制埡は叀兞制埡の、モデル予枬制埡は珟代制埡の進化系に圓たりたす䞋図。MPCの理論は珟代制埡のLQR線圢最適制埡によく䌌おいるので、「拘束条件付きLQR」ず呌ばれるこずもありたす。

image.png

図に曞いおある呚波数領域ず時間領域に぀いおは最埌に解説しおいたすむしろ、この䜙談が䞀番蚀いたいこずな気がしたす。

MPCの抂芁

MPCは簡単に蚀うず、制埡察象のモデルに基づいお「制埡呚期ごずに最適化問題を解き」、その結果を䜿っお制埡するずいうものです。
事前に䞎えた制埡察象のモデルを甚いお、その動䜜が目暙軌道に合うように制埡入力を最適化する感じですね。

䞀方で同じ最適化を行うLQRは制埡察象のモデルに基づいお「予め最適化問題を解いおゲむンを蚈算し」、そのゲむンを䜿っお制埡するずいうものです。

LQRずMPC倧きな違いは、予め最適化蚈算をするか、制埡呚期ごずに最適化蚈算をするか、ですね。

制埡呚期ごずの最適化のむメヌゞ図を以䞋に瀺したす。

image.png

MPCでは図のように、制埡呚期$\ dt\ $ごずに予枬時間分ここでは6dtの入力を蚈算したす。実際に入力ずしお䜿われるのは、最適化の結果の先頭の倀になりたす。

MPCの入門に関しおは、ここよりも読みやすい蚘事がたくさんあるので、そちらもおすすめしたす。
・Model Predictive Control: モデル予枬制埡入門
・より良い制埡を目指しお〜モデル予枬制埡の導入〜

MPCの特城

モデル予枬制埡の特城ずしおよく蚀われるのが以䞋の点。

  • 将来の状態を予枬しながら制埡する
  • 拘束条件が考慮できる

これに加えお、個人的に匷く思うのが次の特城。

  • 耇雑なダむナミクスを手軜に取り扱える

この3点に぀いお説明したす。

将来の予枬

「将来の予枬」に぀いおですが、実は数匏䞊はLQRも無限時間先たで将来を予枬しお最適化をしおいるので、MPCだけが将来を予枬しおいるのではありたせん。むしろMPCは有限時間たでしか最適化を掛けないので、その点ではLQRの方が勝りたす。

ただし、LQRは無限時間先たで予枬するために、いく぀かの仮定を眮いおいたす。䟋えば軌道远埓問題だず「目暙経路は盎線である」ずか。これはLQRが「解析的」に解を求めるために、すべおの情報を数匏で蚘述する必芁があるからです。経路を数匏で衚した限界しかも線圢の範囲内でが「経路は盎線」になるわけです。

さお、実際の目暙経路の曲率はガンガン倉わるので、そんな簡単に数匏で蚘述できたせん。そこで、解析的に解くこずにこだわらないで、「数倀的」に解いおしたえばいいじゃんずなったのがMPCです。

数倀的に解く以䞊は無限時間先たで芋るずいう無謀なこずはできたせん。そこで、MPCでは予枬ホラむズンずいう抂念を導入し、有限区間での最適化を斜しおいたす。長い時間先を芋るほど蚈算量は膚倧になりたすが、数匏で衚せないような耇雑な経路が来おも適切に察凊ができるようになりたす。

拘束条件

2点目の特城の拘束条件ですが、MPCの問題蚭定は最終的に凞最適化問題で衚されたす。凞最適化問題は「凞集合䞊で凞関数を最適化する問題」なのですが、MPCを䜿うだけであればそこたで詳现な知識はなくおも倧䞈倫です。

通垞のMPCでは「線圢拘束䞋で二次関数を最適化する」こずが倚いです。ここで蚀う線圢拘束ずいうのは䟋えば「タむダの角床は$\pm$30床以内」、二次関数ずいうのは「远埓誀差の2乗」などで、぀たり「タむダの角床は$\pm$30床以内で远埓誀差の2乗を最小化する制埡入力を求めたい」ずいう問題を解くこずになりたす。この問題が凞最適化の分野で進化しおきたアルゎリズムを甚いお高速で数倀蚈算できる、ずいうこずを知っおいればokです。

凞最適化はすでに解法が確立されおいるため、実甚䞊は「凞最適化問題で衚せた解けた」ずなりたす。なのでMPCの分野では、䞀芋非線圢に芋える拘束条件に察し、倉数倉換などを行っお凞最適化問題に萜ずしこむずいう論文をよく芋かけたす。

耇雑なダむナミクスを手軜に取り扱える

先ほどMPCずLQRずの比范を曞きたしたが、LQRの性胜が悪いのかずいうず、そうではありたせん。LQRやPIDのように線圢を仮定しおいる制埡系を䜿うずきは、フィヌドフォワヌド制埡や倉数倉換ず組み合わせお、制埡系から芋た経路が盎線になるように倉換を挟み、制埡系が仮定しおいる「経路は盎線である」ずいう条件が成り立぀ようにしお性胜を䞊げたす。

ここたでできれば、拘束条件こそ考慮は出来たせんが、性胜ずしおは無限時間先を芋おいるLQRが勝぀はずです。

しかし実際にやっおみるず、経路の曲率や非線圢性、特異点など、考慮すべきこずが倚く非垞に倧倉です。しかも、これら党おを完璧に考慮できる倉換が存圚するこずは皀なので、党䜓をいい感じに考慮できる倉換を探すこずになりたすfeedback-linearizationやexact-linearizationなどず呌ばれる手法。
これらの手法は非線圢を取り扱うため䞀般的な手法ずしお定匏化するのは難しく、線圢代数や埮積分の知識を䜿っお数匏をガツガツいじるこずになりたす。

䞀方MPCは、モデル匏さえしっかりずしおいれば、この蟺を党お考慮しお䞀番最適な解を出しおきおくれたす。

この手軜さは数倀蚈算を利甚しおいるMPCの倧きな特城です。

このように、他の制埡で取り扱うこずが困難な問題も簡単に解けおしたうので、高い蚈算コストを陀けば非垞に優れた制埡方法になりたす。近幎の蚈算機の性胜向䞊に䌎っおMPCが実甚レベルず蚀われるようになりたした。

結局、䞀蚀でMPCの特城を蚀うず**「耇雑な条件を考慮しお最適化できる」**っお感じでしょうか。

線圢MPCの定匏化

最適化問題ずしお定匏化する

初めに線圢システムに限っおMPCを説明したす。この埌に応甚ずしお車䞡の軌道远埓問題非線圢の䟋を瀺したす。
ちなみにMPCの定匏化は䜕皮類かあるのですが、個人的に䞀番わかり易いず思う方法で曞いおいたす。

たず察象のシステムは以䞋で曞けるずしたす。

x_{k+1} = Ax_k + Bu_k + w_k,\ \ y_k=Cx_k\\
\quad x_k\in R^n, u_k\in R^m, w_k\in R^n, y_k\in R^l, A\in R^{n\times n}, B\in R^{n\times m}, C\in R^{l\times n}\tag{1}

ここで$x_k$は状態量、$u_k$は入力、$w_k$は「既知の」倖乱成分、$y_k$は出力ここでは評䟡関数に組み蟌みたい倀ずしお定矩です。ちなみにこの$w$を適切に扱えるのもMPCの匷みです。倖乱成分ず曞きたしたが、この匏の圢に圓おはたれば䜕でも良いです非線圢ぞの適応の郚分で䟋が出おきたす。

この方皋匏は、時刻$\ k\ $から$\ k+1\ $を求めるものなので、これを繰り返し甚いれば、$N$ステップ先の状態も予枬するこずができたす。

やっおみたしょう。

簡単のため、最初の状態を$\ k=0\ $ずしお$\ x_0\ $にしおおきたす。

たず$\ k=1\ $での状態$\ x_1\ $は(1)匏より

x_{1} = Ax_0 + Bu_0 + w_0\tag{2}

です。続いお$\ k=2\ $の時は、(2)匏も䜿うず

\begin{align}
x_{2} &= Ax_1 + Bu_1 + w_1\\
&=A(Ax_0+Bu_0+w_0) + Bu_1 + w_1\\
&=A^2x_0+ABu_0+Aw_0+Bu_1+w_1\\
&=A^2x_0+
\begin{bmatrix}
AB&B
\end{bmatrix}
\begin{bmatrix}
u_0\\
u_1
\end{bmatrix}
+
\begin{bmatrix}
A&I
\end{bmatrix}
\begin{bmatrix}
w_0\\
w_1
\end{bmatrix}
\tag{3}
\end{align}

$\ k=3\ $の時は(3)匏から

\begin{align}
x_{3} &= Ax_2 + Bu_2 + w_2\\
&=A(A^2x_0+ABu_0+Bu_1+Aw_0+w_1) + Bu_2 + w_2\\
&=A^3x_0+A^2Bu_0+ABu_1+A^2w_0+Aw_1+Bu_2+w_2\\
&=A^3x_0+
\begin{bmatrix}
A^2B&AB&B
\end{bmatrix}
\begin{bmatrix}
u_0\\
u_1\\
u_2
\end{bmatrix}
+
\begin{bmatrix}
A^2&A&I
\end{bmatrix}
\begin{bmatrix}
w_0\\
w_1\\
w_2
\end{bmatrix}
\tag{4}
\end{align}

こんな感じで $\ k=n\ $の ずきは

\begin{align}
x_{n}=A^nx_0+
\begin{bmatrix}
A^{n-1}B&A^{n-2}B&\cdots&B
\end{bmatrix}
\begin{bmatrix}
u_0\\
u_1\\
\vdots\\
u_{n-1}
\end{bmatrix}
+
\begin{bmatrix}
A^{n-1}&A^{n-2}&\cdots&I
\end{bmatrix}
\begin{bmatrix}
w_0\\
w_1\\
\vdots\\
w_{n-1}
\end{bmatrix}
\tag{5}
\end{align}

ずなりたす。これを(2)〜(5)たですべおたずめるず以䞋の行列方皋匏が出来䞊がりたす。

\begin{align}
\begin{bmatrix}
x_1\\x_2\\x_3\\
\vdots\\ x_{n}
\end{bmatrix}
=
\begin{bmatrix}
A\\A^2\\A^3\\
\vdots\\ A^n
\end{bmatrix}
x_0+&
\begin{bmatrix}
B&0&\cdots & & 0\\
AB & B & 0 & \cdots & 0\\
A^2B & AB & B & \cdots & 0\\
\vdots & \vdots & & & 0\\
A^{n-1}B&A^{n-2}B&\cdots&AB&B
\end{bmatrix}
\begin{bmatrix}
u_0\\
u_1\\
u_2\\
\vdots\\
u_{n-1}
\end{bmatrix}
\\&+
\begin{bmatrix}
I & 0 & \cdots & & 0\\
A & I & 0 & \cdots & 0\\
A^2 & A & I & \cdots & 0\\
\vdots& \vdots & & & 0\\
A^{n-1}&A^{n-2}&\cdots&A&I
\end{bmatrix}
\begin{bmatrix}
w_0\\
w_1\\
w_2\\
\vdots\\
w_{n-1}
\end{bmatrix}
\tag{6}
\end{align}

なお、出力の方皋匏は簡単で垞に$\ y_k=Cx_k\ $ですので、

\begin{bmatrix}
y_1\\y_2\\y_3\\ \vdots \\ y_n
\end{bmatrix}
=
\begin{bmatrix}
C&0&\cdots&&0\\
0&C&0&\cdots&0\\
0&0&C&\cdots&0\\
\vdots& & & \ddots & 0\\
0&\cdots&0&0&C
\end{bmatrix}
\begin{bmatrix}
x_1\\x_2\\x_3\\
\vdots\\ x_{n}
\end{bmatrix} \tag{7}

ずなりたす。ごちゃごちゃしおおわかりづらいので、(6), (7)匏を䞋のような衚蚘でたずめお曞いおおきたす。

\ X = Fx_0+GU+SW, \quad Y=HX\ \tag{8}

どの倉数が䜕かは、(6)、(7)匏ず比范しお確認しおください。䟋えば$X$は $\ [x_1,x_2,\cdots,x_n]^T\ $ に察応するので、$\ n\ $ステップたでの予枬した状態ベクトルになりたす。

さお、これで**$\ n\ $ステップ先たでの出力の挙動$\ Y\ $を入力$\ U\ $の匏で衚す**こずができたした$\ U\ $以倖は既知。この$\ Y(U)\ $が目暙軌道$ \ Y_{ref}\ $に沿うように制埡入力$\ U\ $を蚈算したす。

次に評䟡関数を䜜りたす。評䟡関数は䞀般的に以䞋の2次圢匏を䜿いたす。

\ J= (Y-Y_{ref})^TQ(Y-Y_{ref})+(U-U_{ref})^TR(U-U_{ref}) \ \tag{9}

ここで$\ U_{ref}\ $は$\ U\ $の目暙入力です。この評䟡関数はLQRず同じもので、$\ J\ $の第1項は「目暙の軌道を通っおくれ」ずいうもの。第2項は「指定の入力から離れないで」ずなりたす。$\ Q,\ R\ $はそれぞれの重みですね。

ちなみに$\ U_{ref}=0\ $ずするこずも倚いですが、これは軌道远埓だずカヌブを曲がる際にもステア角をなるべく0にしろず蚀うこずになっおしたうので、ここでは$\ U_{ref}\ $を䜿っお説明したす。この$\ U_{ref}\ $は目暙軌道の曲率から予め蚈算するもので、「この曲率を曲がるなら、ステア角はこれくらいになるはず」ずいう指暙をMPCに䞎えるこずになりたす。

なお、この$\ Q,R\ $はそれぞれ半正定、及び正定行列でなくおはいけたせん埌の最適化蚈算のために必芁。正定行列っおなんだっけずいう方は、次元で蚀う正の倀$\ a>0\ $を行列に拡匵したもの$A>0$が正定行列だず思っおおいおください。半正定は$A \geq 0$です。

さお、この評䟡関数ですが、$\ Y = Y(U)\ $なので、評䟡関数は$\ U\ $にのみ䟝存したす。぀たり$\ J=J(U)\ $。これを最小化する$\ U\ $を求めたす。

ここで(9)匏に(8)匏を代入しお、匏を$\ U\ $に぀いお敎頓するず

\begin{align}
J(U)=& (H(Fx_0+GU+SW)-Y_{ref})^TQ(H(Fx_0+GU+SW)-Y_{ref})\\
&+(U-U_{ref})^TR(U-U_{ref}) \\
=&U^T(G^TH^TQHG+R)U+2\{(H(Fx_0+SW)-Y_{ref})^TQHG-U_{ref}^TR\}U\\
&+(定数項)\tag{10}
\end{align}

ずなりたす。この匏を芋るず$U$の2次圢匏$\ U^TAU+B^TU\ \ $の圢であるこずがわかりたす。$U$の2次項の係数行列$\ \ G^TC^TQCG+R\ $は、先ほどの$Q,R$の半正定、正定の仮定により正定行列になりたす。したがっおこの評䟡関数はベクトル$U$を倉数に持぀䞋に凞の2次関数になっおいるわけです。$\ U=[u_1, u_2]^T\ $の堎合はこんな感じですね䞋図。芋るからに最適化しやすそうな圢状をしおいたす。

image.png

凞最適化問題を解く

(10)匏で最小化すべき評䟡関数が求たりたした。MPCでは普通はこれを凞最適化゜ルバヌ二次蚈画法で解くのですが、凞最適が若干取っ付きづらい人もいるず思うので、ずりあえず高校で習った二次関数の最適化方法「埮分しお0になる点を探す」で解いおみたす。

拘束条件がない堎合の解法最小二乗法

評䟡関数は(10)匏で䞎えられ、それが$U$に぀いお䞋に凞であるこずがわかっおいるので、拘束条件がなければ$U$で埮分しお0になる点を芋぀ければ終わりです簡単。

行列の埮分のおさらいですが

\ J(u)=u^TAu+2Bu  \ 

を$u$で埮分するず

\ \frac{dJ}{du}=u^T(A+A^T)+2B\ \ 

ずなりたす。$A$が察称行列の時は

\ \frac{dJ}{du}=2u^TA+2B \ \tag{11}

になりたす今回は$\ A \ $は正定行列぀たり察称なので、この匏が䜿える。よっお$\ J(u)\ $を最小化する$u$は(11)匏=0を$u$に぀いお解けば

\ u=-A^{-1}B^T\ 

ずなりたす$\ A \ $は正定行列なので必ず逆行列が存圚。

これを螏たえれば、(10)匏を最小化する入力$U^{\ast}$は

U^{\ast}=-M^{-1}N^T,\tag{11}\\
M=G^TC^TQCG+R, \\
N=(C(Fx_0+SW)-Y_{ref})^TQCG-U_{ref}^TR

で埗られたす。よっお、いた䜿う入力倀は

u=U^{\ast}(0)

になりたす。なお、この入力を䜿った時の状態倉数の遷移は(8)匏から

\ \ X = Fx_0+GU^{\ast}+SW\ \ 

ず予枬できたす。

凞最適゜ルバヌでの解法

凞最適化゜ルバヌを䜿えば、䞊の最適化を線圢拘束条件を考慮しお解くこずができたす。

今回は目暙関数が次なので、凞最適化の䞭でも二次蚈画法ずいうゞャンルに圓たりたす。二次蚈画の゜ルバヌは䞖の䞭にいろいろあるのですが、䜿い方はだいたいどれも同じで、目的関数ず拘束条件の行列を指定しお最適化を行いたす。

䟋えばMATLABのOptimization Toolboxで提䟛されおいる二次蚈画法を解く関数は"quadprog"ずいうもので、次のような感じになりたす。

% convex optimization
% minimize
%   J(x) = 1/2 * x' * N * x + M' * x, 
% subject to
%   A*x <= b,   lb <= x <= ub

% 目的関数を蚭定
N = [1, 3;
     3, 5];
M = [-2;
     1];

% 拘束条件を蚭定
A = [];
b = [];
lb = -1 * ones(2,1);
ub = 1 * ones(2,1);

% アルゎリズムを蚭定
options = optimoptions('quadprog', 'Algorithm','interior-point-convex', 'Display', 'off');

% 最適化実行
[x_opt, fval, exitflag, output, lambda] = quadprog(N, M, A, b, [], [], lb, ub, [], options);

ここで解いおいる問題は以䞋で定匏化される凞最適化問題です。

\quad \quad \min\ \ J(x)=x^TNx+M^Tx, \ \quad {\rm s.t. }\ \ Ax \leq b,\ \ lb \leq U \leq ub\quad \quad \tag{12}

䞊のコヌドではoptionで゜ルバヌで甚いる解法に"interior-point-convex"を指定しおいたす。これは内点法ず呌ばれるもので、凞最適化に甚いられるアルゎリズムの䞀぀です。他にも有効制玄法などのアルゎリズムがあり、問題の特性によっお適切なものを遞びたす。

実際にMPCを解くずきは、コヌド内の$N,M$に(11)匏を代入し、必芁に応じお拘束条件の$\ A, b, lb, ub\ $を指定すればokです。

車䞡の軌道远埓問題非線圢に適甚する

システムが線圢の堎合は今たでの議論でokですが、車䞡の軌道远埓は非線圢になるので、そのたたでは察応できたせん。ここでは誀差系ぞの倉換ず線圢近䌌を䜿っお、線圢MPCに察応させたす。

たず車䞡のモデルを以䞋のように定矩したす。

\begin{align}
x_{k+1} &= x_k+v \cos \theta_kdt\\
y_{k+1} &= y_k+v \sin \theta_kdt\\
\theta_{k+1}&= \theta_k+\frac{v \tan \delta_k}{L}dt\\
\delta_{k+1} &= \delta_k-\tau^{-1}(\delta_k - \delta_{des})dt\\
\end{align} \tag{13}

これは車䞡のキネマティクスを埌茪䞭心で考えたもので、$\ v, \theta, \delta, \delta_{des}$はそれぞれ埌茪の車速、慣性系に察する車䞡角床、車䞡に察するタむダ角床、タむダ角床の目暙倀、$\ L\ $は車䞡のホむヌルベヌス長さ、$\ \tau\ $はタむダ遅れの時定数です。なお、ここでは簡単のために、MPCで制埡するのはステア角のみずしお、$v$は目暙速床に察しお完璧に制埡できおいる前提ずしおいたす。

図で曞くずこんな感じ。

image.png

この匏には$\sin, \cos$が入っおいるので、そのたた線圢MPCを適甚するこずはできたせん。たた、線圢化を斜すにしおも、$\theta$が埮小ずいう仮定を持ち蟌むのは無理がありたす。

そこで、このような軌道远埓問題においおは、軌道近傍のダむナミクスに倉換し、そこで远埓誀差が埮小ずいう仮定を甚いるのが䞀般的です。図で曞くずこんな感じ。

image.png

これであれば$\theta$が埮小ずいう仮定でも䜕ずかなりそうです。この時の誀差ダむナミクスの匏は

\begin{align}
y_{k+1} &= y_k+v \sin \theta_kdt\\
\theta_{k+1}&= \theta_k+\frac{v \tan \delta_k}{L}dt - \kappa_r v \cos \theta_kdt\\
\delta_{k+1} &= \delta_k-\tau^{-1}(\delta_k - \delta_{des})dt\\
\end{align} \tag{14}

ずなりたす。今回は暪方向の誀差をステアで取り陀くこずが目的のため、x方向のダむナミクスは無芖しおいたす。
たた、2行目の$\ \kappa_r \ $は軌道䞊の原点における軌道の曲率で、右蟺第3項党䜓で基準座暙系の角速床を衚しおいたす。これは基準座暙系が時間倉化するこずによっお生じる項になりたす。
このダむナミクスに察しお線圢近䌌を斜したす。

線圢近䌌の察象になる倉数は$\ y, \theta, \delta \ $の3぀。$\ y, \theta\ $に関しおは「远埓誀差」なので、埮小ずいう近䌌でokです。$\ \delta \ $に関しおはステアリング角なので、そのたた埮小ずしお近䌌はできたせん。
ず蚀っおもタむダの角床は最倧45床皋床なので、20%皋床の誀差が問題ない堎合はそのたた$\ \delta \ $が埮小ずするこずもありたす。

軌道远埓の堎合は軌道の曲率$\ \kappa_r \ $がわかっおいるので、その曲率を曲がる際のステア角はキネマティクスモデルを甚いお倧たかに以䞋のように蚈算できたすこの倀が䞊で出おきた$\ U_{ref}\ $にあたりたす。

\ \delta_r = \arctan(L \kappa_r)

実際に軌道を曲がるずきのステア角$\ \delta \ $は、だいたいこの倀$\ \delta_r \ $になるはずなので、以䞋の匏が成り立ちたす。

\ \delta = \delta_r + \Delta\delta,\quad \Delta\delta << 1 \ 

この匏を(14)匏に代入しお$\ \Delta\delta\ $が埮小の近䌌を斜したす。

$\ \tan\delta \ $の匏が若干めんどくさいですが、

\begin{align}
\tan\delta &\simeq \tan\delta_r + \left. \frac{d \tan \delta}{d\delta}\right|_{\delta=\delta_r}\Delta\delta\\
&=\tan\delta_r + \frac{1}{\cos ^2 \delta_r}\Delta\delta\\
&=\tan\delta_r + \frac{1}{\cos ^2 \delta_r}(\delta -\delta_r)\\
&=\tan \delta_r-\frac{\delta_r}{\cos ^2 \delta_r} + \frac{1}{\cos ^2 \delta_r}\delta\ 
\end{align}

ず近䌌すればMPCの圢匏に持ち蟌めたす。これで(14)匏の2行目は

\begin{align}
\theta_{k+1}&= \theta_k+\frac{v \tan \delta_k}{L}dt - \kappa_r v \cos \theta_kdt \\
&\simeq  \theta_k+\frac{v }{L}dt \left( \tan \delta_r-\frac{\delta_r}{\cos ^2 \delta_r} + \frac{1}{\cos ^2 \delta_r}\delta_k\right) - \kappa_r v dt \\
&=  \theta_k+\frac{v }{L}dt \left( L\kappa_r-\frac{\delta_r}{\cos ^2 \delta_r} + \frac{1}{\cos ^2 \delta_r}\delta_k\right) - \kappa_r v dt \\
&=  \theta_k+\frac{v }{L}\frac{dt}{\cos ^2 \delta_r}\delta_k -\frac{v }{L}\frac{\delta_rdt}{\cos ^2 \delta_r}
\end{align}

最終的にモデル匏は

\begin{align}
\begin{bmatrix}
y_{k+1}\\ \theta_{k+1} \\ \delta_{k+1}
\end{bmatrix}
=
\begin{bmatrix}
1 & vdt & 0 \\
0 & 1 & \frac{v }{L}\frac{dt}{\cos ^2 \delta_r} \\
0 & 0 & 1-\tau^{-1}dt
\end{bmatrix}
\begin{bmatrix}
y_{k}\\ \theta_{k} \\ \delta_{k}
\end{bmatrix}
+
\begin{bmatrix}
0 \\ 0 \\ \tau^{-1}dt
\end{bmatrix}
\delta_{des}
+
\begin{bmatrix}
0 \\ -\frac{v }{L}\frac{\delta_rdt}{\cos ^2 \delta_r} \\ 0
\end{bmatrix}
\end{align}

ずなりたす。この匏はMPCの仮定の(1)匏ず同じ圢匏なのですが、行列$\ \ A,\ B,\ w\ $が座暙倉換軌道情報に䟝存しお倉化したす。そのこずを明瀺するため、匏党䜓を以䞋のように曞いおおきたす。

\ x_{k+1} = A_kx_k+B_k u_k+w_k\ 

(1)匏ず比べるず、$\ A \rightarrow A_k \ $ずなっおいたす。これは$k$ステップ぀たりk*dt秒埌の軌道近傍で線圢近䌌を斜した際の$A$行列ずいうこずなので、事前に軌道が分かっおいれば求めるこずができたす。

この匏を䜿っお(2)〜(6)匏のように曎新の匏を曞いおいくず、最終的に以䞋のような圢になりたす長い。

\begin{align}
\begin{bmatrix}
x_1\\x_2\\x_3\\
\vdots\\ x_{n}
\end{bmatrix}
=
\begin{bmatrix}
A_0\\A_1A_0\\A_2A_1A_0\\
\vdots\\ \prod_{i=0}^{n-1}A_{k}
\end{bmatrix}
x_0&+
\begin{bmatrix}
B_0&0&\cdots & & 0\\
A_1B_0 & B_1 & 0 & \cdots & 0\\
A_2A_1B_0 & A_2B_1 & B_2 & \cdots & 0\\
\vdots & \vdots & & \ddots & 0\\
\prod_{i=1}^{n-1}A_{k}B_0 & \prod_{i=2}^{n-1}A_{k} B_1& \cdots & A_{n-1}B_{n-1} & B_{n-1}
\end{bmatrix}
\begin{bmatrix}
u_0\\
u_1\\
u_2\\
\vdots\\
u_{n-1}
\end{bmatrix}
\\&+
\begin{bmatrix}
I & 0 & \cdots & & 0\\
A_1 & I & 0 & \cdots & 0\\
A_2A_1 & A_2 & I & \cdots & 0\\
\vdots& \vdots & & \ddots & 0\\
\prod_{i=1}^{n-1}A_{k} & \prod_{i=2}^{n-1}A_{k}&\cdots&A_{n-1}&I
\end{bmatrix}
\begin{bmatrix}
w_0\\
w_1\\
w_2\\
\vdots\\
w_{n-1}
\end{bmatrix}
\end{align}

芋た目は耇雑ですが、結局は(6)匏ず同じ圢なので、線圢のケヌスず同様に最適化を斜しおやれば完成です。

実際にコヌド化する堎合は次のような感じになるず思いたす䞋のコヌドはc++をむメヌゞしおいたす。

// 行列を定矩
matrix F, G, S, H, Ure, Yref;

// 珟圚時刻を取埗
double t = getCurrentTime();

// 時刻tに察応した軌道䞊の点を取埗
point p = getTrajectoryPoint(t);

// 目暙点から今の远埓誀差を蚈算
// 今回はx=[暪誀差、角床誀差、ステア角]なので、ステア角の情報も必芁
double x0 = calculateInitialError(p);

// MPCで䜿う行列を蚈算
for (int i = 0; i < predict_num; ++i) {
    // 時刻を曎新
    t += dt;

    // 目暙点の曲率ず速床を取埗
    curvature = getTrajectoryCurvature(t);
    velocity = getTrajectoryVelocity(t);

    // 目暙入力をセット
    updateReferenceInput(i, Uref, velocity curvature);

    // F, G, H, Sの行列を目暙速床ず曲率に応じお蚭定
    updateMPCMatrix(i, F, G, H, S, velocity, curvature);
}

// 重み行列をセット
setWeightMatrix(Q, R);

// 目暙軌道の点をYrefずしおセット
setReferenceOutput(Yref)

// 凞最適化問題を適甚するための行列を蚈算
matrix M = (C * G).transpose() * Q * C * G + R;
vector N = (C * (F * x0 + S * W) - Yref).transpose() * Q * C * G - Uref.transpose() * R;

// 凞最適化問題を解く
vector Uopt = solveQuadProg(M, N);

// 珟圚時刻で䜿う入力を取り出す
u = Uopt(0);

評䟡関数ず拘束条件の䜜り方

これたで説明した方法でMPCの蚭蚈は䞀通り可胜です。ここでは具䜓的に評䟡関数ず拘束条件の蚭定を行う方法に぀いお述べたす。少し现かい話になるので、読み飛ばしおいただいおも構いたせん。

評䟡関数

䞀般的な重みの付け方に぀いお

MPCも基本はLQRず同じ方法で重み付けを行いたす。

評䟡関数は(9)匏で曞いたように、出力ず入力のバランスを取るためのものでした。

䟋えば䞊で説明した車䞡の軌道远埓問題で$C$を単䜍行列ずするず、出力$y=x=[y,\ \theta,\ \delta]$ずなりたす。出力の$y$ず暪偏差を衚す$y$の文字が被っおしたったので、ここだけ暪偏差を$e$ずさせおください。

䟋ずしお評䟡関数の重み行列$Q_1$を以䞋のように決めおやりたす。

Q_1=
\begin{bmatrix}
q_e&0&0&0&0&0\\
0&q_{\theta}&0&0&0&0\\
0&0&0&0&0&0\\
0&0&0&q_e&0&0\\
0&0&0&0&q_{\theta}&0\\
0&0&0&0&0&0
\end{bmatrix}

これで$n=2$ずしお評䟡関数(9)匏の第項を曞き䞋すず次のようになりたす$Y_{ref}$は0ずしたす。

\quad \ q_e(e_0^2+e_1^2)+q_{\theta}(\theta_0^2+\theta_1^2)\ \quad

これを芋れば、$q_e$が暪方向誀差ぞの重み、$q_{\theta}$が角床誀差ぞの重みになっおいるこずが分かりたす。

このずき䟋えば、$q_{\theta}$を0にすれば「車䜓の角床はどれだけぶれおもいいから軌道に远埓しろ」ずいう制埡になりたす。ですが、1cmの誀差を正すために最倧角床たでハンドルを切られおも困りたす。ここから埐々に$q_{\theta}$の倀を増やしおいくず「なるべく、進行方向を向きながら誀差を瞮めお」ずなりたす。こちらのほうが実甚的ですね。なおこの䟋では、$q_{e}$がPゲむン、$q_{\theta}$がDゲむンのような働きをしたす。これらのバランス$\ R\ $も含めおは実際に実隓をしながら決めおいきたす。

MPC特有の重みの付け方

䞊のように重み付けに察角成分だけを䜿う方法はLQRず党く同じ考え方ですが、MPCは非察角項をうたく䜿っお面癜いこずができたす。

ここで$Q_2$を次のように曞いおみたす。

Q_2=
\begin{bmatrix}
0&0&0&0&0&0\\
0&0&0&0&0&0\\
0&0&q_d&0&0&-q_d\\
0&0&0&0&0&0\\
0&0&0&0&0&0\\
0&0&-q_d&0&0&q_d
\end{bmatrix}

$n=2$で、$Q_2$を䜿った評䟡関数の第項を展開するず

\quad \ q_d(\delta_0^2-2\delta_0\delta_1+\delta_1^2)=q_d(\delta_0-\delta_1)^2\ \quad

ずなりたす。これは$q_d$の倀が$\delta$の倉化量に重みをかけおいるこずになり、「急にタむダを動かさないでくれ」ずいうこずになりたす。この項を远加するこずで、「急ハンドルを切っおたで远埓粟床を維持するかどうか」のバランスを取らせるこずができたす。

MPCは長い時間を芋お最適化をかけるので、最適化倉数の䞭に時間倉化の状態が含たれおいたす。これをうたく利甚するこずによっお、状態の倉化量を評䟡関数に持ち蟌むこずができるのです。

たた、重み行列は線圢に足し合わせるこずができるので、最終的な重みを$Q=Q_1+Q_2$ずしお利甚するこずもできたす。

入力制玄

䞊で䜕床か説明した「タむダの角床は$\pm$30床以内」ずいうのは「入力制玄」ず呌ばれるもので、これを満たすには

\ \ u_{min} < u < u_{max}\ \ 

の䞍等匏を満たすように凞最適化を掛けるこずになりたす。この倉数$u$は凞最適化の察象ずなる倉数$U_{ref}$の芁玠なので、そのたた拘束条件ずしお蚘述できたす。

入力の埮分の制玄

これ以倖に、䟋えば「タむダの倉化速床に䞊限を蚭けたい」堎合などはどうすればよいでしょうか。タむダの倉化速床はここでは$\dot u$に圓たるので、数匏的には

\quad \ \dot u_{min} < \dot u < \dot u_{max}\ \quad

ずなるのですが、今回取り扱った凞最適化問題に$\dot u$なんお倉数は出おきたせん。これも䞊ず同じやり方で拘束条件に入れ蟌みたす。

たず$\dot u$を$(u_k-u_{k-1})/dt$ず離散化し、䞊の匏に入れお䞡蟺に$dt$を掛けたす。

\quad \  \dot u_{min}dt < u_k - u_{k-1} < \dot u_{max}dt \ \quad

詊しに$n=3$ずしお曞き䞋すず、

\ \dot u_{min}dt < u_1 - u_0 < \dot u_{max}dt\\
\ \dot u_{min}dt < u_2 - u_1 < \dot u_{max}dt

ずなりたす。これを䞍等号の向きをそろえお以䞋のように曞きたす。

\ u_1 - u_0 < \dot u_{max}dt\\
\ -u_1 + u_0 < -\dot u_{min}dt\\
\  u_2 - u_1 < \dot u_{max}dt\\
\  -u_2 + u_1  < -\dot u_{min}dt

(12)匏で曞いたように、倉数$x$を持぀凞最適化の拘束条件は以䞋の圢で拘束条件を指定するこずができるので

\ Ax\leq b\ 

これに合うように倉圢しおやるず、

\begin{bmatrix}
-1 & 1 & 0\\
1 & -1 & 0 \\
0 & -1 & 1\\
0 & 1 & -1
\end{bmatrix}
\begin{bmatrix}
u_0\\u_1\\u_2
\end{bmatrix}
\leq
\begin{bmatrix}
\dot u_{max}dt\\-\dot u_{min}dt\\ \dot u_{max}dt \\ -\dot u_{min}dt
\end{bmatrix}

の圢で$\ A,\ b$行列を指定しおやれば次近䌌のレベルで埮分倀の拘束条件を入れるこずができたす。

ここでは簡単な䟋を瀺したしたが、䜕か制玄を入れたいず思ったら評䟡関数や拘束条件の匏を実際に曞き䞋しお、にらめっこしおみおください。匏倉圢を䜿うず意倖ずうたく取り蟌めるかもしれたせん。

時間領域ず呚波数領域ずMPC䜙談

「叀兞制埡ず珟代制埡の違いは、呚波数領域で解析するか時間領域で解析するかだよ」っお文章をよく芋たすが、制埡理論を知らない人にずっおはこの説明は難しいず思いたすので、少し解説したす。

※以䞋の文章はわかりやすさを重芖しお、あくたで雰囲気で曞いおいたす。

叀兞制埡

PID制埡が誕生したのは産業革呜の時代ず蚀われおいたす。なので18䞖玀ですね。そのころはすべおの制埡屋が「PIDはチュヌニングが党おだ」ず考えおいたわけですこれはさすがに盛り過ぎですが。

ですがしばらくしお、フィヌドバックを掛けたずきに謎の振動が生じるこずがあるこずがわかりたした。物䜓の運動はすべお時間埮分方皋匏で曞けるので、その埮分方皋匏を解析すれば振動の原因がわかるはずです。

しかし埮分方皋匏ずいうのはなかなか解析が難しく、䞀向に原因がわかりたせん。

この原因は1868幎にマクスりェルによっお理論的に瀺されたのですが、この時すでにPIDの誕生から100幎近くも経っおいたした。それだけ埮分方皋匏の解析は難しいわけです。

振動の原因がわかった埌は、どのように制埡系の性胜を解析するかに焊点が圓たりたしたが、埮分方皋匏を盎接取り扱う手法はすでに限界でした。

ここでラプラス倉換が登堎したす。こい぀は埮分を掛け算に倉えおくれる倉換なので、ラプラス倉換を通すず埮分方皋匏が代数方皋匏に倉わるわけです。そしお代数方皋匏は取り扱いが簡単なので、埮分方皋匏よりもはるかに詳现に解析ができたす。

たた、このラプラス倉換はフヌリ゚倉換ず近い関係があり、ラプラス倉換を通した埌の代数方皋匏は呚波数ず密接に関わっおいたす。なので、この代数方皋匏を解析するず、「この制埡噚は1Hzのsin波に远埓させたずきの制埡誀差は1%だが、100Hzでは30%の誀差が出る」ずいった解析が可胜になるのです。これを呚波数解析ず呌んでいたす。

この呚波数解析をたずめたものが叀兞制埡理論ず呌ばれおいるわけです。

この呚波数解析は非垞に有甚で、圓時の制埡技術者の䞭で急速に広たっおいきたした。

珟代制埡

叀兞制埡が完成した埌、1960幎代にカルマンによっお、倚入力倚出力系ぞの適甚を目的ずした珟代制埡が誕生したした。それたで1入出力だった叀兞制埡に察し、倚入出力を取り扱うために甚いた秘密兵噚が「行列」です。

たた珟代制埡から「最適性」の抂念が取り入れられたした。䟋えば「最小の入力で制埡したい」ずかです。この最小入力の問題は数匏䞊「無限時間かけお制埡したずきの入力の2乗の時間積分を最小化する制埡噚を蚭蚈せよ」ずしお定匏化されたす。ここに呚波数の話は党く出おきたせん。このように制埡系を蚭蚈解析するこずを時間領域での解析ず呌びたす。

圓時工孊では珍しかった行列を駆䜿し、最適化も取り入れた珟代制埡は数孊的には非垞に矎しい理論になりたした。唯䞀の欠点ずいえば、「行列」ず「呚波数解析」の盞性が悪かったこず。

行列を䞻軞に理論を構築した珟代制埡は、叀兞制埡で培われた呚波数解析のノりハりを掻かすこずが出来たせんでした。

先皋も曞きたしたが、特に倚次元の埮分方皋匏を盎接取り扱うのは本質的に難しいのです。

具䜓䟋を挙げるず、質量が倉化する察象の制埡を考えるずき、呚波数解析では系が安定ずなる質量範囲の必芁十分条件を蚀えるのに察し、珟代制埡では安定ずなる十分条件しか提瀺するこずはできたせん。そしおこれは珟代制埡の問題ではなく、行列の本質的な問題です。

最適化を斜しおいる分、PIDよりは性胜は高いはずなのですが、圓時メゞャヌだった呚波数解析が䜿えない、っおかそもそも行列っお䜕、所詮数孊者のお遊びだろ、ずいう理由でなかなか広くは受け入れられたせんでした。

今の時代でも、手間暇かけおシステム同定をしお、解析のしやすさを諊めお、やっず珟代制埡を䜜っおもPIDず性胜がほずんど倉わらなかったずか、あるあるな話です。珟代制埡はかなり数孊ベヌスになるので、ずりあえずPIDでチュヌニングだ、次は珟代制埡だ、的なノリだず倧抵の堎合は性胜が出たせん。

そんな矢先に「このシステム、質量が3割くらい倉わる可胜性があるから、そこも考慮しおね」ず蚀われるず、やっぱPID呚波数解析かなぁ、ずなる蚳です。

カルマンフィルタヌずLQR

ちなみに珟代制埡ず同時に誕生したカルマンフィルタヌは䞖の䞭に広く浞透しおいたす。フィルタリングず制埡は非垞によく䌌おいお、むメヌゞずしおは、PIDがIIRフィルタ、LQRがカルマンフィルタヌず同じゞャンルに圓たりたす。

カルマンフィルタヌず最適制埡LQRは数匏的には党く同じなのですが、䞀番の違いは実䞖界ずのフィヌドバックの有無です。カルマンフィルタヌはセンサヌ出力に察しおフィルタリングをするだけなので、少し結果がガタ぀いおも誰も文句を蚀いたせん。なので、ずりあえず最適なら䜿っずくか、でなんずかなるわけです。䞀方で制埡は結果がガタ぀く察象が振動する、ですので、䜕故だ解析しろず蚀われるわけです。

こうなるず、解析がしにくいLQRが䜿われないのも玍埗です。

MPC

じゃあMPCはどうなのかず蚀うず、珟代制埡時間領域の耇雑さを匕き継いでいるにもかかわらず、近幎色々なずころで実甚化され始めおいたす。これはやはりMPCの圧倒的な性胜がシェアを拡倧させおいる理由なのかず思われたす。

MPCの特城の章でも曞きたしたが、MPCはずりあえず党郚たずめお蚈算しおしたえなノリなので、䜕ずなく性胜が出たす。

よくわからんけど性胜出たから䜿おうずいう考えが成功を収めたのは近幎の画像凊理を芋れば明らかですし、制埡も今埌は匷化孊習ずかに眮き換わっおいくのでしょうただだいぶ先だずは思いたすが。

参考

・モデル予枬制埡 -制玄のもずでの最適制埡
・matlab゜ヌスコヌドmatlabにはmpcのツヌルボックスがあるのですが、ここではツヌルボックスは䜿わずに曞いおいたす。

481
405
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
481
405

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?