赞
踩
前文
Reeds-Shepp 算法简称 RS,由 J.A.Reeds 和 L.A.Shepp 于 1990 年发表的论文 ( optimal path for a car that goes both forward and backwards)。该方法基于 Dubins 算法进行改进,将反向运动(汽车允许后退,挂倒挡)加入到规划中,这就使得在某些情况下可以得出比 Dubins 曲线更优的解。
曲线示例如下:
如上图可以知道,在 Reeds-Shepp 曲线的路径中,允许尖瓣存在。
在字段中的字母上加入上标,用来表示运动方向,表示如下:
符号 | 含义 | 绕单位圆 |
---|---|---|
L + L^+ L+ | 向前左转 | 逆时针 |
L − L^- L− | 向后左转 | 顺时针 |
R + R^+ R+ | 向前右转 | 顺时针 |
R − R^- R− | 向后右转 | 逆时针 |
S + S^+ S+ | 向前直走 | / |
S − S^- S− | 向后直走 | / |
使用 C 、 S C、S C、S 字符可以给出如下集合:
C
C
C
←
{
C
+
C
−
C
+
C
+
C
−
C
−
C
+
C
+
C
−
C
+
C
β
+
C
β
−
C
−
C
+
C
β
−
C
β
−
C
+
}
C
S
C
←
{
C
+
S
+
C
+
C
−
C
π
/
2
+
S
+
C
+
C
+
S
+
C
π
/
2
+
C
−
C
−
C
π
/
2
+
S
+
C
π
/
2
+
C
−
}
(1)
\tag{1}
通过反转等式 (1) 的符号可以获得新的的字段。上式 (1) 中, C π / 2 + C^+_{\pi/2} Cπ/2+表示相应的 L L L或 R R R的转过的角度为 π / 2 \pi/2 π/2 , C β C β C_{\beta}C_{\beta} CβCβ组合表示相应的弧段拥有相等的长度。
为了以紧凑的表示,避免
±
\pm
± ,可以写出充分路径的列表如下:
C
C
C
←
{
C
∣
C
∣
C
C
∣
C
C
C
C
∣
C
C
C
β
∣
C
β
C
C
∣
C
β
C
β
∣
C
}
C
S
C
←
{
C
S
C
C
∣
C
π
/
2
S
C
C
S
C
π
/
2
∣
C
C
∣
C
π
/
2
S
C
π
/
2
∣
C
}
(2)
\tag{2}
其中, ∣ | ∣表示车辆运动朝向由正向转为反向或者由反向转为正向。
将上述word分别带下标,如 C α ∣ C β ∣ C γ C_{\alpha}|C_{\beta}| C_{\gamma} Cα∣Cβ∣Cγ,其中 α , β , γ \alpha, \beta, \gamma α,β,γ分别表示旋转的角度(弧度制)。 S S S带下标 d d d表示行走的直线距离为 d d d。它们的范围如下表所示:
将 C C C替换为 L L L或 R R R ,通过简单的变换,则共有 48 种字段组合。这种简单变换包括时间翻转(timeflip)、反射(reflect)和向后变换(backwards)。
将计算出的曲线按照其运动方向进行取反,得到的新的曲线为原曲线相反的曲线。
如图,蓝色曲线 L − R + S + L + L^-R^+S^+L^+ L−R+S+L+与红色曲线 L + R − S − L − L^+R^-S^-L^- L+R−S−L−关于Y 轴左右对称,两条路径曲线上的路径航向角相反。从起始点 O ( 0 , 0 , 0 ) O(0, 0, 0) O(0,0,0)到目标点 A ( x , y , θ ) A(x, y,\theta) A(x,y,θ)的路径可以通过起始点 O ( 0 , 0 , 0 ) O(0, 0, 0) O(0,0,0)到目标点 B ( − x , − y , − θ ) B(-x,-y,-\theta) B(−x,−y,−θ)的路径取反计算获得。
第二种转换关系:“reflect”,即将计算的曲线按照其沿圆周运动方向取反,得到的曲线与原来的曲线长度相同的新曲线。
如图所示,红色曲线 R − L + S + R + R^- L^+ S^+ R^+ R−L+S+R+与蓝色曲线 L − R + S + L + L^- R^+ S^+ L^+ L−R+S+L+关于 X 轴左右对称,两条路径曲线上的路径航向角相反。从起始点 O ( 0 , 0 , 0 ) O(0,0,0) O(0,0,0) 到目标点 A ( x , y , θ ) A(x, y, \theta) A(x,y,θ)的路径可以通过起始点 O ( 0 , 0 , 0 ) O(0,0,0) O(0,0,0) 到目标点 B ( x , − y , − θ ) B(x,-y,-\theta) B(x,−y,−θ)的路径圆周方向取反计算获得。
第三种转换关系:“backwards”,即将原曲线的路径逆序转换,得到的曲线与原来的曲线长度相同的新曲线。
“backwards”实例图如图所示,蓝色曲线 L − S − R − L + L^-S^-R^- L^+ L−S−R−L+与红色曲线 L + R − S − L − L^+ R^- S^- L^- L+R−S−L−不具有以上两种的堆成关系,但是很直观的可以看出 L − S − R − L + L^-S^-R^- L^+ L−S−R−L+的逆序排列得到 L + R − S − L − L^+ R^- S^- L^- L+R−S−L−,两条路径曲线上的路径进行逆向排列。从起始点 O ( 0 , 0 , 0 ) O(0,0,0) O(0,0,0)到目标点 A ( x , y , θ ) A(x, y,\theta) A(x,y,θ) 的路径可以通过起始点 O ( 0 , 0 , 0 ) O(0,0,0) O(0,0,0) 到目标点 B ( x ∗ cos θ + y ∗ sin θ , x ∗ sin θ − y ∗ cos θ , θ ) B(x*\cos \theta +y*\sin\theta, x*\sin\theta -y*\cos\theta,\theta) B(x∗cosθ+y∗sinθ,x∗sinθ−y∗cosθ,θ) 的路径圆周方向取反计算获得。
所有的48个字段组合一一枚举如下:
图中,角标 β \beta β代表C旋转的弧度是 β \beta β,同理 π / 2 \pi/2 π/2也是代表旋转弧度,意思就是这个圆必须转 π / 2 \pi/2 π/2。
所以,Dubins曲线是从6个曲线中选出最短的那条,而Reeds-Shepp曲线是从48个曲线中选出最短的那个(最开始的论文认为最短的曲线一定在48条曲线中,后人研究发现有两条曲线不会是最短的,所以后来搜索范围减小到46条)。
至于这些字段组合具体的推导,请看原论文。
Reeds-Shepp 曲线的求解公式在原论文的式(8.1)~式(8.11)中。这边将其总结整理。
假设起点为 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),终点为 ( x , y , θ ) (x,y,\theta) (x,y,θ)。
通过时间翻转、反射和向后三种曲线变换方式, 上述 3 种公式的符号变换成 了 12 种曲线的运动方式, 可以利用公式(1)进行求解 。
{
(
u
1
,
t
1
)
=
R
(
x
−
sin
θ
,
y
−
1
+
cos
θ
)
{
u
1
2
>
4
→
L
=
∞
u
1
2
≤
4
→
{
A
=
arcsin
(
u
1
2
4
)
u
=
M
(
A
+
t
1
)
(
u
2
,
t
2
)
=
R
(
x
−
sin
θ
,
y
−
1
+
cos
θ
)
t
=
t
2
v
=
M
(
θ
+
t
−
u
)
L
=
∣
t
∣
+
∣
u
∣
+
∣
v
∣
其中
A
∈
[
π
2
,
π
]
(1)
\tag{1} \left\{
其中 t 、 u 、 v t 、 u 、 v t、u、v 代表公式中每次转向的弧度值大小(其实也是基础曲线三段圆弧的弧长,因为圆弧半径为1,单位圆), L L L为路径总长度;公式中的函数 R R R 是将笛卡尔坐标系中的 ( x , y ) (x, y) (x,y) 转化成极坐标系下的 ( u 1 , t 1 ) \left(u_{1}, t_{1}\right) (u1,t1), 其中径向坐标值有 u 1 、 u 2 u_{1} 、 u_{2} u1、u2, 角坐标值有 t 1 、 t 2 t_{1} 、 t_{2} t1、t2, 函数 M M M 用于对 2 π 2\pi 2π取模运算,并将弧度值限定在 [ − π , π ] [-\pi, \pi] [−π,π]。
函数 ( r , θ ) = R ( x , y ) (r,\theta)=R(x, y) (r,θ)=R(x,y)即笛卡尔坐标系中的 ( x , y ) (x, y) (x,y) 与极坐标系 ( r , θ ) (r,\theta) (r,θ)的关系可以表示为: { r cos θ = x r sin θ = y
{rcosθ=xrsinθ=y{rcosθ=xrsinθ=y ψ = M ( θ ) \psi=M(\theta) ψ=M(θ)即表示 { ψ = θ m o d 2 π − π ≤ ψ < π
{ψ=θmod2π−π≤ψ<π{ψ=θmod2π−π≤ψ<π
后文除了新定义的符号,不再赘述已定义的符号。
{
(
u
,
t
)
=
R
(
x
−
sin
θ
,
y
−
1
+
cos
θ
)
v
=
M
(
θ
−
t
)
L
=
∣
t
∣
+
∣
u
∣
+
∣
v
∣
其中
A
∈
[
0
,
π
]
(2)
\tag{2}
{
(
u
1
,
t
1
)
=
R
(
x
−
sin
θ
,
y
−
1
+
cos
θ
)
{
u
1
2
>
4
→
L
=
∞
u
1
2
≤
4
→
{
u
=
u
1
2
−
4
(
u
2
,
t
2
)
=
R
(
u
,
2
)
t
=
M
(
t
1
+
t
2
)
v
=
M
(
t
−
u
)
L
=
∣
t
∣
+
∣
u
∣
+
∣
v
∣
(3)
\tag{3}
通过上述三种曲线变换方式,将第 4 种公式的符号变换成了 8 种曲线,这 8种曲线中前 4 种使用式(2) 进行求解,后 4 种使用式(3) 进行求解。
第五类基础曲线形式: C C β ∣ C β C C C_{\beta} \mid C_{\beta} C CCβ∣CβC, 即四段圆弧组成, 第一段与第二段圆弧的圆弧方向相反, 第三段与第四段圆弧的圆弧方向相反, 前两段与后两段圆弧方向相反, 基于此, 可以扩展出四种曲线形式: L + R β + L β − R − 、 L − R β − L β + R + 、 R + L β + R β − L − 、 R − L β − R β + L + L^{+} R_{\beta}{ }^{+} L_{\beta}{ }^{-} R^{-} 、 L^{-} R_{\beta}{ }^{-} L_{\beta}{ }^{+} R^{+} 、 R^{+} L_{\beta}{ }^{+} R_{\beta}{ }^{-} L^{-} 、 R^{-} L_{\beta}{ }^{-} R_{\beta}{ }^{+} L^{+} L+Rβ+Lβ−R−、L−Rβ−Lβ+R+、R+Lβ+Rβ−L−、R−Lβ−Rβ+L+。
第六类基础曲线形式: C ∣ C β C β ∣ C C\left|C_{\beta} C_{\beta}\right| C C∣CβCβ∣C, 即四段圆弧组成, 第一段与第二段圆弧的圆弧方向相同, 第三段与第四段圆弧的圆弧方向相同, 前两段与后两段圆弧方向相反, 基于此, 可以扩展出四种曲线形式: L + R β − L β − R + 、 L − R β + L β + R − 、 R + L β − R β − L + 、 R − L β + R β + L − L^{+} R_{\beta}{ }^{-} L_{\beta}{ }^{-} R^{+} 、 L^{-} R_{\beta}{ }^{+} L_{\beta}{ }^{+} R^{-} 、 R^{+} L_{\beta}{ }^{-} R_{\beta}{ }^{-} L^{+} 、 R^{-} L_{\beta}{ }^{+} R_{\beta}{ }^{+} L^{-} L+Rβ−Lβ−R+、L−Rβ+Lβ+R−、R+Lβ−Rβ−L+、R−Lβ+Rβ+L−。
{
ξ
=
x
+
sin
(
θ
)
η
=
y
−
1
−
cos
(
θ
)
ρ
1
=
2
+
ξ
2
+
η
2
4
ρ
2
=
20
−
ξ
2
−
η
2
16
0
≤
ρ
1
、
ρ
2
≤
1
→
{
u
1
=
arccos
(
ρ
1
)
u
2
=
−
arccos
(
ρ
2
)
u
=
u
1
o
r
u
2
(
t
,
v
)
=
τ
ω
(
u
,
−
u
,
ξ
,
η
,
θ
)
L
=
∣
t
∣
+
2
∗
∣
u
∣
+
∣
v
∣
其中
u
∈
[
0
,
π
/
2
]
其它
L
=
∞
(4)
\tag{4} \left\{
这 8 种曲线可以通过式(4)求解, 上述公式中的
ρ
1
,
u
1
\rho_{1},u_1
ρ1,u1 用于第 5 类公式的路径计算,
ρ
2
,
u
2
\rho_{2},u_2
ρ2,u2 用于第 6 类公式的路径计算,式中的
τ
ω
\tau \omega
τω 是曲线弧度计算函数,一般地,函数的曲线弧度值
(
t
,
v
)
=
τ
ω
(
u
,
v
0
,
ξ
,
η
,
θ
)
(t,v)=\tau \omega(u,v_0,\xi,\eta,\theta)
(t,v)=τω(u,v0,ξ,η,θ)是通过式(5) 进行计算。
{
σ
=
M
(
u
−
v
0
)
ζ
=
sin
(
u
)
−
sin
(
σ
)
ψ
=
cos
(
u
)
−
cos
(
σ
)
−
1
t
1
=
arctan
η
∗
ζ
−
ξ
∗
ψ
ξ
∗
ζ
+
η
∗
ψ
λ
=
2
∗
(
cos
(
σ
)
−
cos
(
v
0
)
−
cos
(
u
)
)
+
3
t
=
{
M
(
t
1
+
π
)
,
λ
<
0
M
(
t
1
)
,
λ
≥
0
v
=
M
(
t
−
(
u
−
v
0
)
−
θ
)
(5)
\tag{5} \left\{
第七类基础曲线形式: C ∣ C π / 2 S C C\mid C_{\pi / 2} SC C∣Cπ/2SC, 即三段圆弧与一条直线段组成, 第二段圆弧为 π / 2 \pi / 2 π/2 圆弧, 第三段为直线路径, 第一段与后三段圆弧方向相反, 基于此, 可以扩展出八种曲线形式: L + R π / 2 − S − R − 、 L − R π / 2 + S + R + 、 R + L π / 2 − S − L − 、 R − L π / 2 + S + L + 、 L + R π / 2 − S − L − L^{+} R_{\pi / 2}^{-} S^{-} R^{-} 、 L^{-} R_{\pi / 2}^{+} S^{+} R^{+} 、 R^{+} L_{\pi / 2}^{-} S^{-} L^{-} 、 R^{-} L_{\pi / 2}^{+} S^{+} L^{+} 、 L^{+} R_{\pi / 2}^{-} S^{-} L^{-} L+Rπ/2−S−R−、L−Rπ/2+S+R+、R+Lπ/2−S−L−、R−Lπ/2+S+L+、L+Rπ/2−S−L−、 L − R π / 2 + S + L + L^{-} R_{\pi / 2}^{+} S^{+} L^{+} L−Rπ/2+S+L+、 R + L π / 2 − S − R − R^{+} L_{\pi / 2}^{-} S^{-} R^{-} R+Lπ/2−S−R−、 R − L π / 2 + S + R + R^{-} L_{\pi / 2}^{+} S^{+} R^{+} R−Lπ/2+S+R+。
第八类基础曲线形式: C S C π / 2 ∣ C C S C_{\pi / 2} \mid C CSCπ/2∣C, 即三段圆弧与一段直线组成, 第三段圆弧为 π / 2 \pi / 2 π/2 圆弧, 第二段为直线路径, 第四段与前三段圆弧方向相反, 基于此, 可以扩展出八种曲线形式: L + S + L π / 2 + R − 、 L − S − L π / 2 − R + 、 R + S + R π / 2 + L − 、 R − S − R π / 2 − L + 、 R + S + L π / 2 + R − 、 R − S − L π / 2 − R + L^{+} S^{+} L_{\pi / 2}^{+} R^{-} 、 L^{-} S^{-} L_{\pi / 2}^{-} R^{+} 、 R^{+} S^{+} R_{\pi / 2}^{+} L^{-} 、 R^{-} S^{-} R_{\pi / 2}^{-} L^{+} 、 R^{+} S^{+} L_{\pi / 2}^{+} R^{-} 、 R^{-} S^{-} L_{\pi / 2}^{-} R^{+} L+S+Lπ/2+R−、L−S−Lπ/2−R+、R+S+Rπ/2+L−、R−S−Rπ/2−L+、R+S+Lπ/2+R−、R−S−Lπ/2−R+、 L + S + R π / 2 + L − 、 L − S − R π / 2 − L + L^{+} S^{+} R_{\pi / 2}^{+} L^{-} 、 L^{-} S^{-} R_{\pi / 2}^{-} L^{+} L+S+Rπ/2+L−、L−S−Rπ/2−L+。
{
ζ
=
x
+
sin
(
θ
)
η
=
y
−
1
−
cos
(
θ
)
(
ρ
,
ϑ
)
=
R
(
−
η
,
ζ
)
{
(
1
)
ρ
≥
2
→
{
(
T
,
ϑ
1
)
=
R
(
ρ
2
−
4
,
−
2
)
t
=
M
(
ϑ
−
ϑ
1
)
u
=
2
−
ϑ
1
v
=
M
(
θ
−
t
−
π
/
2
)
(
2
)
{
t
=
ϑ
u
=
2
−
ρ
v
=
M
(
t
+
π
/
2
−
θ
)
L
=
∣
t
∣
+
∣
u
∣
+
∣
v
∣
+
π
/
2
其他,
L
=
∞
(6)
\tag{6} \left\{
式中 u u u 表示直线运动长度, t 、 v t、v t、v 表示圆弧运动的弧度值,式(6)中,当圆弧路经由两段顺时针方向的曲线构成就利用(1)子式计算,当圆弧路径由两段逆时针方向的曲线构成就利用(2)子式计算。
{
ζ
=
x
+
sin
(
θ
)
η
=
y
−
1
−
cos
(
θ
)
(
ρ
,
ϑ
)
=
R
(
ζ
,
η
)
ρ
≥
2
→
{
t
=
M
(
ϑ
−
arccos
(
−
2
ρ
)
)
,
t
∈
[
−
π
2
,
π
2
]
{
t
≤
0
→
L
=
∞
t
>
0
→
{
u
=
4
−
ζ
+
2
∗
cos
(
t
)
sin
(
t
)
v
=
M
(
t
−
θ
)
L
=
∣
t
∣
+
∣
u
∣
+
∣
v
∣
+
2
∗
π
2
其他,
L
=
∞
(7)
\tag{7} \left\{
由于自己写的代码bug实在太多了。。。不想改了,所以这边贴出几个开源的github代码:
python:
C++:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。