动手学运动规划: 2.2 3次样条曲线(Cubic Spline)

我自狂歌空度日, 飞扬跋扈为谁雄. — 亮剑 楚云飞

🏰代码及环境配置:请参考0.2 环境配置和代码运行 | 动手学运动规划!


上一节说到多项式曲线的缺点: 不管是多少阶的多项式, 能够表达的曲线始终是有限的. 那么有没有什么简单的办法能够克服这个缺陷呢? 插值样条就是一种简单有效的方法.

2.2.1 3次样条曲线定义

3次样条曲线(Cubic Spline), 是一种通过一系列三次多项式来逼近给定数据点集的方法。每个多项式定义在两个相邻的数据点之间,且满足在数据点处及其一阶导数和二阶导数都连续的条件。

简单的说, 它在每两个采样点之间, 构造了一个3次多项式. 这样只要采样点和点之间距离足够近, 理论上可以表达任何曲线.

我们先从1维的3次样条开始解释, 比如图上的这5个点, 我们在每两个点之间构造一个3次多项式.那么有如下定义:

S j ( x ) = a j + b j ( x − x j ) + c j ( x − x j ) 2 + d j ( x − x j ) 3 x j < x < x j + 1 \begin{align*} S_j(x)=a_j+b_j\left(x-x_j\right)+c_j\left(x-x_j\right)^2&+d_j\left(x-x_j\right)^3 \\ x_j < x < x_{j+1} \end{align*} Sj(x)=aj+bj(xxj)+cj(xxj)2xj<x<xj+1+dj(xxj)3

x j x_j xj x j + 1 x_{j+1} xj+1是第j段样条的起点和终点, a j , b j , c j , d j a_j, b_j, c_j, d_j aj,bj,cj,dj是第j段样条的参数.

很好理解的是, 每段样条有起点和终点的这些约束:

S j ( x j ) = y j S j ( x j + 1 ) = S j + 1 ( x j + 1 ) = y j + 1 S j ′ ( x j + 1 ) = S j + 1 ′ ( x j + 1 ) S j ′ ′ ( x j + 1 ) = S j + 1 ′ ′ ( x j + 1 ) \begin{align*} S_j\left(x_j\right)&=y_j \\ S_j\left(x_{j+1}\right)&=S_{j+1}\left(x_{j+1}\right)=y_{j+1} \\ S_j^{\prime}\left(x_{j+1}\right)&=S_{j+1}^{\prime}\left(x_{j+1}\right)\\ S_j^{\prime \prime}\left(x_{j+1}\right)&=S_{j+1}^{\prime \prime}\left(x_{j+1}\right) \end{align*} Sj(xj)Sj(xj+1)Sj(xj+1)Sj′′(xj+1)=yj=Sj+1(xj+1)=yj+1=Sj+1(xj+1)=Sj+1′′(xj+1)

以及第一个点和最后一个点, 我们给的2阶导约束:

S 0 ′ ′ ( 0 ) = S n + 1 ′ ′ ( x n ) = 0 S_0^{\prime \prime}(0)=S_{n+1}^{\prime \prime}\left(x_n\right)=0 S0′′(0)=Sn+1′′(xn)=0

2.2.2 3次样条曲线参数求解

带入方程求解样条曲线的参数, 求解 a j a_j aj:

a j = y j a_j=y_j aj=yj

求解 c j c_j cj:

将各个样条方程统一放到 A , B A,B A,B矩阵中, 求解线性方程组.

A c j = B A = [ 1 0 0 0 ⋯ 0 h 0 2 ( h 0 + h 1 ) h 1 0 ⋯ 0 0 h 1 2 ( h 1 + h 2 ) h 2 ⋯ 0 0 0 h 2 2 ( h 2 + h 3 ) ⋯ 0 0 0 0 h 3 ⋱ ⋮ ⋮ 0 0 0 ⋯ 0 1 ] B = [ 0 3 h 1 ( a 2 − a 1 ) − 3 h 0 ( a 1 − a 0 ) ⋮ 3 h n − 1 ( a n − a n − 1 ) − 3 h n − 2 ( a n − 1 − a n − 2 ) 0 ] w h e r e   h i = x i + 1 − x i A c_j=B \\ \begin{gathered} A=\left[\begin{array}{cccccc} 1 & 0 & 0 & 0 & \cdots & 0 \\ h_0 & 2\left(h_0+h_1\right) & h_1 & 0 & \cdots & 0 \\ 0 & h_1 & 2\left(h_1+h_2\right) & h_2 & \cdots & 0 \\ 0 & 0 & h_2 & 2\left(h_2+h_3\right) & \cdots & 0 \\ 0 & 0 & 0 & h_3 & \ddots & \\ \vdots & \vdots & & & & \\ 0 & 0 & 0 & \cdots & 0 & 1 \end{array}\right] \\ \\ B=\left[\begin{array}{c} 0 \\ \frac{3}{h_1}\left(a_2-a_1\right)-\frac{3}{h_0}\left(a_1-a_0\right) \\ \vdots \\ \frac{3}{h_{n-1}}\left(a_n-a_{n-1}\right)-\frac{3}{h_{n-2}}\left(a_{n-1}-a_{n-2}\right) \\ 0 \end{array}\right] \end{gathered}\\ \\ where \ h_i=x_{i+1}-x_i Acj=BA= 1h0000002(h0+h1)h10000h12(h1+h2)h20000h22(h2+h3)h3000001 B= 0h13(a2a1)h03(a1a0)hn13(anan1)hn23(an1an2)0 where hi=xi+1xi

求解 d j d_j dj:

d j = c j + 1 − c j 3 h j d_j=\frac{c_{j+1}-c_j}{3 h_j} dj=3hjcj+1cj

求解 b j b_j bj

b j = 1 h j ( a j + 1 − a j ) − h j 3 ( 2 c j + c j + 1 ) b_j=\frac{1}{h_j}\left(a_{j+1}-a_j\right)-\frac{h_j}{3}\left(2 c_j+c_{j+1}\right) bj=hj1(aj+1aj)3hj(2cj+cj+1)

2.2.3 基于3次样条曲线的参数方程

与上一节类似, 我们在x,y两个坐标分别用参数方程, 构造2维的3次样条曲线, 不再赘述.

参数方程下, 计算点的朝向角 θ \theta θ和曲率 k k k:

$$
\begin{align*}\theta&=\tan ^{-1} \frac{y{\prime}}{x{\prime}} \

\kappa&=\frac{y^{\prime \prime} x{\prime}-x{\prime \prime} y{\prime}}{\left(x{\prime 2}+y^{\prime 2}\right)^{\frac{2}{3}}}
\end{align*}
$$

这样我们就可以在x,y坐标系下使用3次样条进行轨迹规划了.

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


🏎️自动驾驶小白说官网: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、付费专栏及课程。

余额充值