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

news2024/11/28 16:27:36

目录

  • 0 专栏介绍
  • 1 什么是B样条曲线?
  • 2 基函数的de Boor递推式
  • 3 B样条曲线基本概念图解
  • 4 节点生成公式

0 专栏介绍

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

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


1 什么是B样条曲线?

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

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

在这里插入图片描述

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

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

2 基函数的de Boor递推式

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

在这里插入图片描述

采用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样条曲线也可视为若干段贝塞尔曲线的拼接,是贝塞尔曲线的推广,相邻贝塞尔曲线间存在若干重合节点,保留了对称性、几何不变性、变差伸缩性等优良特性。

在这里插入图片描述

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

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样条曲线定义区间的实例说明。

在这里插入图片描述

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样条曲线的计算算法——近似和插值应用,并给出代码实现。


🔥 更多精彩专栏

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1456041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3+vite搭建基础架构(6)--- 使用vue-router

Vue3vite搭建基础架构(6)--- 使用vue-router 说明官方文档安装vue-router使用vue-router测试vue-router 说明 这里记录下自己在Vue3vite的项目使用vue-router的过程,不使用ts语法,方便以后直接使用。这里承接自己的博客Vue3vite搭…

第五次作业:LMDeploy 的量化和部署

参考文档:https://github.com/InternLM/tutorial/blob/main/lmdeploy/lmdeploy.md 基础作业: 使用 LMDeploy 以本地对话、网页Gradio、API服务中的一种方式部署 InternLM-Chat-7B 模型,生成 300 字的小故事(需截图) …

免费的一键伪原创工具哪个好用?有答案

免费的一键伪原创工具对于许多有写作需求的朋友来说是非常实用的,免费的一键伪原创工具不仅可以帮助大家高效率的输出所要的文章内容,而且关键还是免费就能使用的。对于网上比比旨是免费的一键伪原创工具中,我们如何挑选到那个好用的免费一键…

【目标跟踪】提供一种简单跟踪测距方法(c++)

文章目录 一、前言二、c代码2.1、Tracking2.2、KalmanTracking2.3、Hungarian2.4、TrackingInfo 三、调用示例四、结果 一、前言 在许多目标检测应用场景中,完完全全依赖目标检测对下游是很难做出有效判断,如漏检。检测后都会加入跟踪进行一些判断或者说…

Rust-知多少?

文章目录 前言1.使用下划线开头忽略未使用的变量2. 变量解构3.常量4.变量遮蔽(shadowing)5. 类似println!("{}", x); 为啥加感叹号6.单元类型7. -> 运算符到哪去了?总结 前言 Rust 学习系列,记录一些rust使用小技巧…

QT实现十字线

效果: int resolutionWidth m_resolution.width();int resolutionHeight m_resolution.height();QPixmap pixmap(resolutionWidth, resolutionHeight);pixmap.fill(Qt::transparent);QPainter painter(&pixmap);painter.setPen(QPen(Qt::red, 2)); // 设置画笔…

蓝桥杯DP算法——背包问题(C++)

目录 一、01背包问题 二、完全背包问题 三、多重背包问题 四、多重背包问题(优化版) 五、分组背包问题 一、01背包问题 01背包问题就是有N件物品,一个空间大小为V的背包,每个物品只能使用一次,使得背包中所装物品…

【软考高级信息系统项目管理师--第十五章:项目风险管理】

🚀 作者 :“码上有前” 🚀 文章简介 :软考高级–信息系统项目管理师 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 第十五章:项目风险管理 风险的属性风险的分类风险管理过程规划风险管理…

企业大宽带服务器用哪里最合适

如今,数字经济的发展速度不断加快,进入数字化跑道的企业,每天都在大量输出、共享、存储数字内容,想要更高效、安全地让用户看到内容,企业的服务器需要满足大带宽、低延时、高并发等要求。 中小企业受限于资金、资源等…

CTA量化策略—基于时间窗口的唐奇安通道法CTA策略

结合唐奇安通道法的核心思想,以及窗口法寻找到的局部高峰点和低谷点,将高点回归得到拟合直线作为上轨,取代唐奇安通道法 中的平行线上轨,同理也将低点回归得到拟合直线作为下轨,以此构建道氏理论 CTA策略。 回测标的&a…

anomalib1.0学习纪实-续3:结合python lightning理思路

一、python lightning python lightning是个好东西,但不见得那么友好。 GPT4给我讲解了他的用法: 二、anomalib的思路 1、 创建一个Lightning Module。 首先,在src\anomalib\models\components\base\anomaly_module.py中, cl…

基于Java SSM框架实现电影售票系统项目【项目源码】

基于java的SSM框架实现电影售票系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写,受到很多的追捧,“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架,通常更简单的数据源。Spring属于…

生成式 AI - Diffusion 模型的数学原理(3)

来自 论文《 Denoising Diffusion Probabilistic Model》(DDPM) 论文链接: https://arxiv.org/abs/2006.11239 Hung-yi Lee 课件整理 文章目录 一、图像生成模型本质上的共同目标二、最大似然估计三、和VAE的关联四、概率计算 一、图像生成模…

LeetCode.590. N 叉树的后序遍历

题目 590. N 叉树的后序遍历 分析 我们之前有做过LeetCode的 145. 二叉树的后序遍历,其实对于 N 叉树来说和二叉树的思路是一模一样的。 二叉树的后序遍历是【左 右 根】 N叉树的后序遍历顺序是【孩子 根】,你可以把二叉树的【左 右 根】想象成【孩子…

MySQL为什么改进LRU算法?

普通LRU算法 LRU = Least Recently Used(最近最少使用): 就是末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰. 当要访问某个页时,如果不在Buffer Pool,需要把该页加载到缓冲池,并且把该缓冲页对应的控制块作为节点添加到LRU链表的头部。当要访问某个页时,如果在…

js设计模式:代理模式

作用: 创建代理的数据来复刻对原有数据的操作,并且可以添加自己的逻辑 vue中的data就是用的代理模式,比较经典 示例: let proxyFun (obj)>{return new Proxy(obj,{get:(obj,prop,value)>{return obj[prop]},set:(obj,prop,value)>{obj[prop] valuereturn true}})…

从阿里宜搭到吉客云通过接口配置打通数据

从阿里宜搭到吉客云通过接口配置打通数据 来源系统:阿里宜搭 宜搭是阿里巴巴自研的低代码应用搭建平台,传统情况下需要2周才能搭建完成的应用,用宜搭2小时就可完成。宜搭于2019年3月上线,用户可以在可视化界面上以拖拉拽的方式编辑和配置页面…

【漏洞复现-通达OA】通达OA report_bi存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力,包括流程审批、行政办公、日常事务、数据统计…

二叉树和N叉数的遍历合集

二叉树和N叉数的遍历合集 二叉树的前序遍历 前序遍历的顺序是 根 -> 左儿子 -> 右儿子&#xff0c;所以我们直接按照这个顺序 dfs 就行 dfs class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;function<void(…

如何在极低成本硬件上落地人工智能算法 —— 分布式AI

一、背景 分布式AI的发展前景非常广阔&#xff0c;随着5G、6G等高速网络通信技术的普及和边缘计算能力的提升&#xff0c;以及AI算法和硬件的不断优化进步&#xff0c;分布式AI将在多个领域展现出强大的应用潜力和市场价值&#xff1a; 1. **物联网&#xff08;IoT&#xff0…