Repository files navigation

SiMpLE Minimal Configuration LiDAR odometry

Simple Mapping and Localisation Estimation (SiMpLE) is a low-drift and low-configuration LiDAR odometry method providing accurate localization and mapping with a variety of sensors.

Demo_SiMpLE_compressed.mp4

The original paper code is available as a release here.

We perform among state-of-the-art LiDAR odometry methods with a simple and use case agnostic algorithm. The method is derived from using raw point clouds. We do not modify or develop a new variant of any existing algorithm. The code is written for readability and easy understanding with the methodology described in the paper. The software can be optimised for increased performance. Find our paper here.

We have tested the algorithm using LiDARs with various point cloud densities, fields of view, and scan patterns,

  • Velodyne HDL-64 KITTI dataset
  • OS1-64 from the MulRan dataset
  • Velodyne VLP-16 using a self-created dataset
  • Livox Horizon using a self-created dataset

The motivation stems from reducing the complexity and configuration burden of localisation algorithms.

The code is portable, easy to understand, and modify.

The following includes:

  1. A summary of the LiDAR odometry method.
  2. The hardware requirements and dependencies installation.
  3. Installation of the SiMpLE repository.
  4. An example of using SiMpLE.
  5. Sample results interpretation.
  6. The effect of threading on real-time performance.
  7. Results on different operating systems and processors.
  8. Extensive Parameter List
  9. Other datasets.
  10. References.

Method

The method has five configuration parameters.

  1. rNew is the new point cloud spatial subsampling radius.
  2. rMap is the spatial subsampling radius for the local map.
  3. σ is the standard deviation of the Gaussian reward function - see the paper for more details.
  4. ϵ is the convergence tolerance of the optimisation solver.
  5. rMin is optional and for computational benefit only. The default value is zero where it has no effect. Increasing this value eliminates the rings commonly formed around the sensor to reduce the size of the point cloud without losing geometric information.

There are also hardware settings:

  • rMax is the maximum radius of the point cloud. This is hardware-dependent and not a configuration parameter.

Using Docker

For easy reproducibility, a docker image has been provided. To use it, clone this repository and inside the repository directory run the following command to build the docker image:

docker build -t simple .

Inside another directory, acquire a dataset (this example will use the MulRan dataset) and create a configuration file called config.yaml containing the following (other dataset examples can be seen in the configs directory):

---
scanPath: ./dataset/MulRan/DCC_02/velodyne/
outputFileName: ./dataset/result
kitti: false
# Algorithm configuration.
sigma: 0.35
rMap: 2
rNew: 0.5
convergenceTol: 1e-3
minSensorRange: 10
# Hardware configuration.
maxSensorRange: 120

Then you can run the following command to execute simple:

docker run --volume ./:/dataset simple /dataset/config.yaml

The result output should be located in the same directory you ran this command from.

Building from source

Hardware and Dependencies

This implementation has been tested on Ubuntu 20.04.5/6 LTS (Focal Fossa) and Ubuntu 22.04.3 (Jammy Jellyfish) with an Intel Core i7-10700K CPU @ 3.80GHz x 16 and 62.5 GiB memory. SiMpLE uses a few open-source libraries for reading the algorithm configuration file, Kd-Trees, matrix operations, optimization functions, and CPU threading. The installation instructions are detailed below.

  • Git is required to download the open-source libraries.
sudo apt install git
  • Require a g++ compiler.
sudo apt install g++
  • CMake is required to compile the libraries and the repository.
sudo apt install cmake
  • Install the Eigen library for math operations [1].
sudo apt install libeigen3-dev
  • Install Intel's Thread Building Blocks (TBB) library for CPU threading.
sudo apt install libtbb-dev

If the SiMpLE repository build in the following section returns an error that it cannot find TBB for CMake, the following installation may help.

git clone https://github.com/oneapi-src/oneTBB
cd oneTBB
mkdir build &&cd build
cmake ..
sudo make install
  • Clone and install the nanoflann library for KD-tree operations [2].
git clone https://github.com/jlblancoc/nanoflann.git
cd nanoflann
mkdir build &&cd build
cmake ..
sudo make install
  • Install the Dlib library for the optimization solver [3, 4].
wget http://dlib.net/files/dlib-19.24.tar.bz2
tar xvf dlib-19.24.tar.bz2
cd dlib-19.24/
mkdir build &&cd build
cmake ..
sudo make install
  • Install the yaml-cpp library for reading the configuration file [5].
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build &&cd build
cmake ..
sudo make install

Alternative options for any of the libraries can be used if desired. The code is easy to change.

Installation

Clone the repository.

git clone https://github.com/vb44/SiMpLE.git

Create a build folder in the repository.

cd SiMpLE/simple
mkdir build &&cd build

Run CMake.

cmake ../

Make the executable.

make

Example

The code only works with .bin files in the KITTI format. However, the code is very easy to modify to suit the desired inputs and outputs. When compiled, the SiMpLE algorithm is run using a .yaml algorithm configuration file as shown below.

./simple config.yaml

Sample config files are included in the config folder. An example is shown below.
Note that the --kitti argument is required to correct the scans for the KITTI dataset.

---
# Test setup.scanPath: /path_to_scans/velodyne/outputFileName: /path_to_output_files/fileNamekitti: true# Algorithm configuration.sigma: 0.3rMap: 0.5rNew: 0.3convergenceTol: 1e-6minSensorRange: 0# Hardware configuration.maxSensorRange: 120

Sample Results and Evaluation

Sample results from the paper are available in the sampleResults folder for all reported datasets.
The estimated trajectories can be evaluated in the devkit folder, which is a reduced version of the devkit provided by KITTI.

It is important to note that the KITTI estimates must be transformed to the ground truth frame using the sensor registration before evaluating the results. An example is provided in the sampleResults folder.

Results on Different Operating Systems and Processors

The implementation allows for deterministic results for a varying number of threads on a given platform. However, slight variations were observed when executing the algorithm on different machines. Upon investigation, this was found to be caused by the Dlib optimisation library having slight numerical precision differences when searching for the best pose hypothesis. Due to the nature of recursive pose estimation, the differences propagate and result in slight variations in the output trajectory.

Example results from the KITTI dataset executed on different operating systems and processors are displayed below.

  • Ubuntu 20.04.5: Desktop with Intel Core i7 (10th gen, 16 cores).
  • Ubuntu 20.04.6: Laptop with Intel Core i7 (8 cores).
  • Ubuntu 22.04.3: Desktop virtual machine with Intel Core i7 (10th gen, 10 cores).
  • Windows 11: Desktop with Intel Pentium (8 cores).
  • macOS Sonoma 14.2.1: MacBook Air with M1 core.

The slight differences in the KITTI results on different machines are shown below.

SequenceUbuntu 20.04.5Ubuntu 20.04.6Ubuntu 22.04.3Windows 11macOS 14.2.1
000.66670.65850.65990.65700.6606
010.77490.77500.76820.77860.7740
020.62630.64520.62900.62980.6208
030.73690.73780.74500.75070.7443
040.40670.40630.40430.40560.4052
050.33720.32980.33280.32130.3362
060.26130.26070.26210.25950.2599
070.47060.47680.44880.46220.4475
080.82360.82380.82150.82330.8290
090.56840.54200.55880.54760.5656
100.64540.63180.66220.63210.6186
Average0.57440.57160.57200.56980.5693

Extensive Parameter List

The five parameters listed at the beginning of the page, namely, rNew, rMap, σ, ϵ, and rMin, are the algorithm configuration parameters. The use of opensource libraries such as nanoflann and Dlib introduce additional parameters into the implementation. We use the default parameters often hardcoded in the libraries and do not change them. Hence, these parameters are not included in the algorithm configuration list. SiMpLE has been extensively tested on numerous benchmark datasets in different environments and LiDARs with different characteristics, and we have not needed to change any default parameters. For complete transparency, an extensive list of all identifiable parameters and their source is displayed below.

Algorithm Configuration Parameters

ParameterSourceUse
rNewAlgorithm configuration.New scan subsampling.
rMapAlgorithm configuration.Local map subsampling.
σAlgorithm configuration.Reward standard deviation.
ϵAlgorithm configuration.Optimisation exit condition.
rMinAlgorithm configuration.Minimum sensor range used for reducing point cloud size.

Hardware Parameters

ParameterSourceUse
rMaxHardware specification.Maintaining local map size.

Default Unchanged Parameters

Other unchanged, default parameters that are introduced by opensource libraries as they appear in the code. These parameters have not been changed for all experiments,

ParameterSourceValueUse
leafSizeKdTree library (nanoflann)10Used to construct the KD-tree. Default recommended value used.
derivativeEpsDlib (API call to find ‘min using approximate derivatives’)1e-7Derivative step. Unchanged from the library.
wolfeRhoDlib (API call to ‘bfgs search strategy’)0.01Set as a const parameter in the library (Nocedal and Wright (1999)).
wolfeSigmaDlib (API call to ‘bfgs search strategy’)0.9Set as a const parameter in the library (Nocedal and Wright (1999)).
Line search, maxIterationsDlib (API call to ‘bfgs search strategy’)100Set as a const parameter in the library.

Updates

  • 21/04/2025: Refactor project to improve style and timeliness. Improving for future integration.
  • 05/04/2024: Refactor project for better readability and execution time improvement.

References

[1] eigen library
[2] nanoflann library
[3] Dlib library
[4] Dlib C++ install for CMake
[5] yaml-cpp library

About

A simple LiDAR odometry method reducing the complexity and configuration burden of localization algorithms.

Resources

Stars

