曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)

这篇具有很好参考价值的文章主要介绍了曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 专栏介绍

🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。

🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法


1 什么是B样条曲线?

为了解决贝塞尔曲线无法局部修正、控制性减弱、曲线次数过高、不易拼接的缺陷,引入B样条曲线(B-Spline)。对贝塞尔曲线不了解的同学请看曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

B样条曲线是一种用于表示和描绘曲线的数学工具,它在计算机图形学、计算机辅助设计、计算机动画和数值分析等领域得到广泛应用。其名称中的B代表了基本(basis),而样条则是在各个领域中广泛应用的一种绘制曲线的技术,例如计算机图形学、物理学模拟、金融和经济分析等。在计算机图形学中,样条通常用于创建平滑的曲线和曲面,以便在三维场景中呈现出更真实的效果。在物理学模拟中,样条可用于描述物体的运动轨迹和变形过程。

曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法),算法,人工智能,ROS,机器人,自动驾驶,轨迹规划,曲线生成

B样条曲线的性质包括平滑性、局部控制性、递归计算和多项式插值。通过调整控制点的位置、权重和节点序列,可以改变B样条曲线的形状,从而实现对曲线的精确控制。B样条曲线常用于描述自然曲线和复杂曲线,如汽车外形、飞机机翼、艺术造型等。在计算机图形学中,B样条曲线可以用来生成圆滑的曲线路径,进行形状建模和渲染,以及实现动画效果等。

在运动规划中,B样条曲线也是一种很强大的曲线生成和轨迹优化工具,接下来介绍其基本原理。

2 基函数的de Boor递推式

B样条曲线的核心是具有局部性的基函数(Basic function)——当改变一个控制节点时,只会变动该点旁边有限段曲线(样条曲线则需要重新计算整条曲线,因为它由一组控制点唯一确定),而非“牵一发动全身”。如图所示给出了B样条与贝塞尔曲线基函数的区别。

曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法),算法,人工智能,ROS,机器人,自动驾驶,轨迹规划,曲线生成

采用Cox-de Boor递推定义B样条曲线的基函数

N i , k ( t ) = t − t i t i + k − t i N i , k − 1 ( t ) + t i + k + 1 − t t i + k + 1 − t i + 1 N i + 1 , k − 1 ( t ) N_{i,k}\left( t \right) =\frac{t-t_i}{t_{i+k}-t_i}N_{i,k-1}\left( t \right) +\frac{t_{i+k+1}-t}{t_{i+k+1}-t_{i+1}}N_{i+1,k-1}\left( t \right) Ni,k(t)=ti+ktittiNi,k1(t)+ti+k+1ti+1ti+k+1tNi+1,k1(t)

其中 N i , k ( t ) N_{i,k}\left( t \right) Ni,k(t)称为第 i i i个控制节点的 k k k次( k + 1 k+1 k+1阶)B样条基函数 i = 0 , 1 , ⋯   , n − 1 i=0,1,\cdots ,n-1 i=0,1,,n1 k ⩾ 1 k\geqslant 1 k1且规定 0 / 0 = 0 {{0}/{0}}=0 0/0=0。特别地,有

N i , 0 ( t ) = { 1 , t ∈ [ t i , t i + 1 ) 0 , o t h e r w i s e N_{i,0}\left( t \right) =\begin{cases} 1,t\in \left[ t_i,t_{i+1} \right)\\ 0,\mathrm{otherwise}\\\end{cases} Ni,0(t)={1,t[ti,ti+1)0,otherwise

即高次B样条基函数为若干低次B样条基函数的线性组合。 N i , k ( t ) N_{i,k}\left( t \right) Ni,k(t)的次数 k k k与控制节点的个数 n n n无关,因此B样条曲线自由度更大——允许定义多个控制点而不用担心曲线次数过高导致计算困难

3 B样条曲线基本概念图解

B样条曲线定义为用基函数加权的控制节点

P ( t ) = ∑ i = 0 n − 1 p i N i , k ( t ) , t ∈ [ t k , t n ) \boldsymbol{P}\left( t \right) =\sum_{i=0}^{n-1}{\boldsymbol{p}_iN_{i,k}\left( t \right)}, t\in \left[ t_k,t_n \right) P(t)=i=0n1piNi,k(t),t[tk,tn)

其中 T = { t 0 , t 1 , ⋯   , t m − 1 } T=\left\{ t_0,t_1,\cdots ,t_{m-1} \right\} T={t0,t1,,tm1}是一个一维单调非递减序列,称为节点向量(knot vector),其中的元素 t i t_i ti称为节点(knot),区间 [ t i , t i + 1 ) \left[ t_i,t_{i+1} \right) [ti,ti+1)称为第 i i i节点区间(knot range),节点在样条曲线上的映射 P ( t i ) \boldsymbol{P}\left( t_i \right) P(ti)称为曲节点(knot point)

在节点向量中,若某节点 t i t_i ti出现 l l l次,则称 t i t_i ti重复度 l l l多重节点,否则为简单节点。与贝塞尔曲线不同,仅当B样条曲线首末节点重复度为 k + 1 k+1 k+1时,曲线本身才穿过首末控制点

接下来分析B样条曲线的局部支撑性。基函数 N i , k ( t ) N_{i,k}\left( t \right) Ni,k(t)在区间 [ t i , t i + k + 1 ] \left[ t_i,t_{i+k+1} \right] [ti,ti+k+1]上非零,因为该区间上总存在不为零的零阶基函数 N i , 0 N_{i,0} Ni,0,该区间称为支撑区间,对应样条曲线上的区段称为支撑曲线。由于 N i , k ( t ) N_{i,k}\left( t \right) Ni,k(t)直接与控制节点 p i \boldsymbol{p}_i pi相乘,所以 p i \boldsymbol{p}_i pi只影响其支撑区间 [ t i , t i + k + 1 ] \left[ t_i,t_{i+k+1} \right] [ti,ti+k+1]上对应支撑曲线的形状。所以B样条曲线也可视为若干段贝塞尔曲线的拼接,是贝塞尔曲线的推广,相邻贝塞尔曲线间存在若干重合节点,保留了对称性、几何不变性、变差伸缩性等优良特性。

曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法),算法,人工智能,ROS,机器人,自动驾驶,轨迹规划,曲线生成

为使每个控制节点都有合法的支撑区间与之匹配,节点数量应满足

m = n + k + 1 m=n+k+1 m=n+k+1

B样条曲线的次数指基函数多项式的最高次数,阶数则可视为控制节点 p i \boldsymbol{p}_i pi所影响的节点数。当节点区间 [ t i , t i + 1 ) \left[ t_i,t_{i+1} \right) [ti,ti+1)上的非零 k k k次基函数达到最大数量 k + 1 k+1 k+1个时,令其满足

∑ j = i − k i N j , k = 1 \sum_{j=i-k}^i{N_{j,k}}=1 j=ikiNj,k=1

称为基函数的加权性质。显然,对于 k k k次基函数,节点区间 [ t 0 , t k ) \left[ t_0,t_k \right) [t0,tk) [ t n , t n + k ) \left[ t_n,t_{n+k} \right) [tn,tn+k)上的非零基函数不足 k + 1 k+1 k+1个,它们的加权和不为零,在这些区间计算B样条曲线会导致错误,因此B样条曲线定义在区间 [ t k , t n ) \left[ t_k,t_n \right) [tk,tn)上。如图所示是关于B样条曲线定义区间的实例说明。

曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法),算法,人工智能,ROS,机器人,自动驾驶,轨迹规划,曲线生成

4 节点生成公式

