自動駕駛運動規划-Reeds Shepp曲線


自動駕駛運動規划-Reeds Shepp曲線

相比於Dubins Car只允許車輛向前運動,Reeds Shepp Car既允許車輛向前運動,也允許車輛向后運動。

Reeds Shepp Car運動規划

1、車輛模型

車輛運動模型仍然采用Simple Car Model,但增加對車輛運動方向的描述,運動方程如下:

[公式]

[公式]

[公式]

其中,[公式][公式]。當[公式]時,表示車輛向前運動;[公式]時,表示車輛向后運動。

2、Reeds-Shepp Car

J Reeds和L Shepp證明Reeds Shepp Car從起點[公式]到終點[公式]的最短路徑一定是下面的word的其中之一。word中的"|"表示車輛運動朝向由正向轉為反向或者由反向轉為正向。

圖片來源:Planning Algorithm,http://planning.cs.uiuc.edu/node822.html

每個word都由[公式][公式][公式][公式][公式][公式]這六種primitives組成,其中[公式]表示車輛左轉前進;[公式]表示車輛左轉后退;[公式]表示車輛右轉前進;[公式]表示車輛右轉后退;[公式]表示車輛直行前進;[公式]表示車輛直行后退。

Reeds and Shepp曲線的word所有組合不超過48種,所有的組合一一枚舉如下:

圖片來源:Planning Algorithm,http://planning.cs.uiuc.edu/node822.html

3、計算優化

3.1 位置姿態統一化

車輛的起點和終點的位置姿態是難以窮舉的,所以一般在計算之前,會將車輛的姿態歸一化:

起始姿態:[公式]

目標姿態:[公式];其中,[公式]

車輛的轉彎半徑: r = 1;

假設車輛的初始姿態為[公式],目標姿態[公式],車輛的轉向半徑為r = [公式],如何實現姿態的歸一化呢,實際上歸一化的過程就是向量的平移和旋轉過程。歸一化:為了方便起見Reeds-Shepp中最小轉向半徑強制設置為1,如果車輛的實際最小轉向半徑不是1,可也通過適當放縮終點坐標來計算該曲線。比如如果一個車輛的最小轉向半徑為10,終點坐標為x,y,如果我們在計算曲線的時候將終點設為x/10,y/10,計算所得路徑放大10倍曲線的轉向半徑就是10,終點也是x,y,所得曲線就是我們所期望曲線。

首先將向量[公式]平移到坐標原點(0,0)。平移[公式]到O(0, 0),平移向量為[公式];對[公式]應用同樣的平移向量:[公式],最后得到平移后的向量:

[公式]

應用旋轉矩陣,將車輛的起點朝向轉到x軸正向:

[公式]

旋轉之后,目標位置朝向更新為[公式]

將車輛轉向半徑縮放到1,於是最終得到車輛運動的起始姿態:

[公式]

目標姿態:

[公式]

代碼如下:

double x1 = s1->getX(), y1 = s1->getY(), th1 = s1->getYaw(); double x2 = s2->getX(), y2 = s2->getY(), th2 = s2->getYaw(); double dx = x2 - x1, dy = y2 - y1, c = cos(th1), s = sin(th1); double x = c * dx + s * dy, y = -s * dx + c * dy, phi = th2 - th1; return ::reedsShepp(x / rho_, y / rho_, phi)

3.2 利用對稱關系降低求解復雜度

Reeds Shepp曲線有48種組合,編程時一一編碼計算比較麻煩,因此可以利用其對稱性降低求解工作量。

以轉向不同的CSC類型為例,它包含4種曲線類型:[公式][公式][公式][公式],我們只需要編碼推導得到[公式]的計算過程,其它幾種直接可以通過對稱性關系得到車輛運動路徑。

給定車輛起始姿態[公式],目標姿態[公式],可以得到[公式]的運動路徑如下:

{ Steering: left        Gear: forward    distance: 0.63 } { Steering: straight Gear: forward distance: 4.02 } { Steering: right Gear: forward distance: 0.11 }

對應的效果如下:

L^{+}S^{+}R^{+}

下面看看利用對稱性求解其它幾種路徑的方法。

3.2.1 timefilp對稱性

假設我們推導出從起始姿態[公式]達到目標姿態[公式]的路徑計算方法:

path = calc_path([公式][公式][公式][公式][公式][公式])

利用對稱性,將目標Pose修改為[公式],代入同樣的Path計算函數:

path = calc_path([公式][公式][公式], -[公式][公式], -[公式])

就得到從[公式][公式][公式]類型的運動路徑。

計算出的[公式]的車輛運動路徑如下:

{ Steering: left        Gear: backward    distance: -2.85 } { Steering: straight Gear: backward distance: 4.02 } { Steering: right Gear: backward distance: -2.32 }

下面是車輛的運動效果,一路倒車進入另一個車位。

3.2.2 reflect對稱性

將目標姿態修改為[公式],代入同樣的Path計算函數:

path = calc_path([公式][公式][公式][公式], -[公式], -[公式])

就得到從[公式][公式][公式]類型的運動路徑。

計算出的[公式]的車輛運動路徑如下:

{ Steering: right        Gear: forward    distance: -0.56 } { Steering: straight Gear: forward distance: 5.28 } { Steering: left Gear: forward distance: -0.03 }

下面是車輛先右轉、再直行、再左轉從一個車位進入另一個車位的運動效果。

R^{+}S^{+}L^{+}類型曲線

3.2.3 timeflip + reflect

結合timeflip對稱性和reflect對稱性,將目標姿態修改為[公式],代入同樣的Path計算函數:

path = calc_path([公式][公式][公式], -[公式], -[公式][公式])

就得到從[公式][公式][公式]類型的運動路徑。

計算出的[公式]的車輛運動路徑如下:

{ Steering: right    Gear: backward    distance: -1.86 } { Steering: straight Gear: backward distance: 5.28 } { Steering: left Gear: backward distance: -2.38 }

下面是車輛先右轉、再直行、再左轉,全程倒車從一個車位進入另一個車位的運動效果。

R^{-}S^{-}L^{-}類型曲線

通過對稱性,48種不同的Reeds Shepp曲線通過不超過12個函數就可以得到全部運動路徑。

參考鏈接

1、Optimal paths for a car that goes both forwards and backwards, J Reeds, L Shepp - Pacific journal of mathematics, 1990

2、OMPL的Reeds Sheep實現代碼。()

3、Reeds Sheep的Python代碼實現。()

轉自:https://zhuanlan.zhihu.com/p/122544884


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM