nanoflann库
? ? ?點(diǎn)云處理過程中可能會遇到尋找最臨近點(diǎn)的問題,常用的解決方案就是用空間換效率。例如建立kd-tree等樹狀結(jié)構(gòu)來代替遍歷。
? ? ?這里向大家介紹一個(gè)nanoflann工程,nanoflann 算法對fastann進(jìn)行了改進(jìn),效率以及內(nèi)存使用等方面都進(jìn)行了優(yōu)化,而且代碼十分輕量級且開源,是一個(gè)不錯的選擇。工程代碼下載地址? https://github.com/jlblancoc/nanoflann
1.介紹
? ? ?nanoflann是一個(gè)c++11標(biāo)準(zhǔn)庫,用于構(gòu)建具有不同拓?fù)?#xff08;R2,R3(點(diǎn)云),SO(2)和SO(3)(2D和3D旋轉(zhuǎn)組))的KD樹。nanoflann不需要編譯或安裝。你只需要#include <nanoflann.hpp>在你的代碼中。?
1.1 如何使用庫
? ? 最簡單的方法:將其include/nanoflann.hpp用于需要的地方。
1.2 代碼示例
KD-trees使用kdd_search()和查找radius_search()?:?pointcloud_kdd_radius.cpp
點(diǎn)云數(shù)據(jù)集上的KD樹查找:pointcloud_example.cpp
在動態(tài)點(diǎn)云數(shù)據(jù)集上進(jìn)行KD樹查找:dynamic_pointcloud_example.cpp
旋轉(zhuǎn)組(SO2)上的KD樹查找:SO2_example.cpp
旋轉(zhuǎn)組(SO3)上的KD樹查找:SO3_example.cpp
使用外部適配器類在點(diǎn)云數(shù)據(jù)集上查找KD樹:pointcloud_adaptor_example.cpp
KD-tree使用在Eigen::Matrix<>:matrix_example.cpp上查找
KD-tree查找std::vector<std::vector<T> >或std::vector<Eigen::VectorXd>:vector_of_vectors_example.cpp
如何構(gòu)建索引并將其保存到磁盤供以后使用的示例:saveload_example.cpp
3. nanoflann可以做什么?
? ? A.建立具有單一索引的KD樹(沒有隨機(jī)化的KD樹,沒有大致的搜索)。快速,線程安全地查詢KD樹上最近的鄰居。接口是:
? ? 1.? ?nanoflann :: KDTreeSingleIndexAdaptor <>::knnSearch()
找到num_closest最近的鄰居query_point[0:dim-1]。它們的索引存儲在結(jié)果對象中。查看示例使用代碼:
? ?2.???nanoflann :: KDTreeSingleIndexAdaptor <>::radiusSearch()
?query_point[0:dim-1]在最大半徑范圍內(nèi)查找所有鄰居。輸出作為對的向量給出,其中第一個(gè)元素是點(diǎn)索引,第二個(gè)元素是相應(yīng)的距離。查看示例使用代碼。
? ?3.? ? nanoflann :: KDTreeSingleIndexAdaptor<>::radiusSearchCustomCallback()
可以用于接收范圍內(nèi)找到的每個(gè)點(diǎn)的回叫。這在某些情況下可能更有效,而不是用結(jié)果構(gòu)建一個(gè)巨大的向量對。
?
B. 使用2D和3D點(diǎn)云或N維數(shù)據(jù)集。
C. 直接使用Eigen::Matrix<>類(矩陣和向量向量)
D. 使用動態(tài)點(diǎn)云而無需重建整個(gè)kd-tree索引。
E.??使用距離度量標(biāo)準(zhǔn):
????o??? L1?(曼哈頓)
????o??? L2 (歐幾里得,贊成SSE2優(yōu)化)。
????o??? L2_Simple (歐幾里得,用于像點(diǎn)云這樣的低維數(shù)據(jù)集)。
????o??? SO2 (用于旋轉(zhuǎn)組SO2)。
????o??? SO3 (歐幾里得,對于旋轉(zhuǎn)組SO3)。
F. 將構(gòu)建的索引保存并加載到磁盤。
1.4 Nanoflann不能做什么?
使用除L1,L2,SO2和SO3以外的其他距離度量。
支持SE(3)組。
只有C ++接口存在:不支持C,MATLAB或Python。
2.如何選擇KD樹參數(shù)?
2.1?KDTreeSingleIndexAdaptorParams::leaf_max_size
? ? ? ? KD樹它有一個(gè)根節(jié)點(diǎn),一組中間節(jié)點(diǎn),最后是沒有孩子的“葉”節(jié)點(diǎn)。點(diǎn)只存儲在葉節(jié)點(diǎn)中。每個(gè)葉子都包含一個(gè)列表,其中包含哪些點(diǎn)落入其范圍內(nèi)。在構(gòu)建樹的同時(shí),遞歸地分割節(jié)點(diǎn),直到內(nèi)部的點(diǎn)數(shù)等于或低于某個(gè)閾值。那是leaf_max_size。在進(jìn)行查 時(shí),“樹算法”通過選擇葉節(jié)點(diǎn)結(jié)束,然后在葉中的所有元素內(nèi)對查詢的最近點(diǎn)執(zhí)行線性搜索(一個(gè)接一個(gè))。所以,leaf_max_size必須將其設(shè)定為合適的值:
·??較大的值意味著樹會更快地構(gòu)建(因?yàn)闃鋾?#xff09;,但是每個(gè)查詢會更慢(因?yàn)槿~子中的線性搜索要完成更多的點(diǎn))。
·?較小的值將構(gòu)建樹慢得多(將會有許多樹節(jié)點(diǎn)),但查詢會更快......因?yàn)樗阉鞯摹皹洳糠帧?#xff08;對數(shù)復(fù)雜度)仍然有很高的成本。
選擇哪個(gè)數(shù)字確實(shí)取決于應(yīng)用程序,甚至取決于處理器高速緩存的大小,因此理想情況下應(yīng)該執(zhí)行一些基準(zhǔn)測試以最大限度地提高效率。
? ? ?但為了幫助選擇一個(gè)比較合適的參數(shù)作為一個(gè)基準(zhǔn),我提供了以下兩個(gè)基準(zhǔn)。每個(gè)圖表代表leaf_max_size1到10K之間不同值的樹構(gòu)建(水平)和查詢(垂直)時(shí)間(95%不確定性橢圓,由于對數(shù)標(biāo)度而變形)。
·??一個(gè)100K點(diǎn)云,均勻分布(每個(gè)點(diǎn)有(x,y,z)float坐標(biāo)):
·??一個(gè)來自真實(shí)數(shù)據(jù)集(scan_071_points.dat來自弗萊堡校區(qū)360數(shù)據(jù)集,每個(gè)點(diǎn)具有(x,y,z)float坐標(biāo))的大約150K點(diǎn)云:
因此,對于查詢成本占主導(dǎo)地位的應(yīng)用(例如ICP),似乎leaf_max_size10到50之間是最佳的。目前,其默認(rèn)值為10。
3.性能
3.1 nanoflann:更快,更少的內(nèi)存使用
3.2 原始flann對比nanoflann
? ? ? 許多點(diǎn)云算法(如ICP)中最耗時(shí)的部分是查詢最近鄰居的KD樹。因此這個(gè)操作是最重要的。nanoflann相對于原始flann實(shí)現(xiàn)可節(jié)省大約50%的時(shí)間(此圖表中的時(shí)間以微秒為單位):
?
? ? ? ?由于模板化代碼的原因,在構(gòu)建KD樹索引時(shí)還節(jié)省了一些時(shí)間,避免在輔助矩陣中復(fù)制數(shù)據(jù)(下圖中的時(shí)間以毫秒為單位):
4.其他KD樹項(xiàng)目
FLANN?- Marius Muja和David G. Lowe(不列顛哥倫比亞大學(xué))。
FASTANN?- James Philbin(VGG,牛津大學(xué))。
ANN?- David M. Mount和Sunil Arya(馬里蘭大學(xué))。
libkdtree ++?- Martin F. Krafft等人。
資源
三維點(diǎn)云論文及相關(guān)應(yīng)用分享
【點(diǎn)云論文速讀】基于激光雷達(dá)的里程計(jì)及3D點(diǎn)云地圖中的定位方法
3D目標(biāo)檢測:MV3D-Net
三維點(diǎn)云分割綜述(上)
3D-MiniNet: 從點(diǎn)云中學(xué)習(xí)2D表示以實(shí)現(xiàn)快速有效的3D LIDAR語義分割(2020)
win下使用QT添加VTK插件實(shí)現(xiàn)點(diǎn)云可視化GUI
JSNet:3D點(diǎn)云的聯(lián)合實(shí)例和語義分割
大場景三維點(diǎn)云的語義分割綜述
PCL中outofcore模塊---基于核外八叉樹的大規(guī)模點(diǎn)云的顯示
基于局部凹凸性進(jìn)行目標(biāo)分割
基于三維卷積神經(jīng)網(wǎng)絡(luò)的點(diǎn)云標(biāo)記
點(diǎn)云的超體素(SuperVoxel)
基于超點(diǎn)圖的大規(guī)模點(diǎn)云分割
更多文章可查看:點(diǎn)云學(xué)習(xí)歷史文章大匯總
SLAM及AR相關(guān)分享
【開源方案共享】ORB-SLAM3開源啦!
【論文速讀】AVP-SLAM:自動泊車系統(tǒng)中的語義SLAM
【點(diǎn)云論文速讀】StructSLAM:結(jié)構(gòu)化線特征SLAM
SLAM和AR綜述
常用的3D深度相機(jī)
AR設(shè)備單目視覺慣導(dǎo)SLAM算法綜述與評價(jià)
SLAM綜述(4)激光與視覺融合SLAM
Kimera實(shí)時(shí)重建的語義SLAM系統(tǒng)
SLAM綜述(3)-視覺與慣導(dǎo),視覺與深度學(xué)習(xí)SLAM
易擴(kuò)展的SLAM框架-OpenVSLAM
高翔:非結(jié)構(gòu)化道路激光SLAM中的挑戰(zhàn)
SLAM綜述之Lidar SLAM
基于魚眼相機(jī)的SLAM方法介紹
往期線上分享錄播匯總
第一期B站錄播之三維模型檢索技術(shù)
第二期B站錄播之深度學(xué)習(xí)在3D場景中的應(yīng)用
第三期B站錄播之CMake進(jìn)階學(xué)習(xí)
第四期B站錄播之點(diǎn)云物體及六自由度姿態(tài)估計(jì)
第五期B站錄播之點(diǎn)云深度學(xué)習(xí)語義分割拓展
第六期B站錄播之Pointnetlk解讀
[線上分享錄播]點(diǎn)云配準(zhǔn)概述及其在激光SLAM中的應(yīng)用
[線上分享錄播]cloudcompare插件開發(fā)
[線上分享錄播]基于點(diǎn)云數(shù)據(jù)的?Mesh重建與處理
[線上分享錄播]機(jī)器人力反饋遙操作技術(shù)及機(jī)器人視覺分享
[線上分享錄播]地面點(diǎn)云配準(zhǔn)與機(jī)載點(diǎn)云航帶平差
點(diǎn)云PCL更多活動請查看:點(diǎn)云PCL活動之應(yīng)屆生校招群
掃描下方微信視頻號二維碼可查看最新研究成果及相關(guān)開源方案的演示:
如果你對本文感興趣,點(diǎn)擊“原文閱讀”獲取知識星球二維碼,務(wù)必按照“姓名+學(xué)校/公司+研究方向”備注加入免費(fèi)知識星球,星球可自由發(fā)言交流和分享。也可免費(fèi)下載公眾號分享的論文pdf文檔,和更多熱愛分享的小伙伴一起交流吧!
歡迎各位轉(zhuǎn)發(fā)分享朋友圈,將公眾號設(shè)置為星標(biāo),或點(diǎn)擊“在看”以示鼓勵和支持,讓我們繼續(xù)分享!
以上內(nèi)容如有錯誤請留言評論,歡迎指正交流。如有侵權(quán),請聯(lián)系刪除
掃描二維碼
? ? ? ? ? ? ? ? ? ?關(guān)注我們
讓我們一起分享一起學(xué)習(xí)吧!期待有想法,樂于分享的小伙伴加入免費(fèi)星球注入愛分享的新鮮活力。分享的主題包含但不限于三維視覺,點(diǎn)云,高精地圖,自動駕駛,以及機(jī)器人等相關(guān)的領(lǐng)域。
分享及合作方式:聯(lián)系微信“920177957”(需要按要求備注)聯(lián)系郵箱:dianyunpcl@163.com,歡迎企業(yè)來聯(lián)系公眾號展開合作。
點(diǎn)一下“在看”你會更好看耶
總結(jié)
以上是生活随笔為你收集整理的nanoflann库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Open3d学习计划—高级篇 3(点云全
- 下一篇: 最新开源LiDAR数据集LSOOD:四种