Fast Planner规划算法(二)—— Fast Planner后端之贝塞尔曲线与B样条曲线

   本系列文章用于学习记录Fast-Planner规划算法的相关内容,主要学习资料是深蓝学院的移动机器人运动规划课程

   二、Fast Planner后端之贝塞尔曲线与B样条曲线

   Fast Planner后端的主要任务是基于前端生成的轨迹,生成一条满足其他约束的轨迹,Fast Planner后端包含轨迹优化和迭代时间调整两部分,我们先来看轨迹优化部分中的B样条曲线的相关内容。

   B样条是一种轨迹的表达方式,就像用多项式来表示轨迹也是一种轨迹的表达方式。B样条通过控制点来表示轨迹,如下图中的轨迹上的圆点所示,通过拉动控制点就可以使轨迹发送变化。

在这里插入图片描述

   1、贝塞尔曲线

   假设我们用两个点来表示轨迹,即 B ( t ) = ( 1 − t ) P 0 + t P 1 t ∈ [ 0 , 1 ] \boldsymbol{B}(t)=(1-t)\boldsymbol{P}_0+t\boldsymbol{P}_1\quad t\in[0,1] B(t)=(1t)P0+tP1t[0,1],随着时间t从0到1的变化,就可以得到该轨迹上的任意一点

在这里插入图片描述

   现在我们将点的个数增加到三个 P 0 P_0 P0 P 1 P_1 P1 P 2 P_2 P2,通过上面的方法,我们可以得到线段 P 0 P_0 P0 P 1 P_1 P1上任意一点X,和线段 P 1 P_1 P1 P 2 P_2 P2上任意一点Y,同理在线段XY上也可以得到任意一点B,如下图所示,它们满足 ∥ X B ∥ ∥ X Y ∥ = ∥ P 0 X ∥ ∥ P 0 P 1 ∥ = ∥ P 1 Y ∥ ∥ P 1 P 2 ∥ = t t ∈ [ 0 , 1 ] \frac{\|XB\|}{\|XY\|}=\frac{\|P_0X\|}{\|P_0P_1\|}=\frac{\|P_1Y\|}{\|P_1P_2\|}=t\quad t\in[0,1] XYXB=P0P1P0X=P1P2P1Y=tt[0,1]

在这里插入图片描述

   进一步可以得到B点的表达式,如下所示:

   B ( t ) = ( 1 − t ) 2 P 0 + 2 ( 1 − t ) t P 1 + t 2 P 2 t ∈ [ 0 , 1 ] \boldsymbol{B}(t)=(1-t)^2\boldsymbol{P}_0+2(1-t)t\boldsymbol{P}_1+t^2\boldsymbol{P}_2\quad t\in[0,1] B(t)=(1t)2P0+2(1t)tP1+t2P2t[0,1]

   随着时间t的变化,我们可以获得不同的B点,构成了B的轨迹曲线,动态演示:

在这里插入图片描述

   由B点的表达式可知,我们改变 P 0 P_0 P0 P 1 P_1 P1 P 2 P_2 P2三个点中的任意一个点都可让B点的轨迹发生变化,,基于这三个控制点,我们先推出X和Y,再推出了B,基于这种递推的特性,我们可以扩展到四个控制点情况:

   B ( t ) = ( 1 − t ) 3 P 0 + 3 ( 1 − t ) 2 t P 1 + 3 ( 1 − t ) t 2 P 2 + t 3 P 3 t ∈ [ 0 , 1 ] B(t)=(1-t)^3P_0+3(1-t)^2tP_1+3(1-t)t^2P_2+t^3P_3\quad t\in[0,1] B(t)=(1t)3P0+3(1t)2tP1+3(1t)t2P2+t3P3t[0,1]

在这里插入图片描述

   同理,我们可以得到五个控制点、六个控制点的情况:

   通过上面的介绍,我们得到了一种不同于多项式的曲线表达方式,这种方式也称为贝塞尔曲线(Bezier Curve),我们可以推出n个控制点时,贝塞尔曲线轨迹的表达式,如下所示:

   B ( t ) = ∑ i = 0 n − 1 R i , n ( t ) P i 其中 R i , n ( t ) = C n i t i ( 1 − t ) n − i B(t)=\sum_{i=0}^{n-1}R_{i,n}(t)P_{i}\quad\text{其中}\quad R_{i,n}(t)=C_{n}^{i}t^{i}(1-t)^{n-i} B(t)=i=0n1Ri,n(t)Pi其中Ri,n(t)=Cniti(1t)ni

   上式中的 R i , n ( t ) R_{i,n}(t) Ri,n(t)称为贝塞尔曲线的基函数,t的取值范围为[0,1],上述的贝塞尔曲线中任意一个控制点的改变都会使得曲线的整体形状发生改变,感兴趣的可以去贝塞尔曲线和B样条曲线的在线交互网站进行体验,链接如下:

   链接:http://nurbscalculator.in/

