走行距離を時間軸とする時間軸状態制御形

目次

 はじめに

自動車などの経路追従制御でよく利用される2輪モデルは非ホロノミック(Nonholonomic)な拘束を有するシステムであり,比較的制御が困難であると言われています.

このようなシステムを安定化する方法として,以下のような手法が挙げられています.

  • 時変状態フィードバック
  • 不連続フィードバック
  • 時間軸状態制御

最近は時間軸状態制御に基づく手法をよく見るような気がしますので,勉強までに実装してみました.

ベースとする資料は下記の論文です.

www.jstage.jst.go.jp

 

時間軸状態制御の概要

制御系を実現する際には状態フィードバックのようなフィードバック系を利用することが多いです.
このようなフィードバック系は静的連続状態フィードバック系と呼ばれます.
しかし非ホロノミック系はこのようなフィードバック系では安定化できないことが知られています.

時間軸状態制御(Time state control)では,座標変換により「新たな時間軸」を定義し,
その「新たな時間軸」に対するフィードバック系を設計します.

このとき設計するフィードバック系は通常の状態フィードバック系でよいため,
従来の設計手法や制御則を利用できる点が大きな利点です.

応用として時間軸状態制御形に変換後,モデル予測制御を適用した例などもあります.
今回のベースとする論文も非線形のモデル予測制御を適用しています.

また,2輪モデルへの適用の場合には実装が極めて簡単なところも利点と言えます.

時間軸の選定

「新たな時間軸」には様々な選択肢がありますが,私が見たところでは大きく3つに分類されます.

  •  x軸(平面上に固定した軸)を時間軸にする
  • 目標経路(参照経路)を時間軸にする
  • 走行経路(自車の走行距離)を時間軸にする

 x軸を利用する方法は,発案者である三平先生(東京工業大学)が最初に利用した手法です.
この手法では \pm\pi/2以上の方位姿勢変化がある場合には座標系を切り替える必要があるようで,
現在ではあまり利用されていないようです.

その後,目標経路を利用する方法と走行経路を利用する方法が出てきていますが,
後者の方が新しいアプローチのようです.

今回ベースとする論文が,走行経路を時間軸とする手法を提案した論文でもあります.

適用の流れ

時間軸制御形を適用する際には,以下の流れが必要となります.

  1. 新しい時間軸を定義する
  2. 新しい状態ベクトルを定義する
  3. 決定した時間軸と状態ベクトルを利用してシステムを座標変換する
  4. 座標変換後のシステムに対してフィードバック系を設計する

今回,時間軸は自車の走行距離に取ると決めています.
また,フィードバック系の設計については従来の手法を利用することができます.

重要なところは状態ベクトルの定義とシステムの座標変換の部分となります.

座標変換の到着点

通常,システムの状態方程式を立てる際には,状態ベクトルは時間微分の形式で取ります.

\begin{align}
\frac{d}{dt} \left[\begin{array}{c}
x \\
\displaystyle\frac{dx}{dt}
\end{array}\right] = \left[\begin{array}{cc}
a_{11} & a_{12} \\
a_{21} & a_{22}
\end{array}\right] \left[\begin{array}{c}
x \\
\displaystyle\frac{dx}{dt}
\end{array}\right] + \left[\begin{array}{c}
b_{1} \\
b_{2}
\end{array}\right] u
\end{align}

 

時間軸状態制御形では,新たに定義する時間軸に対する微分の形式で取ることが特徴です.

\begin{align}
\frac{d}{ds} \left[\begin{array}{c}
x \\
\displaystyle\frac{dx}{ds}
\end{array}\right] = \left[\begin{array}{cc}
a'_{11} & a'_{12} \\
a'_{21} & a'_{22}
\end{array}\right] \left[\begin{array}{c}
x \\
\displaystyle\frac{dx}{ds}
\end{array}\right] + \left[\begin{array}{c}
b'_{1} \\
b'_{2}
\end{array}\right] u'
\end{align}

 

あとはこのシステムに対して状態フィードバック系を設計するだけなので,
上の形式に変換することが時間軸状態制御形を扱う上でのゴールとなります.

時間軸状態制御の2輪モデルへの適用

2輪モデル

2輪モデルの運動は以下の式で表すことができます.
よく知られている一般的な式です.