117 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

SiMpLE Minimal Configuration LiDAR odometry

Simple Mapping and Localisation Estimation (SiMpLE) is a low-drift and low-configuration LiDAR odometry method providing accurate localization and mapping with a variety of sensors.

Demo_SiMpLE_compressed.mp4

The original paper code is available as a release here.

We perform among state-of-the-art LiDAR odometry methods with a simple and use case agnostic algorithm. The method is derived from using raw point clouds. We do not modify or develop a new variant of any existing algorithm. The code is written for readability and easy understanding with the methodology described in the paper. The software can be optimised for increased performance. Find our paper here.

We have tested the algorithm using LiDARs with various point cloud densities, fields of view, and scan patterns,

  • Velodyne HDL-64 KITTI dataset
  • OS1-64 from the MulRan dataset
  • Velodyne VLP-16 using a self-created dataset
  • Livox Horizon using a self-created dataset

The motivation stems from reducing the complexity and configuration burden of localisation algorithms.

The code is portable, easy to understand, and modify.

The following includes:

  1. A summary of the LiDAR odometry method.
  2. The hardware requirements and dependencies installation.
  3. Installation of the SiMpLE repository.
  4. An example of using SiMpLE.
  5. Sample results interpretation.
  6. The effect of threading on real-time performance.
  7. Results on different operating systems and processors.
  8. Extensive Parameter List
  9. Other datasets.
  10. References.

Method

The method has five configuration parameters.

  1. rNew is the new point cloud spatial subsampling radius.
  2. rMap is the spatial subsampling radius for the local map.
  3. σ is the standard deviation of the Gaussian reward function - see the paper for more details.
  4. ϵ is the convergence tolerance of the optimisation solver.
  5. rMin is optional and for computational benefit only. The default value is zero where it has no effect. Increasing this value eliminates the rings commonly formed around the sensor to reduce the size of the point cloud without losing geometric information.

There are also hardware settings:

  • rMax is the maximum radius of the point cloud. This is hardware-dependent and not a configuration parameter.

Using Docker

For easy reproducibility, a docker image has been provided. To use it, clone this repository and inside the repository directory run the following command to build the docker image:

docker build -t simple .

Inside another directory, acquire a dataset (this example will use the MulRan dataset) and create a configuration file called config.yaml containing the following (other dataset examples can be seen in the configs directory):

---
scanPath: ./dataset/MulRan/DCC_02/velodyne/
outputFileName: ./dataset/result
kitti: false
# Algorithm configuration.
sigma: 0.35
rMap: 2
rNew: 0.5
convergenceTol: 1e-3
minSensorRange: 10
# Hardware configuration.
maxSensorRange: 120

Then you can run the following command to execute simple:

docker run --volume ./:/dataset simple /dataset/config.yaml

The result output should be located in the same directory you ran this command from.

Building from source

Hardware and Dependencies

This implementation has been tested on Ubuntu 20.04.5/6 LTS (Focal Fossa) and Ubuntu 22.04.3 (Jammy Jellyfish) with an Intel Core i7-10700K CPU @ 3.80GHz x 16 and 62.5 GiB memory. SiMpLE uses a few open-source libraries for reading the algorithm configuration file, Kd-Trees, matrix operations, optimization functions, and CPU threading. The installation instructions are detailed below.

  • Git is required to download the open-source libraries.
sudo apt install git
  • Require a g++ compiler.
sudo apt install g++
  • CMake is required to compile the libraries and the repository.
sudo apt install cmake
  • Install the Eigen library for math operations [1].
sudo apt install libeigen3-dev
  • Install Intel's Thread Building Blocks (TBB) library for CPU threading.
sudo apt install libtbb-dev

If the SiMpLE repository build in the following section returns an error that it cannot find TBB for CMake, the following installation may help.

git clone https://github.com/oneapi-src/oneTBB
cd oneTBB
mkdir build &&cd build
cmake ..
sudo make install
  • Clone and install the nanoflann library for KD-tree operations [2].
git clone https://github.com/jlblancoc/nanoflann.git
cd nanoflann
mkdir build &&cd build
cmake ..
sudo make install
  • Install the Dlib library for the optimization solver [3, 4].
wget http://dlib.net/files/dlib-19.24.tar.bz2
tar xvf dlib-19.24.tar.bz2
cd dlib-19.24/
mkdir build &&cd build
cmake ..
sudo make install
  • Install the yaml-cpp library for reading the configuration file [5].
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build &&cd build
cmake ..
sudo make install

Alternative options for any of the libraries can be used if desired. The code is easy to change.

Installation

Clone the repository.

git clone https://github.com/vb44/SiMpLE.git

Create a build folder in the repository.

cd SiMpLE/simple
mkdir build &&cd build

Run CMake.

cmake ../

Make the executable.

make

Example

The code only works with .bin files in the KITTI format. However, the code is very easy to modify to suit the desired inputs and outputs. When compiled, the SiMpLE algorithm is run using a .yaml algorithm configuration file as shown below.

./simple config.yaml

Sample config files are included in the config folder. An example is shown below.
Note that the --kitti argument is required to correct the scans for the KITTI dataset.

---
# Test setup.scanPath: /path_to_scans/velodyne/outputFileName: /path_to_output_files/fileNamekitti: true# Algorithm configuration.sigma: 0.3rMap: 0.5rNew: 0.3convergenceTol: 1e-6minSensorRange: 0# Hardware configuration.maxSensorRange: 120

Sample Results and Evaluation

Sample results from the paper are available in the sampleResults folder for all reported datasets.
The estimated trajectories can be evaluated in the devkit folder, which is a reduced version of the devkit provided by KITTI.

It is important to note that the KITTI estimates must be transformed to the ground truth frame using the sensor registration before evaluating the results. An example is provided in the sampleResults folder.

Results on Different Operating Systems and Processors

The implementation allows for deterministic results for a varying number of threads on a given platform. However, slight variations were observed when executing the algorithm on different machines. Upon investigation, this was found to be caused by the Dlib optimisation library having slight numerical precision differences when searching for the best pose hypothesis. Due to the nature of recursive pose estimation, the differences propagate and result in slight variations in the output trajectory.

Example results from the KITTI dataset executed on different operating systems and processors are displayed below.

  • Ubuntu 20.04.5: Desktop with Intel Core i7 (10th gen, 16 cores).
  • Ubuntu 20.04.6: Laptop with Intel Core i7 (8 cores).
  • Ubuntu 22.04.3: Desktop virtual machine with Intel Core i7 (10th gen, 10 cores).
  • Windows 11: Desktop with Intel Pentium (8 cores).
  • macOS Sonoma 14.2.1: MacBook Air with M1 core.

The slight differences in the KITTI results on different machines are shown below.

SequenceUbuntu 20.04.5Ubuntu 20.04.6Ubuntu 22.04.3Windows 11macOS 14.2.1
000.66670.65850.65990.65700.6606
010.77490.77500.76820.77860.7740
020.62630.64520.62900.62980.6208
030.73690.73780.74500.75070.7443
040.40670.40630.40430.40560.4052
050.33720.32980.33280.32130.3362
060.26130.26070.26210.25950.2599
070.47060.47680.44880.46220.4475
080.82360.82380.82150.82330.8290
090.56840.54200.55880.54760.5656
100.64540.63180.66220.63210.6186
Average0.57440.57160.57200.56980.5693

Extensive Parameter List

The five parameters listed at the beginning of the page, namely, rNew, rMap, σ, ϵ, and rMin, are the algorithm configuration parameters. The use of opensource libraries such as nanoflann and Dlib introduce additional parameters into the implementation. We use the default parameters often hardcoded in the libraries and do not change them. Hence, these parameters are not included in the algorithm configuration list. SiMpLE has been extensively tested on numerous benchmark datasets in different environments and LiDARs with different characteristics, and we have not needed to change any default parameters. For complete transparency, an extensive list of all identifiable parameters and their source is displayed below.

Algorithm Configuration Parameters

ParameterSourceUse
rNewAlgorithm configuration.New scan subsampling.
rMapAlgorithm configuration.Local map subsampling.
σAlgorithm configuration.Reward standard deviation.
ϵAlgorithm configuration.Optimisation exit condition.
rMinAlgorithm configuration.Minimum sensor range used for reducing point cloud size.

Hardware Parameters

ParameterSourceUse
rMaxHardware specification.Maintaining local map size.

Default Unchanged Parameters

Other unchanged, default parameters that are introduced by opensource libraries as they appear in the code. These parameters have not been changed for all experiments,

ParameterSourceValueUse
leafSizeKdTree library (nanoflann)10Used to construct the KD-tree. Default recommended value used.
derivativeEpsDlib (API call to find ‘min using approximate derivatives’)1e-7Derivative step. Unchanged from the library.
wolfeRhoDlib (API call to ‘bfgs search strategy’)0.01Set as a const parameter in the library (Nocedal and Wright (1999)).
wolfeSigmaDlib (API call to ‘bfgs search strategy’)0.9Set as a const parameter in the library (Nocedal and Wright (1999)).
Line search, maxIterationsDlib (API call to ‘bfgs search strategy’)100Set as a const parameter in the library.

Updates

  • 21/04/2025: Refactor project to improve style and timeliness. Improving for future integration.
  • 05/04/2024: Refactor project for better readability and execution time improvement.

References

[1] eigen library
[2] nanoflann library
[3] Dlib library
[4] Dlib C++ install for CMake
[5] yaml-cpp library

About

A simple LiDAR odometry method reducing the complexity and configuration burden of localization algorithms.

Resources

Stars

