Nanoflann adalah perpustakaan c ++ 11 header khusus untuk membangun pohon kD kumpulan data dengan topologi yang berbeda: r 2 , r 3 (awan titik), jadi (2) dan demikian (3) (kelompok rotasi 2D dan 3D). Tidak ada dukungan untuk perkiraan NN disediakan. Nanoflann tidak memerlukan kompilasi atau pemasangan. Anda hanya perlu #include <nanoflann.hpp> dalam kode Anda.
Perpustakaan ini adalah garpu dari Perpustakaan Flann oleh Marius Muja dan David G. Lowe, dan lahir sebagai proyek anak MRPT. Mengikuti persyaratan lisensi asli, Nanoflann didistribusikan di bawah lisensi BSD. Tolong, untuk bug menggunakan tombol masalah atau garpu dan buka permintaan tarik.
Mengutip sebagai:
@misc{blanco2014nanoflann,
title = {nanoflann: a {C}++ header-only fork of {FLANN}, a library for Nearest Neighbor ({NN}) with KD-trees},
author = {Blanco, Jose Luis and Rai, Pranjal Kumar},
howpublished = {url{https://github.com/jlblancoc/nanoflann}},
year = {2014}
}
Lihat rilis changelog untuk daftar perubahan proyek.
include/nanoflann.hpp untuk digunakan di mana Anda membutuhkannya.$ sudo apt install libnanoflann-devnanoflann dengan homebrew dengan: $ brew install brewsci/science/nanoflann$ brew tap brewsci/science
$ brew install nanoflann$ sudo port install nanoflannbrew install homebrew/science/nanoflannMeskipun Nanoflann sendiri tidak harus dikompilasi, Anda dapat membangun beberapa contoh dan tes dengan:
$ sudo apt-get install build-essential cmake libgtest-dev libeigen3-dev
$ mkdir build && cd build && cmake ..
$ make && make testJelajahi dokumentasi doxygen.
Catatan penting: Jika norma L2 digunakan, perhatikan bahwa jari -jari pencarian dan semua jarak yang diteruskan dan dikembalikan sebenarnya adalah jarak kuadrat .
knnSearch() dan radiusSearch() : pointcloud_kdd_radius.cppEigen::Matrix<> : matrix_example.cppstd::vector<std::vector<T> > atau std::vector<Eigen::VectorXd> : vector_of_vectors_example.cppMakefile untuk digunakan melalui pkg-config (misalnya, setelah melakukan "membuat instal" atau setelah menginstal dari repositori ubuntu): example_with_pkgconfig/mrpt-gui , misalnya sudo apt install libmrpt-gui-dev ):
Efisiensi Waktu Eksekusi :
flann asli berasal dari kemungkinan memilih antara berbagai algoritma Ann. Biaya fleksibilitas ini adalah deklarasi metode virtual murni yang (dalam beberapa keadaan) menjatuhkan hukuman run-time. Dalam nanoflann semua metode virtual tersebut telah digantikan dengan kombinasi dari pola template yang berulang (CRTP) dan metode inline, yang jauh lebih cepat.radiusSearch() , tidak perlu melakukan panggilan untuk menentukan jumlah poin dalam radius dan kemudian memanggilnya lagi untuk mendapatkan data. Dengan menggunakan wadah STL untuk data output, wadah secara otomatis diubah ukurannya.nanoflann memungkinkan pengguna untuk menyediakan kotak pembatas data yang dihapuskan, jika tersedia, untuk menghindari komputasi.int ke size_t , yang menghilangkan batas saat menangani set data yang sangat besar. Efisiensi Memori : Alih -alih membuat salinan seluruh dataset ke dalam matriks seperti flann khusus sebelum membangun indeks KD -Tree, nanoflann memungkinkan akses langsung ke data Anda melalui antarmuka adaptor yang harus diimplementasikan di kelas Anda.
Lihat contoh di bawah ini atau ke C ++ API dari Nanoflann :: Kdtreesingleindexadaptor <> untuk info lebih lanjut.
::knnSearch()num_closest ke query_point[0:dim-1] . Indeks mereka disimpan di dalam objek hasil. Lihat contoh kode penggunaan.::radiusSearch()query_point[0:dim-1] dalam radius maksimum. Output diberikan sebagai vektor pasangan, di mana elemen pertama adalah indeks titik dan yang kedua jarak yang sesuai. Lihat contoh kode penggunaan.::radiusSearchCustomCallback()Eigen::Matrix<> (matriks dan vektor vektor).R^N : Ruang Euclidean:L1 (Manhattan)L2 (norma Euclidean kuadrat , mendukung optimasi SSE2).L2_Simple (norma Euclidean kuadrat , untuk set data berdimensionalitas rendah seperti awan titik).SO(2) : kelompok rotasi 2Dmetric_SO2 : Perbedaan sudut absolut.SO(3) : Grup Rotasi 3D (support yang lebih baik disediakan dalam rilis mendatang)metric_SO3 : Produk Dalam antara Kuarter. Anda dapat langsung menjatuhkan file nanoflann.hpp di proyek Anda. Atau, metode standar CMake juga tersedia:
CMAKE_INSTALL_PREFIX ke jalur yang tepat dan kemudian jalankan make install (Linux, OSX) atau bangun target INSTALL (Visual Studio). # Find nanoflannConfig.cmake:
find_package (nanoflann)
add_executable (my_project test .cpp)
# Make sure the include path is used:
target_link_libraries (my_project nanoflann::nanoflann)conan Anda dapat memasang binari pra-built untuk nanoflann atau membangunnya dari sumber menggunakan Conan. Gunakan perintah berikut untuk menginstal versi terbaru:
$ conan install --requires= " nanoflann/[*] " --build=missingUntuk instruksi terperinci tentang cara menggunakan Conan, silakan merujuk ke dokumentasi Conan.
Resep nanoflann Conan selalu diperbarui oleh Conan Loaders dan kontributor masyarakat. Jika versi sudah ketinggalan zaman, silakan buat permintaan atau tarik permintaan di Repositori ConancenterIndex.
vcpkgAnda dapat mengunduh dan menginstal nanoflann menggunakan VCPKG Dependency Manager:
$ git clone https://github.com/Microsoft/vcpkg.git
$ cd vcpkg
$ ./bootstrap-vcpkg.sh
$ ./vcpkg integrate install
$ ./vcpkg install nanoflannPelabuhan Nanoflann di VCPKG terus diperbarui oleh anggota tim Microsoft dan kontributor komunitas. Jika versi sudah ketinggalan zaman, silakan buat masalah atau tarik permintaan pada repositori VCPKG.
NANOFLANN_FIRST_MATCH : Jika didefinisikan dan dua titik memiliki jarak yang sama, yang dengan indeks terendah akan dikembalikan terlebih dahulu. Kalau tidak, tidak ada urutan tertentu.NANOFLANN_NO_THREADS : Jika didefinisikan, kemampuan multithreading akan dinonaktifkan, sehingga perpustakaan dapat digunakan tanpa menghubungkan dengan pthreads. Jika seseorang mencoba menggunakan beberapa utas, pengecualian akan dilemparkan. KDTreeSingleIndexAdaptorParams::leaf_max_sizeSebuah pohon KD adalah ... yah, pohon :-). Dan karena itu memiliki simpul akar, satu set node perantara dan akhirnya, "daun" yang merupakan mereka yang tidak memiliki anak.
Poin (atau, dengan benar, indeks titik) hanya disimpan dalam node daun. Setiap daun berisi daftar poin mana yang termasuk dalam jangkauannya.
Saat membangun pohon, node dibagi secara rekursif sampai jumlah titik di dalamnya sama atau di bawah beberapa ambang batas. Itu adalah leaf_max_size . Saat melakukan kueri, "algoritma pohon" berakhir dengan memilih node daun, kemudian melakukan pencarian linier (satu per satu) untuk titik terdekat dengan kueri di dalam semua yang ada di daun.
Jadi, leaf_max_size harus ditetapkan sebagai tradeoff :
Angka apa yang harus dipilih benar -benar tergantung pada aplikasi dan bahkan pada ukuran memori cache prosesor, jadi idealnya Anda harus melakukan beberapa pembandingan untuk memaksimalkan efisiensi.
Tetapi untuk membantu memilih nilai yang baik sebagai aturan praktis, saya memberikan dua tolok ukur berikut. Setiap grafik mewakili waktu pembuatan pohon (horisontal) dan kueri (vertikal) untuk nilai leaf_max_size yang berbeda antara 1 dan 10k (sebagai elips ketidakpastian 95%, dideformasi karena skala logaritmik).
float koordinat):scan_071_points.dat dari Dataset Freiburg Campus 360, setiap titik memiliki (x, y, z) koordinat float ): Jadi, tampaknya leaf_max_size antara 10 dan 50 akan optimal dalam aplikasi di mana biaya kueri mendominasi (misalnya ICP). Saat ini, nilai defaultnya adalah 10.
KDTreeSingleIndexAdaptorParams::checks Parameter ini benar -benar diabaikan dalam nanoflann , tetapi disimpan untuk kompatibilitas ke belakang dengan antarmuka Flann asli. Abaikan saja.
KDTreeSingleIndexAdaptorParams::n_thread_build Parameter ini menentukan jumlah maksimum utas yang dapat disebut secara bersamaan selama pembangunan pohon KD. Nilai default adalah 1. Ketika parameter diatur ke 0, nanoflann secara otomatis menentukan jumlah utas yang akan digunakan.
Lihat permintaan tarik ini untuk beberapa pembandingan yang menunjukkan bahwa menggunakan jumlah maksimum utas tidak selalu merupakan pendekatan yang paling efisien. Lakukan pembandingan pada data Anda!
nanoflann : Penggunaan memori yang lebih cepat dan lebih sedikit Lihat "Mengapa garpu?" Bagian di atas untuk ide -ide optimisasi utama di balik nanoflann .
Perhatikan bahwa tidak ada optimasi SSE2/SSE3 yang eksplisit di nanoflann , tetapi penggunaan intensif inline dan templat dalam praktik berubah menjadi kode yang dioptimalkan secara otomatis SSE yang dihasilkan oleh kompiler.
flann vs nanoflannBagian yang paling memakan waktu dari banyak algoritma cloud titik (seperti ICP) adalah menanyakan pohon-KD untuk tetangga terdekat. Oleh karena itu, operasi ini adalah yang paling penting.
nanoflann menyediakan penghematan waktu ~ 50% sehubungan dengan implementasi flann asli (waktu dalam bagan ini berada dalam mikrodetik untuk setiap kueri):
Meskipun sebagian besar keuntungan berasal dari kueri (karena sejumlah besar dari mereka dalam operasi tipikal dengan awan titik), ada juga beberapa waktu yang dihemat saat membangun indeks pohon-kd, karena kode templatisasi tetapi juga untuk menghindari duplikasi data dalam matriks pembantu (waktu dalam bagan berikutnya adalah di milagondasi):
Tes kinerja ini hanya mewakili pengujian kami. Jika Anda ingin mengulanginya, baca instruksi dalam tes perf
Catatan: Logo proyek disebabkan oleh cedarseed
Kontributor