\begin{align}
\dot{x} = v \cos\theta \\
\dot{y} = v \sin\theta \\
\dot{\theta} = \frac{v}{l} \tan\delta
\end{align}

 

ここで, x y \thetaはそれぞれ車両後輪位置および姿勢角です.
また, vは車両の速度, \deltaは車両操舵角 lホイールベースを表します.

新しい時間軸と状態ベクトルを定義する

今回は,新しい時間軸を「自車の走行距離」に取ると決まっているため,
まずは自車の走行距離を sと定義します.
また,ここから明らかに sの時間微分 ds/dt=vとなることがわかります.

 

次に,新しい状態を参照経路から車両後輪位置までの距離 zとして定義します.
新しい状態の微分は自車の走行距離 sで行われるため, dz/dsとなり,以下の式となります.

\begin{align}
\frac{dz}{ds} = \frac{dz}{dt} \frac{dt}{ds}
\end{align}

 

また,2階微分は同様に以下の式で得られます.

\begin{align}
\frac{d^2z}{ds^2} = \frac{d}{ds}\left( \frac{dz}{dt} \frac{dt}{ds} \right)
\end{align}

 

上式の中では zのみが未知なため,これを幾何学的関係から導出します.

発見的仮定
  • 新しい時間軸を自車の走行距離に取る.
  • 新しい状態を参照経路から車両後輪位置までの距離に取る.
  • 新しい状態に対する2階微分まで利用する.

幾何学的関係の導出

論文中では基底幾何ベクトル表現となっていますが,あまり馴染みがないので
代数ベクトル表現で書き直しています.

慣性座標系 \Sigmaにおいて,位置ベクトル q_{r}=[q_{rx}, q_{ry}]^T q=[q_{x}, q_{y}]^T p=[p_{x}, p_{y}]^T
以下の関係にあります.

\begin{align}
q_{r} = q + p
\end{align}

 

また,この時間微分は以下のとおりです.

\begin{align}
\dot{q_{r}} = \dot{q} + \dot{p}
\end{align}

 

 ここで左辺は \dot{s_{r}}を参照経路上の速度として,

\begin{align}
\dot{q_{r}}=\left[\begin{array}{c}
\dot{s_{r}} \cos\theta_{r} \\
\dot{s_{r}} \sin\theta_{r}
\end{array}\right]
\end{align}

 

右辺第1項は,

\begin{align}
\dot{q}=\left[\begin{array}{c}
v \cos\theta \\
v \sin\theta
\end{array}\right] .
\end{align}

 

状態 zは参照経路から車両後輪位置までの距離に取るため,位置ベクトル pに沿った状態となります.
ただし,向きは反対なため負号がついています.

\begin{align}
p&=\left[\begin{array}{c}
-z \cos\left(\theta_{r}+\displaystyle\frac{\pi}{2}\right) \\
-z \sin\left(\theta_{r}+\displaystyle\frac{\pi}{2}\right)
\end{array}\right] \\
\\
&=\left[\begin{array}{c}
z \sin\theta_{r} \\
-z \cos\theta_{r}
\end{array}\right]
\end{align}

 

上式を時間微分することで \dot{p}が得られます.

\begin{align}
\dot{p}&=\left[\begin{array}{c}
\dot{z} \sin\theta_{r} + z\dot{\theta_{r}}\cos\theta_{r} \\
-\dot{z} \cos\theta_{r} + z\dot{\theta_{r}}\sin\theta_{r}
\end{array}\right]
\end{align}

 

ここで, \dot{\theta_{r}}を連鎖律より以下の形式に変換します.

\begin{align}
\dot{\theta_{r}}&=\frac{d\theta_{r}}{dt}=\frac{d\theta_{r}}{ds_{r}}\frac{ds_{r}}{dt} \\
\\
&= \kappa_{r} \dot{s_{r}}
\end{align}

 

ただし, \kappa_{r}は参照軌道の曲率です.

上記の結果をまとめて書くと,以下の幾何学的な関係が得られます.