117 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SiMpLE Minimal Configuration LiDAR odometry

Simple Mapping and Localisation Estimation (SiMpLE) is a low-drift and low-configuration LiDAR odometry method providing accurate localization and mapping with a variety of sensors.

Demo_SiMpLE_compressed.mp4

The original paper code is available as a release here.

We perform among state-of-the-art LiDAR odometry methods with a simple and use case agnostic algorithm. The method is derived from using raw point clouds. We do not modify or develop a new variant of any existing algorithm. The code is written for readability and easy understanding with the methodology described in the paper. The software can be optimised for increased performance. Find our paper here.

We have tested the algorithm using LiDARs with various point cloud densities, fields of view, and scan patterns,

  • Velodyne HDL-64 KITTI dataset
  • OS1-64 from the MulRan dataset
  • Velodyne VLP-16 using a self-created dataset
  • Livox Horizon using a self-created dataset

The motivation stems from reducing the complexity and configuration burden of localisation algorithms.

The code is portable, easy to understand, and modify.

The following includes:

  1. A summary of the LiDAR odometry method.
  2. The hardware requirements and dependencies installation.
  3. Installation of the SiMpLE repository.
  4. An example of using SiMpLE.
  5. Sample results interpretation.
  6. The effect of threading on real-time performance.
  7. Results on different operating systems and processors.
  8. Extensive Parameter List
  9. Other datasets.
  10. References.

Method

The method has five configuration parameters.

  1. rNew is the new point cloud spatial subsampling radius.
  2. rMap is the spatial subsampling radius for the local map.
  3. σ is the standard deviation of the Gaussian reward function - see the paper for more details.
  4. ϵ is the convergence tolerance of the optimisation solver.
  5. rMin is optional and for computational benefit only. The default value is zero where it has no effect. Increasing this value eliminates the rings commonly formed around the sensor to reduce the size of the point cloud without losing geometric information.

There are also hardware settings:

  • rMax is the maximum radius of the point cloud. This is hardware-dependent and not a configuration parameter.

Using Docker

For easy reproducibility, a docker image has been provided. To use it, clone this repository and inside the repository directory run the following command to build the docker image:

docker build -t simple .

Inside another directory, acquire a dataset (this example will use the MulRan dataset) and create a configuration file called config.yaml containing the following (other dataset examples can be seen in the configs directory):

---
scanPath: ./dataset/MulRan/DCC_02/velodyne/
outputFileName: ./dataset/result
kitti: false
# Algorithm configuration.
sigma: 0.35
rMap: 2
rNew: 0.5
convergenceTol: 1e-3
minSensorRange: 10
# Hardware configuration.
maxSensorRange: 120

Then you can run the following command to execute simple:

docker run --volume ./:/dataset simple /dataset/config.yaml

The result output should be located in the same directory you ran this command from.

Building from source

Hardware and Dependencies

This implementation has been tested on Ubuntu 20.04.5/6 LTS (Focal Fossa) and Ubuntu 22.04.3 (Jammy Jellyfish) with an Intel Core i7-10700K CPU @ 3.80GHz x 16 and 62.5 GiB memory. SiMpLE uses a few open-source libraries for reading the algorithm configuration file, Kd-Trees, matrix operations, optimization functions, and CPU threading. The installation instructions are detailed below.

  • Git is required to download the open-source libraries.
sudo apt install git
  • Require a g++ compiler.
sudo apt install g++
  • CMake is required to compile the libraries and the repository.
sudo apt install cmake
  • Install the Eigen library for math operations [1].
sudo apt install libeigen3-dev
  • Install Intel's Thread Building Blocks (TBB) library for CPU threading.
sudo apt install libtbb-dev

If the SiMpLE repository build in the following section returns an error that it cannot find TBB for CMake, the following installation may help.

git clone https://github.com/oneapi-src/oneTBB
cd oneTBB
mkdir build &&cd build
cmake ..
sudo make install
  • Clone and install the nanoflann library for KD-tree operations [2].
git clone https://github.com/jlblancoc/nanoflann.git
cd nanoflann
mkdir build &&cd build
cmake ..
sudo make install
  • Install the Dlib library for the optimization solver [3, 4].
wget http://dlib.net/files/dlib-19.24.tar.bz2
tar xvf dlib-19.24.tar.bz2
cd dlib-19.24/
mkdir build &&cd build
cmake ..
sudo make install
  • Install the yaml-cpp library for reading the configuration file [5].
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build &&cd build
cmake ..
sudo make install

Alternative options for any of the libraries can be used if desired. The code is easy to change.

Installation

Clone the repository.

git clone https://github.com/vb44/SiMpLE.git

Create a build folder in the repository.

cd SiMpLE/simple
mkdir build &&cd build

Run CMake.

cmake ../

Make the executable.

make

Example

The code only works with .bin files in the KITTI format. However, the code is very easy to modify to suit the desired inputs and outputs. When compiled, the SiMpLE algorithm is run using a .yaml algorithm configuration file as shown below.

./simple config.yaml

Sample config files are included in the config folder. An example is shown below.
Note that the --kitti argument is required to correct the scans for the KITTI dataset.

---
# Test setup.scanPath: /path_to_scans/velodyne/outputFileName: /path_to_output_files/fileNamekitti: true# Algorithm configuration.sigma: 0.3rMap: 0.5rNew: 0.3convergenceTol: 1e-6minSensorRange: 0# Hardware configuration.maxSensorRange: 120

Sample Results and Evaluation

Sample results from the paper are available in the sampleResults folder for all reported datasets.
The estimated trajectories can be evaluated in the devkit folder, which is a reduced version of the devkit provided by KITTI.

It is important to note that the KITTI estimates must be transformed to the ground truth frame using the sensor registration before evaluating the results. An example is provided in the sampleResults folder.

Results on Different Operating Systems and Processors

The implementation allows for deterministic results for a varying number of threads on a given platform. However, slight variations were observed when executing the algorithm on different machines. Upon investigation, this was found to be caused by the Dlib optimisation library having slight numerical precision differences when searching for the best pose hypothesis. Due to the nature of recursive pose estimation, the differences propagate and result in slight variations in the output trajectory.

Example results from the KITTI dataset executed on different operating systems and processors are displayed below.

  • Ubuntu 20.04.5: Desktop with Intel Core i7 (10th gen, 16 cores).
  • Ubuntu 20.04.6: Laptop with Intel Core i7 (8 cores).
  • Ubuntu 22.04.3: Desktop virtual machine with Intel Core i7 (10th gen, 10 cores).
  • Windows 11: Desktop with Intel Pentium (8 cores).
  • macOS Sonoma 14.2.1: MacBook Air with M1 core.

The slight differences in the KITTI results on different machines are shown below.

SequenceUbuntu 20.04.5Ubuntu 20.04.6Ubuntu 22.04.3Windows 11macOS 14.2.1
000.66670.65850.65990.65700.6606
010.77490.77500.76820.77860.7740
020.62630.64520.62900.62980.6208
030.73690.73780.74500.75070.7443
040.40670.40630.40430.40560.4052
050.33720.32980.33280.32130.3362
060.26130.26070.26210.25950.2599
070.47060.47680.44880.46220.4475
080.82360.82380.82150.82330.8290
090.56840.54200.55880.54760.5656
100.64540.63180.66220.63210.6186
Average0.57440.57160.57200.56980.5693

Extensive Parameter List

The five parameters listed at the beginning of the page, namely, rNew, rMap, σ, ϵ, and rMin, are the algorithm configuration parameters. The use of opensource libraries such as nanoflann and Dlib introduce additional parameters into the implementation. We use the default parameters often hardcoded in the libraries and do not change them. Hence, these parameters are not included in the algorithm configuration list. SiMpLE has been extensively tested on numerous benchmark datasets in different environments and LiDARs with different characteristics, and we have not needed to change any default parameters. For complete transparency, an extensive list of all identifiable parameters and their source is displayed below.

Algorithm Configuration Parameters

ParameterSourceUse
rNewAlgorithm configuration.New scan subsampling.
rMapAlgorithm configuration.Local map subsampling.
σAlgorithm configuration.Reward standard deviation.
ϵAlgorithm configuration.Optimisation exit condition.
rMinAlgorithm configuration.Minimum sensor range used for reducing point cloud size.

Hardware Parameters

ParameterSourceUse
rMaxHardware specification.Maintaining local map size.

Default Unchanged Parameters

Other unchanged, default parameters that are introduced by opensource libraries as they appear in the code. These parameters have not been changed for all experiments,

ParameterSourceValueUse
leafSizeKdTree library (nanoflann)10Used to construct the KD-tree. Default recommended value used.
derivativeEpsDlib (API call to find ‘min using approximate derivatives’)1e-7Derivative step. Unchanged from the library.
wolfeRhoDlib (API call to ‘bfgs search strategy’)0.01Set as a const parameter in the library (Nocedal and Wright (1999)).
wolfeSigmaDlib (API call to ‘bfgs search strategy’)0.9Set as a const parameter in the library (Nocedal and Wright (1999)).
Line search, maxIterationsDlib (API call to ‘bfgs search strategy’)100Set as a const parameter in the library.

Updates

  • 21/04/2025: Refactor project to improve style and timeliness. Improving for future integration.
  • 05/04/2024: Refactor project for better readability and execution time improvement.

References

[1] eigen library
[2] nanoflann library
[3] Dlib library
[4] Dlib C++ install for CMake
[5] yaml-cpp library

About

A simple LiDAR odometry method reducing the complexity and configuration burden of localization algorithms.

Resources

Stars

