Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |
Dependant Packages
Launch files
Messages
Services
Plugins
Recent questions tagged rko_lio at Robotics Stack Exchange
Package Summary
| Version | 0.4.0 |
| License | MIT |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/PRBonn/rko_lio.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2026-09-13 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Maintainers
- Meher Malladi
Authors
RKO-LIO
Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling
Four different platforms, four different environments, one odometry system
Still early days, but if you want drift correction on top of the odometry, have a look at rko_slam.
Quick Start
Following is for the python version, see ROS for that.
Assuming you have a rosbag (ros1/ros2) which contains a TF tree, you can run RKO-LIO through
pip install "rko_lio[all]"
# or
pip install rko_lio rosbags "rerun-sdk>=0.31"
# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)
rko_lio -v /path/to/data
Why pip install those three packages?
-
rko_lio-> the odometry package -
rosbags-> required for the rosbag dataloader. Both ros1 and ros2 bags are supported! -
rerun-sdk-> required for the optional visualizer (-vflag)
pip install "rko_lio[all]" fetches the other optional dependencies as well.
Check further options for the CLI through rko_lio --help.
To dump a default config you can edit and pass with --config, run rko_lio --dump_config.
More details are available in the Python docs.
Extrinsics and convention
Please note that the system needs the extrinsic to be specified between IMU and LiDAR. Either your data includes this in some format, and then the dataloaders try to automatically read it, or otherwise you can specify it in a config file (required if it’s missing in the data). Pass the config file with
rko_lio --config config_file.yaml
This file needs two keys: extrinsic_imu2base_quat_xyzw_xyz and extrinsic_lidar2base_quat_xyzw_xyz, which must each be a list. For example: [0,0,0,1,0,0,0] for identity. Both keys are required.
Throughout this package, I refer to transformations using transform_<from-frame>2<to-frame>. By this, I mean a transformation that converts a vector expressed in the <from-frame> coordinate system to the <to-frame> coordinate system. Mathematically, this translates to:
The superscript on the vector indicates the frame in which the vector is expressed, and $^{ \mathrm{to} }\mathbf{T}_{\mathrm{from}}$ corresponds to transform_<from-frame>_to_<to-frame>.
ROS
Supported distros: Humble, Jazzy, Kilted, Lyrical, Rolling.
sudo apt install ros-$ROS_DISTRO-rko-lio
Or if you’d like to build from source, clone the repo into your colcon workspace and
rosdep install --from-paths src --ignore-src -r -y
colcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+
In case you cannot system install the necessary dependencies through rosdep, you can also build the dependencies while building RKO-LIO
colcon build --packages-select rko_lio --cmake-args -DRKO_LIO_FETCH_CONTENT_DEPS=ON
A launch file is provided:
ros2 launch rko_lio odometry.launch.py
The topics and frames are autodetected (experimental). To set them yourself instead:
File truncated at 100 lines see the full file
Changelog for package rko_lio
0.4.0 (2026-09-01)
- core, ros: reset odometry on fatal registration error (#183) adds a reset count publisher for downstream subscribers
- core: widen the size check on register scan entry to catch more possible errors
- core: drop imu messages with negative dt
- ros: reorder declaration of jthreads to avoid a possible race
- core: use typed exceptions and clean up error handling (#182) frame drops and fatal errors can now be distinguished
- core: switch to an spdlog sink instead of cout/cerr for core logs (#180) on ros, spdlog is redirected to an rclcpp sink so ros log levels are respected
- core, ci: bump clang tidy to latest, clean up linter warnings (#179)
- core, ros: remove nlohmann_json as a dep, dump config as yaml instead (#177)
- ros: drop the oldest frame on the online node instead of the latest scan (#155)
- core: extrapolate the motion prior across a lidar gap instead of throwing (#174) a gap longer than the allowed scan delta used to permanently stop odometry instead of just the one scan spanning it
- core: timestamp struct handling cleanup, min/max computed once (#175)
- core, ros: consistent naming, and make the voxel map's state private (#171) breaking core api renames: VoxelHashMap::pointcloud() -> points(), ros::LidarFrame -> LidarScan
- core: deskew without a per-point SE3 exp (#172)
- ros: fix a deadlock on the offline node bag read
- ros, config: limit max iterations to 50 by default was 500
- ros: change default num threads to 1, and reduce the lidar buffer size
- core: quantise the voxel map to int8 offsets with fixed-size inline blocks (#170) cuts local map memory footprint
- core: use pmr for voxel down sample to reduce allocations
- core: switch icp to right perturbation (#163) theoretically better conditioning at very large scales
- chore: enforce formatters and linters through pre-commit, various lint fixes (#162) clang-format, ruff, cmake-format, clang-tidy and codespell across the repo. also scopes BUILD_SHARED_LIBS to the python wheel build: it was set globally from TBB's dependency file, so a ROS user building with FetchContent hit oneTBB's static-build warning meant only for the wheel
- core: redo tbb threading control using task arena instead of global allows multiple components in a process to use tbb independently. also fixes a build breakage where tbb needed to be a public link, not private
- core: better icp convergence criterion, function tolerance over param delta (#161)
- floating point type is now configurable to float or double (#160) across core, py, ros; a build-time switch, no runtime cost
- core, perf: reducing scan copies (#159)
- core, cleanup: linear system build cleanup, and voxel map op unification (#158)
- core, perf: improve closest neighbour search by early pruning voxels (#157)
- Contributors: Dhagash Desai, Meher Malladi
0.3.2 (2026-07-28)
- ros, launch: autodetect topics and frames (#152) the imu and lidar topics, the sensor frames and the base frame are filled in from the running graph, or from the bag in offline mode
0.3.1 (2026-07-16)
- ros: fix rolling compat break, plus a bunch of deprecation warnings (#149) add a ros nightly image based weekly ci job so i have my own signal of api changes upstream
- py: improve raw dataloader and remove open3d as a dep (#148)
0.3.0 (2026-06-16)
- misc: adds testing for lyrical, fixes the current ci fails
(#142)
- adds testing for lyrical, fixes the current ci fails, and switches to leaner images for ci
- use VoxelHash struct to avoid ODR violations (#140) Co-authored-by: Meher Malladi <<rm.meher97@gmail.com>>
- core: revert voxel down sample sorted (#141) not a 1-1 improvement over previous behavior
- core: Fix tbb threading using max_num_threads
File truncated at 100 lines see the full file
Package Dependencies
| Deps | Name |
|---|---|
| ament_cmake | |
| rclpy | |
| tf2_ros_py | |
| rosbag2_py | |
| rosidl_runtime_py | |
| sophus | |
| rclcpp | |
| std_msgs | |
| tf2 | |
| tf2_ros | |
| sensor_msgs | |
| nav_msgs | |
| geometry_msgs | |
| rosbag2_cpp | |
| rosbag2_storage | |
| rclcpp_components |
System Dependencies
| Name |
|---|
| eigen |
| tbb |
| robin-map-dev |
| spdlog |