![95ec28d3f38cf46bd55e5349c5e40bfd.png](https://i-blog.csdnimg.cn/blog_migrate/5d5c8718692d3d46b2b306e72b43a81a.jpeg)
假设我们有一个向量的序列
![52036ecc92f620c28c509486eaaa7663.png](https://i-blog.csdnimg.cn/blog_migrate/c2db21eaed43bc13f4f74188c19667f0.jpeg)
很明显,这个曲线虽然是连续的,但是它的一阶导数(切线)在切换插值向量时都不是连续的.为了解决这个问题,我们最常使用的就是Bézier曲线.直接使用一个四次Bézier曲线(因为有五个点)来生成这个近似曲线.但是Bézier曲线只会经过初始点与最终点(插值),一 般不会经过中间的控制点(近似),所以这样求出来的曲线虽然是可导的,但是插值 曲线不会经过中间的三个向量:
![46e30de658e0d3bf29ae5a203b8af428.png](https://i-blog.csdnimg.cn/blog_migrate/9505dcdd6e0c0db2454088cb5c8218f9.jpeg)
为了解决这个问题,我们可以分段对每两个向量
在我们的例子中,因为我们一共有四对向量
![0526dc21654c9c3047fc25b05592c620.png](https://i-blog.csdnimg.cn/blog_migrate/b1e362dd1f6b63d1064d1e541a541188.jpeg)
在上面的曲线中,蓝色的线就是曲线在点
如何构造一个三次Bézier曲线:
![be3dc38b14bc3e341f5ce7b2a413dce4.png](https://i-blog.csdnimg.cn/blog_migrate/d12f7f22dc5169270ffa41ac0ebe14b0.jpeg)
![2a47b86e0e84eb71dfb99021391a9231.png](https://i-blog.csdnimg.cn/blog_migrate/dfa6dc337f703fa4b11261b6ec9d834a.jpeg)
![eae8ca7e3021362ceb0992826f2b78a0.png](https://i-blog.csdnimg.cn/blog_migrate/33b444aaaab48183aea8aab18cb9c420.jpeg)
Bspline/B样条曲线:
根据控制点来生成曲线的。
常见的三种曲线关系如下:
曲线中的每个控制点都会影响整个曲线的形状。
克服了Bezier曲线的一些缺点,Bezier曲线的每个控制点对整条曲线都有影响,也就是说,改变一个控制点的位置,整条曲线的形状都会发生变化,而B样条中的每个控制点只会影响曲线的一段参数范围,从而实现了局部修改。
和
都是多项式参数曲线,不能表示一些基本的曲线,比如圆,所以引入了
来解决这个问题。
非均匀有理B样条函数():
自由曲线插补;
机器人的运动轨迹一般都是圆弧或直线,而对复杂的运动往往用样条函数进行拟合。
核心算法:
Cox-deBoor递推算法:
In the mathematical subfield of numerical analysis de Boor's algorithmis a fast[vague][quantify] and numerically stable algorithm for evaluating spline curves in B-spline form. It is a generalization of de Casteljau's algorithm for Bézier curves. The algorithm was devised by Carl R. de Boor. Simplified, potentially faster variants of the de Boor algorithm have been created but they suffer from comparatively lower stability.
其中:
单个称为节点
![]()
多个序列组成
称为节点向量
(一行多列)
这是一个最简单的基函数(分段常函数),存在函数值不连续。
它是一个分段多项式,高阶的情况如下:
结论:其他位置为
;
它为分段次多项式;
更高阶的基函数,其反映真实情况的波函数会越不粗糙。
举个梨子:
其中,
因为分母
同理可得:
又因为此时,
所以,可以得出结论:
推广到高阶的公式:
同样是条两条直线方程围成的“三角形”。
:为![]()
次规范的
基函数,最高次数为
![]()
满足关系![]()
其中:为节点数;
为控制点个数;
为基函数的最高次数。
其中,
举个梨子,如果输入控制点个数
本来输入的是6个控制点,但是,只要通过给真正的变量设置不一样的步长,输出的可是几百上千个点,用点与点间的直线,形成的折现去近似、拟合曲线。
仿真的结果如图:
![16bc84518a8f234395193ac306b559ea.png](https://i-blog.csdnimg.cn/blog_migrate/0b41987d4ceec3bc06dc6be7d2863285.jpeg)
![d9d4063c659ac4ac53922040e54faab3.png](https://i-blog.csdnimg.cn/blog_migrate/b53266b8a9e7673a7c81e46311e03f9c.jpeg)
直线插补:
适用于:末端在p2p间运动轨迹是直线。
较简单,不做赘述。
圆弧插补:
适用于:根据两端点间的插补数字信息,计算出逼近实际圆弧的点集。
可以证明,等闲得不行再码出来。
如果有帮助的话,请点赞或者关注支持一下~