浙江建设职业技术学院招生网站,山东德州最新消息今天,wordpress 商城,长沙网站公司网站建设文章目录0.参考1.问题起源与插值法的曲线拟合1.1.问题起源1.2.拉格朗日插值1.3.“基”的概念1.4.插值存在的Runge现象2.贝塞尔曲线2.1.控制点的思想2.2.由控制点生成贝塞尔曲线2.3.多个控制点时的贝塞尔曲线公式2.4.贝塞尔曲线的递推公式2.5.贝塞尔曲线的性质3.B样条曲线3.1.B样…
文章目录0.参考1.问题起源与插值法的曲线拟合1.1.问题起源1.2.拉格朗日插值1.3.“基”的概念1.4.插值存在的Runge现象2.贝塞尔曲线2.1.控制点的思想2.2.由控制点生成贝塞尔曲线2.3.多个控制点时的贝塞尔曲线公式2.4.贝塞尔曲线的递推公式2.5.贝塞尔曲线的性质3.B样条曲线3.1.B样条曲线的基本概念3.2.对B样条的疑问3.3.B样条递推公式的过程3.4.B样条引入节点带来的好处——局部性3.5.为什么 m n k 1 ?3.6.为什么 阶数(Order) 次数(Degree) 13.7.B样条曲线的特点3.8.B样条曲线的历史4.B样条曲线的矩阵表达式及在SLAM中的应用4.1.均匀B样条的矩阵表达式4.2.均匀B样条表示李群空间的矩阵表达式4.3.B样条曲线用于SLAM的轨迹表示0.参考
贝塞尔(Bezier)曲线与B样条这个视频讲的很好尤其是对样条曲线的两种理解方式上会对后面B样条曲线性质的分析有很大的帮助。本文在前面的部分也会较多的参考这个视频中讲解的内容。但是视频后面讲解B样条曲线的时候稍微简略了一点因此本文给出我自己的理解。
1.问题起源与插值法的曲线拟合
1.1.问题起源
样条曲线起源于一个常见问题即已知若干点的条件下如何得到通过这些点的一条光滑曲线
一个简答的方法是对曲线进行 插值在原有数据点上进行填充生成曲线曲线必经过原有数据点。 1.2.拉格朗日插值
当有多个点的时候可以使用拉格朗日插值法得到插值的曲线函数表达式 其中每个函数 LkL_kLk称为拉格朗日插值基函数。注意这个基的概念对于后面理解贝塞尔曲线和B样条曲线非常有帮助。
1.3.“基”的概念
我们之前学过的知识中有很多地方用到了 基 的概念比如下面的内容
线性代数向量的线性组合就是在对向量空间的基向量给不同的权重相加然后得到新的向量。微积分Taylor展式Fourier级数他们都是有基函数然后最终我们的函数是由很多这种基函数组成的Lagrange插值法一组基的线性组合前面刚刚提到我们插值得到的函数其实是由一组基函数组合来的。
1.4.插值存在的Runge现象
插值存在一些问题比如Runge现象。这是因为插值要求插值函数必须经过所有的插值点导致非线性程度很严重。
为了解决这个问题并且考虑到人们往往想要一个比较光滑的曲线而并不要求曲线通过所有点所以拟合就产生了。
2.贝塞尔曲线
2.1.控制点的思想
一个简单且行之有效的方法是把这些点作为限制点然后在这些限制点中放置一条具有弹性的金属片最后金属片绕过这些点后的最终状态即为所需曲线。而最终得到的形状曲线就是样条曲线。这也是该名字的由来其中金属片就是样条形成的曲线就是样条曲线。 注意上图中的蓝色圆形可以变的很大这样生成的样条曲线就离圆心很远了所以就是明显不通过这些圆心点的。如果把圆的半径缩小成0那么结果就变成插值了。
2.2.由控制点生成贝塞尔曲线
步骤如下
先由前2个控制点按照 ttt 的比例生成一个中间过程点 PiP_iPi Pi(1−t)P0P1P_i (1-t) P_0 P_1Pi(1−t)P0P1再由后2个控制点按照 ttt 的比例生成一个中间过程点 PjP_jPj Pj(1−t)P1P2P_j (1-t) P_1 P_2Pj(1−t)P1P2对两个中间过程点按照 ttt 的比例生成最后我们要的曲线上的一个点 PxP_xPx。 Px(1−t)PiPjP_x (1-t)P_i P_jPx(1−t)PiPj
最后通过遍历所有的比例值 t∈[0,1]t \in [0, 1]t∈[0,1]我们就可以得到贝塞尔曲线上的所有点也就是得到了整条贝塞尔曲线。 如果控制点的个数比3个多呢那么就要不断重复上面2个点生成1个中间点的过程直到最后只剩下一个点这个点就是曲线上的点。所以当有多个控制点的时候只需要对上面的过程进行多次最后得到一个曲线上的点PxP_xPx然后改变比例ttt就得到整条贝塞尔曲线了。
2.3.多个控制点时的贝塞尔曲线公式 重要对贝塞尔曲线公式的两种理解
从 基 是 基函数 的角度理解贝塞尔曲线前面的权重WWW就是插值基函数它是和ttt有关的函数所以他是有次数的比如下图所示的就是关于ttt为3次的基函数。后面的点PPP就相当于插值点也就是给基函数的权重。但是贝塞尔曲线和拉尔朗日插值的不同之处在于贝塞尔曲线的结果并不全都通过这些插值点。
也就是说这种理解方式基 是 基函数也就是关于ttt的一些函数而 权重 则是这些 控制点。
这种理解方式就是微积分的理解方式也就是泰勒展开、级数的理解方式因为最终我们的曲线是可以用一个函数表示的而这个函数是由 基函数 施加不同的 权重 得到的而这个权重就是各个控制点的坐标值。 2. 从 基 是 控制点 的角度理解 也就是说这种理解方式基 是 基向量也就是控制点而 权重 则是关于 ttt的一些函数对于任意一个 ttt确定了之后我们就可以把函数值算出来就得到了一个具体的权重值。然后把权重值施加到控制点上我们就得到了曲线上的一个具体的点。
这种理解方式就是线性代数的理解方式也就是对向量空间的基向量进行线性组合的理解方式。这里相当于把整个曲线分成一个个的点来看对于每一个点来说它对应着一个确定的ttt值这个确定的ttt值带入函数WWW里面就可以得到确定的权重。然后利用这个确定的权重对控制点进行线性组合就得到了曲线上的一个点。最后遍历所有的ttt值我们就得到了曲线上的所有点也就是得到了整条贝塞尔曲线。
2.4.贝塞尔曲线的递推公式 其实这个很简单因为前面我们讲解多个控制点的贝塞尔曲线的具体做法时其实就是按照递推的公式来讲解的它的思路只不过是写成最终的公式的时候我们可以写出一个最终的结果。而递推公式就是描述了一步步求中间点的过程。
2.5.贝塞尔曲线的性质
Bezier曲线是BSpline的特例曲线总是通过第一个和最后一个点曲线在始点处的切线落在前两个控制的连线上曲线在终点处的切线落在最后两个控制点的连线上改变其中任何一个点整条曲线都会随之改变。这个很容易发现以为如果从 基 是 基函数 的角度来看就会发现每个基函数的定义域都是 t∈[0,1]t \in [0, 1]t∈[0,1]。所以一个控制点改变了之后它会影响整个曲线中这个控制点对应的 基函数 的函数值分量从而导致整条曲线从头到尾都会受到影响。贝塞尔曲线幂次 控制点个数 - 1。 对于一条复杂的曲线如果使用一个贝塞尔曲线来插值获得目标曲线就需要通过增加控制点来进行插值需要的计算也越复杂。幂次的问题很好理解因为每生成一个中间点幂次就上升一次。 因此对于复杂曲线不要求用n-1次曲线而是让次数低一点经常使用三次贝塞尔曲线一段一段地拼接成目标曲线如Ps 或 Ai 中使用钢笔工具画出物体轮廓所做的那样。 如果使用这种方法确保最终整体曲线一次光滑的条件是在连接点出两侧的斜率相等即连接点和其两侧控制点共线。
3.B样条曲线
3.1.B样条曲线的基本概念
生成曲线本质上就是找一组基函数然后用各个控制点当权重进行线性组合。或者理解为把控制点作为基向量然后用函数当权重给定一个ttt带入函数中就得到一个具体的权重值然后就可以得到曲线上一个点最后遍历所有的比例ttt就可以得到曲线上的所有点。
下面给出B样条曲线的一些基本概念然后后面再给出详细的解释。 举例说明如下 3.2.对B样条的疑问
前面的概念中不太清楚的就是 控制点(Control Points) 和 节点(Knots) 这两个概念。而且前面的讲解中一开始说了节点的个数和控制点无关是自己选取的但是后面又说控制点和节点的个数必须要满足的关系是 mnk1m nk1mnk1这个属实有点让人疑惑。
另外一个让人不太清楚的就是 次(Degree) 和 阶(Order) 的区别实际上 阶数 次数 1。
直接解释这两个问题是无法解释的因为这个必须从B样条的原理触发当明白了B样条的原理自然就可以明白为什么B样条中除了控制点还会有节点然后才可以推导前面的两个关系式。
3.3.B样条递推公式的过程
我们直接从最终的递推形式的kkk次B样条基函数出发来解释B样条的思想。所以这里我们把曲线的样条拟合问题变成了对 基函数 的线性组合问题线性组合的权重变成了各个点的坐标值。
有了控制点为什么还要使用节点呢贝塞尔曲线只用控制点就可以了啊其实这个就是为了改进贝塞尔曲线只有全局特性、没有局部特性的问题也就是贝塞尔曲线只要修改了一个控制点之后即使基函数不变整个曲线也都会被修改因为它的基函数的定义域是在t∈[0,1]t \in [0, 1]t∈[0,1] 的整个区间上的。而B样条加入节点目的就是为了给拟合的曲线增加局部性从而实现改变一个控制点只会影响整个拟合曲线的一部分而不会影响整个曲线。而实现的关键就是插入节点让控制点只能作用到部分节点区间上而不会作用到整个节点区间上。
贝塞尔曲线的基函数区间定义域是在t∈[0,1]t \in [0, 1]t∈[0,1] 的B样条曲线就在这个区间上插入很多节点从而把整个区间分成很多小的区间。如下图所示假设我把区间[0,1][0, 1][0,1]分成8个子区间那么我要插入819819819个节点假设他们的序号分别是0−80-80−8。 根据前面B样条曲线的递推公式这个公式为什么是这样大家就不要追究了这种结论大佬发现了直接用就行了
可以发现在这些节点区间内的基函数都是0次的也就是他们在各自的区间内都是1不在自己区间范围内的都是0并且这个取值和ttt是无关的所以这个区间内的基函数都是0次的如下图所示。注意图中的Bi,0B_{i, 0}Bi,0表示的就是当前的样条基函数都是0次的然后iii表示的是哪个区间的样条基函数因为我们有9个点所以有8个样条基函数注意下图中的索引都是从0开始的。
那么B样条曲线的递推公式就是在说可以使用两个相邻的小区间组成一个大区间同时基函数次数增加1。如下图所示最开始的子区间里面的B样条函数都是0次的而由于B样条的递推公式中组合两个相邻区间的时候前面的系数是带有 ttt 的而且一个是ttt另一个是1−t1-t1−t实际公式不是这样但是也大概是这个思想。所以组合了两个区间之后在这个新的区间中的基函数就变成1次的了。同理新区间中的样条基函数Bi,1B_i,1Bi,1表示样条基函数都是1次的而iii表示它的哪个区间的样条基函数。 注意
图中为了方便画图合并之后的区间和之前的区间长度画成一样大的了实际上合并之后的区间长度应该是翻倍的。另外图中也是为了方便表示出两个区间合成一个区间的结果把区间画的而有点问题了。实际上由于第0和第1个区间合成新的区间0第1和第2个区间合成新的区间1那么新的区间0和1之间应该是有一般重叠的但是图中没有把重叠画出来因为画出来的话就太乱了。如果是正常有重叠的区间的话那么此时新的区间的基函数应该就是像下图这样也有重叠 那么如此不断的用B样条的递推公式合并相邻的两个区间的话可以发现区间个数越来越少但是区间上的样条基函数的次数会越来越高如下图所示 假设我们进行3次这样的区间合并最终我们得到的每个区间上的样条基函数就是3次的整个过程如下 另外也可以看参考视频的讲解中作者给出的PPT其实也是在表达这个 区间合并、基函数次数递增 的过程 以上就是B样条曲线的递推公式表示的过程可以发现其实和前面贝塞尔曲线递推的过程是非常像的其实都是用相邻的两个点组合成一个新的中间点然后再用相邻的两个中间点组合成一个更新的中间点如此迭代……
3.4.B样条引入节点带来的好处——局部性
我们看之前的图最终我们得到了5个B样条的基函数并且每个基函数都是3次的。由B样条的公式可以发现最终我们也需要5个控制点来控制样条曲线因为控制点的个数和基函数的个数是一样的因为控制点就是权重有几个基函数肯定就要有几个权重嘛。
那么我们来分析一下第0个控制点P0P_0P0它作用到了几个最初的节点区间上呢如下图所示可以发现它之作用到了前4个区间上。也就是说如果改变控制点P0P_0P0最终只会影响在区间0−40-40−4之间的B样条曲线而不会影响它后面的B样条曲线这就是B样条曲线引入控制点之后带来的好处——拟合的曲线具有局部性不会由于一个控制点的改变而导致牵一发而动全身 3.5.为什么 m n k 1 ?
首先再次定义以上变量的意思
mmm节点的个数-1也就是节点的个数m1或者说mmm是节点区间的个数。比如在上图中节点的个数为9则m8m8m8nnn控制点的个数-1也就是控制点的个数n1或者说nnn是控制点区间的个数。比如在上图中控制点的个数为5则n4n4n4。注意最后的时候区间是5个表示控制点个数就是5个因为每个控制点是作用在一个区间上的而在节点的那个地方区间是8个而节点数是9个kkk基函数的次数也就是合并区间的最后得到的基函数的次数
那么为什么 mnk1mnk1mnk1呢其实从上面合并区间的过程中就可以看出来每合并一次基函数的次数上升一次区间的个数就减少一次。
一开始是时候区间的个数就是mmm。最后区间的个数是n1n1n1。注意不是nnn最终的区间个数就是控制点的个数因为一个控制点对应一个区间的基函数。一共合并了kkk次区间所以有m−kn1m-k n1m−kn1因此得到mnk1m nk1mnk1。
注意既然有上面的公式到底谁是自变量谁是因变量其实从写法就可以看出来nnn和kkk是自变量而mmm是因变量。也就是说控制点的个数n1n1n1是自己事先确定的基函数的次数kkk也是自己事先确定的确定了这两个之后选择几个节点m1m1m1也自然就确定了因为这是由B样条曲线的递推公式决定的。
3.6.为什么 阶数(Order) 次数(Degree) 1
首先我们已经明白了**次数(Degree)**的含义它代表的是最终的基函数的次数也就是ttt的最高次幂。
那么 阶数(Order) 有什么意义呢以及为什么满足 阶(Order) 次(Degree) 1
首先说阶数的物理意义它其实反应了当前的点最多受到几个控制点的控制也就是如果是4阶的B样条曲线那么一个点最多受到它周围的4个控制点的控制。
前面我们已经说了B样条曲线具有局部性而且分析了为什么具有局部性本质上是因为区间合并这种操作导致最终基函数所在的区间只能影响到整个节点区间的一部分所以这个基函数对应的权重也就是控制点如果改变也只会影响到最终拟合的这个区间的样条曲线而不会影响整个样条曲线。
那么怎么分析的当前的一个点最多受到几个控制点的影响呢其实也很简单我们就分析每个控制点覆盖的区间范围直到某个控制点和第0个控制点没有重合的节点区间。
如下图所示节点区间0−10-10−1只受到控制点P0P_0P0的影响节点区间1−21-21−2会受到控制点P0P_0P0、P1P_1P1的影响节点区间2−32-32−3会受到控制点P0P_0P0、P1P_1P1、P2P_2P2的影响节点区间3−43-43−4会受到控制点P0P_0P0、P1P_1P1、P2P_2P2、P3P_3P3的影响而到了区间4−54-54−5的时候此时前面的控制点P0P_0P0已经无法施加控制作用了此时起作用的控制点是P1P_1P1、P2P_2P2、P3P_3P3、P4P_4P4。
所以可以发现一个节点区间最多受到几个控制点的控制和一个控制点可以控制几个节点区间是一样的那么一个控制点可以控制几个节点区间呢显然控制点自己就是一个区间然后每往上走一次控制点控制的节点区间个数就1所以最终一个控制点控制的节点区间个数就是 k1 所以说 阶数 次数 1。 可以看到就像一种滑窗的感觉如下图所示
一开始的时候在节点区间开头只有第0个控制点能发挥作用滑窗长度是1慢慢往后遍历节点区间发挥作用的控制点个数逐渐增加滑窗长度逐渐变大从滑动到某个节点区间开始就只能有恒定个数的控制点发挥作用了而不会一直增加也就是滑窗开始保持固定长度这个长度就是B样条曲线的 阶数(Order) 快到达节点区间结尾的时候发挥作用的控制点个数逐渐减少滑窗长度逐渐变小最后到达节点区间末尾只有最后一个控制点能发挥作用滑窗长度又变成1。 另外从这个图中也可以发现起始和最后的kkk个区间也就是阶数-1个区间有效的控制点个数是不足的所以一般来说不使用前面的几个节点区间而使用有效控制点个数到达阶数的那些区间也就是从中间区间开始使用。
3.7.B样条曲线的特点
优点和Bezier样条一样B样条也是通过逼近一组控制点来产生的。但是B样条具有两个Bezier样条所不具备的特点 1B样条多项式的次数可独立于控制点数目有一定限制 2B样条允许局部控制曲线或曲面。缺点比Bezier样条更复杂。
3.8.B样条曲线的历史
最后给出这个吧其中前面的B样条曲线的递推公式就是de Boor-Cox公式1972年就提出来了真理经久不衰啊……
均匀节点意义下的一元B样条(B-splinesBasis Splines缩写)是在1946年由I.J.Schoenberg提出非均匀节点定义的B样条由Curry在1947年提出1962年法国数学家Pierre Bézier研究了一种曲线即Bézier曲线1972年de Boor与Cox分别独立提出了计算B样条基函数的公式这个公式对B样条作为计算机辅助几何设计(CAGD)重要工具起到了至关重要的作用称之为de Boor-Cox公式。在此之前计算B样条基函数大多用差分方法计算数值上可能不稳定。
4.B样条曲线的矩阵表达式及在SLAM中的应用
参考均匀B样条曲线的表达式
4.1.均匀B样条的矩阵表达式 注意这个矩阵形式的推导可以不用关注实际上是有公式的在上面的参考博客中就有。只需要知道其中的自变量有ttt和控制点PPP即可。比如在SLAM中位置样条曲线P(t)P(t)P(t)对ttt求导得到的就是速度样条曲线再对ttt求导得到的就是加速度曲线。如果要优化轨迹的时候那么就是对控制点求导来有优化轨迹。
4.2.均匀B样条表示李群空间的矩阵表达式 4.3.B样条曲线用于SLAM的轨迹表示