\begin{align}
\dot{q_{r}} &= \dot{q} + \dot{p} \\
\\
\left[\begin{array}{c}
\dot{s_{r}} \cos\theta_{r} \\
\dot{s_{r}} \sin\theta_{r}
\end{array}\right] &= \left[\begin{array}{c}
v \cos\theta \\
v \sin\theta
\end{array}\right] + \left[\begin{array}{c}
\dot{z} \sin\theta_{r} + z\kappa_{r}\dot{s_{r}}\cos\theta_{r} \\
-\dot{z} \cos\theta_{r} + z\kappa_{r}\dot{s_{r}}\sin\theta_{r}
\end{array}\right]
\end{align}

発見的仮定
  • 状態 zを位置ベクトル pと逆方向に取る.
  • 時間微分 \dot{\theta_{r}}を曲率 \kappa_{r}と参照軌道上の速度 \dot{s_{r}}に分解する.

システムを座標変換する

先ほど求めた関係式を z s_{r}についてまとめます.

\begin{align}
\left[ \begin{array}{cc}
-\sin\theta_{r} & (1-z\kappa_{r})\cos\theta_{r} \\
\cos\theta_{r} & (1-z\kappa_{r})\sin\theta_{r}
\end{array} \right] \left[ \begin{array}{c}
\dot{z} \\
\dot{s_{r}}
\end{array} \right] = \left[ \begin{array}{c}
v\cos\theta \\
v\sin\theta
\end{array} \right]
\end{align}

 

上式を \dot{z} \dot{s_{r}}について解きます.

\begin{align}
\left[ \begin{array}{c}
\dot{z} \\
\dot{s_{r}}
\end{array} \right] &= -\frac{1}{(1-z\kappa_{r})} \left[ \begin{array}{cc}
(1-z\kappa_{r})\sin\theta_{r} & -(1-z\kappa_{r})\cos\theta_{r} \\
-\cos\theta_{r} & -\sin\theta_{r}
\end{array} \right] \left[ \begin{array}{c}
v\cos\theta \\
v\sin\theta
\end{array} \right] \\
\\
&= -\frac{1}{(1-z\kappa_{r})} \left[ \begin{array}{c}
v(1-z\kappa_{r}) (\sin\theta_{r}\cos\theta - \cos\theta_{r}\sin\theta) \\
-v(\cos\theta_{r}\cos\theta + \sin\theta_{r}\sin\theta)
\end{array} \right] \left[ \begin{array}{c}
v\cos\theta \\
v\sin\theta
\end{array} \right] \\
\\
&= \left[ \begin{array}{c}
-v\sin(\theta_{r}-\theta) \\
\displaystyle\frac{v}{1-z\kappa_{r}}\cos(\theta_{r}-\theta)
\end{array} \right]
\end{align}

 

計算の過程で逆行列の計算と,三角関数の加法定理を使っています.

この時間微分形式の状態方程式を座標変換していきます.
まずは, dz/dsを求めます.

\begin{align}
\frac{dz}{ds} &= \frac{dz}{dt} \frac{dt}{ds} \\
\\
&= -v\sin(\theta_{r}-\theta) \cdot \frac{1}{v} \\
\\
&= -\sin(\theta_{r}-\theta)
\end{align}

 

次に2階微分 d^2z/ds^2を求めます.
まず連鎖律で変換して,

\begin{align}
\frac{d^2z}{ds^2} &= \frac{d}{ds}\left( \frac{dz}{ds} \right) \\
\\
&= \frac{d}{ds} \left( -\sin(\theta_{r}-\theta) \right)\\
\\
&= -\cos(\theta_{r}-\theta) \cdot \left( \frac{d\theta_{r}}{ds} -\frac{d\theta}{ds} \right) \\
\\
&= -\cos(\theta_{r}-\theta) \cdot \left( \frac{d\theta_{r}}{ds_{r}} \frac{ds_{r}}{dt} \frac{dt}{ds} - \frac{d\theta}{dt} \frac{dt}{ds} \right)
\end{align}

 これまでに求めた式を代入していきます.

\begin{align}
\frac{d^2z}{ds^2} &= -\cos(\theta_{r}-\theta) \cdot \left( \kappa_{r} \cdot \frac{v}{1-z\kappa_{r}}\cos(\theta_{r}-\theta) \cdot \frac{1}{v} - \frac{v}{l}\tan\delta \cdot \frac{1}{v} \right) \\
\\
&= \cos(\theta_{r}-\theta) \cdot \left( \frac{-\kappa_{r}}{1-z\kappa_{r}}\cos(\theta_{r}-\theta) + \frac{1}{l}\tan\delta \right)
\end{align}

 