B样条曲线由控制节点与节点向量唯一确定,通过改变节点向量中节点的分布特征,可以构造不同类型的B样条曲线

  • 均匀B样条曲线(Uniform B-Spline Curve)

    节点向量中的节点沿数轴方向等距离均匀分布,所有节点区间等距,即 t i + 1 − t i = c o n s t > 0 , i = 0 , 1 , ⋯   , n + k t_{i+1}-t_i=\mathrm{const}>0, i=0,1,\cdots ,n+k ti+1ti=const>0,i=0,1,,n+k

  • 准均匀B样条曲线(quasi-Uniform B-Spline Curve)

    节点向量中的首末节点重复度为 k + 1 k+1 k+1,其余节点沿数轴方向等距均匀分布且重复度为1。可以证明该情况下,当 k = n k=n k=n时,B样条基函数 N i , k ( t ) N_{i,k}\left( t \right) Ni,k(t)退化为伯恩斯坦多项式,即B样条曲线退化为贝塞尔曲线

  • 非均匀B样条曲线(non-Uniform B-Spline Curve)

    节点向量任意分布

节点生成通常有两种方法:

  • 均匀法
    { t 0 = t 1 = ⋯ = t k = 0 t k + i = i n − k + 1 , i = 1 , 2 , ⋯   , n − k − 1 t n = t n + 1 = ⋯ = t n + k = 1 \begin{cases} t_0=t_1=\cdots =t_k=0\\ t_{k+i}=\frac{i}{n-k+1}, i=1,2,\cdots ,n-k-1\\ t_n=t_{n+1}=\cdots =t_{n+k}=1\\\end{cases} t0=t1==tk=0tk+i=nk+1i,i=1,2,,nk1tn=tn+1==tn+k=1
    该方法不依赖于参数选择。
  • De Boor法
    { t 0 = t 1 = ⋯ = t k = 0 t k + i = 1 k ∑ j = i i + k − 1 u j , i = 1 , 2 , ⋯   , n − k − 1 t n = t n + 1 = ⋯ = t n + k = 1 \begin{cases} t_0=t_1=\cdots =t_k=0\\ t_{k+i}=\frac{1}{k}\sum_{j=i}^{i+k-1}{u_j}, i=1,2,\cdots ,n-k-1\\ t_n=t_{n+1}=\cdots =t_{n+k}=1\\\end{cases} t0=t1==tk=0tk+i=k1j=ii+k1uj,i=1,2,,nk1tn=tn+1==tn+k=1
    该方法对选择的参数进行窗口平滑。

下一节将继续介绍B样条曲线的计算算法——近似和插值应用,并给出代码实现。


🔥 更多精彩专栏文章来源地址https://www.toymoban.com/news/detail-826211.html

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

到了这里,关于曲线生成 | 图解B样条曲线生成原理(基本概念与节点生成算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【动态规划】动态规划算法基本概念,原理应用和示例代码

             动态规划(Dynamic Programming,简称DP)是一种解决多阶段决策问题的数学优化方法。它将原问题分解成若干个子问题,通过解决子问题只需解决一次并将结果保存下来,从而避免了重复计算,提高了算法效率。         通俗来讲,动态规划算法是解决一类具有重叠

    2024年01月21日
    浏览(36)
  • 贝塞尔曲线 PH曲线 C曲线 B样条 NURBS样条曲线 三次Cardinal样条曲线对比 也涉及到不同曲线加速度的一些东西,不过有待细化

    本文很多直接截图论文的,因为不需要重复造轮子,对比也只是为了选择更佳的路径规划曲线,对比于B曲线,时间不够,概括会有所疏漏,下表是曲线的对比表格,看完可以直接看下面,也涉及到不同曲线加速度的一些东西,不过有待细化,2022/3/17后来上了高等工程数学,如

    2024年02月03日
    浏览(27)
  • 【算法导论】图论(图的基本概念,图上的深度优先搜索(DFS),广度优先搜索(BFS),最小生成树(MST)及Prim,Kruskal算法)

    图(Graph)是一种包含节点与节点的边的集合,记作G=(V,E),V是节点的集合,E是边的集合。 有向图 一个有向图G=(V,E),E中每个元素是V上的一个二值关系:一条从a出发的连向b的边e可以记作一个 有序 对e = (a,b) 。 无向图 一个无向图G=(V,E),E的每个元素e可以表示V上的一个 无序 对,记

    2024年02月03日
    浏览(32)
  • Matlab样条工具箱及曲线拟合

    Matlab样条工具箱提供了样条的建立、操作、绘制等功能. 建立一个样条曲线或曲面,根据前缀可分为4类: 前缀 类别 cs* 三次样条 pp* 分段多项式样条 sp* B样条,系数为基函数系数 rp* 有理B样条 函数操作:求值、求导数、求积分等; 节点操作:节点重数的设定、修改等. 1.三次

    2024年02月08日
    浏览(37)
  • 曲线平滑算法:三次Hermite曲线生成

    目录  1.三次Hermite曲线的参数方程 2. 三次Hermite曲线的绘制          Hermite曲线是通过给定曲线的两个端点的位置矢量、以及两个端点处的切线矢量、来描述曲线的,如图1所示。这里先对Hermite曲线进行数学公式推导,然后讲述如何绘制Hermite曲线。(这里是算法代码) 图

    2024年02月16日
    浏览(56)
  • B-spline三次B样条曲线方程

    一、B-样条基函数 它有两条贝塞尔基函数所没有的特性, (1)定义域被节点细分(subdivided); (2) 基函数不是在整个区间非零。实际上,每个B样条基函数在附近一个子区间非零, 因此,B-样条基函数相当“局部”。 1.节点 设 U  是 m  + 1 个非递减数的集合, u 0 =  u 2 =  u 3 

    2024年02月06日
    浏览(26)
  • Opencv实现的三次样条曲线(Cubic Spline)插值

    1.样条曲线简介 样条曲线(Spline)本质是分段多项式实函数,在实数范围内有: S:[a,b]→R ,在区间 [a,b] 上包含 k 个子区间[ti−1,ti],且有: a=t0t1⋯tk−1tk=b(1) 对应每一段区间 i 的存在多项式: Pi:[ti−1,ti]→R,且满足于: S(t)=P1(t) , t0≤tt1,S(t)=P2(t) , t1≤tt2,⋮S(t)=Pk(t) , 

    2024年02月06日
    浏览(26)
  • 【计算机图形学】【实验报告】太阳系绘制、B样条曲线绘制(附代码)

    实 验 报 告 一、实验目的 掌握三维图形的显示原理和方法,掌握三维观察的原理和方法; 掌握OpenGL中矩阵堆栈函数的使用,会使用堆栈函数进行复杂场景的组装。 掌握OpenGL中三维观察变换常用的函数的使用方法,了解三维模型的贴图方法; 掌握自由曲线的生成方法,熟练

    2024年02月10日
    浏览(28)
  • 49学习容器管理平台 Docker Swarm 的基本概念和应用,包括节点管理、服务编排

    Docker Swarm 是 Docker 官方提供的容器编排工具,可以管理多个 Docker 节点,并支持自动化扩展、负载均衡等功能。下面是 Docker Swarm 的基本概念和使用方法,包括节点管理和服务编排。 在 Docker Swarm 中,一个或多个 Docker 节点组成一个 Swarm 集群,其中一个节点是 Swarm Manager,负责

    2024年02月05日
    浏览(35)
  • 最小生成树——Prim算法(详细图解)

    目录  最小生成树的概念   经典题目 prim算法简介  prim算法解析 (详细图解)  代码实现  代码实战 在一给定的无向图G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边,而 w(u, v) 代表此的边权重,若存在 T 为 E 的子集(即)且为无循环图,使得的 w(T) 最小,则此 T 为 G 的

    2023年04月09日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包