动手学运动规划: 2.4 3次螺旋线(Cubic Spiral Curve)

应是天仙狂醉,乱把白云揉碎。— 唐 李白

🏰代码及环境配置:请参考 环境配置和代码运行!


之前介绍的曲线形式, 都是基于参数方程构造的. 这种方法有一个共同的缺点: 对于曲线上的弧长, 曲率, 计算比较困难.

κ = y ′ ′ x ′ − x ′ ′ y ′ ( x ′ 2 + y ′ 2 ) 2 3 \kappa=\frac{y^{\prime \prime} x^{\prime}-x^{\prime \prime} y^{\prime}}{\left(x^{\prime 2}+y^{\prime 2}\right)^{\frac{2}{3}}} κ=(x′2+y′2)32y′′xx′′y

正如上式, 他们需要1阶,2阶导数才能得到曲率信息, 需要做大量的求根运算才能得到弧长. 这毫无疑问需要较大的计算资源. 那么如果某些情况下, 我们会大量的用到曲率和弧长, 有没有办法能够方便的得到呢?

2.4.1 3次螺旋线定义

3次螺旋线就是这样一种方法, 它是由一个曲率 k k k关于弧长 s s s的多项式定义的.

κ ( s ) = a 3 s 3 + a 2 s 2 + a 1 s + a 0 \kappa(s)=a_3 s^3+a_2 s^2+a_1 s+a_0 κ(s)=a3s3+a2s2+a1s+a0

a 0 , a 1 , a 2 , a 3 a_0, a_1, a_2, a_3 a0,a1,a2,a3是参数, 这样我们可以直接使用弧长s简单的计算曲率 k k k.

但是对应的, 计算x, y会变的很麻烦, 需要使用积分. (这就是人生啊~)

假设我们有一个用3次螺旋线表达的曲线, 它的始末状态分别是 ( x 0 , y 0 , θ 0 , k 0 ) , ( x f , y f , θ f , k f ) (x_0,y_0, \theta_0, k_0),(x_f,y_f, \theta_f, k_f) (x0,y0,θ0,k0),(xf,yf,θf,kf).

曲率=切向角的变化率/弧长的变化率. 因此从起始点开始对曲率进行积分可以得到切向角. 很容易可以得到切向角 θ ( s ) \theta(s) θ(s)的表达式

κ = d θ d s \kappa = \frac{d\theta}{ds} κ=dsdθ

θ ( s ) = θ 0 + ∫ 0 s a 3 s ′ 3 + a 2 s ′ 2 + a 1 s ′ + a 0 d s ′ = θ 0 + a 3 s 4 4 + a 2 s 3 3 + a 1 s 2 2 + a 0 s \begin{aligned}\theta(s) & =\theta_0+\int_0^s a_3 s^{\prime 3}+a_2 s^{\prime 2}+a_1 s^{\prime}+a_0 d s^{\prime} \\& =\theta_0+a_3 \frac{s^4}{4}+a_2 \frac{s^3}{3}+a_1 \frac{s^2}{2}+a_0 s\end{aligned} θ(s)=θ0+0sa3s′3+a2s′2+a1s+a0ds=θ0+a34s4+a23s3+a12s2+a0s

接下来我们再计算x,y, 需要通过 θ \theta θ积分得到:

x ( s ) = x 0 + ∫ 0 s cos ⁡ ( θ ( s ′ ) ) d s ′ y ( s ) = y 0 + ∫ 0 s sin ⁡ ( θ ( s ′ ) ) d s ′ \begin{aligned}& x(s)=x_0+\int_0^s \cos \left(\theta\left(s^{\prime}\right)\right) d s^{\prime} \\& y(s)=y_0+\int_0^s \sin \left(\theta\left(s^{\prime}\right)\right) d s^{\prime}\end{aligned} x(s)=x0+0scos(θ(s))dsy(s)=y0+0ssin(θ(s))ds

这样我们有了 ( x , y , θ , k ) (x,y, \theta, k) (x,y,θ,k)的完整表达, 但是似乎没有解决问题, 因为积分运算 ∫ 0 s cos ⁡ ( θ ( s ′ ) ) d s ′ \int_0^s \cos \left(\theta\left(s^{\prime}\right)\right) d s^{\prime} 0scos(θ(s))ds岂不是更复杂?

是的, 我们很难去算这个积分, 但是我们可以求积分的近似值.

2.4.2 辛普森法则(Simpson’s Rule)

辛普森法则(Simpson’s Rule)是一种数值积分方法,用于近似计算定积分的值。它是基于插值多项式的数值积分方法中的一种,特别地,它使用了二次多项式(抛物线)来逼近被积函数在小区间上的行为。下图的蓝线 f ( x ) f(x) f(x)是原曲线, 红线 P ( x ) P(x) P(x)是逼近的曲线.

该法则通过将积分区间[a,b]等分为n个小区间(n为偶数),然后在每个小区间内选取三个点(例如,第i个小区间的点 x i , x i + 1 , x i + 2 x_i, x_{i+1}, x_{i+2} xi,xi+1,xi+2),利用这三个点构造一条抛物线,以此抛物线的积分值来近似表示该小区间内被积函数的积分值。最终,将所有小区间的积分值相加,得到整个积分区间的近似积分值。

