Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
jazzy

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
kilted

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
lyrical

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
rolling

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro ardent showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro bouncy showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro crystal showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro eloquent showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro dashing showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro galactic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro foxy showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro iron showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro lunar showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro jade showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro indigo showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro hydro showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro kinetic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro melodic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange

No version for distro noetic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

rko_lio package from rko_lio repo

rko_lio

ROS Distro
humble

Package Summary

Version 0.4.2
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-29
Dev Status DEVELOPED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling

Maintainers

  • Meher Malladi

Authors

No additional authors.

RKO-LIO

Robust LiDAR-Inertial Odometry Without Sensor-Specific Modelling

[![IEEE RA-L](https://img.shields.io/badge/IEEE_RA--L-10.1109%2FLRA.2026.3685966-00629B.svg)](https://doi.org/10.1109/LRA.2026.3685966) [![arXiv](https://img.shields.io/badge/arXiv-2509.06593-b31b1b.svg)](https://arxiv.org/abs/2509.06593) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_lio)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_lio)](/) [![PyPI - Version](https://img.shields.io/pypi/v/rko_lio?color=blue)](https://pypi.org/project/rko-lio/) [![ROS Package Index](https://img.shields.io/ros/v/humble/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#humble) [![ROS Package Index](https://img.shields.io/ros/v/jazzy/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#jazzy) [![ROS Package Index](https://img.shields.io/ros/v/kilted/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#kilted) [![ROS Package Index](https://img.shields.io/ros/v/lyrical/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#lyrical) [![ROS Package Index](https://img.shields.io/ros/v/rolling/rko_lio?color=blue)](https://index.ros.org/p/rko_lio/#rolling)

Visualization of odometry system running on data from four different platforms in four different environments
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 (-v flag)

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:

\[\mathbf{v}^{\mathrm{to}} = {}^{\mathrm{to}}\mathbf{T}_{\mathrm{from}} \mathbf{v}^{\mathrm{from}}\]

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+

File truncated at 100 lines see the full file

CHANGELOG

Changelog for package rko_lio

0.4.2 (2026-09-29)

  • ros: add support for compressed clouds (#187)
  • Contributors: Meher Malladi

0.4.1 (2026-09-25)

  • core, api break: publish deskewed scan in base frame, change topic name (#185) topic renamed from rko_lio/frame to rko_lio/deskewed_scan, previously in the lidar frame
  • ros, utils: log transform lookup failures only behind a flag
  • ros, launch: clean up autodetect again
  • ros: add use_sim_time param to launch
  • core, fix: voxel map quantisation cleanup the full int8 range is used now. and an issue with round tripping point to quanta to point landing in a different voxel (the upper face) is fixed by changing the min and max bounds. approximation error goes up near the upper face of a voxel, mm level at typical voxel sizes
  • core: make voxel center public api
  • ros, fix: stamp the local map publish with the latest scan time and not now()
  • ros, fix: the listener was changed in lyrical, breaks before that ugly macro but what can one do. i do want the cleanup in behavior
  • ros, fix: clean up how the tf listener is made, fixes creation on rolling
  • ros, launch: make autodetect suitable for use in other libs
  • ros, fix: tbb was missed in the export list after the public link change
  • ros, fix: node shutdown callback cleanup
  • ros, utils: add a point cloud write version that includes intensities
  • core: move deskew to its own TU. enables reuse in other projects should essentially be a no-op for all use cases. just adds a new function to the public api
  • ros, utils: add a to_se3 free func, cleans up extrinsic handling
  • ros, utils: make ingesting dynamic tf optional (default true)
  • ros: cleaning up offline bag reader seek on bag becomes seek from start in relative instead of absolute time, to make it more convenient. tf is directly read into the tf buffers instead of a doing a round trip via the rmw.

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,

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged rko_lio at Robotics Stack Exchange