• Stars
    star
    440
  • Rank 99,036 (Top 2 %)
  • Language
    C++
  • License
    BSD 3-Clause "New...
  • Created about 14 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A fast K Nearest Neighbor library for low-dimensional spaces

libnabo is a fast K Nearest Neighbour library for low-dimensional spaces. It provides a clean, legacy-free, scalar-type–agnostic API thanks to C++ templates. Its current CPU implementation is strongly inspired by ANN, but with more compact data types. On the average, libnabo is 5% to 20% faster than ANN.

libnabo depends on Eigen, a modern C++ matrix and linear-algebra library. libnabo works with either version 2 or 3 of Eigen. libnabo also optionally depends on Boost, a C++ general library, for Python bindings.

libnabo was developed by Stéphane Magnenat as part of his work at ASL-ETH and is now maintained by Simon Lynen.

If you are interested in a pure-Rust version, check that repository out.

Download

Ubuntu builds are available on my PPA at: https://launchpad.net/~stephane.magnenat They provide a package with the shared library, another with the development headers and a third with the documentation.

The source code is available from github, you can clone the git tree by doing:

git clone git://github.com/ethz-asl/libnabo.git

Compilation

libnabo uses CMake as build system. The complete compilation process depends on the system you are using (Linux, Mac OS X or Windows). You will find a nice introductory tutorial in this video.

Prerequisites

If your operating system does not provide it, you must get Eigen, and Boost if you want to build the Python bindings. Eigen only needs to be downloaded and extracted.

Compilation options

libnabo provides the following compilation options, available through CMake:

  • SHARED_LIBS (boolean, default: false): if true, build a shared library, otherwise build a static library

You can specify them with a command-line tool, ccmake, or with a graphical tool, cmake-gui. Please read the CMake documentation for more information.

Quick compilation and installation under Unix

Under Unix, assuming that Eigen and Boost are installed system-wide, you can compile (with optimisation and debug information) and install libnabo in /usr/local with the following commands run in the top-level directory of libnabo's sources:

SRC_DIR=`pwd`
BUILD_DIR=${SRC_DIR}/build
mkdir -p ${BUILD_DIR} && cd ${BUILD_DIR}
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ${SRC_DIR}
# if Eigen or Boost are not available system-wide, run at that point:
#   cmake-gui .
# cmake-gui allows you to tell the location of Eigen or Boost
make
sudo make install

These lines will compile libnabo in a build sub-directory and therefore keep your source tree clean. Note that you could compile libnabo anywhere you have write access, such as in /tmp/libnabo. This out-of-source build is a nice feature of CMake. If Eigen or Boost are not installed system-wide, you might have to tell CMake where to find them (using ccmake or cmake-gui).

You can generate the documentation by typing:

make doc

Usage

libnabo is easy to use. For example, assuming that you are working with floats and that you have a point set M and a query point q, you can find the K nearest neighbours of q in M:

#include "nabo/nabo.h"
using namespace Nabo;
using namespace Eigen;
...
NNSearchF* nns = NNSearchF::createKDTreeLinearHeap(M);

const int K = 5;
VectorXi indices(K);
VectorXf dists2(K);

nns->knn(q, indices, dists2, K);

In this example, M is an Eigen (refering to the software, not to the math) matrix (column major, float) and q is an Eigen vector (float). Note that M must stay alive throughout the use of libnabo, otherwise the results of knn are undefined. The results indices and dists2 are Eigen vectors of indices and squared distances refering to the columns of M. See examples/trivial.cpp for a compilable version of this example, and examples/usage.cpp for a slightly more complex example involving multi-point queries.

Running make doc in your build directory will generate a browsable documentation in doc/html. The main page doc/html/index.html contains a detailed overview of the usage of libnabo.

You can find a complete CMake integration example in examples/libnabo-cmake-example to see how to look for, and link against this library.

Python bindings

libnabo includes python bindings that are compiled if Python is available. The resulting module is called pynabo, you can see an example in python/test.py. You can find more information in the docstring-based documentation:

python -c "import pynabo; help(pynabo.NearestNeighbourSearch)"

Building

The Python bindings can be generated for Python 2 or Python 3. To specify the version of the interpreter to use when building the bindings, set the PYTHON_VERSION_MAJOR and PYTHON_VERSION_MINOR variables. For example if you have both Python 2.7 and 3.5 installed, you could ask CMake to generate Python 3 bindings by using the following command.

cmake -DPYTHON_VERSION_MAJOR=3 -DPYTHON_VERSION_MINOR=5 ..

On Debian-based distributions you may also need the -DPYTHON_DEB_INSTALL_TARGET option enabled.

Unit testing

The distribution of libnabo integrates a unit test module, based on CTest. Just type:

make test

...in the build directory to run the tests. Their outputs are available in the Testing directory. These consist of validation and benchmarking tests. If ANN or FLANN are detected when compiling libnabo, make test will also perform comparative benchmarks.

Citing libnabo

If you use libnabo in the academic context, please cite this paper that evaluates its performances in the contex of ICP:

@article{elsebergcomparison,
	title={Comparison of nearest-neighbor-search strategies and implementations for efficient shape registration},
	author={Elseberg, J. and Magnenat, S. and Siegwart, R. and N{\"u}chter, A.},
	journal={Journal of Software Engineering for Robotics (JOSER)},
	pages={2--12},
	volume={3},
	number={1},
	year={2012},
	issn={2035-3928}
}

Bug reporting

Please use github's issue tracker to report bugs.

License

libnabo is released under a permissive BSD license.

More Repositories

1

libpointmatcher

An Iterative Closest Point (ICP) library for 2D and 3D mapping in Robotics
C++
1,611
star
2

PercepTreeV1

Implementation of Grondin et al. 2022 "Tree Detection and Diameter Estimation Based on Deep Learning". Also includes datasets and some of the pretrained models.
Python
85
star
3

cheatsheet_LieAlgebra

cheatsheet of all the basics notions of Lie algebra
TeX
70
star
4

norlab_icp_mapper

A 2-D/3-D mapping library relying on the "Iterative Closest Point" algorithm
C++
55
star
5

awesome-canadian-robotics

A curated list of Canadian robotics open-source software, companies and researchers.
42
star
6

logpiles_segmentation

Code repository for paper Instance Segmentation for Autonomous Log Grasping in Forestry Operations
Python
36
star
7

RTS_project

Code and Python library to process Robotic Total Stations data
Jupyter Notebook
34
star
8

norlab_icp_mapper_ros

A bridge between norlab_icp_mapper and ROS
C++
19
star
9

ros2_tcp_tunnel

Nodes that allow reliable TCP relay of ROS 2 topics between remote machines.
C++
19
star
10

wiln

A lidar-based Teach-and-Repeat framework designed to enable outdoor autonomous navigation in harsh weather.
Jupyter Notebook
19
star
11

mask_bev

Source code for "MaskBEV: Joint Object Detection and Footprint Completion for Bird's-eye View 3D Point Clouds"
Python
15
star
12

Norlab_wiki

TeX
13
star
13

husky-trainer

A set of nodes that can do teach and repeat on a Clearpath Husky A200, under ROS.
C++
12
star
14

norlab_xsens_driver

Driver for xsens IMUs compatible with ROS 2
Python
10
star
15

BorealHDR

Python
8
star
16

percep3d_lessons

Jupyter Notebook
6
star
17

camera_white_balance

Python
6
star
18

RTS_ROS_node_Trimble

Node Ros which can directly read data of theodolite and send them to robot
C++
6
star
19

BorealTC

BorealTC: Deep Learning for Proprioceptive-Based Terrain Classification in a Boreal Setting
Python
6
star
20

norlab_imu_tools

Set of tools for imu data processing and publishing
Python
5
star
21

Liblie

Small library containing basic functions for lie algebra (SO(3) and SE(3)) matrix manipulation
Python
5
star
22

libpointmatcher_ros

A bridge between libpointmatcher and ROS
C++
5
star
23

SNOW-sim_internship_H22

Project goal: Have access to a simulator for doing research on mobile robotic control algorithms subject to adversarial conditions.
Shell
4
star
24

norlab_trajectory

Trajectory interpolation using Gaussian processes
C++
4
star
25

pointcloud_motion_deskew

Tools for removing motion skew from rotating pointclouds.
C++
4
star
26

latexGoodPractices

A list of Latex packages used to standardize good practices in the Northern Robotics Lab
TeX
4
star
27

DRIVE

A UGV characterization node that automates training dataset gathering, covering the entire spectrum of commands uniformly.
Python
4
star
28

norlab_controllers_ros

ROS wrapper for the norlab_controllers library
Python
3
star
29

Lambda_mapper

Occupancy grid framework using the theory of the Lambda-Fields.
C++
3
star
30

norlab_controllers

A python library for norlab controllers
Python
2
star
31

percep3d_students

Jupyter Notebook
2
star
32

warthog_mapping

A package containing launch files and config files to do mapping with the Warthog
Python
2
star
33

norlab_scripts

Python
2
star
34

imu_odom

A node that estimates IMU poses based on ICP poses and accelerometer measurements
C++
2
star
35

odom_to_pose_converter

A node for converting nav_msgs/Odometry messages to geometry_msgs/PoseStamped messages
CMake
2
star
36

ros2_icm20948

Driver for the ICM-20948 IMU
Python
2
star
37

rosbag_extractor

A set of scripts to convert rosbags into human-readable data
Python
2
star
38

libpointmatcher-server

Main repo for the 2024 GLO-3002 class
Vue
2
star
39

theodolite_node_msgs

Message definition for the theodolite_node package
CMake
1
star
40

ros_lidar_visibility

Ros package used to compute lidar visibility.
C++
1
star
41

dockerized-ROS4percept3D

Shell
1
star
42

dockerized-norlab

Containerized development workflow for NorLab perception or control projects leveraging docker and nvidia-docker technology.
Shell
1
star
43

norlab_dense_mapper

C++
1
star
44

publication_FR2021_DominicBaril

Field Report for the SNOW project Lidar Teach and Repeat in a subarctic forest.
TeX
1
star
45

norlab_dense_mapper_ros

C++
1
star
46

NorLab_MPPI

Jupyter Notebook
1
star
47

global_map_builder

CMake
1
star
48

norlab_scan_assembler

node that subscribes to two point cloud topics, assembles them and publishes the result in a new topic.
C++
1
star
49

marmotte_mapping

CMake
1
star
50

test_penalized_icp

Python scripts for the penalized icp project. The goal is to add constaint from other sensors (IMU, GPS, etc.) which affect the ICP minimization.
Python
1
star
51

iasdk_navtech_radar

SDK needed for the radar to be functional
C++
1
star
52

saturated_gryo_speed_estimation

ROS package to estimate body angular velocities under saturated gyroscope measurements.
C++
1
star
53

foxglove-user-scripts

User Scripts that can be used in FoxGlove to convert or merge topics together
TypeScript
1
star