在这里插入图片描述

   贝塞尔曲线存在两个明显的缺点,第一个是曲线的阶数随着控制点的增加而增加,如果有n个控制点,则由贝塞尔曲线的表达式可知,曲线的阶数为n-1。第二个缺点是,当我们改变整条轨迹中的一个控制点的时候,整条轨迹都会发生变化。

   而我们想要的是阶数不太高的轨迹,且我们动某个控制点对轨迹的局部进行调整时,不会使得整条轨迹发送变化,此时,可以使用接下来介绍的一种特殊的贝塞尔曲线——B样条曲线


   2、B样条曲线

   通过定义基函数N和控制点Q,B样条曲线可用下式表示

   C ( t ) = ∑ i = 0 n N i , p ( t ) Q i \mathbf{C}(t)=\sum_{i=0}^nN_{i,p}(t)\mathbf{Q}_i C(t)=i=0nNi,p(t)Qi

   B样条曲线可以理解成一种分段的特殊贝塞尔曲线,我们可以用多段低阶的贝塞尔曲线来表示一条轨迹,然而在分段点处的平滑性很难得到保证,而B样条曲线是一种特殊的分段贝塞尔曲线,它天然的满足分段点处的平滑性连续性。

   与贝塞尔曲线不同的是,B样条曲线并不要求时间范围限定在[0,1]区间上,B样条曲线与贝塞尔曲线的最大区别是基函数不同

   B样条曲线唯一的由三个变量决定,即阶数 p b \color{red}p_b pb、N+1个控制点 { Q 0 , Q 1 , . . . , Q N } \color{red}\{{\mathbb{Q}_0,\mathbb{Q}_1,...,\mathbb{Q}_N}\} {Q0,Q1,...,QN}、时间节点向量 [ t 0 , t 1 , . . . , t M ] \color{red}{[t_0,t_1,...,t_M]} [t0,t1,...,tM],其中 M = N + p b + 1 M=N+p_b+1 M=N+pb+1,完整的B样条轨迹对应的时间区间是 [ t p b , t M − p b ] [t_{p_b},t_{M-p_b}] [tpb,tMpb]

   时间区间就是两两相邻的时间节点之间的区间,3阶B样条曲线的每段分段曲线都由4个控制点来控制,假设分段曲线中某段曲线由控制点 Q 0 、 Q 1 、 Q 2 、 Q 3 Q_0、Q_1、Q_2、Q_3 Q0Q1Q2Q3 控制,对应的时间区间是 [ t 3 , t 4 ] [t_3,t_4] [t3,t4],则控制点 Q 1 、 Q 2 、 Q 3 、 Q 4 Q_1、Q_2、Q_3、Q_4 Q1Q2Q3Q4控制的分段曲线,对应的时间区间是 [ t 4 , t 5 ] [t_4,t_5] [t4,t5],以此类推,每相邻的四个控制点控制一个时间区间内的轨迹。