これで以下のような状態方程式が得られました.

非線形状態方程式

\begin{align}
\frac{d}{ds} \left[\begin{array}{c}
z \\
\displaystyle\frac{dz}{ds}
\end{array}\right] = \left[\begin{array}{c}
\displaystyle\frac{dz}{ds} \\
\cos(\theta_{r}-\theta) \cdot \displaystyle\left( \frac{-\kappa_{r}}{1-z\kappa_{r}}\cos(\theta_{r}-\theta) + \frac{1}{l}\tan\delta \right)
\end{array}\right]
\end{align}

 

この式に対して直接,非線形モデル予測制御などの手法を適用することもできますが,
今回は入力変換によって下記のような線形の状態方程式に変換します.

線形状態方程式

\begin{align}
\frac{d}{ds} \left[ \begin{array}{c}
z \\
\displaystyle\frac{dz}{ds}
\end{array} \right] = \left[ \begin{array}{cc}
0 & 1 \\
0 & 0
\end{array} \right] \left[ \begin{array}{c}
z \\
\displaystyle\frac{dz}{ds}
\end{array} \right] + \left[ \begin{array}{c}
0 \\
1
\end{array} \right] \mu
\end{align}

 

線形化された式を非線形の式と比較すると, d^2z/ds^2=\muであることがわかります.

したがって,入力変換の式は以下となります.

\begin{align}
\mu &= \cos(\theta_{r}-\theta) \cdot \displaystyle\left( \frac{-\kappa_{r}}{1-z\kappa_{r}}\cos(\theta_{r}-\theta) + \frac{1}{l}\tan\delta \right) \\
\\
\frac{1}{l}\tan\delta &= \frac{\mu}{\cos(\theta_{r}-\theta)} + \frac{\kappa_{r}}{1-z\kappa_{r}}\cos(\theta_{r}-\theta) \\
\end{align}

入力変換

\begin{align}
\delta &= \tan^{-1} \left( \frac{\mu l}{\cos(\theta_{r}-\theta)} + \frac{\kappa_{r} l}{1-z\kappa_{r}}\cos(\theta_{r}-\theta) \right)
\end{align}

 

状態方程式に対してフィードバックをかけて得た \muを上式に代入することで,
目標とする車両操舵角 \deltaを計算できます.

ただし,この入力変換の過程で参照軌道の接線方位 \theta_{r},車両方位 \theta,参照軌道の曲率 \kappa_{r}
急激に変化しないことを仮定していることに注意が必要です.

シミュレーション

MATLAB/Simulink R2015aでシミュレーションしてみました.

といってもほとんどコードベースなので,mファイルを見れば何をしているかわかると思います.

実装に必要な情報

時間軸状態制御のコントローラ内部は線形状態方程式に対する状態フィードバックと,
入力変換の式の2つだけです.

よって必要な情報は,車両から参照経路までの距離 zとその微分 dz/ds
参照軌道と車両の方位誤差 \theta_{r}-\theta,参照経路の曲率 \kappa_{r}ホイールベース lです.

距離 z,方位誤差 \theta_{r}-\thetaおよび曲率 \kappa_{r}ですが,
複雑な経路を走行させる場合にはパラメトリック曲線を利用すると簡単に計算することができます.

 

今回はCatmull-Rom splineを利用し,ニュートン法で車両から参照経路までの距離 zを計算しています.

このとき同時にFrenet-Serretの公式より,経路の接線方向 \theta_{r}と曲率 \kappa_{r}も計算しています.

あとは自車の方位を取得できれば実装が可能です.

 

また dz/dsですが,「車両の進んだ長さあたりの zの変化」であるため,
表記通りに計算すると停止時に分母がゼロとなりゼロ割の恐れがあります.

ただし,先述した以下の式を利用すると問題なさそうなので今回はこちらを使用しています.

\begin{align}
\frac{dz}{ds} = -\sin(\theta_{r}-\theta)
\end{align}

 

シミュレーション

灰色の線が追従すべき参照経路,赤色の点が車両を表しています.

赤色の円は車両から参照経路までの距離,青の直線は参照経路上の接線方向を描画したものです.

f:id:blockahead:20180708152716g:plain

 


 

この結果はSimlink project形式でGithubにアップロードしています.

github.com