117 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SiMpLE Minimal Configuration LiDAR odometry

Simple Mapping and Localisation Estimation (SiMpLE) is a low-drift and low-configuration LiDAR odometry method providing accurate localization and mapping with a variety of sensors.

Demo_SiMpLE_compressed.mp4

The original paper code is available as a release here.

We perform among state-of-the-art LiDAR odometry methods with a simple and use case agnostic algorithm. The method is derived from using raw point clouds. We do not modify or develop a new variant of any existing algorithm. The code is written for readability and easy understanding with the methodology described in the paper. The software can be optimised for increased performance. Find our paper here.

We have tested the algorithm using LiDARs with various point cloud densities, fields of view, and scan patterns,

  • Velodyne HDL-64 KITTI dataset
  • OS1-64 from the MulRan dataset
  • Velodyne VLP-16 using a self-created dataset
  • Livox Horizon using a self-created dataset

The motivation stems from reducing the complexity and configuration burden of localisation algorithms.

The code is portable, easy to understand, and modify.

The following includes:

  1. A summary of the LiDAR odometry method.
  2. The hardware requirements and dependencies installation.
  3. Installation of the SiMpLE repository.
  4. An example of using SiMpLE.
  5. Sample results interpretation.
  6. The effect of threading on real-time performance.
  7. Results on different operating systems and processors.
  8. Extensive Parameter List
  9. Other datasets.
  10. References.

Method

The method has five configuration parameters.

  1. rNew is the new point cloud spatial subsampling radius.
  2. rMap is the spatial subsampling radius for the local map.
  3. σ is the standard deviation of the Gaussian reward function - see the paper for more details.
  4. ϵ is the convergence tolerance of the optimisation solver.
  5. rMin is optional and for computational benefit only. The default value is zero where it has no effect. Increasing this value eliminates the rings commonly formed around the sensor to reduce the size of the point cloud without losing geometric information.

There are also hardware settings:

  • rMax is the maximum radius of the point cloud. This is hardware-dependent and not a configuration parameter.

Using Docker

For easy reproducibility, a docker image has been provided. To use it, clone this repository and inside the repository directory run the following command to build the docker image:

docker build -t simple .

Inside another directory, acquire a dataset (this example will use the MulRan dataset) and create a configuration file called config.yaml containing the following (other dataset examples can be seen in the configs directory):

---
scanPath: ./dataset/MulRan/DCC_02/velodyne/
outputFileName: ./dataset/result
kitti: false
# Algorithm configuration.
sigma: 0.35
rMap: 2
rNew: 0.5
convergenceTol: 1e-3
minSensorRange: 10
# Hardware configuration.
maxSensorRange: 120

Then you can run the following command to execute simple:

docker run --volume ./:/dataset simple /dataset/config.yaml

The result output should be located in the same directory you ran this command from.

Building from source

Hardware and Dependencies

This implementation has been tested on Ubuntu 20.04.5/6 LTS (Focal Fossa) and Ubuntu 22.04.3 (Jammy Jellyfish) with an Intel Core i7-10700K CPU @ 3.80GHz x 16 and 62.5 GiB memory. SiMpLE uses a few open-source libraries for reading the algorithm configuration file, Kd-Trees, matrix operations, optimization functions, and CPU threading. The installation instructions are detailed below.

  • Git is required to download the open-source libraries.
sudo apt install git
  • Require a g++ compiler.
sudo apt install g++
  • CMake is required to compile the libraries and the repository.
sudo apt install cmake
  • Install the Eigen library for math operations [1].
sudo apt install libeigen3-dev
  • Install Intel's Thread Building Blocks (TBB) library for CPU threading.
sudo apt install libtbb-dev

If the SiMpLE repository build in the following section returns an error that it cannot find TBB for CMake, the following installation may help.

git clone https://github.com/oneapi-src/oneTBB
cd oneTBB
mkdir build &&cd build
cmake ..
sudo make install
  • Clone and install the nanoflann library for KD-tree operations [2].
git clone https://github.com/jlblancoc/nanoflann.git
cd nanoflann
mkdir build &&cd build
cmake ..
sudo make install
  • Install the Dlib library for the optimization solver [3, 4].
wget http://dlib.net/files/dlib-19.24.tar.bz2
tar xvf dlib-19.24.tar.bz2
cd dlib-19.24/
mkdir build &&cd build
cmake ..
sudo make install
  • Install the yaml-cpp library for reading the configuration file [5].
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build &&cd build
cmake ..
sudo make install

Alternative options for any of the libraries can be used if desired. The code is easy to change.

Installation

Clone the repository.

git clone https://github.com/vb44/SiMpLE.git

Create a build folder in the repository.

cd SiMpLE/simple
mkdir build &&cd build

Run CMake.

cmake ../

Make the executable.

make

Example

The code only works with .bin files in the KITTI format. However, the code is very easy to modify to suit the desired inputs and outputs. When compiled, the SiMpLE algorithm is run using a .yaml algorithm configuration file as shown below.

./simple config.yaml

Sample config files are included in the config folder. An example is shown below.
Note that the --kitti argument is required to correct the scans for the KITTI dataset.

---
# Test setup.scanPath: /path_to_scans/velodyne/outputFileName: /path_to_output_files/fileNamekitti: true# Algorithm configuration.sigma: 0.3rMap: 0.5rNew: 0.3convergenceTol: 1e-6minSensorRange: 0# Hardware configuration.maxSensorRange: 120

Sample Results and Evaluation

Sample results from the paper are available in the sampleResults folder for all reported datasets.
The estimated trajectories can be evaluated in the devkit folder, which is a reduced version of the devkit provided by KITTI.

It is important to note that the KITTI estimates must be transformed to the ground truth frame using the sensor registration before evaluating the results. An example is provided in the sampleResults folder.

Results on Different Operating Systems and Processors

The implementation allows for deterministic results for a varying number of threads on a given platform. However, slight variations were observed when executing the algorithm on different machines. Upon investigation, this was found to be caused by the Dlib optimisation library having slight numerical precision differences when searching for the best pose hypothesis. Due to the nature of recursive pose estimation, the differences propagate and result in slight variations in the output trajectory.

Example results from the KITTI dataset executed on different operating systems and processors are displayed below.

  • Ubuntu 20.04.5: Desktop with Intel Core i7 (10th gen, 16 cores).
  • Ubuntu 20.04.6: Laptop with Intel Core i7 (8 cores).
  • Ubuntu 22.04.3: Desktop virtual machine with Intel Core i7 (10th gen, 10 cores).
  • Windows 11: Desktop with Intel Pentium (8 cores).
  • macOS Sonoma 14.2.1: MacBook Air with M1 core.

The slight differences in the KITTI results on different machines are shown below.

SequenceUbuntu 20.04.5Ubuntu 20.04.6Ubuntu 22.04.3Windows 11macOS 14.2.1
000.66670.65850.65990.65700.6606
010.77490.77500.76820.77860.7740
020.62630.64520.62900.62980.6208
030.73690.73780.74500.75070.7443
040.40670.40630.40430.40560.4052
050.33720.32980.33280.32130.3362
060.26130.26070.26210.25950.2599
070.47060.47680.44880.46220.4475
080.82360.82380.82150.82330.8290
090.56840.54200.55880.54760.5656
100.64540.63180.66220.63210.6186
Average0.57440.57160.57200.56980.5693

Extensive Parameter List

The five parameters listed at the beginning of the page, namely, rNew, rMap, σ, ϵ, and rMin, are the algorithm configuration parameters. The use of opensource libraries such as nanoflann and Dlib introduce additional parameters into the implementation. We use the default parameters often hardcoded in the libraries and do not change them. Hence, these parameters are not included in the algorithm configuration list. SiMpLE has been extensively tested on numerous benchmark datasets in different environments and LiDARs with different characteristics, and we have not needed to change any default parameters. For complete transparency, an extensive list of all identifiable parameters and their source is displayed below.

Algorithm Configuration Parameters

ParameterSourceUse
rNewAlgorithm configuration.New scan subsampling.
rMapAlgorithm configuration.Local map subsampling.
σAlgorithm configuration.Reward standard deviation.
ϵAlgorithm configuration.Optimisation exit condition.
rMinAlgorithm configuration.Minimum sensor range used for reducing point cloud size.

Hardware Parameters

ParameterSourceUse
rMaxHardware specification.Maintaining local map size.

Default Unchanged Parameters

Other unchanged, default parameters that are introduced by opensource libraries as they appear in the code. These parameters have not been changed for all experiments,

ParameterSourceValueUse
leafSizeKdTree library (nanoflann)10Used to construct the KD-tree. Default recommended value used.
derivativeEpsDlib (API call to find ‘min using approximate derivatives’)1e-7Derivative step. Unchanged from the library.
wolfeRhoDlib (API call to ‘bfgs search strategy’)0.01Set as a const parameter in the library (Nocedal and Wright (1999)).
wolfeSigmaDlib (API call to ‘bfgs search strategy’)0.9Set as a const parameter in the library (Nocedal and Wright (1999)).
Line search, maxIterationsDlib (API call to ‘bfgs search strategy’)100Set as a const parameter in the library.

Updates

  • 21/04/2025: Refactor project to improve style and timeliness. Improving for future integration.
  • 05/04/2024: Refactor project for better readability and execution time improvement.

References

[1] eigen library
[2] nanoflann library
[3] Dlib library
[4] Dlib C++ install for CMake
[5] yaml-cpp library

About

A simple LiDAR odometry method reducing the complexity and configuration burden of localization algorithms.

Resources

Stars

117 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

