0 專欄介紹
??附C++/Python/Matlab全套代碼??課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)、創(chuàng)新競(jìng)賽必備!詳細(xì)介紹全局規(guī)劃(圖搜索、采樣法、智能算法等);局部規(guī)劃(DWA、APF等);曲線優(yōu)化(貝塞爾曲線、B樣條曲線等)。
??詳情:圖解自動(dòng)駕駛中的運(yùn)動(dòng)規(guī)劃(Motion Planning),附幾十種規(guī)劃算法
1 什么是B樣條曲線?
為了解決貝塞爾曲線無(wú)法局部修正、控制性減弱、曲線次數(shù)過(guò)高、不易拼接的缺陷,引入B樣條曲線(B-Spline)。對(duì)貝塞爾曲線不了解的同學(xué)請(qǐng)看曲線生成 | 圖解貝塞爾曲線生成原理(附ROS C++/Python/Matlab仿真)
B樣條曲線是一種用于表示和描繪曲線的數(shù)學(xué)工具,它在計(jì)算機(jī)圖形學(xué)、計(jì)算機(jī)輔助設(shè)計(jì)、計(jì)算機(jī)動(dòng)畫(huà)和數(shù)值分析等領(lǐng)域得到廣泛應(yīng)用。其名稱中的B
代表了基本(basis)
,而樣條
則是在各個(gè)領(lǐng)域中廣泛應(yīng)用的一種繪制曲線的技術(shù),例如計(jì)算機(jī)圖形學(xué)、物理學(xué)模擬、金融和經(jīng)濟(jì)分析等。在計(jì)算機(jī)圖形學(xué)中,樣條通常用于創(chuàng)建平滑的曲線和曲面,以便在三維場(chǎng)景中呈現(xiàn)出更真實(shí)的效果。在物理學(xué)模擬中,樣條可用于描述物體的運(yùn)動(dòng)軌跡和變形過(guò)程。
B樣條曲線的性質(zhì)包括平滑性、局部控制性、遞歸計(jì)算和多項(xiàng)式插值。通過(guò)調(diào)整控制點(diǎn)的位置、權(quán)重和節(jié)點(diǎn)序列,可以改變B樣條曲線的形狀,從而實(shí)現(xiàn)對(duì)曲線的精確控制。B樣條曲線常用于描述自然曲線和復(fù)雜曲線,如汽車外形、飛機(jī)機(jī)翼、藝術(shù)造型等。在計(jì)算機(jī)圖形學(xué)中,B樣條曲線可以用來(lái)生成圓滑的曲線路徑,進(jìn)行形狀建模和渲染,以及實(shí)現(xiàn)動(dòng)畫(huà)效果等。
在運(yùn)動(dòng)規(guī)劃中,B樣條曲線也是一種很強(qiáng)大的曲線生成和軌跡優(yōu)化工具,接下來(lái)介紹其基本原理。
2 基函數(shù)的de Boor遞推式
B樣條曲線的核心是具有局部性的基函數(shù)(Basic function)——當(dāng)改變一個(gè)控制節(jié)點(diǎn)時(shí),只會(huì)變動(dòng)該點(diǎn)旁邊有限段曲線(樣條曲線則需要重新計(jì)算整條曲線,因?yàn)樗梢唤M控制點(diǎn)唯一確定),而非“牽一發(fā)動(dòng)全身”。如圖所示給出了B樣條與貝塞爾曲線基函數(shù)的區(qū)別。
采用Cox-de Boor遞推定義B樣條曲線的基函數(shù)
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+k??ti?t?ti??Ni,k?1?(t)+ti+k+1??ti+1?ti+k+1??t?Ni+1,k?1?(t)
其中 N i , k ( t ) N_{i,k}\left( t \right) Ni,k?(t)稱為第 i i i個(gè)控制節(jié)點(diǎn)的 k k k次( k + 1 k+1 k+1階)B樣條基函數(shù), i = 0 , 1 , ? ? , n ? 1 i=0,1,\cdots ,n-1 i=0,1,?,n?1, k ? 1 k\geqslant 1 k?1且規(guī)定 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樣條基函數(shù)為若干低次B樣條基函數(shù)的線性組合。 N i , k ( t ) N_{i,k}\left( t \right) Ni,k?(t)的次數(shù) k k k與控制節(jié)點(diǎn)的個(gè)數(shù) n n n無(wú)關(guān),因此B樣條曲線自由度更大——允許定義多個(gè)控制點(diǎn)而不用擔(dān)心曲線次數(shù)過(guò)高導(dǎo)致計(jì)算困難。
3 B樣條曲線基本概念圖解
B樣條曲線定義為用基函數(shù)加權(quán)的控制節(jié)點(diǎn)
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=0∑n?1?pi?Ni,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?,?,tm?1?}是一個(gè)一維單調(diào)非遞減序列,稱為節(jié)點(diǎn)向量(knot vector),其中的元素 t i t_i ti?稱為節(jié)點(diǎn)(knot),區(qū)間 [ t i , t i + 1 ) \left[ t_i,t_{i+1} \right) [ti?,ti+1?)稱為第 i i i個(gè)節(jié)點(diǎn)區(qū)間(knot range),節(jié)點(diǎn)在樣條曲線上的映射 P ( t i ) \boldsymbol{P}\left( t_i \right) P(ti?)稱為曲節(jié)點(diǎn)(knot point)。
在節(jié)點(diǎn)向量中,若某節(jié)點(diǎn) t i t_i ti?出現(xiàn) l l l次,則稱 t i t_i ti?是重復(fù)度為 l l l的多重節(jié)點(diǎn),否則為簡(jiǎn)單節(jié)點(diǎn)。與貝塞爾曲線不同,僅當(dāng)B樣條曲線首末節(jié)點(diǎn)重復(fù)度為 k + 1 k+1 k+1時(shí),曲線本身才穿過(guò)首末控制點(diǎn)。
接下來(lái)分析B樣條曲線的局部支撐性?;瘮?shù) N i , k ( t ) N_{i,k}\left( t \right) Ni,k?(t)在區(qū)間 [ t i , t i + k + 1 ] \left[ t_i,t_{i+k+1} \right] [ti?,ti+k+1?]上非零,因?yàn)樵搮^(qū)間上總存在不為零的零階基函數(shù) N i , 0 N_{i,0} Ni,0?,該區(qū)間稱為支撐區(qū)間,對(duì)應(yīng)樣條曲線上的區(qū)段稱為支撐曲線。由于 N i , k ( t ) N_{i,k}\left( t \right) Ni,k?(t)直接與控制節(jié)點(diǎn) p i \boldsymbol{p}_i pi?相乘,所以 p i \boldsymbol{p}_i pi?只影響其支撐區(qū)間 [ t i , t i + k + 1 ] \left[ t_i,t_{i+k+1} \right] [ti?,ti+k+1?]上對(duì)應(yīng)支撐曲線的形狀。所以B樣條曲線也可視為若干段貝塞爾曲線的拼接,是貝塞爾曲線的推廣,相鄰貝塞爾曲線間存在若干重合節(jié)點(diǎn),保留了對(duì)稱性、幾何不變性、變差伸縮性等優(yōu)良特性。
為使每個(gè)控制節(jié)點(diǎn)都有合法的支撐區(qū)間與之匹配,節(jié)點(diǎn)數(shù)量應(yīng)滿足
m = n + k + 1 m=n+k+1 m=n+k+1
B樣條曲線的次數(shù)指基函數(shù)多項(xiàng)式的最高次數(shù),階數(shù)則可視為控制節(jié)點(diǎn) p i \boldsymbol{p}_i pi?所影響的節(jié)點(diǎn)數(shù)。當(dāng)節(jié)點(diǎn)區(qū)間 [ t i , t i + 1 ) \left[ t_i,t_{i+1} \right) [ti?,ti+1?)上的非零 k k k次基函數(shù)達(dá)到最大數(shù)量 k + 1 k+1 k+1個(gè)時(shí),令其滿足
∑ j = i ? k i N j , k = 1 \sum_{j=i-k}^i{N_{j,k}}=1 j=i?k∑i?Nj,k?=1
稱為基函數(shù)的加權(quán)性質(zhì)。顯然,對(duì)于 k k k次基函數(shù),節(jié)點(diǎn)區(qū)間 [ 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?)上的非零基函數(shù)不足 k + 1 k+1 k+1個(gè),它們的加權(quán)和不為零,在這些區(qū)間計(jì)算B樣條曲線會(huì)導(dǎo)致錯(cuò)誤,因此B樣條曲線定義在區(qū)間 [ t k , t n ) \left[ t_k,t_n \right) [tk?,tn?)上。如圖所示是關(guān)于B樣條曲線定義區(qū)間的實(shí)例說(shuō)明。
4 節(jié)點(diǎn)生成公式
B樣條曲線由控制節(jié)點(diǎn)與節(jié)點(diǎn)向量唯一確定,通過(guò)改變節(jié)點(diǎn)向量中節(jié)點(diǎn)的分布特征,可以構(gòu)造不同類型的B樣條曲線
-
均勻B樣條曲線(Uniform B-Spline Curve)
節(jié)點(diǎn)向量中的節(jié)點(diǎn)沿?cái)?shù)軸方向等距離均勻分布,所有節(jié)點(diǎn)區(qū)間等距,即 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+1??ti?=const>0,i=0,1,?,n+k
-
準(zhǔn)均勻B樣條曲線(quasi-Uniform B-Spline Curve)
節(jié)點(diǎn)向量中的首末節(jié)點(diǎn)重復(fù)度為 k + 1 k+1 k+1,其余節(jié)點(diǎn)沿?cái)?shù)軸方向等距均勻分布且重復(fù)度為1??梢宰C明該情況下,當(dāng) k = n k=n k=n時(shí),B樣條基函數(shù) N i , k ( t ) N_{i,k}\left( t \right) Ni,k?(t)退化為伯恩斯坦多項(xiàng)式,即B樣條曲線退化為貝塞爾曲線。
-
非均勻B樣條曲線(non-Uniform B-Spline Curve)
節(jié)點(diǎn)向量任意分布
節(jié)點(diǎn)生成通常有兩種方法:
-
均勻法
{ 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?=n?k+1i?,i=1,2,?,n?k?1tn?=tn+1?=?=tn+k?=1?
該方法不依賴于參數(shù)選擇。 -
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?=k1?∑j=ii+k?1?uj?,i=1,2,?,n?k?1tn?=tn+1?=?=tn+k?=1?
該方法對(duì)選擇的參數(shù)進(jìn)行窗口平滑。
下一節(jié)將繼續(xù)介紹B樣條曲線的計(jì)算算法——近似和插值應(yīng)用,并給出代碼實(shí)現(xiàn)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-826211.html
?? 更多精彩專欄:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-826211.html
- 《ROS從入門(mén)到精通》
- 《Pytorch深度學(xué)習(xí)實(shí)戰(zhàn)》
- 《機(jī)器學(xué)習(xí)強(qiáng)基計(jì)劃》
- 《運(yùn)動(dòng)規(guī)劃實(shí)戰(zhàn)精講》
- …
到了這里,關(guān)于曲線生成 | 圖解B樣條曲線生成原理(基本概念與節(jié)點(diǎn)生成算法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!