我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【自动驾驶】路径规划——ReedsShepp 曲线总结(python实现 | c++实现)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【自动驾驶】路径规划——ReedsShepp 曲线总结(python实现 | c++实现)

文章目录

参考资料


前文


1. Reeds-Shepp 曲线

1.1 基本概念

Reeds-Shepp 算法简称 RS,由 J.A.ReedsL.A.Shepp 于 1990 年发表的论文 ( optimal path for a car that goes both forward and backwards)。该方法基于 Dubins 算法进行改进,将反向运动(汽车允许后退,挂倒挡)加入到规划中,这就使得在某些情况下可以得出比 Dubins 曲线更优的解。

曲线示例如下:

图片来源:https://blog.csdn.net/robinvista/article/details/95137143

如上图可以知道,在 Reeds-Shepp 曲线的路径中,允许尖瓣存在。

1.2 字段组合

在字段中的字母上加入上标,用来表示运动方向,表示如下:

符号含义绕单位圆
L + L^+ L+左转逆时针
L − L^- L左转顺时针
R + R^+ R+右转逆时针
R − R^- R右转顺时针
S + S^+ S+直走/
S − S^- S直走/

使用 C 、 S C、S CS 字符可以给出如下集合:

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} \begin{aligned} &C C C \leftarrow\left\{\quad C^{+} C^{-} C^{+} \quad C^{+} C^{-} C^{-} \quad C^{+} C^{+} C^{-} \quad C^{+} C_{\beta}^{+} C_{\beta}^{-} C^{-} \quad C^{+} C_{\beta}^{-} C_{\beta}^{-} C^{+}\right\}\\ &C S C \leftarrow\left\{\quad C^{+} S^{+} C^{+} \quad C^{-} C_{\pi / 2}^{+} S^{+} C^{+} \quad C^{+} S^{+} C_{\pi / 2}^{+} C^{-} \quad C^{-} C_{\pi / 2}^{+} S^{+} C_{\pi / 2}^{+} C^{-}\right\} \end{aligned} CCC{C+CC+C+CCC+C+CC+Cβ+CβCC+CβCβC+}CSC{C+S+C+CCπ/2+S+C+C+S+Cπ/2+CCCπ/2+S+Cπ/2+C}(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} \begin{aligned} &C C C \leftarrow\left\{\begin{array}{ccccc} C|C| C & C \mid C C & C C \mid C & C C_{\beta} \mid C_{\beta} C & C\left|C_{\beta} C_{\beta}\right| C \end{array}\right\}\\ &C S C \leftarrow\left\{\begin{array}{llll} C S C & C \mid C_{\pi / 2} S C & C S C_{\pi / 2} \mid C & C\left|C_{\pi / 2} S C_{\pi / 2}\right| C \end{array}\right\} \end{aligned} CCC{CCCCCCCCCCCβCβCCCβCβC}CSC{CSCCCπ/2SCCSCπ/2CCCπ/2SCπ/2C}(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)

1.3 时间翻转(timeflip)、反射(reflect)和向后变换(backwards)

1.3.1 时间翻转(timeflip)

将计算出的曲线按照其运动方向进行取反,得到的新的曲线为原曲线相反的曲线。

如图,蓝色曲线 L− R+ S+ L+ L^-R^+S^+L^+ LR+S+L+与红色曲线 L+ R− S− L− L^+R^-S^-L^- L+RSL关于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,θ)的路径取反计算获得。

1.3.2 反射(reflect)

第二种转换关系:“reflect”,即将计算的曲线按照其沿圆周运动方向取反,得到的曲线与原来的曲线长度相同的新曲线。

如图所示,红色曲线 R− L+ S+ R+ R^- L^+ S^+ R^+ RL+S+R+与蓝色曲线 L− R+ S+ L+ L^- R^+ S^+ L^+ LR+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,θ)的路径圆周方向取反计算获得。

1.3.3 向后变换(backwards)

第三种转换关系:“backwards”,即将原曲线的路径逆序转换,得到的曲线与原来的曲线长度相同的新曲线。