这个动图能够更加直观的解释这个过程, 每3个点构造一个二次多项式, 然后对二次多形式积分.

Δ x \Delta x Δx表示采样点的间距, 可以明显看出来采样点越密集, 整体误差越小. 当然相对的, 计算量越大.

辛普森法则的计算公式有多种形式,其中较为常见的是辛普森1/3法则和辛普森3/8法则。我们使用辛普森1/3法则:

∫ 0 s f ( s ′ ) d s ′ ≈ s 3 n ( f ( 0 ) + 4 f ( s n ) + 2 f ( 2 s n ) + ⋯ + f ( s ) ) \int_0^s f\left(s^{\prime}\right) d s^{\prime} \approx \frac{s}{3 n}\left(f(0)+4 f\left(\frac{s}{n}\right)+2 f\left(\frac{2 s}{n}\right)+\cdots+f(s)\right) 0sf(s)ds3ns(f(0)+4f(ns)+2f(n2s)++f(s))

n n n代表在区间内切割成多少份. 我们设定 n = 8 n=8 n=8, 将辛普森法则应用到 ( x , y , θ ) (x,y, \theta) (x,y,θ)的积分中, 得到积分的近似解.

x ( s ) ≈ x 0 + s 24 [ cos ⁡ ( θ ( 0 ) ) + 4 cos ⁡ ( θ ( s 8 ) ) + 2 cos ⁡ ( θ ( 2 s 8 ) ) + 4 cos ⁡ ( θ ( 3 s 8 ) ) + 2 cos ⁡ ( θ ( 4 s 8 ) ) + 4 cos ⁡ ( θ ( 5 s 8 ) ) + 2 cos ⁡ ( θ ( 6 s 8 ) ) + 4 cos ⁡ ( θ ( 7 s 8 ) ) + cos ⁡ ( θ ( s ) ) ] y ( s ) ≈ y 0 + s 24 [ sin ⁡ ( θ ( 0 ) ) + 4 sin ⁡ ( θ ( s 8 ) ) + 2 sin ⁡ ( θ ( 2 s 8 ) ) + 4 sin ⁡ ( θ ( 3 s 8 ) ) + 2 sin ⁡ ( θ ( 4 s 8 ) ) + 4 sin ⁡ ( θ ( 5 s 8 ) ) + 2 sin ⁡ ( θ ( 6 s 8 ) ) + 4 sin ⁡ ( θ ( 7 s 8 ) ) + sin ⁡ ( θ ( s ) ) ] \begin{aligned}x(s)\approx x_0+\frac{s}{24}[\cos (\theta(0)) & +4 \cos \left(\theta\left(\frac{s}{8}\right)\right)+2 \cos \left(\theta\left(\frac{2 s}{8}\right)\right)+4 \cos \left(\theta\left(\frac{3 s}{8}\right)\right)+2 \cos \left(\theta\left(\frac{4 s}{8}\right)\right) \\& \left.+4 \cos \left(\theta\left(\frac{5 s}{8}\right)\right)+2 \cos \left(\theta\left(\frac{6 s}{8}\right)\right)+4 \cos \left(\theta\left(\frac{7 s}{8}\right)\right)+\cos (\theta(s))\right] \\y(s)\approx y_0+\frac{s}{24}[\sin (\theta(0)) & +4 \sin \left(\theta\left(\frac{s}{8}\right)\right)+2 \sin \left(\theta\left(\frac{2 s}{8}\right)\right)+4 \sin \left(\theta\left(\frac{3 s}{8}\right)\right)+2 \sin \left(\theta\left(\frac{4 s}{8}\right)\right) \\& \left.+4 \sin \left(\theta\left(\frac{5 s}{8}\right)\right)+2 \sin \left(\theta\left(\frac{6 s}{8}\right)\right)+4 \sin \left(\theta\left(\frac{7 s}{8}\right)\right)+\sin (\theta(s))\right]\end{aligned} x(s)x0+24s[cos(θ(0))y(s)y0+24s[sin(θ(0))+4cos(θ(8s))+2cos(θ(82s))+4cos(θ(83s))+2cos(θ(84s))+4cos(θ(85s))+2cos(θ(86s))+4cos(θ(87s))+cos(θ(s))]+4sin(θ(8s))+2sin(θ(82s))+4sin(θ(83s))+2sin(θ(84s))+4sin(θ(85s))+2sin(θ(86s))+4sin(θ(87s))+sin(θ(s))]

这样, 我们就得到了最终的表达式.

下一节, 我们会解析和运行代码.

参考链接


🏎️自动驾驶小白说官网:https://www.helloxiaobai.cn

🐮GitHub代码仓:https://github.com/Hello-Xiao-Bai/Planning-XiaoBai!

🔥课程答疑,面试辅导:https://shop380995420.taobao.com

🌠代码配合官网教程食用更佳!

🚀知乎,微信,知识星球全平台同号!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值