SiMpLE Minimal Configuration LiDAR odometry

Simple Mapping and Localisation Estimation (SiMpLE) is a low-drift and low-configuration LiDAR odometry method providing accurate localization and mapping with a variety of sensors.

Demo_SiMpLE_compressed.mp4

The original paper code is available as a release here.

We perform among state-of-the-art LiDAR odometry methods with a simple and use case agnostic algorithm. The method is derived from using raw point clouds. We do not modify or develop a new variant of any existing algorithm. The code is written for readability and easy understanding with the methodology described in the paper. The software can be optimised for increased performance. Find our paper here.

We have tested the algorithm using LiDARs with various point cloud densities, fields of view, and scan patterns,

  • Velodyne HDL-64 KITTI dataset
  • OS1-64 from the MulRan dataset
  • Velodyne VLP-16 using a self-created dataset
  • Livox Horizon using a self-created dataset

The motivation stems from reducing the complexity and configuration burden of localisation algorithms.

The code is portable, easy to understand, and modify.

The following includes:

  1. A summary of the LiDAR odometry method.
  2. The hardware requirements and dependencies installation.
  3. Installation of the SiMpLE repository.
  4. An example of using SiMpLE.
  5. Sample results interpretation.
  6. The effect of threading on real-time performance.
  7. Results on different operating systems and processors.
  8. Extensive Parameter List
  9. Other datasets.
  10. References.

Method

The method has five configuration parameters.

  1. rNew is the new point cloud spatial subsampling radius.
  2. rMap is the spatial subsampling radius for the local map.
  3. σ is the standard deviation of the Gaussian reward function - see the paper for more details.
  4. ϵ is the convergence tolerance of the optimisation solver.
  5. rMin is optional and for computational benefit only. The default value is zero where it has no effect. Increasing this value eliminates the rings commonly formed around the sensor to reduce the size of the point cloud without losing geometric information.

There are also hardware settings:

  • rMax is the maximum radius of the point cloud. This is hardware-dependent and not a configuration parameter.

Using Docker

For easy reproducibility, a docker image has been provided. To use it, clone this repository and inside the repository directory run the following command to build the docker image:

docker build -t simple .

Inside another directory, acquire a dataset (this example will use the MulRan dataset) and create a configuration file called config.yaml containing the following (other dataset examples can be seen in the configs directory):

---
scanPath: ./dataset/MulRan/DCC_02/velodyne/
outputFileName: ./dataset/result
kitti: false
# Algorithm configuration.
sigma: 0.35
rMap: 2
rNew: 0.5
convergenceTol: 1e-3
minSensorRange: 10
# Hardware configuration.
maxSensorRange: 120

Then you can run the following command to execute simple:

docker run --volume ./:/dataset simple /dataset/config.yaml

The result output should be located in the same directory you ran this command from.

Building from source

Hardware and Dependencies

This implementation has been tested on Ubuntu 20.04.5/6 LTS (Focal Fossa) and Ubuntu 22.04.3 (Jammy Jellyfish) with an Intel Core i7-10700K CPU @ 3.80GHz x 16 and 62.5 GiB memory. SiMpLE uses a few open-source libraries for reading the algorithm configuration file, Kd-Trees, matrix operations, optimization functions, and CPU threading. The installation instructions are detailed below.

  • Git is required to download the open-source libraries.
sudo apt install git
  • Require a g++ compiler.
sudo apt install g++
  • CMake is required to compile the libraries and the repository.
sudo apt install cmake
  • Install the Eigen library for math operations [1].
sudo apt install libeigen3-dev
  • Install Intel's Thread Building Blocks (TBB) library for CPU threading.
sudo apt install libtbb-dev

If the SiMpLE repository build in the following section returns an error that it cannot find TBB for CMake, the following installation may help.

git clone https://github.com/oneapi-src/oneTBB
cd oneTBB
mkdir build &&cd build
cmake ..
sudo make install
  • Clone and install the nanoflann library for KD-tree operations [2].
git clone https://github.com/jlblancoc/nanoflann.git
cd nanoflann
mkdir build &&cd build
cmake ..
sudo make install
  • Install the Dlib library for the optimization solver [3, 4].
wget http://dlib.net/files/dlib-19.24.tar.bz2
tar xvf dlib-19.24.tar.bz2
cd dlib-19.24/
mkdir build &&cd build
cmake ..
sudo make install
  • Install the yaml-cpp library for reading the configuration file [5].
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build &&cd build
cmake ..
sudo make install

Alternative options for any of the libraries can be used if desired. The code is easy to change.

Installation

Clone the repository.

git clone https://github.com/vb44/SiMpLE.git

Create a build folder in the repository.

cd SiMpLE/simple
mkdir build &&cd build

Run CMake.

cmake ../

Make the executable.

make

Example

The code only works with .bin files in the KITTI format. However, the code is very easy to modify to suit the desired inputs and outputs. When compiled, the SiMpLE algorithm is run using a .yaml algorithm configuration file as shown below.

./simple config.yaml

Sample config files are included in the config folder. An example is shown below.
Note that the --kitti argument is required to correct the scans for the KITTI dataset.

---
# Test setup.scanPath: /path_to_scans/velodyne/outputFileName: /path_to_output_files/fileNamekitti: true# Algorithm configuration.sigma: 0.3rMap: 0.5rNew: 0.3convergenceTol: 1e-6minSensorRange: 0# Hardware configuration.maxSensorRange: 120

Sample Results and Evaluation

Sample results from the paper are available in the sampleResults folder for all reported datasets.
The estimated trajectories can be evaluated in the devkit folder, which is a reduced version of the devkit provided by KITTI.

It is important to note that the KITTI estimates must be transformed to the ground truth frame using the sensor registration before evaluating the results. An example is provided in the sampleResults folder.

Results on Different Operating Systems and Processors

The implementation allows for deterministic results for a varying number of threads on a given platform. However, slight variations were observed when executing the algorithm on different machines. Upon investigation, this was found to be caused by the Dlib optimisation library having slight numerical precision differences when searching for the best pose hypothesis. Due to the nature of recursive pose estimation, the differences propagate and result in slight variations in the output trajectory.

Example results from the KITTI dataset executed on different operating systems and processors are displayed below.

  • Ubuntu 20.04.5: Desktop with Intel Core i7 (10th gen, 16 cores).
  • Ubuntu 20.04.6: Laptop with Intel Core i7 (8 cores).
  • Ubuntu 22.04.3: Desktop virtual machine with Intel Core i7 (10th gen, 10 cores).
  • Windows 11: Desktop with Intel Pentium (8 cores).
  • macOS Sonoma 14.2.1: MacBook Air with M1 core.

The slight differences in the KITTI results on different machines are shown below.

SequenceUbuntu 20.04.5Ubuntu 20.04.6Ubuntu 22.04.3Windows 11macOS 14.2.1
000.66670.65850.65990.65700.6606
010.77490.77500.76820.77860.7740
020.62630.64520.62900.62980.6208
030.73690.73780.74500.75070.7443
040.40670.40630.40430.40560.4052
050.33720.32980.33280.32130.3362
060.26130.26070.26210.25950.2599
070.47060.47680.44880.46220.4475
080.82360.82380.82150.82330.8290
090.56840.54200.55880.54760.5656
100.64540.63180.66220.63210.6186
Average0.57440.57160.57200.56980.5693

Extensive Parameter List

The five parameters listed at the beginning of the page, namely, rNew, rMap, σ, ϵ, and rMin, are the algorithm configuration parameters. The use of opensource libraries such as nanoflann and Dlib introduce additional parameters into the implementation. We use the default parameters often hardcoded in the libraries and do not change them. Hence, these parameters are not included in the algorithm configuration list. SiMpLE has been extensively tested on numerous benchmark datasets in different environments and LiDARs with different characteristics, and we have not needed to change any default parameters. For complete transparency, an extensive list of all identifiable parameters and their source is displayed below.

Algorithm Configuration Parameters

ParameterSourceUse
rNewAlgorithm configuration.New scan subsampling.
rMapAlgorithm configuration.Local map subsampling.
σAlgorithm configuration.Reward standard deviation.
ϵAlgorithm configuration.Optimisation exit condition.
rMinAlgorithm configuration.Minimum sensor range used for reducing point cloud size.

Hardware Parameters

ParameterSourceUse
rMaxHardware specification.Maintaining local map size.

Default Unchanged Parameters

Other unchanged, default parameters that are introduced by opensource libraries as they appear in the code. These parameters have not been changed for all experiments,

ParameterSourceValueUse
leafSizeKdTree library (nanoflann)10Used to construct the KD-tree. Default recommended value used.
derivativeEpsDlib (API call to find ‘min using approximate derivatives’)1e-7Derivative step. Unchanged from the library.
wolfeRhoDlib (API call to ‘bfgs search strategy’)0.01Set as a const parameter in the library (Nocedal and Wright (1999)).
wolfeSigmaDlib (API call to ‘bfgs search strategy’)0.9Set as a const parameter in the library (Nocedal and Wright (1999)).
Line search, maxIterationsDlib (API call to ‘bfgs search strategy’)100Set as a const parameter in the library.

Updates

  • 21/04/2025: Refactor project to improve style and timeliness. Improving for future integration.
  • 05/04/2024: Refactor project for better readability and execution time improvement.

References

[1] eigen library
[2] nanoflann library
[3] Dlib library
[4] Dlib C++ install for CMake
[5] yaml-cpp library

About

A simple LiDAR odometry method reducing the complexity and configuration burden of localization algorithms.

Resources

Stars

117 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SiMpLE Minimal Configuration LiDAR odometry