“backwards”实例图如图所示,蓝色曲线 L− S− R− L+ L^-S^-R^- L^+ LSRL+与红色曲线 L+ R− S− L− L^+ R^- S^- L^- L+RSL不具有以上两种的堆成关系,但是很直观的可以看出 L− S− R− L+ L^-S^-R^- L^+ LSRL+的逆序排列得到 L+ R− S− L− L^+ R^- S^- L^- L+RSL,两条路径曲线上的路径进行逆向排列。从起始点 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(xcosθ+ysinθ,xsinθycosθ,θ) 的路径圆周方向取反计算获得。

1.4 48 个字段组合

所有的48个字段组合一一枚举如下:

图中,角标 β \beta β代表C旋转的弧度是 β \beta β,同理 π / 2 \pi/2 π/2也是代表旋转弧度,意思就是这个圆必须转 π / 2 \pi/2 π/2

所以,Dubins曲线是从6个曲线中选出最短的那条,而Reeds-Shepp曲线是从48个曲线中选出最短的那个(最开始的论文认为最短的曲线一定在48条曲线中,后人研究发现有两条曲线不会是最短的,所以后来搜索范围减小到46条)。

至于这些字段组合具体的推导,请看原论文

2. RS曲线求解

Reeds-Shepp 曲线的求解公式在原论文的式(8.1)~式(8.11)中。这边将其总结整理。

假设起点为 ( 0 , 0 , 0 ) (0,0,0) (0,0,0),终点为 ( x , y , θ ) (x,y,\theta) (x,y,θ)

2.1 三段圆弧组成

  • 第一类基础曲线: C∣C∣C C|C| C CCC, 即三段圆弧且每段圆弧两两圆弧方向相反, 基于此, 可以扩展出四种曲线形式: L + R − L + 、 L − R + L − 、 R + L − R + 、 R − L + R − L^{+} R^{-} L^{+} 、 L^{-} R^{+} L^{-} 、 R^{+} L^{-} R^{+} 、 R^{-} L^{+} R^{-} L+RL+LR+LR+LR+RL+R
  • 第二类基础曲线: CC∣C C C \mid C CCC, 即三段圆弧且后两段圆弧的圆弧方向相反, 基于此, 可 以扩展出四种曲线形式: L + R + L − 、 L − R − L + 、 R + L + R − 、 R − L − R + L^{+} R^{+} L^{-} 、 L^{-} R^{-} L^{+} 、 R^{+} L^{+} R^{-} 、 R^{-} L^{-} R^{+} L+R+LLRL+R+L+RRLR+
  • 第三类基础曲线: C∣CC C \mid C C CCC, 即三段圆弧且前两段圆弧的圆弧方向相反, 基于此, 可 以扩展出四种曲线形式: L + R − L − 、 L − R + L + 、 R + L − R − 、 R − L + R + L^{+} R^{-} L^{-} 、 L^{-} R^{+} L^{+} 、 R^{+} L^{-} R^{-} 、 R^{-} L^{+} R^{+} L+RLLR+L+R+LRRL+R+

