![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
|
![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
|
![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
|
![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
|
![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences rmcl rmcl_msgs rmcl_ros |
|
Repository Summary
Description | Mobile Robot Localization in 3D Triangle Meshes |
Checkout URI | https://github.com/uos/rmcl.git |
VCS Type | git |
VCS Version | humble |
Last Updated | 2025-05-17 |
Dev Status | UNKNOWN |
CI status | No Continuous Integration |
Released | UNRELEASED |
Tags | localization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
Contributing |
Help Wanted (0)
Good First Issues (0) Pull Requests to Review (0) |
README

Software Tools for Mobile Robot Localization in 3D Meshes
This repository contains algorithms designed for map-based robot localization, specifically when dealing with maps composed of triangle meshes or complete scene graphs. These maps may be provided by architects who have designed the building in which the robot operates, or they can be autonomously generated by the robot through Simultaneous Localization and Mapping (SLAM) methods. It’s crucial to note that map-based localization differs from SLAM; it focuses on estimating the robot’s pose within a potentially large map, whether the initial pose is roughly known (tracking) or entirely unknown from the start aka kidnapped robot problem. Map-based localization is essential for precisely planning the robot’s missions on a given map.
MICP-L - Pose Tracking in Meshes
MICP-L: Mesh-based ICP for Robot Localization Using Hardware-Accelerated Ray Casting. An approach to directly register range sensor data to a mesh in order to localize a mobile robot using hardware-accelerated ray casting correspondences (See publications).
Hilti: 6DoF Localization | MulRan: Large-scale scenes |
---|---|
![]() |
![]() |
Requirements:
- At least one range sensor is equipped and running
- Triangle mesh as map
- Prior odometry estimation of the robot given as TF
IMU prior is also possible as long as it is integrated as TF-Transform, e.g. with Madgwick Filter.
Publication
Please reference the following paper when using the MICP-L method in your scientific work.
@inproceedings{mock2024micpl,
title={{MICP-L}: Mesh-based ICP for Robot Localization Using Hardware-Accelerated Ray Casting},
author={Mock, Alexander and Wiemann, Thomas and Pütz, Sebastian and Hertzberg, Joachim},
booktitle={2024 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
year={2024},
pages={10664-10671},
doi={10.1109/IROS58592.2024.10802360}
}
The paper is available on IEEE Xplore and as preprint on arXiv. The experiments are available at https://github.com/amock/micp_experiments, but they are primarily compatible with the ROS 1 version.
See the older branches or commits for reference.
Running micp_localization_node
(Theoretical Usage)
Note: The following is a theoretical usage example meant to illustrate the general setup.
For actual working examples and detailed instructions, please refer to:
https://github.com/amock/rmcl_examples
The micp_localization_node
starts the process of localizing the robot within a triangle mesh using MICP, based on a given pose estimate. It is typically launched via a launch file:
<launch>
<node pkg="rmcl_ros" exec="micp_localization_node" name="rmcl_micpl" output="screen">
<param name="map_file" value="/path/to/mesh/map.dae" />
<param from="/path/to/config/file.yaml" />
</node>
</launch>
Once the launch file is started, the output in Terminal should look as follows:
```console [micp_localization_node-2] ------------------------- [micp_localization_node-2] --- MAP --- [micp_localization_node-2] ------------------------- [micp_localization_node-2] - file: /home/amock/rmcl_ws/install/rmcl_examples_maps/share/rmcl_examples_maps/maps/tray.dae [micp_localization_node-2] - meshes: 1 [micp_localization_node-2] Cube-mesh [micp_localization_node-2] - vertices, faces: 30, 10 [micp_localization_node-2] For more infos enter in terminal: [micp_localization_node-2] $ rmagine_map_info /home/amock/rmcl_ws/install/rmcl_examples_maps/share/rmcl_examples_maps/maps/tray.dae [micp_localization_node-2] [micp_localization_node-2] -------------------------- [micp_localization_node-2] --- BACKENDS --- [micp_localization_node-2] -------------------------- [micp_localization_node-2] Available combining units: [micp_localization_node-2] - CPU [micp_localization_node-2] Available raytracing backends: [micp_localization_node-2] - Embree (CPU) [micp_localization_node-2] [micp_localization_node-2] ------------------------- [micp_localization_node-2] --- FRAMES --- [micp_localization_node-2] ------------------------- [micp_localization_node-2] - base: base_footprint [micp_localization_node-2] - odom: odom [micp_localization_node-2] - map: map [micp_localization_node-2] Estimating: base_footprint -> map [micp_localization_node-2] Providing: odom -> map [micp_localization_node-2] [micp_localization_node-2] ------------------------- [micp_localization_node-2] --- SENSORS --- [micp_localization_node-2] ------------------------- [micp_localization_node-2] - lidar3d [micp_localization_node-2] - data: topic [micp_localization_node-2] - topic: /rmcl_inputs/lidar3d [micp_localization_node-2] - frame: velodyne [micp_localization_node-2] - model: o1dn [micp_localization_node-2] - correspondences: [micp_localization_node-2] - backend: embree [micp_localization_node-2] - type: RC [micp_localization_node-2] - metric: P2L [micp_localization_node-2] MICP load params - done. Valid Sensors: 1 [micp_localization_node-2] [INFO] [1747438141.203392843] [rmcl_micpl]: Waiting for 'odom' frame to become available ... [micp_localization_node-2] Waiting for pose... ```After the node has been started, an initial pose estimate must be provided, eg, using the “2D Pose Estimate” tool in RViz, which publishes to the /initialpose
topic.
Make sure the fixed frame in RViz is set to match the map coordinate system.
Note: RMCL does not provide tools to visualize triangle mesh maps in RViz. To view mesh maps, consider using the rviz_mesh_tools_plugins from the mesh_tools repository.
–> For an actual quick start, go to: https://github.com/amock/rmcl_examples
RMCL - Project
Installation
Dependencies:
- ROS 2 (check compatible branches)
- Download and put Rmagine (v >= 2.3.0) into your ROS workspace.
- Recommended: Install OptiX backend if NVIDIA GPU is available.
- Optional for functionality, but required for visualizations: mesh_tools.
Clone this repository into your ROS workspace and build it.
colcon build
Mesh Navigation
To navigate a robot automatically and safely through uneven terrain, the combination RMCL + Mesh Navigation Stack is very suitable: https://github.com/naturerobots/mesh_navigation. As we presented on ROSCon 2023:
Roadmap
This package will be expanded by more functionalities to localize a robot in mesh maps. The planned Roadmap is as follows:
- MICP-L (Tracking)
- RMCL (Global Localization)
News
2025-05-17: ROS 2-ify MICP-L - v2.2.0
After conducting real-world tests, we refactored the MICP-L node to better integrate it into the ROS 2 ecosystem and added several new features:
- Limited the possible inputs to only
rmcl_msgs
. Instead, we provide nodes and instructions to convert commonly used range sensor messages intormcl_msgs
. - MICP-L can now be launched as a composable node.
- Separated correspondence search from optimization without losing much efficiency. This allowed us to add classic closest-point correspondences (CP), in addition to ray-casting correspondences (RC) (only available for embree backend).
- Improved time synchronization between combinations of sensors and odometry.
- Added many new examples and small demos for a quick start: https://github.com/amock/rmcl_examples
For the old version, download v2.1.0
2024-11-25: Restructuring - ROS 1 + ROS 2
We had to do minor structural changes to the repository in order to better integrate new features into RMCL. This repository is now devided into
- “rmcl” which is a ROS-agnostic library that can be compiled and installed as regular CMake project,
- “rmcl_ros” which contains all the nodes,
- “rmcl_msgs” which are the message moved from to this repository. The original msgs repository is not required anymore.
Using the latest rmcl version might break your launch files as the nodes are now located in “rmcl_ros” package. However, it’s rather simple to fix that. The new versions of RMCL are v2.1.0 for ROS 2 and v1.3.0 for ROS 1.
2024-02-11: ROS2 release - v2.0.0
The main branch is humble now! Since it is not backwards compatible we decided to increase the version of RMCL to 2.0.0. The noetic version will still exist with the “noetic” branch. The “noetic” branch will be maintained until the end of 2024.
2024-01-05: ROS2 - humble
The first ROS2 port has been released! If you are using ROS2, check out the humble
branch of this and all linked repositories. After the new branch has been tested well enough, I will make it the main branch. The current version will persist in the noetic
branch.
CONTRIBUTING
![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
|
![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
|
![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
|
![]() |
rmcl repositorylocalization robotics cuda ros mesh lidar rtx optix embree triangle-mesh micp rmagine mesh-localization micp-l mesh-icp ray-casting-correspondences |
|