Simple Mapping and Localisation Estimation (SiMpLE) is a low-drift and low-configuration LiDAR odometry method providing accurate localization and mapping with a variety of sensors.

Demo_SiMpLE_compressed.mp4

The original paper code is available as a release here.

We perform among state-of-the-art LiDAR odometry methods with a simple and use case agnostic algorithm. The method is derived from using raw point clouds. We do not modify or develop a new variant of any existing algorithm. The code is written for readability and easy understanding with the methodology described in the paper. The software can be optimised for increased performance. Find our paper here.

We have tested the algorithm using LiDARs with various point cloud densities, fields of view, and scan patterns,

  • Velodyne HDL-64 KITTI dataset
  • OS1-64 from the MulRan dataset
  • Velodyne VLP-16 using a self-created dataset
  • Livox Horizon using a self-created dataset

The motivation stems from reducing the complexity and configuration burden of localisation algorithms.

The code is portable, easy to understand, and modify.

The following includes:

  1. A summary of the LiDAR odometry method.
  2. The hardware requirements and dependencies installation.
  3. Installation of the SiMpLE repository.
  4. An example of using SiMpLE.
  5. Sample results interpretation.
  6. The effect of threading on real-time performance.
  7. Results on different operating systems and processors.
  8. Extensive Parameter List
  9. Other datasets.
  10. References.

Method

The method has five configuration parameters.

  1. rNew is the new point cloud spatial subsampling radius.
  2. rMap is the spatial subsampling radius for the local map.
  3. σ is the standard deviation of the Gaussian reward function - see the paper for more details.
  4. ϵ is the convergence tolerance of the optimisation solver.
  5. rMin is optional and for computational benefit only. The default value is zero where it has no effect. Increasing this value eliminates the rings commonly formed around the sensor to reduce the size of the point cloud without losing geometric information.

There are also hardware settings:

  • rMax is the maximum radius of the point cloud. This is hardware-dependent and not a configuration parameter.

Using Docker

For easy reproducibility, a docker image has been provided. To use it, clone this repository and inside the repository directory run the following command to build the docker image:

docker build -t simple .

Inside another directory, acquire a dataset (this example will use the MulRan dataset) and create a configuration file called config.yaml containing the following (other dataset examples can be seen in the configs directory):

---
scanPath: ./dataset/MulRan/DCC_02/velodyne/
outputFileName: ./dataset/result
kitti: false
# Algorithm configuration.
sigma: 0.35
rMap: 2
rNew: 0.5
convergenceTol: 1e-3
minSensorRange: 10
# Hardware configuration.
maxSensorRange: 120

Then you can run the following command to execute simple:

docker run --volume ./:/dataset simple /dataset/config.yaml

The result output should be located in the same directory you ran this command from.

Building from source

Hardware and Dependencies

This implementation has been tested on Ubuntu 20.04.5/6 LTS (Focal Fossa) and Ubuntu 22.04.3 (Jammy Jellyfish) with an Intel Core i7-10700K CPU @ 3.80GHz x 16 and 62.5 GiB memory. SiMpLE uses a few open-source libraries for reading the algorithm configuration file, Kd-Trees, matrix operations, optimization functions, and CPU threading. The installation instructions are detailed below.

  • Git is required to download the open-source libraries.
sudo apt install git
  • Require a g++ compiler.
sudo apt install g++
  • CMake is required to compile the libraries and the repository.
sudo apt install cmake
  • Install the Eigen library for math operations [1].
sudo apt install libeigen3-dev
  • Install Intel's Thread Building Blocks (TBB) library for CPU threading.
sudo apt install libtbb-dev

If the SiMpLE repository build in the following section returns an error that it cannot find TBB for CMake, the following installation may help.

git clone https://github.com/oneapi-src/oneTBB
cd oneTBB
mkdir build &&cd build
cmake ..
sudo make install
  • Clone and install the nanoflann library for KD-tree operations [2].
git clone https://github.com/jlblancoc/nanoflann.git
cd nanoflann
mkdir build &&cd build
cmake ..
sudo make install
  • Install the Dlib library for the optimization solver [3, 4].
wget http://dlib.net/files/dlib-19.24.tar.bz2
tar xvf dlib-19.24.tar.bz2
cd dlib-19.24/
mkdir build &&cd build
cmake ..
sudo make install
  • Install the yaml-cpp library for reading the configuration file [5].
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build &&cd build
cmake ..
sudo make install

Alternative options for any of the libraries can be used if desired. The code is easy to change.

Installation

Clone the repository.

git clone https://github.com/vb44/SiMpLE.git

Create a build folder in the repository.

cd SiMpLE/simple
mkdir build &&cd build

Run CMake.

cmake ../

Make the executable.

make

Example

The code only works with .bin files in the KITTI format. However, the code is very easy to modify to suit the desired inputs and outputs. When compiled, the SiMpLE algorithm is run using a .yaml algorithm configuration file as shown below.

./simple config.yaml

Sample config files are included in the config folder. An example is shown below.
Note that the --kitti argument is required to correct the scans for the KITTI dataset.

---
# Test setup.scanPath: /path_to_scans/velodyne/outputFileName: /path_to_output_files/fileNamekitti: true# Algorithm configuration.sigma: 0.3rMap: 0.5rNew: 0.3convergenceTol: 1e-6minSensorRange: 0# Hardware configuration.maxSensorRange: 120

Sample Results and Evaluation

Sample results from the paper are available in the sampleResults folder for all reported datasets.
The estimated trajectories can be evaluated in the devkit folder, which is a reduced version of the devkit provided by KITTI.

It is important to note that the KITTI estimates must be transformed to the ground truth frame using the sensor registration before evaluating the results. An example is provided in the sampleResults folder.

Results on Different Operating Systems and Processors

The implementation allows for deterministic results for a varying number of threads on a given platform. However, slight variations were observed when executing the algorithm on different machines. Upon investigation, this was found to be caused by the Dlib optimisation library having slight numerical precision differences when searching for the best pose hypothesis. Due to the nature of recursive pose estimation, the differences propagate and result in slight variations in the output trajectory.

Example results from the KITTI dataset executed on different operating systems and processors are displayed below.

  • Ubuntu 20.04.5: Desktop with Intel Core i7 (10th gen, 16 cores).
  • Ubuntu 20.04.6: Laptop with Intel Core i7 (8 cores).
  • Ubuntu 22.04.3: Desktop virtual machine with Intel Core i7 (10th gen, 10 cores).
  • Windows 11: Desktop with Intel Pentium (8 cores).
  • macOS Sonoma 14.2.1: MacBook Air with M1 core.

The slight differences in the KITTI results on different machines are shown below.

SequenceUbuntu 20.04.5Ubuntu 20.04.6Ubuntu 22.04.3Windows 11macOS 14.2.1
000.66670.65850.65990.65700.6606
010.77490.77500.76820.77860.7740
020.62630.64520.62900.62980.6208
030.73690.73780.74500.75070.7443
040.40670.40630.40430.40560.4052
050.33720.32980.33280.32130.3362
060.26130.26070.26210.25950.2599
070.47060.47680.44880.46220.4475
080.82360.82380.82150.82330.8290
090.56840.54200.55880.54760.5656
100.64540.63180.66220.63210.6186
Average0.57440.57160.57200.56980.5693

Extensive Parameter List

The five parameters listed at the beginning of the page, namely, rNew, rMap, σ, ϵ, and rMin, are the algorithm configuration parameters. The use of opensource libraries such as nanoflann and Dlib introduce additional parameters into the implementation. We use the default parameters often hardcoded in the libraries and do not change them. Hence, these parameters are not included in the algorithm configuration list. SiMpLE has been extensively tested on numerous benchmark datasets in different environments and LiDARs with different characteristics, and we have not needed to change any default parameters. For complete transparency, an extensive list of all identifiable parameters and their source is displayed below.

Algorithm Configuration Parameters

ParameterSourceUse
rNewAlgorithm configuration.New scan subsampling.
rMapAlgorithm configuration.Local map subsampling.
σAlgorithm configuration.Reward standard deviation.
ϵAlgorithm configuration.Optimisation exit condition.
rMinAlgorithm configuration.Minimum sensor range used for reducing point cloud size.

Hardware Parameters

ParameterSourceUse
rMaxHardware specification.Maintaining local map size.

Default Unchanged Parameters

Other unchanged, default parameters that are introduced by opensource libraries as they appear in the code. These parameters have not been changed for all experiments,

ParameterSourceValueUse
leafSizeKdTree library (nanoflann)10Used to construct the KD-tree. Default recommended value used.
derivativeEpsDlib (API call to find ‘min using approximate derivatives’)1e-7Derivative step. Unchanged from the library.
wolfeRhoDlib (API call to ‘bfgs search strategy’)0.01Set as a const parameter in the library (Nocedal and Wright (1999)).
wolfeSigmaDlib (API call to ‘bfgs search strategy’)0.9Set as a const parameter in the library (Nocedal and Wright (1999)).
Line search, maxIterationsDlib (API call to ‘bfgs search strategy’)100Set as a const parameter in the library.

Updates

  • 21/04/2025: Refactor project to improve style and timeliness. Improving for future integration.
  • 05/04/2024: Refactor project for better readability and execution time improvement.

References

[1] eigen library
[2] nanoflann library
[3] Dlib library
[4] Dlib C++ install for CMake
[5] yaml-cpp library

About

A simple LiDAR odometry method reducing the complexity and configuration burden of localization algorithms.

Resources

Stars

117 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

SiMpLE Minimal Configuration LiDAR odometry