在这里插入图片描述

   若相邻的节点向量之间的差值是相同的,即每段分段曲线对应的时间区间是相同的,则称为均匀B样条曲线,,对于总时间区间中某段分段轨迹对应的时间区间 [ t m , t m + 1 ) ⊂ [ t p b , t M − p b ] [t_{m},t_{m+1})\subset[t_{p_{b}},t_{M-p_{b}}] [tm,tm+1)[tpb,tMpb]中的时间t,可以通过 s ( t ) = ( t − t m ) / Δ t . s(t)=(t-t_{m})/\Delta t. s(t)=(ttm)t.来归一化到[0,1]上,其中 Δ t = t m + 1 − t m . \Delta t=t_{m+1}-t_m. Δt=tm+1tm.

   我们先来看一下B样条曲线的基函数,它是以递推的形式给出的,如下所示,这里的u跟前面用t含义相同:

   N i , 0 ( u ) = { 1 i f u i ≤ u < u i + 1 0 o t h e r w i s e N i , p ( u ) = u − u i u i + p − u i N i , p − 1 ( u ) + u i + p + 1 − u u i + p + 1 − u i + 1 N i + 1 , p − 1 ( u ) \begin{aligned} &N_{i,0}(u)=\begin{cases}1&\mathrm{if}u_i\leq u<u_{i+1}\\0&\mathrm{otherwise}\end{cases} \\ &N_{i,p}(u)=\frac{u-u_{i}}{u_{i+p}-u_{i}}N_{i,p-1}(u)+\frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u) \end{aligned} Ni,0(u)={10ifuiu<ui+1otherwiseNi,p(u)=ui+puiuuiNi,p1(u)+ui+p+1ui+1ui+p+1uNi+1,p1(u)

   其中,p是阶数,对于0阶的情况可以直接写出来,然后可以由0阶的推1阶的,再由1阶的推2阶的 …以此类推,其关系如下图所示,比如可由 N 0 , 0 N_{0,0} N0,0 N 1 , 0 N_{1,0} N1,0得到 N 0 , 1 N_{0,1} N0,1

在这里插入图片描述


   我们来看一个具体的实例,我们取 u 0 = 0 , u 1 = 1 , u 2 = 2 , u 3 = 3 , u 4 = 4 u_{0}=0,u_{1}=1,u_{2}=2,u_{3}=3,u_{4}=4 u0=0,u1=1,u2=2,u3=3,u4=4,则由0阶的 N 0 , 0 N_{0,0} N0,0 N 1 , 0 N_{1,0} N1,0 N 2 , 0 N_{2,0} N2,0得到1阶的 N 0 , 1 N_{0,1} N0,1 N 1 , 1 N_{1,1} N1,1随u变化的曲线如下所示:

在这里插入图片描述

   同理,我们可以由1阶的 N 0 , 1 N_{0,1} N0,1 N 1 , 1 N_{1,1} N1,1推出2阶的 N 0 , 2 N_{0,2} N0,2

   N 0 , 2 ( u ) = u − u 0 u 2 − u 0 N 0 , 1 ( u ) + u 3 − u u 3 − u 1 N 1 , 1 ( u ) = 0.5 u N 0 , 1 ( u ) + 0.5 ( 3 − u ) N 1 , 1 ( u ) N_{0,2}(u)=\frac{u-u_{0}}{u_{2}-u_{0}}N_{0,1}(u)+\frac{u_{3}-u}{u_{3}-u_{1}}N_{1,1}(u)=0.5uN_{0,1}(u)+0.5(3-u)N_{1,1}(u) N0,2(u)=u2u0uu0N0,1(u)+u3u1u3uN1,1(u)=0.5uN0,1(u)+0.5(3u)N1,1(u)

   即:

   N 0 , 2 ( u ) = { 0.5 u 2 u ∈ [ 0 , 1 ) 0.5 u ( 2 − u ) + 0.5 ( 3 − u ) ( u − 1 ) u ∈ [ 1 , 2 ) 0.5 ( 3 − u ) ( 3 − u ) u ∈ [ 2 , 3 ) N_{0,2}(u)=\left\{\begin{matrix}0.5u^2&u\in[0,1)\\0.5u(2-u)+0.5(3-u)(u-1)u\in[1,2)\\0.5(3-u)(3-u)&u\in[2,3)\end{matrix}\right. N0,2(u)= 0.5u20.5u(2u)+0.5(3u)(u1)u[1,2)0.5(3u)(3u)u[0,1)u[2,3)在这里插入图片描述


   同理,我们可以推出3阶的公式

   N 0 , 3 ( u ) = u − u 0 u 3 − u 0 N 0 , 2 ( u ) + u 4 − u u 4 − u 1 N 1 , 2 ( u ) = 1 3 u N 0 , 2 ( u ) + 1 3 ( 4 − u ) N 1 , 2 ( u ) N_{0,3}(u)=\frac{u-u_{0}}{u_{3}-u_{0}}N_{0,2}(u)+\frac{u_{4}-u}{u_{4}-u_{1}}N_{1,2}(u)=\frac{1}{3}uN_{0,2}(u)+\frac{1}{3}(4-u)N_{1,2}(u) N0,3(u)=u3u0uu0N0,2(u)+u4u1u4uN1,2(u)=31uN0,2(u)+31(4u)N1,2(u)

  

   N 0 , 3 ( u ) = 1 6 { u 3 u ∈ [ 0 , 1 ) u 2 ( 2 − u ) + u ( 3 − u ) ( u − 1 ) + ( 4 − u ) ( u − 1 ) 2 u ∈ [ 1 , 2 ) u ( 3 − u ) 2 + ( u − 1 ) ( 3 − u ) ( 4 − u ) + ( 4 − u ) 2 ( u − 2 ) u ∈ [ 2 , 3 ) ( 4 − u ) 3 u ∈ [ 3 , 4 ) N_{0,3}(u)=\dfrac{1}{6}\begin{cases}u^3&u\in[0,1)\\u^2(2-u)+u(3-u)(u-1)+(4-u)(u-1)^2&u\in[1,2)\\u(3-u)^2+(u-1)(3-u)(4-u)+(4-u)^2(u-2)&u\in[2,3)\\(4-u)^3&u\in[3,4)\end{cases} N0,3(u)=61 u3u2(2u)+u(3u)(u1)+(4u)(u1)2u(3u)2+(u1)(3u)(4u)+(4u)2(u2)(4u)3u[0,1)u[1,2)u[2,3)u[3,4)


   可以发现,随着阶数的增加,图像中非零的区域在变大,0阶的 N 0 , 0 N_{0,0} N0,0的非零区域是 [ u 0 , u 1 ) [u_0,u_1) [u0,u1),1阶的 N 0 , 1 N_{0,1} N0,1的非零区域是 [ u 0 , u 2 ) [u_0,u_2) [u0,u2),2阶的 N 0 , 2 N_{0,2} N0,2的非零区域是 [ u 0 , u 3 ) [u_0,u_3) [u0,u3),3阶的 N 0 , 3 N_{0,3} N0,3的非零区域是 [ u 0 , u 4 ) [u_0,u_4) [u0,u4)…可以在图中用三角形圈出来

在这里插入图片描述
   假设阶数 p b p_b pb=3,控制点有3个: Q 0 Q_0 Q0 Q 1 Q_1 Q1 Q 2 Q_2 Q2,即N+1=3,由上图可知这三个控制点对应的区间为[ u 0 u_0 u0 u 6 u_6 u6],即M=6,显然,关系式M=N+ p b p_b pb+1=6成立。

   另外,B样条轨迹由时间t参数化,其中 t ∈ [ t p b , t M − p b ] t\in[t_{p_{b}},t_{M-p_{b}}] t[tpb,tMpb],为什么不是 t ∈ [ t 0 , t M ] t\in[t_{0},t_{M}] t[t0,tM]? 因为,若取 t ∈ [ t 0 , t M ] t\in[t_{0},t_{M}] t[t0,tM]其导数的含义不清,且某个区间受相邻几个控制点控制的结论也不清晰了

在这里插入图片描述


   总的来说,我们可以得到以下递推的形式的B样条曲线的基函数

   N i , 0 ( u ) = { 1 i f u i ≤ u < u i + 1 0 o t h e r w i s e N i , p ( u ) = u − u i u i + p − u i N i , p − 1 ( u ) + u i + p + 1 − u u i + p + 1 − u i + 1 N i + 1 , p − 1 ( u ) \color{red}\begin{aligned} &N_{i,0}(u)=\begin{cases}1&\mathrm{if}u_i\leq u<u_{i+1}\\0&\mathrm{otherwise}\end{cases} \\ &N_{i,p}(u)=\frac{u-u_{i}}{u_{i+p}-u_{i}}N_{i,p-1}(u)+\frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u) \end{aligned} Ni,0(u)={10ifuiu<ui+1otherwiseNi,p(u)=ui+puiuuiNi,p1(u)+ui+p+1ui+1ui+p+1uNi+1,p1(u)

   然后由下式即可得到B样条曲线:

   C ( u ) = ∑ i = 0 n N i , p ( u ) Q i \color{red}\mathbf{C}(u)=\sum_{i=0}^nN_{i,p}(u)\mathbf{Q}_i C(u)=i=0nNi,p(u)Qi


   3、 B样条曲线的特性

   (1)B样条特性1:移动控制点

   C ( u ) = ∑ i = 0 n N i , p ( u ) Q i \mathbf{C}(u)=\sum_{i=0}^nN_{i,p}(u)\mathbf{Q}_i C(u)=i=0nNi,p(u)Qi

   我们将其中一个控制点Q移动到新的位置Q+v,整理后得到的B样条曲线的表达式相比于原表达式多了一项 N k , p ( u ) v N_{k,p}(u)\mathbf{v} Nk,p(u)v,也就是说对某个控制点进行移动后,只需要在原有轨迹的基础上,加上一个偏移量就可以了

   c n e w ( u ) = ∑ i = 0 k − 1 N i , p ( u ) Q i + N k , p ( u ) ( Q i + v ) + ∑ i = k + 1 n N i , p ( u ) Q i = ∑ i = 0 n N i , p ( u ) Q i + N k , p ( u ) v = C ( u ) + N k , p ( u ) v \begin{aligned} \mathbf{c}_{new}(u)& =\sum_{i=0}^{k-1}N_{i,p}(u)\mathbf{Q}_{i}+N_{k,p}(u)(\mathbf{Q}_{i}+\mathbf{v})+\sum_{i=k+1}^{n}N_{i,p}(u)\mathbf{Q}_{i} \\ &=\boxed{\sum_{i=0}^nN_{i,p}(u)\mathbf{Q}_i}+N_{k,p}(u)\mathbf{v} \\ &=\mathbf{C}(u)+\boxed{N_{k,p}(u)\mathbf{v}} \end{aligned} cnew(u)=i=0k1Ni,p(u)Qi+Nk,p(u)(Qi+v)+i=k+1nNi,p(u)Qi=i=0nNi,p(u)Qi+Nk,p(u)v=C(u)+Nk,p(u)v


   下面看一个具体的例子,假设B样条的阶次p=3,对控制点1进行移动,则 c n e w ( u ) = C ( u ) + N 1 , 3 ( u ) v \mathbf{c}_{new}(u)=\mathbf{C}(u)+\boxed{N_{1,3}(u)\mathbf{v}} cnew(u)=C(u)+N1,3(u)v,通过前面的介绍可知基函数 N 1 , 3 N_{1,3} N1,3的非零区间为 [ u 1 , u 5 ) [u_1,u_5) [u1u5),如下图的红框所示,所以移动控制点1仅对位于 [ u 1 , u 5 ) [u_1,u_5) [u1u5)区间内的轨迹产生影响,改善了贝塞尔曲线牵一发而动全身的缺陷

在这里插入图片描述


   (2)B样条特性2:每个区间仅由相邻的几个控制点完全描述

   把上面的结构图竖起来,如下所示:

在这里插入图片描述

   由特性1可知,3阶B样条曲线,控制点 Q 0 Q_0 Q0对应的非零区间是 [ u 0 , u 4 ) [u_0,u_4) [u0,u4)、控制点 Q 1 Q_1 Q1对应的非零区间是 [ u 1 , u 5 ) [u_1,u_5) [u1,u5)、控制点 Q 2 Q_2 Q2对应的非零区间是 [ u 2 , u 6 ) [u_2,u_6) [u2,u6)、控制点 Q 3 Q_3 Q3对应的非零区间是 [ u 3 , u 7 ) [u_3,u_7) [u3,u7)、控制点 Q 4 Q_4 Q4对应的非零区间是 [ u 4 , u 9 ) [u_4,u_9) [u4,u9)

   所以区间 [ u 3 , u 4 ) [u_3,u_4) [u3,u4)完全且仅由控制点 Q 0 Q_0 Q0 ~ Q 3 Q_3 Q3 控制,这也是B样条可以分段描述的原因,可以绘制成倒三角的形式,如下图所示:

在这里插入图片描述

   当阶次 p b p_b pb=3,m也取为3时,Fast Planner中的B样条曲线中某段分段曲线的表达式(在下一部分会进行详细介绍)可具体写为下式,相比于传统的基函数表示,该表达形式很容易看出该段曲线仅受控制点 Q 0 Q_0 Q0 ~ Q 3 Q_3 Q3 控制

在这里插入图片描述


   (3)B样条特性3:连续性

   B样条曲线在阶数p=0时是不连续的,在阶数p>=1时是连续的

在这里插入图片描述

   随着控制点的增加,B样条曲线会在原曲线的基础上不断进行扩展,而不会改变整个轨迹:

在这里插入图片描述


   (4)B样条特性4:B样条的导数也是B样条

   B样条曲线的导数也是B样条曲线,而且B样条曲线的导数的控制点也可以很容易算出来,证明略

在这里插入图片描述

   (5)凸包性

   贝塞尔曲线和B样条曲线都具有凸包性,凸包就是包含所有顶点(控制点)的最小凸多边形。凸多边形的任一边延长,其它边都在它的一侧。贝塞尔曲线和B样条曲线得到的轨迹始终会在包含了所有控制点的最小凸多边形中,因此,可以通过控制点的凸包来限制轨迹曲线的范围

   由性质4可知,B样条的导数也是B样条,所以B样条的导数同样具有凸包性,下面的左图是p=3的B样条曲线,右图是其导数,也即p=2的B样条曲线

在这里插入图片描述

   凸包性质在轨迹避障中有重要应用,为了保证B样条轨迹的安全性,若我们保证它的所有凸包都是无碰撞的,由凸包性可知,B样条轨迹属于该凸包中,必然也是无碰撞的。

   保证它的所有凸包都是无碰撞的,等价于凸包中的点与障碍物的距离 d h > 0 d_h > 0 dh>0,但是凸包中任意一点不好表示,凸包的顶点比较好表示,所以把 d h > 0 d_h > 0 dh>0转换成对障碍物与凸包顶点距离 d c d_c dc的约束

在这里插入图片描述

   由三角形的性质可知 d h > d c − r h d_h>d_c-r_h dh>dcrh,由点Q在凸包里面可知 r h ≤ r 12 + r 23 + r 34 r_h\leq r_{12}+r_{23}+r_{34} rhr12+r23+r34,这两个关系式叠加后可得, d h > d c − ( r 12 + r 23 + r 34 ) > 0 d_h>d_c-(r_{12}+r_{23}+r_{34})>0 dh>dc(r12+r23+r34)>0,也即:

   d c > 0 , r j , j + 1 < d c 3 , ( j ∈ { 1 , 2 , 3 } ) d_c>0,r_{j,j+1}<\frac{d_c}3,(j\in\{1,2,3\}) dc>0,rj,j+1<3dc,(j{1,2,3})

   即,我们只需要保证障碍物到凸包顶点的距离大于0,并且满足 r j , j + 1 < d c 3 , ( j ∈ { 1 , 2 , 3 } ) r_{j,j+1}<\frac{d_c}3,(j\in\{1,2,3\}) rj,j+1<3dc,(j{1,2,3}),就可以保证凸包一定在障碍物外面。


   4、 Fast Planner中的B样条曲线


   在Fast Planner中并没有写出基函数到底是什么,而是用控制点去左乘一个M矩阵,再左乘一个时间归一化后的向量,即B样条曲线的某段分段曲线的表达式由下面的左式,变为右式:

   N i , p ( u ) Q i   → s ( t ) T M p b + 1 q m N_{i,p}(u)\mathbf{Q}_{i}\quad\textbf{ }{\rightarrow}{ }\quad\mathbf{s}(t)^{\mathrm{T}}\mathbf{M}_{p_{b}+1}\mathbf{q}_{m} Ni,p(u)Qi s(t)TMpb+1qm

   其中,

   p b = 3 p_{b}=3 pb=3时,M矩阵如下所示:

   M p b + 1 = 1 3 ! [ 1 4 0 0 − 3 0 3 0 3 − 6 3 0 − 1 3 − 3 1 ] \mathbf{M}_{p_b+1}=\dfrac{1}{3!}\begin{bmatrix}1&4&0&0\\-3&0&3&0\\3&-6&3&0\\-1&3&-3&1\end{bmatrix} Mpb+1=3!1 1331406303330001

   接下来来看一下上面的这些式子是怎么来的,我们前面推导出3阶B样条的基函数的表达式如下所示:

   N 0 , 3 ( t ) = 1 6 { t 3 t ∈ [ 0 , 1 ) t 2 ( 2 − t ) + t ( 3 − t ) ( t − 1 ) + ( 4 − t ) ( t − 1 ) 2 t ∈ [ 1 , 2 ) t ( 3 − t ) 2 + ( t − 1 ) ( 3 − t ) ( 4 − t ) + ( 4 − t ) 2 ( t − 2 ) t ∈ [ 2 , 3 ) ( 4 − t ) 3 t ∈ [ 3 , 4 ) N_{0,3}(t)=\dfrac{1}{6}\left\{\begin{matrix}t^3&t\in[0,1)\\t^2(2-t)+t(3-t)(t-1)+(4-t)(t-1)^2&t\in[1,2)\\t(3-t)^2+(t-1)(3-t)(4-t)+(4-t)^2(t-2)&t\in[2,3)\\(4-t)^3&t\in[3,4)\end{matrix}\right. N0,3(t)=61 t3t2(2t)+t(3t)(t1)+(4t)(t1)2t(3t)2+(t1)(3t)(4t)+(4t)2(t2)(4t)3t[0,1)t[1,2)t[2,3)t[3,4)

   现在,我们想要写出 [ u m . u m + 1 ) [u_m.u_{m+1}) [um.um+1)区间上的B样条曲线的表达式,根据B样条曲线的特性2可知,我们仅需要知道 Q m − 3 \mathbf{Q}_{m-3} Qm3 Q m − 2 \mathbf{Q}_{m-2} Qm2 Q m − 1 \mathbf{Q}_{m-1} Qm1 Q m \mathbf{Q}_m Qm N m − 3 , 3 N_{m-3,3} Nm3,3 N m − 2 , 3 N_{m-2,3} Nm2,3 N m − 1 , 3 N_{m-1,3} Nm1,3 N m , 3 N_{m,3} Nm,3这八个量,就可以根据 C ( u ) = ∑ i = 0 n N i , p ( u ) Q i \mathbf{C}(u)=\sum_{i=0}^nN_{i,p}(u)\mathbf{Q}_i C(u)=i=0nNi,p(u)Qi写出该段B样条曲线表达式。

在这里插入图片描述

   这八个量中,4个控制点是直接给定的,只需要计算4个基函数,上面我们已经给出了 N 0 , 3 N_{0,3} N0,3的表达式,其对应的非零区间为[0,4),如果我们可以将 N m − 3 , 3 N_{m-3,3} Nm3,3 N m − 2 , 3 N_{m-2,3} Nm2,3 N m − 1 , 3 N_{m-1,3} Nm1,3 N m , 3 N_{m,3} Nm,3的非零区间分别映射到区间[0,4)上,就可以直接调用 N 0 , 3 N_{0,3} N0,3的表达式了,比如 N m − 3 , 3 N_{m-3,3} Nm3,3 我们进行以下的变化(注: s ( t ) = ( t − t m ) / Δ t s(t)=(t-t_{m})/\Delta t s(t)=(ttm)t Δ u = u m − u m − 1 = 1 {\Delta u}=u_m-u_{m-1}=1 Δu=umum1=1

   t = u − u m − 3 Δ u = u − u m − 3 + u m − u m Δ u = u − u m + u m − u m − 3 Δ u = u − u m Δ u + u m − u m − 3 Δ u = s ( u ) + 3 \begin{aligned} \text{t}& =\frac{u-u_{m-3}}{\Delta u} \\ &=\frac{u-u_{m-3}+u_{m}-u_{m}}{\Delta u} \\ &=\frac{u-u_m+u_m-u_{m-3}}{\Delta u} \\ &=\frac{u-u_m}{\Delta u}+\frac{u_m-u_{m-3}}{\Delta u} \\ &=s(u)+3 \end{aligned} t=Δuuum3=Δuuum3+umum=Δuuum+umum3=Δuuum+Δuumum3=s(u)+3

在这里插入图片描述

   由上面的示意图可知 [ u m . u m + 1 ) [u_m.u_{m+1}) [um.um+1)位于 N m − 3 , 3 N_{m-3,3} Nm3,3 的第4段小区间上,所以应该把上面得到的t的表达式代入到 N 0 , 3 ( t ) N_{0,3}(t) N0,3(t)的第4段小区间,也就是[3,4)的表达式上,所以

   N m − 3 , 3 = 1 6 ( 4 − s ( u ) − 3 ) 3 = 1 6 ( 1 − s ( u ) ) 3 = 1 6 [ − s ( u ) 3 + 3 s ( u ) 2 − 3 s ( u ) + 1 ] \begin{aligned} N_{m-3,3}& =\frac16(4-s(u)-3)^3 \\ &=\frac16(1-s(u))^3 \\ &=\frac{1}{6}[-s(u)^{3}+3s(u)^{2}-3s(u)+1] \end{aligned} Nm3,3=61(4s(u)3)3=61(1s(u))3=61[s(u)3+3s(u)23s(u)+1]

   同理, N m − 2 , 3 N_{m-2,3} Nm2,3 进行 t = u − u m − 2 Δ u = s ( u ) + 2 t=\frac{u-u_{m-2}}{\Delta u}=s(u)+2 t=Δuuum2=s(u)+2变化, [ u m . u m + 1 ) [u_m.u_{m+1}) [um.um+1)位于 N m − 2 , 3 N_{m-2,3} Nm2,3 第3段小区间上,所以代入到 N 0 , 3 ( t ) N_{0,3}(t) N0,3(t)的第3段小区间,也就是[2,3)的表达式上,所以

   N m − 2 , 3 = 1 6 [ ( s ( u ) + 2 ) ( 1 − s ( u ) ) 2 + ( s ( u ) + 1 ) ( 1 − s ( u ) ) ( 2 − s ( u ) ) + ( 2 − s ( u ) ) 2 s ( u ) ] = 1 6 [ 3 s ( u ) 3 − 6 s ( u ) 2 + 4 ] \begin{aligned} &N_{m-2,3} \\ &=\frac{1}{6}[(s(u)+2)(1-s(u))^{2} \\ &+(s(u)+1)(1-s(u))(2-s(u)) \\ &+\left(2-s(u)\right)^2s(u)] \\ &=\frac{1}{6}[3s(u)^{3}-6s(u)^{2}+4] \end{aligned} Nm2,3=61[(s(u)+2)(1s(u))2+(s(u)+1)(1s(u))(2s(u))+(2s(u))2s(u)]=61[3s(u)36s(u)2+4]

   同理, N m − 1 , 3 N_{m-1,3} Nm1,3 进行 t = u − u m − 1 Δ u = s ( u ) + 1 t=\frac{u-u_{m-1}}{\Delta u}=s(u)+1 t=Δuuum1=s(u)+1变化, [ u m . u m + 1 ) [u_m.u_{m+1}) [um.um+1)位于 N m − 1 , 3 N_{m-1,3} Nm1,3 第2段小区间上,所以代入到 N 0 , 3 ( t ) N_{0,3}(t) N0,3(t)的第2段小区间,也就是[1,2)的表达式上,所以

   N m − 1 , 3 = 1 6 [ ( s ( u ) + 1 ) 2 ( 1 − s ( u ) ) + ( s ( u ) + 1 ) ( 2 − s ( u ) ) s ( u ) + s ( u ) 2 ( 3 − s ( u ) ) ] = 1 6 [ − 3 s ( u ) 3 + 3 s ( u ) 2 + s ( u ) + 1 ] \begin{aligned} &N_{m-1,3} \\ &=\frac{1}{6}[(s(u)+1)^{2}(1-s(u)) \\ &+(s(u)+1)(2-s(u))s(u) \\ &+s(u)^2(3-s(u))] \\ &=\frac{1}{6}[-3s(u)^{3}+3s(u)^{2}+s(u)+1] \end{aligned} Nm1,3=61[(s(u)+1)2(1s(u))+(s(u)+1)(2s(u))s(u)+s(u)2(3s(u))]=61[3s(u)3+3s(u)2+s(u)+1]

   同理, N m , 3 N_{m,3} Nm,3 进行 t = u − u m Δ u = s ( u ) t=\frac{u-u_{m}}{\Delta u}=s(u) t=Δuuum=s(u)变化, [ u m . u m + 1 ) [u_m.u_{m+1}) [um.um+1)位于 N m , 3 N_{m,3} Nm,3 第1段小区间上,所以代入到 N 0 , 3 ( t ) N_{0,3}(t) N0,3(t)的第1段小区间,也就是[0,1)的表达式上,所以

   N m , 3 = 1 6 s ( u ) 3 N_{m,3}=\frac16s(u)^3 Nm,3=61s(u)3

   我们将这四个表达式放在一起写成矩阵的形式,就是Fast Planner中的B样条曲线的表现形式

在这里插入图片描述


   参考资料:

   1、深蓝学院-移动机器人运动规划


  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Fast Planner是一种快速规划工具,旨在帮助人们高效地制定计划,并实现既定目标。它包含了许多实用的功能,能够简化计划的过程,提高计划的准确性和实施效率。 首先,Fast Planner提供了一个直观、用户友好的界面,使得使用者可以快速上手并创建自己的计划。用户可以根据需要添加任务及其相关细节,如截止日期、重要性和紧急程度。此外,用户还可以设定任务之间的优先级,以确保按重要性和紧急程度进行适当的安排。 其次,Fast Planner具有强大的时间管理功能。它可以帮助用户合理分配时间,设定合理的计划期限,并提醒用户任务的截止日期。用户可以很容易地追踪任务的进度,及时调整计划以适应变化的情况。 另外,Fast Planner还支持多人协作。用户可以与团队成员共享计划,分配任务并跟踪每个人的进度。团队成员可以通过Fast Planner的即时通讯功能进行即时交流,共享信息和协调行动,有助于有效地完成团队任务。 最后,Fast Planner还提供了数据分析功能,帮助用户评估计划的执行情况和效果。用户可以查看任务完成情况的统计数据,了解任务完成时间、延迟情况和效率等信息。这些数据可以帮助用户识别问题,并根据需要调整计划以提高效率。 总之,Fast Planner是一个功能强大、易于使用的快速规划工具。它能够帮助用户高效地制定计划,实现目标,并提高个人和团队的工作效率。无论是个人还是团队,使用Fast Planner都将成为提高工作效率和管理时间的重要利器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕羽★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值