Bezier curve
贝塞尔曲线的数学基础是早在 1912 年就广为人知的伯恩斯坦多项式。但直到 1959 年,当时就职于雪铁龙的法国数学家 Paul de Casteljau 才开始对它进行图形化应用的尝试,并提出了一种数值稳定的 de Casteljau 算法。然而贝塞尔曲线的得名,却是由于 1962 年另一位就职于雷诺的法国工程师 Pierre Bézier 的广泛宣传。他使用这种只需要很少的控制点就能够生成复杂平滑曲线的方法,来辅助汽车车体的工业设计。
正是因为控制简便却具有极强的描述能力,贝塞尔曲线在工业设计领域迅速得到了广泛的应用。不仅如此,在计算机图形学领域,尤其是矢量图形学,贝塞尔曲线也占有重要的地位。今天我们最常见的一些矢量绘图软件,如 Flash、Illustrator、CorelDraw 等,无一例外都提供了绘制贝塞尔曲线的功能。甚至像 Photoshop 这样的位图编辑软件,也把贝塞尔曲线作为仅有的矢量绘制工具(钢笔工具)包含其中。
Bezier曲线由一组控制点P0到Pn定义,其中n称为其阶(n = 1表示线性,2表示二次,等等)。第一个控制点和最后一个控制点始终是曲线的端点;然而,中间控制点(如果有的话)通常不在曲线上。
一阶贝塞尔曲线(Linear Bezier curves)
给定控制点P0和P1, 线性贝塞尔曲线是两点中的线段。
二阶贝塞尔曲线(Quadratic Bezier curves)
给定三个控制点P0 P1和P2, 取S0为直线P0P1一阶贝塞尔曲线,S1为P1P2一阶贝塞尔曲线,得:
可推导出一阶导数为:
由此可见,二阶贝塞尔曲线在P0和P2处的切线相交于P1。
可推导出二阶导数为:
三阶贝塞尔曲线(Cubic Bezier curves)
给定四个控制点P0 P1 P2和P3,由以上推导,三阶贝塞尔曲线可以由二阶导出:
展开可得:
可推导出一阶导数为:
可推导出二阶导数为:
N阶通用形式
其导数为:
其中bi,n称为Bernstein polynomial,Pi称为贝塞尔曲线控制点,由控制点组成的多边形为贝塞尔多边形,并且此多边形为贝塞尔曲线的凸包(convex hull)。
贝塞尔曲线性质
- 曲线从P0开始,到Pn结束,称为端点插值性质。
- 当且仅当所有控制点共线时,曲线是一条直线。
- 曲线的起点和终点分别与贝塞尔多边形的第一段和最后一段相切。
- 一条曲线可以在任意点上分成两条子曲线,也可以分成任意多条子曲线,每条子曲线都是贝塞尔曲线。
- 有些曲线看起来很简单,比如圆,不能用Bezier曲线或分段Bezier曲线精确地描述。
- 每条二次贝塞尔曲线也是一条三次贝塞尔曲线,更一般的,每一条n阶贝塞尔曲线也是一条m阶贝塞尔曲线,其中m > n。比如n阶贝塞尔曲线具有控制点P0,⋯,Pn也是n+1阶贝塞尔曲线,其中
- 贝塞尔曲线具有变异递减性质。从直观的角度来看,这意味着一条Bezier曲线的“波动”不会超过它的控制点的多边形,而实际上它的“波动”可能比控制点的多边形还要小.
- 对于某些控制点的选择,大于2阶的贝塞尔曲线可能会与自身相交,也可能有一个尖顶。
Uniform Cubic B-Splines in SE3
SE3定义为:
假设角速度和线速度在每个变换过程中都是恒定的。利用矩阵对数和指数,我们可以定义如下函数:
其中是t时刻插值的位姿,
为控制点,
是基函数。
我们可以通过指定k = 4(degree=k - 1)来转换成三次b样条曲线。表示在最大值处有四个控制点,它们对样条曲线上的任何点都有贡献。
因此得到:
其中对于k=4,基函数为:
化解得到:
其中。
简化表达为:
对时间求导:
因此可以得到:
Demo
代码实现参考open_vins, 其中蓝色曲线为knots插值之后的曲线,绿色曲线为模拟的IMU数据积分得到的曲线。
Reference
[1] https://en.wikipedia.org/wiki/Bézier_curve
[2] N-order Bézier curve | Desmos
[3] K. Qin, “General matrix representations for b-splines,” The Visual Computer, vol. 16, no. 3, pp. 177–186, 2000.
[4] GitHub - HKUST-Aerial-Robotics/Fast-Planner: A Robust and Efficient Trajectory Planner for Quadrotors
[5] Continuous-Time Visual-Inertial Trajectory Estimation with Event Cameras