应是天仙狂醉,乱把白云揉碎。— 唐 李白
🏰代码及环境配置:请参考 环境配置和代码运行!
之前介绍的曲线形式, 都是基于参数方程构造的. 这种方法有一个共同的缺点: 对于曲线上的弧长, 曲率, 计算比较困难.
κ = 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′′x′−x′′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′))ds′y(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′)ds′≈3ns(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.coursera.org/lecture/motion-planning-self-driving-cars/lesson-2-path-planning-optimization-9MonW
- https://en.wikipedia.org/wiki/Simpson’s_rule
🏎️自动驾驶小白说官网:https://www.helloxiaobai.cn
🐮GitHub代码仓:https://github.com/Hello-Xiao-Bai/Planning-XiaoBai!
🔥课程答疑,面试辅导:https://shop380995420.taobao.com
🌠代码配合官网教程食用更佳!
🚀知乎,微信,知识星球全平台同号!