Simple Mapping and Localisation Estimation (SiMpLE) is a low-drift and low-configuration LiDAR odometry method providing accurate localization and mapping with a variety of sensors.

Demo_SiMpLE_compressed.mp4

The original paper code is available as a release here.

We perform among state-of-the-art LiDAR odometry methods with a simple and use case agnostic algorithm. The method is derived from using raw point clouds. We do not modify or develop a new variant of any existing algorithm. The code is written for readability and easy understanding with the methodology described in the paper. The software can be optimised for increased performance. Find our paper here.

We have tested the algorithm using LiDARs with various point cloud densities, fields of view, and scan patterns,

  • Velodyne HDL-64 KITTI dataset
  • OS1-64 from the MulRan dataset
  • Velodyne VLP-16 using a self-created dataset
  • Livox Horizon using a self-created dataset

The motivation stems from reducing the complexity and configuration burden of localisation algorithms.

The code is portable, easy to understand, and modify.

The following includes:

  1. A summary of the LiDAR odometry method.
  2. The hardware requirements and dependencies installation.
  3. Installation of the SiMpLE repository.
  4. An example of using SiMpLE.
  5. Sample results interpretation.
  6. The effect of threading on real-time performance.
  7. Results on different operating systems and processors.
  8. Extensive Parameter List
  9. Other datasets.
  10. References.

Method

The method has five configuration parameters.

  1. rNew is the new point cloud spatial subsampling radius.
  2. rMap is the spatial subsampling radius for the local map.
  3. σ is the standard deviation of the Gaussian reward function - see the paper for more details.
  4. ϵ is the convergence tolerance of the optimisation solver.
  5. rMin is optional and for computational benefit only. The default value is zero where it has no effect. Increasing this value eliminates the rings commonly formed around the sensor to reduce the size of the point cloud without losing geometric information.

There are also hardware settings:

  • rMax is the maximum radius of the point cloud. This is hardware-dependent and not a configuration parameter.

Using Docker

For easy reproducibility, a docker image has been provided. To use it, clone this repository and inside the repository directory run the following command to build the docker image:

docker build -t simple .

Inside another directory, acquire a dataset (this example will use the MulRan dataset) and create a configuration file called config.yaml containing the following (other dataset examples can be seen in the configs directory):

---
scanPath: ./dataset/MulRan/DCC_02/velodyne/
outputFileName: ./dataset/result
kitti: false
# Algorithm configuration.
sigma: 0.35
rMap: 2
rNew: 0.5
convergenceTol: 1e-3
minSensorRange: 10
# Hardware configuration.
maxSensorRange: 120

Then you can run the following command to execute simple:

docker run --volume ./:/dataset simple /dataset/config.yaml

The result output should be located in the same directory you ran this command from.

Building from source

Hardware and Dependencies

This implementation has been tested on Ubuntu 20.04.5/6 LTS (Focal Fossa) and Ubuntu 22.04.3 (Jammy Jellyfish) with an Intel Core i7-10700K CPU @ 3.80GHz x 16 and 62.5 GiB memory. SiMpLE uses a few open-source libraries for reading the algorithm configuration file, Kd-Trees, matrix operations, optimization functions, and CPU threading. The installation instructions are detailed below.

  • Git is required to download the open-source libraries.
sudo apt install git
  • Require a g++ compiler.
sudo apt install g++
  • CMake is required to compile the libraries and the repository.
sudo apt install cmake
  • Install the Eigen library for math operations [1].
sudo apt install libeigen3-dev
  • Install Intel's Thread Building Blocks (TBB) library for CPU threading.
sudo apt install libtbb-dev

If the SiMpLE repository build in the following section returns an error that it cannot find TBB for CMake, the following installation may help.

git clone https://github.com/oneapi-src/oneTBB
cd oneTBB
mkdir build &&cd build
cmake ..
sudo make install
  • Clone and install the nanoflann library for KD-tree operations [2].
git clone https://github.com/jlblancoc/nanoflann.git
cd nanoflann
mkdir build &&cd build
cmake ..
sudo make install
  • Install the Dlib library for the optimization solver [3, 4].
wget http://dlib.net/files/dlib-19.24.tar.bz2
tar xvf dlib-19.24.tar.bz2
cd dlib-19.24/
mkdir build &&cd build
cmake ..
sudo make install
  • Install the yaml-cpp library for reading the configuration file [5].
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build &&cd build
cmake ..
sudo make install

Alternative options for any of the libraries can be used if desired. The code is easy to change.

Installation

Clone the repository.

git clone https://github.com/vb44/SiMpLE.git

Create a build folder in the repository.

cd SiMpLE/simple
mkdir build &&cd build

Run CMake.

cmake ../

Make the executable.

make

Example

The code only works with .bin files in the KITTI format. However, the code is very easy to modify to suit the desired inputs and outputs. When compiled, the SiMpLE algorithm is run using a .yaml algorithm configuration file as shown below.

./simple config.yaml

Sample config files are included in the config folder. An example is shown below.
Note that the --kitti argument is required to correct the scans for the KITTI dataset.

---
# Test setup.scanPath: /path_to_scans/velodyne/outputFileName: /path_to_output_files/fileNamekitti: true# Algorithm configuration.sigma: 0.3rMap: 0.5rNew: 0.3convergenceTol: 1e-6minSensorRange: 0# Hardware configuration.maxSensorRange: 120

Sample Results and Evaluation

Sample results from the paper are available in the sampleResults folder for all reported datasets.
The estimated trajectories can be evaluated in the devkit folder, which is a reduced version of the devkit provided by KITTI.

It is important to note that the KITTI estimates must be transformed to the ground truth frame using the sensor registration before evaluating the results. An example is provided in the sampleResults folder.

Results on Different Operating Systems and Processors

The implementation allows for deterministic results for a varying number of threads on a given platform. However, slight variations were observed when executing the algorithm on different machines. Upon investigation, this was found to be caused by the Dlib optimisation library having slight numerical precision differences when searching for the best pose hypothesis. Due to the nature of recursive pose estimation, the differences propagate and result in slight variations in the output trajectory.

Example results from the KITTI dataset executed on different operating systems and processors are displayed below.

  • Ubuntu 20.04.5: Desktop with Intel Core i7 (10th gen, 16 cores).
  • Ubuntu 20.04.6: Laptop with Intel Core i7 (8 cores).
  • Ubuntu 22.04.3: Desktop virtual machine with Intel Core i7 (10th gen, 10 cores).
  • Windows 11: Desktop with Intel Pentium (8 cores).
  • macOS Sonoma 14.2.1: MacBook Air with M1 core.

The slight differences in the KITTI results on different machines are shown below.

SequenceUbuntu 20.04.5Ubuntu 20.04.6Ubuntu 22.04.3Windows 11macOS 14.2.1
000.66670.65850.65990.65700.6606
010.77490.77500.76820.77860.7740
020.62630.64520.62900.62980.6208
030.73690.73780.74500.75070.7443
040.40670.40630.40430.40560.4052
050.33720.32980.33280.32130.3362
060.26130.26070.26210.25950.2599
070.47060.47680.44880.46220.4475
080.82360.82380.82150.82330.8290
090.56840.54200.55880.54760.5656
100.64540.63180.66220.63210.6186
Average0.57440.57160.57200.56980.5693

Extensive Parameter List

The five parameters listed at the beginning of the page, namely, rNew, rMap, σ, ϵ, and rMin, are the algorithm configuration parameters. The use of opensource libraries such as nanoflann and Dlib introduce additional parameters into the implementation. We use the default parameters often hardcoded in the libraries and do not change them. Hence, these parameters are not included in the algorithm configuration list. SiMpLE has been extensively tested on numerous benchmark datasets in different environments and LiDARs with different characteristics, and we have not needed to change any default parameters. For complete transparency, an extensive list of all identifiable parameters and their source is displayed below.

Algorithm Configuration Parameters

ParameterSourceUse
rNewAlgorithm configuration.New scan subsampling.
rMapAlgorithm configuration.Local map subsampling.
σAlgorithm configuration.Reward standard deviation.
ϵAlgorithm configuration.Optimisation exit condition.
rMinAlgorithm configuration.Minimum sensor range used for reducing point cloud size.

Hardware Parameters

ParameterSourceUse
rMaxHardware specification.Maintaining local map size.

Default Unchanged Parameters

Other unchanged, default parameters that are introduced by opensource libraries as they appear in the code. These parameters have not been changed for all experiments,

ParameterSourceValueUse
leafSizeKdTree library (nanoflann)10Used to construct the KD-tree. Default recommended value used.
derivativeEpsDlib (API call to find ‘min using approximate derivatives’)1e-7Derivative step. Unchanged from the library.
wolfeRhoDlib (API call to ‘bfgs search strategy’)0.01Set as a const parameter in the library (Nocedal and Wright (1999)).
wolfeSigmaDlib (API call to ‘bfgs search strategy’)0.9Set as a const parameter in the library (Nocedal and Wright (1999)).
Line search, maxIterationsDlib (API call to ‘bfgs search strategy’)100Set as a const parameter in the library.

Updates

  • 21/04/2025: Refactor project to improve style and timeliness. Improving for future integration.
  • 05/04/2024: Refactor project for better readability and execution time improvement.

References

[1] eigen library
[2] nanoflann library
[3] Dlib library
[4] Dlib C++ install for CMake
[5] yaml-cpp library

About

A simple LiDAR odometry method reducing the complexity and configuration burden of localization algorithms.

Resources

Stars

117 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

SiMpLE Minimal Configuration LiDAR odometry

