自動駕駛運動規划-Reeds Shepp曲線
相比於Dubins Car只允許車輛向前運動,Reeds Shepp Car既允許車輛向前運動,也允許車輛向后運動。

Reeds Shepp Car運動規划
1、車輛模型
車輛運動模型仍然采用Simple Car Model,但增加對車輛運動方向的描述,運動方程如下:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNkb3QlN0J4JTdEKyUzRCt1XzErY29zJTdCJTVDdGhldGElN0Q=.png)
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNkb3QlN0J5JTdEKyUzRCt1XzErc2luJTdCJTVDdGhldGElN0Q=.png)
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNkb3QlN0IlNUN0aGV0YSU3RCslM0QrdV8xK3VfMg==.png)
其中,
,
。當
時,表示車輛向前運動;
時,表示車輛向后運動。
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 位置姿態統一化
車輛的起點和終點的位置姿態是難以窮舉的,所以一般在計算之前,會將車輛的姿態歸一化:
起始姿態:
;
目標姿態:
;其中,![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNwaGklM0QlNUN0aGV0YV8yKy0rJTVDdGhldGFfMQ==.png)
車輛的轉彎半徑: r = 1;
假設車輛的初始姿態為
,目標姿態
,車輛的轉向半徑為r =
,如何實現姿態的歸一化呢,實際上歸一化的過程就是向量的平移和旋轉過程。歸一化:為了方便起見Reeds-Shepp中最小轉向半徑強制設置為1,如果車輛的實際最小轉向半徑不是1,可也通過適當放縮終點坐標來計算該曲線。比如如果一個車輛的最小轉向半徑為10,終點坐標為x,y,如果我們在計算曲線的時候將終點設為x/10,y/10,計算所得路徑放大10倍曲線的轉向半徑就是10,終點也是x,y,所得曲線就是我們所期望曲線。

首先將向量
平移到坐標原點(0,0)。平移
到O(0, 0),平移向量為
;對
應用同樣的平移向量:
,最后得到平移后的向量:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUN2ZWMlN0JxX0krcV9HJTdEKyUzRCslNUNiZWdpbiU3QmJtYXRyaXglN0QreF8yKy0reF8xKyU1QyU1Qyt5XzIrLSt5XzErJTVDJTVDKyU1Q2VuZCU3QmJtYXRyaXglN0QrJTNEKyU1Q2JlZ2luJTdCYm1hdHJpeCU3RCtkX3grJTVDJTVDK2RfeSslNUMlNUMrJTVDZW5kJTdCYm1hdHJpeCU3RCslNUMlNUM=.png)
應用旋轉矩陣,將車輛的起點朝向轉到x軸正向:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD0lNUNiZWdpbiU3QmJtYXRyaXglN0QrY29zKyU1Q3RoZXRhXzErJTI2K3NpbislNUN0aGV0YV8xKyU1QyU1Qystc2luKyU1Q3RoZXRhXzErJTI2K2NvcyslNUN0aGV0YV8xKyU1QyU1QyslNUNlbmQlN0JibWF0cml4JTdEKyU1Q2JlZ2luJTdCYm1hdHJpeCU3RCtkX3grJTVDJTVDK2RfeSslNUMlNUMrJTVDZW5kJTdCYm1hdHJpeCU3RCslM0QrJTVDYmVnaW4lN0JibWF0cml4JTdEK2RfeCtjb3MrJTVDdGhldGFfMSslMkIrZF95K3NpbislNUN0aGV0YV8xKyU1QyU1QystZF94K3NpbislNUN0aGV0YV8xKyUyQitkX3krY29zKyU1Q3RoZXRhXzErJTVDJTVDKyU1Q2VuZCU3QmJtYXRyaXglN0QrJTVDJTVD.png)
旋轉之后,目標位置朝向更新為
。
將車輛轉向半徑縮放到1,於是最終得到車輛運動的起始姿態:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1JKyUzRCsrJTVDYmVnaW4lN0JibWF0cml4JTdEKzArJTVDJTVDKzArJTVDJTVDKzArJTVDZW5kJTdCYm1hdHJpeCU3RCslNUMlNUM=.png)
目標姿態:
![[公式]](/image/aHR0cHM6Ly93d3cuemhpaHUuY29tL2VxdWF0aW9uP3RleD1HJTNEKyU1Q2JlZ2luJTdCYm1hdHJpeCU3RCt4KyU1QyU1Qyt5KyU1QyU1QyslNUNwaGkrJTVDZW5kJTdCYm1hdHJpeCU3RCslM0QrJTVDYmVnaW4lN0JibWF0cml4JTdEKyUyOGRfeCtjb3MrJTVDdGhldGFfMSslMkIrZF95K3NpbislNUN0aGV0YV8xJTI5KyUyRislNUNyaG8rJTVDJTVDKyUyOC1kX3grc2luKyU1Q3RoZXRhXzErJTJCK2RfeStjb3MrJTVDdGhldGFfMSslNUQrJTJGKyU1Q3JobyslNUMlNUMrJTVDdGhldGEyKy0rJTVDdGhldGFfMSslNUNlbmQlN0JibWF0cml4JTdEKyU1QyU1Qw==.png)
代碼如下:
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實現代碼。(https://ompl.kavrakilab.org/ReedsSheppStateSpace_8cpp_source.html)
3、Reeds Sheep的Python代碼實現。(https://github.com/nathanlct/reeds-shepp-curves/blob/master/reeds_shepp.py)
轉自:https://zhuanlan.zhihu.com/p/122544884