通过时间翻转、反射和向后三种曲线变换方式, 上述 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\{\begin{array}{l} \left(u_{1}, t_{1}\right)=R(x-\sin \theta, y-1+\cos \theta) \\ \left\{\begin{array}{l} u_{1}^{2}>4 \rightarrow L=\infty \\ u_{1}^{2} \leq 4 \rightarrow\left\{\begin{array}{l} A=\arcsin \left(\frac{u_{1}^{2}}{4}\right) \\ u=M\left(A+t_{1}\right) \\ \left(u_{2}, t_{2}\right)=R(x-\sin \theta, y-1+\cos \theta) \\ t=t_{2} \\ v=M(\theta+t-u) \\ L=|t|+|u|+|v| \end{array}\right. \\ \text { 其中 } A \in\left[\frac{\pi}{2}, \pi\right] \end{array}\right. \end{array}\right. (u1,t1)=R(xsinθ,y1+cosθ)u12>4L=u124A=arcsin(4u12)u=M(A+t1)(u2,t2)=R(xsinθ,y1+cosθ)t=t2v=M(θ+tu)L=t+u+v 其中 A[2π,π](1)

其中 t 、 u 、 v t 、 u 、 v tuv 代表公式中每次转向的弧度值大小(其实也是基础曲线三段圆弧的弧长,因为圆弧半径为1,单位圆), L L L为路径总长度;公式中的函数 R R R 是将笛卡尔坐标系中的 ( x , y ) (x, y) (x,y) 转化成极坐标系下的 ( u1 , t1 ) \left(u_{1}, t_{1}\right) (u1,t1), 其中径向坐标值有 u1 、 u2 u_{1} 、 u_{2} u1u2, 角坐标值有 t1 、 t2 t_{1} 、 t_{2} t1t2, 函数 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 \begin{aligned} \left\{\begin{array}{l} r\cos{\theta}=x\\ r\sin{\theta}=y \end{array}\right.\\ \end{aligned} {rcosθ=xrsinθ=y

ψ=M(θ) \psi=M(\theta) ψ=M(θ)即表示 { ψ = θ m o d    2 π − π ≤ ψ < π \begin{aligned} \left\{\begin{array}{l} \psi=\theta \mod 2\pi\\ -\pi\le\psi<\pi \end{array}\right.\\ \end{aligned} {ψ=θmod2ππψ<π

后文除了新定义的符号,不再赘述已定义的符号。

2.2 两段圆弧与直线组成

  • 第四类基础曲线形式: CSC C S C CSC, 即两段圆弧与直线组成, 基于此, 可以扩展出八种曲 线形式: L + S + L + 、 L − S − L − 、 R + S + R + 、 R − S − R − 、 L + S + R + 、 L − S − R − 、 R + S + L + 、 R − S − L − L^{+} S^{+} L^{+} 、 L^{-} S^{-} L^{-} 、 R^{+} S^{+} R^{+} 、 R^{-} S^{-} R^{-} 、 L^{+} S^{+} R^{+} 、 L^{-} S^{-} R^{-} 、 R^{+} S^{+} L^{+} 、 R^{-} S^{-} L^{-} L+S+L+LSLR+S+R+RSRL+S+R+LSRR+S+L+RSL

{ ( u , t ) = R ( x − sin ⁡ θ , y − 1 + cos ⁡ θ ) v = M ( θ − t ) L = ∣ t ∣ + ∣ u ∣ + ∣ v ∣  其中  A ∈ [ 0 , π ] (2) \tag{2} \begin{aligned} \left\{\begin{array}{l} (u, t)=R(x-\sin \theta, y-1+\cos \theta) \\ v=M(\theta-t) \\ L=|t|+|u|+|v| \\ \text { 其中 } A \in[0, \pi] \end{array}\right. \end{aligned} (u,t)=R(xsinθ,y1+cosθ)v=M(θt)L=t+u+v 其中 A[0,π](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} \begin{aligned} \left\{\begin{array}{l} \left(u_{1}, t_{1}\right)=R(x-\sin \theta, y-1+\cos \theta) \\ \left\{\begin{array}{l} u_{1}^{2}>4 \rightarrow L=\infty \\ u_{1}^{2} \leq 4 \rightarrow\left\{\begin{array}{l} u=\sqrt{u_{1}^{2}-4} \\ \left(u_{2}, t_{2}\right)=R(u, 2) \\ t=M\left(t_{1}+t_{2}\right) \\ v=M(t-u) \\ L=|t|+|u|+|v| \end{array}\right. \end{array}\right. \end{array}\right.\\ \end{aligned} (u1,t1)=R(xsinθ,y1+cosθ)u12>4L=u124u=u124 (u2,t2)=R(u,2)t=M(t1+t2)v=M(tu)L=t+u+v(3)

通过上述三种曲线变换方式,将第 4 种公式的符号变换成了 8 种曲线,这 8种曲线中前 4 种使用式(2) 进行求解,后 4 种使用式(3) 进行求解。

2.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βRLRβLβ+R+R+Lβ+RβLRLβRβ+L+

  • 第六类基础曲线形式: C ∣ C β C β ∣ C C\left|C_{\beta} C_{\beta}\right| 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+LRβ+Lβ+RR+LβRβL+RLβ+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\{\begin{array}{l} \xi=x+\sin (\theta) \\ \eta=y-1-\cos (\theta) \\ \rho_{1}=\frac{2+\sqrt{\xi^{2}+\eta^{2}}}{4} \\ \rho_{2}=\frac{20-\xi^{2}-\eta^{2}}{16} \\ 0 \leq \rho_{1} 、 \rho_{2} \leq 1 \rightarrow\left\{\begin{array}{l} u_{1}=\arccos \left(\rho_{1}\right) \\ u_{2}=-\arccos \left(\rho_{2}\right) \\ u=u_1 \quad or \quad u_2\\ (t, v)=\tau \omega(u,-u, \xi, \eta, \theta) \\ L=|t|+2 *|u|+|v| \\ \text { 其中 } u \in[0, \pi / 2] \end{array}\right. \\ \text { 其它 } L=\infty \end{array}\right. ξ=x+sin(θ)η=y1cos(θ)ρ1=42+ξ2+η2 ρ2=1620ξ2η20ρ1ρ21u1=arccos(ρ1)u2=arccos(ρ2)u=u1oru2(t,v)=τω(u,u,ξ,η,θ)L=t+2u+v 其中 u[0,π/2] 其它 L=(4)
这 8 种曲线可以通过式(4)求解, 上述公式中的 ρ1 , u1 \rho_{1},u_1 ρ1,u1 用于第 5 类公式的路径计算, ρ2 , u2 \rho_{2},u_2 ρ2,u2 用于第 6 类公式的路径计算,式中的 τ ω \tau \omega τω 是曲线弧度计算函数,一般地,函数的曲线弧度值 ( t , v ) = τ ω ( u , v0 , ξ , η , θ ) (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 ) ) + 3t = { M ( t 1 + π ) , λ < 0 M ( t 1 ) , λ ≥ 0 v = M ( t − ( u − v 0 ) − θ ) (5) \tag{5} \left\{\begin{array}{l} \sigma=M(u-v_0) \\ \zeta=\sin (u)-\sin (\sigma) \\ \psi=\cos (u)-\cos (\sigma)-1 \\ t_{1}=\arctan \frac{\eta * \zeta-\xi * \psi}{\xi * \zeta+\eta * \psi} \\ \lambda=2 *(\cos (\sigma)-\cos (v_0)-\cos (u))+3 \\ t=\left\{\begin{array}{l} M\left(t_{1}+\pi\right), \lambda<0 \\ M\left(t_{1}\right), \lambda \geq 0 \end{array}\right. \\ v=M(t-(u-v_0)-\theta) \end{array}\right. σ=M(uv0)ζ=sin(u)sin(σ)ψ=cos(u)cos(σ)1t1=arctanξζ+ηψηζξψλ=2(cos(σ)cos(v0)cos(u))+3t={M(t1+π),λ<0M(t1),λ0v=M(t(uv0)θ)(5)

2.4 三段圆弧与一条直线段组成

  • 第七类基础曲线形式: C ∣ C π / 2 S C C\mid C_{\pi / 2} SC CCπ/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π/2SRLRπ/2+S+R+R+Lπ/2SLRLπ/2+S+L+L+Rπ/2SL L − R π / 2 + S + L + L^{-} R_{\pi / 2}^{+} S^{+} L^{+} LRπ/2+S+L+ R + L π / 2 − S − R − R^{+} L_{\pi / 2}^{-} S^{-} R^{-} R+Lπ/2SR R − L π / 2 + S + R + R^{-} L_{\pi / 2}^{+} S^{+} R^{+} RLπ/2+S+R+

  • 第八类基础曲线形式: C S C π / 2 ∣ C C S C_{\pi / 2} \mid C CSCπ/2C, 即三段圆弧与一段直线组成, 第三段圆弧为 π / 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+RLSLπ/2R+R+S+Rπ/2+LRSRπ/2L+R+S+Lπ/2+RRSLπ/2R+ 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+LLSRπ/2L+

{ ζ = 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\{\begin{array}{l} \zeta=x+\sin (\theta) \\ \eta=y-1-\cos (\theta) \\ \left(\rho, \vartheta\right)=R(-\eta, \zeta) \\ \left\{\begin{array}{l} (1) \rho \geq 2 \rightarrow\left\{\begin{array}{l} \left(T, \vartheta_{1}\right)=R\left(\sqrt{\rho^{2}-4},-2\right) \\ t=M\left(\vartheta-\vartheta_{1}\right) \\ u=2-\vartheta_{1} \\ v=M(\theta-t-\pi / 2) \end{array}\right. \\ (2)\left\{\begin{array}{l} t=\vartheta \\ u=2-\rho \\ v=M(t+\pi / 2-\theta) \end{array}\right. \\ L=|t|+|u|+|v|+\pi / 2 \\ \text { 其他,} L=\infty \end{array}\right. \end{array}\right. ζ=x+sin(θ)η=y1cos(θ)(ρ,ϑ)=R(η,ζ)(1)ρ2(T,ϑ1)=R(ρ24 ,2)t=M(ϑϑ1)u=2ϑ1v=M(θtπ/2)(2)t=ϑu=2ρv=M(t+π/2θ)L=t+u+v+π/2 其他,L=(6)

式中 u u u 表示直线运动长度, t 、 v t、v tv 表示圆弧运动的弧度值,式(6)中,当圆弧路经由两段顺时针方向的曲线构成就利用(1)子式计算,当圆弧路径由两段逆时针方向的曲线构成就利用(2)子式计算。

2.5 四段圆弧与一条直线段组成

  • 第九类基础曲线形式: C ∣ C π / 2 S C π / 2 ∣ C C\left|C_{\pi / 2} S C_{\pi / 2}\right| C CCπ/2SCπ/2C, 即四段圆弧与一条直线段组成, 第二段圆弧与第四段圆弧为 π/2 \pi / 2 π/2 圆弧, 中间路径为直线路径, 第二、三、四段圆弧方向与第一段、 第五段路径方向相反, 基于此, 可以扩展出四种曲线形式: L + R π / 2 − S − L π / 2 − R + 、 L − R π / 2 + S + L π / 2 + R − L^{+} R_{\pi / 2}^{-} S^{-} L_{\pi / 2}^{-} R^{+} 、 L^{-} R_{\pi / 2}^{+} S^{+} L_{\pi / 2}^{+} R^{-} L+Rπ/2SLπ/2R+LRπ/2+S+Lπ/2+R R + L π / 2 − S − R π / 2 − L + 、 R − L π / 2 + S + R π / 2 + L − R^{+} L_{\pi / 2}^{-} S^{-} R_{\pi / 2}^{-} L^{+} 、 R^{-} L_{\pi / 2}^{+} S^{+} R_{\pi / 2}^{+} L^{-} R+Lπ/2SRπ/2L+RLπ/2+S+Rπ/2+L

{ ζ = 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\{\begin{array}{l} \zeta=x+\sin (\theta) \\ \eta=y-1-\cos (\theta) \\ (\rho, \vartheta)=R(\zeta, \eta) \\ \rho \geq 2 \rightarrow\left\{\begin{array}{l} t=M\left(\vartheta-\arccos \left(-\frac{2}{\rho}\right)\right), t \in\left[-\frac{\pi}{2}, \frac{\pi}{2}\right] \\ \left\{\begin{array}{l} t \leq 0 \rightarrow L=\infty\\ t>0 \rightarrow\left\{\begin{array}{l} u=4-\frac{\zeta+2 * \cos (t)}{\sin (t)} \\ v=M(t-\theta) \\ L=|t|+|u|+|v|+2 * \frac{\pi}{2} \end{array}\right. \\ \end{array}\right. \\ \end{array}\right.\\ \text{其他, }L=\infty \end{array}\right. ζ=x+sin(θ)η=y1cos(θ)(ρ,ϑ)=R(ζ,η)ρ2t=M(ϑarccos(ρ2)),t[2π,2π]t0L=t>0u=4sin(t)ζ+2cos(t)v=M(tθ)L=t+u+v+22π其他L=(7)

3. python实现

由于自己写的代码bug实在太多了。。。不想改了,所以这边贴出几个开源的github代码:

python:

4. c++实现

C++:

来源地址:https://blog.csdn.net/weixin_42301220/article/details/125382518

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【自动驾驶】路径规划——ReedsShepp 曲线总结(python实现 | c++实现)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录