Simple Mapping and Localisation Estimation (SiMpLE) is a low-drift and low-configuration LiDAR odometry method providing accurate localization and mapping with a variety of sensors.

Demo_SiMpLE_compressed.mp4

The original paper code is available as a release here.

We perform among state-of-the-art LiDAR odometry methods with a simple and use case agnostic algorithm. The method is derived from using raw point clouds. We do not modify or develop a new variant of any existing algorithm. The code is written for readability and easy understanding with the methodology described in the paper. The software can be optimised for increased performance. Find our paper here.

We have tested the algorithm using LiDARs with various point cloud densities, fields of view, and scan patterns,

  • Velodyne HDL-64 KITTI dataset
  • OS1-64 from the MulRan dataset
  • Velodyne VLP-16 using a self-created dataset
  • Livox Horizon using a self-created dataset

The motivation stems from reducing the complexity and configuration burden of localisation algorithms.

The code is portable, easy to understand, and modify.

The following includes:

  1. A summary of the LiDAR odometry method.
  2. The hardware requirements and dependencies installation.
  3. Installation of the SiMpLE repository.
  4. An example of using SiMpLE.
  5. Sample results interpretation.
  6. The effect of threading on real-time performance.
  7. Results on different operating systems and processors.
  8. Extensive Parameter List
  9. Other datasets.
  10. References.

Method

The method has five configuration parameters.

  1. rNew is the new point cloud spatial subsampling radius.
  2. rMap is the spatial subsampling radius for the local map.
  3. σ is the standard deviation of the Gaussian reward function - see the paper for more details.
  4. ϵ is the convergence tolerance of the optimisation solver.
  5. rMin is optional and for computational benefit only. The default value is zero where it has no effect. Increasing this value eliminates the rings commonly formed around the sensor to reduce the size of the point cloud without losing geometric information.

There are also hardware settings:

  • rMax is the maximum radius of the point cloud. This is hardware-dependent and not a configuration parameter.

Using Docker

For easy reproducibility, a docker image has been provided. To use it, clone this repository and inside the repository directory run the following command to build the docker image:

docker build -t simple .

Inside another directory, acquire a dataset (this example will use the MulRan dataset) and create a configuration file called config.yaml containing the following (other dataset examples can be seen in the configs directory):

---
scanPath: ./dataset/MulRan/DCC_02/velodyne/
outputFileName: ./dataset/result
kitti: false
# Algorithm configuration.
sigma: 0.35
rMap: 2
rNew: 0.5
convergenceTol: 1e-3
minSensorRange: 10
# Hardware configuration.
maxSensorRange: 120

Then you can run the following command to execute simple:

docker run --volume ./:/dataset simple /dataset/config.yaml

The result output should be located in the same directory you ran this command from.

Building from source

Hardware and Dependencies

This implementation has been tested on Ubuntu 20.04.5/6 LTS (Focal Fossa) and Ubuntu 22.04.3 (Jammy Jellyfish) with an Intel Core i7-10700K CPU @ 3.80GHz x 16 and 62.5 GiB memory. SiMpLE uses a few open-source libraries for reading the algorithm configuration file, Kd-Trees, matrix operations, optimization functions, and CPU threading. The installation instructions are detailed below.

  • Git is required to download the open-source libraries.
sudo apt install git
  • Require a g++ compiler.
sudo apt install g++
  • CMake is required to compile the libraries and the repository.
sudo apt install cmake
  • Install the Eigen library for math operations [1].
sudo apt install libeigen3-dev
  • Install Intel's Thread Building Blocks (TBB) library for CPU threading.
sudo apt install libtbb-dev

If the SiMpLE repository build in the following section returns an error that it cannot find TBB for CMake, the following installation may help.

git clone https://github.com/oneapi-src/oneTBB
cd oneTBB
mkdir build &&cd build
cmake ..
sudo make install
  • Clone and install the nanoflann library for KD-tree operations [2].
git clone https://github.com/jlblancoc/nanoflann.git
cd nanoflann
mkdir build &&cd build
cmake ..
sudo make install
  • Install the Dlib library for the optimization solver [3, 4].
wget http://dlib.net/files/dlib-19.24.tar.bz2
tar xvf dlib-19.24.tar.bz2
cd dlib-19.24/
mkdir build &&cd build
cmake ..
sudo make install
  • Install the yaml-cpp library for reading the configuration file [5].
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build &&cd build
cmake ..
sudo make install

Alternative options for any of the libraries can be used if desired. The code is easy to change.

Installation

Clone the repository.

git clone https://github.com/vb44/SiMpLE.git

Create a build folder in the repository.

cd SiMpLE/simple
mkdir build &&cd build

Run CMake.

cmake ../

Make the executable.

make

Example

The code only works with .bin files in the KITTI format. However, the code is very easy to modify to suit the desired inputs and outputs. When compiled, the SiMpLE algorithm is run using a .yaml algorithm configuration file as shown below.

./simple config.yaml

Sample config files are included in the config folder. An example is shown below.
Note that the --kitti argument is required to correct the scans for the KITTI dataset.

---
# Test setup.scanPath: /path_to_scans/velodyne/outputFileName: /path_to_output_files/fileNamekitti: true# Algorithm configuration.sigma: 0.3rMap: 0.5rNew: 0.3convergenceTol: 1e-6minSensorRange: 0# Hardware configuration.maxSensorRange: 120

Sample Results and Evaluation

Sample results from the paper are available in the sampleResults folder for all reported datasets.
The estimated trajectories can be evaluated in the devkit folder, which is a reduced version of the devkit provided by KITTI.

It is important to note that the KITTI estimates must be transformed to the ground truth frame using the sensor registration before evaluating the results. An example is provided in the sampleResults folder.

Results on Different Operating Systems and Processors

The implementation allows for deterministic results for a varying number of threads on a given platform. However, slight variations were observed when executing the algorithm on different machines. Upon investigation, this was found to be caused by the Dlib optimisation library having slight numerical precision differences when searching for the best pose hypothesis. Due to the nature of recursive pose estimation, the differences propagate and result in slight variations in the output trajectory.

Example results from the KITTI dataset executed on different operating systems and processors are displayed below.

  • Ubuntu 20.04.5: Desktop with Intel Core i7 (10th gen, 16 cores).
  • Ubuntu 20.04.6: Laptop with Intel Core i7 (8 cores).
  • Ubuntu 22.04.3: Desktop virtual machine with Intel Core i7 (10th gen, 10 cores).
  • Windows 11: Desktop with Intel Pentium (8 cores).
  • macOS Sonoma 14.2.1: MacBook Air with M1 core.

The slight differences in the KITTI results on different machines are shown below.

SequenceUbuntu 20.04.5Ubuntu 20.04.6Ubuntu 22.04.3Windows 11macOS 14.2.1
000.66670.65850.65990.65700.6606
010.77490.77500.76820.77860.7740
020.62630.64520.62900.62980.6208
030.73690.73780.74500.75070.7443
040.40670.40630.40430.40560.4052
050.33720.32980.33280.32130.3362
060.26130.26070.26210.25950.2599
070.47060.47680.44880.46220.4475
080.82360.82380.82150.82330.8290
090.56840.54200.55880.54760.5656
100.64540.63180.66220.63210.6186
Average0.57440.57160.57200.56980.5693

Extensive Parameter List

The five parameters listed at the beginning of the page, namely, rNew, rMap, σ, ϵ, and rMin, are the algorithm configuration parameters. The use of opensource libraries such as nanoflann and Dlib introduce additional parameters into the implementation. We use the default parameters often hardcoded in the libraries and do not change them. Hence, these parameters are not included in the algorithm configuration list. SiMpLE has been extensively tested on numerous benchmark datasets in different environments and LiDARs with different characteristics, and we have not needed to change any default parameters. For complete transparency, an extensive list of all identifiable parameters and their source is displayed below.

Algorithm Configuration Parameters

ParameterSourceUse
rNewAlgorithm configuration.New scan subsampling.
rMapAlgorithm configuration.Local map subsampling.
σAlgorithm configuration.Reward standard deviation.
ϵAlgorithm configuration.Optimisation exit condition.
rMinAlgorithm configuration.Minimum sensor range used for reducing point cloud size.

Hardware Parameters

ParameterSourceUse
rMaxHardware specification.Maintaining local map size.

Default Unchanged Parameters

Other unchanged, default parameters that are introduced by opensource libraries as they appear in the code. These parameters have not been changed for all experiments,

ParameterSourceValueUse
leafSizeKdTree library (nanoflann)10Used to construct the KD-tree. Default recommended value used.
derivativeEpsDlib (API call to find ‘min using approximate derivatives’)1e-7Derivative step. Unchanged from the library.
wolfeRhoDlib (API call to ‘bfgs search strategy’)0.01Set as a const parameter in the library (Nocedal and Wright (1999)).
wolfeSigmaDlib (API call to ‘bfgs search strategy’)0.9Set as a const parameter in the library (Nocedal and Wright (1999)).
Line search, maxIterationsDlib (API call to ‘bfgs search strategy’)100Set as a const parameter in the library.

Updates

  • 21/04/2025: Refactor project to improve style and timeliness. Improving for future integration.
  • 05/04/2024: Refactor project for better readability and execution time improvement.

References

[1] eigen library
[2] nanoflann library
[3] Dlib library
[4] Dlib C++ install for CMake
[5] yaml-cpp library

About

A simple LiDAR odometry method reducing the complexity and configuration burden of localization algorithms.

Resources

Stars

117 stars

Watchers

3 watching

Forks

Releases

Contributors

Languages