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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

Repo symbol

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

Repo symbol

rko_slam repository

rko_slam

ROS Distro
kilted

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

Repo symbol

rko_slam repository

rko_slam

ROS Distro
lyrical

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

Repo symbol

rko_slam repository

rko_slam

ROS Distro
rolling

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file

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

rko_slam repository

rko_slam

ROS Distro
jazzy

Repository Summary

Checkout URI https://github.com/PRBonn/rko_slam.git
VCS Type git
VCS Version master
Last Updated 2026-09-29
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Packages

Name Version
rko_slam 0.0.1

README

rko_slam

ROS2 LiDAR-inertial SLAM and multi-session alignment

[![Jazzy](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_jazzy.yaml) [![Kilted](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_kilted.yaml) [![Lyrical](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_lyrical.yaml) [![Rolling](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml/badge.svg)](https://github.com/PRBonn/rko_slam/actions/workflows/ros_rolling.yaml) [![Docs](https://img.shields.io/badge/docs-prbonn.github.io-blue)](https://prbonn.github.io/rko_slam/) [![GitHub License](https://img.shields.io/github/license/PRBonn/rko_slam)](/LICENSE) [![GitHub last commit](https://img.shields.io/github/last-commit/PRBonn/rko_slam)](/)

Sub-maps of a drive placed by the odometry, doubling the road where the drive returns, then snapping into one road with rko_slam running on top
A drive that returns to where it started, with rko_lio, and with rko_slam running on top of it

Three closed maps: a vehicle run, a backpack run on Oxford Spires, and a backpack run in a DigiForests forest

Quick start

rko_slam runs on rko_lio, my LiDAR-inertial odometry, or on your own odometry. Build it with rko_lio:

cd <ws>/src
git clone https://github.com/PRBonn/rko_lio
git clone https://github.com/PRBonn/rko_slam
cd <ws> && rosdep install --from-paths src --ignore-src -y
colcon build --packages-select rko_lio rko_slam

What it needs

  • A LiDAR (sensor_msgs/PointCloud2 with per-point timestamps) and an IMU (sensor_msgs/Imu).
  • The LiDAR and IMU frames linked to your base frame on TF, e.g. by your URDF.

The TF tree: rko_slam publishes map from odom, your odometry odom from base_link, your URDF base_link from the LiDAR and, dashed as optional, the IMU frame

Run

odometry_and_slam.launch.py starts rko_lio and rko_slam together and finds the LiDAR and IMU topics and your base frame by itself. Start your robot, then:

ros2 launch rko_slam odometry_and_slam.launch.py rviz:=true

From a bag, in two terminals, bag first:

ros2 bag play <bag> --clock
ros2 launch rko_slam odometry_and_slam.launch.py use_sim_time:=true rviz:=true

If your setup differs:

Your setup Do this
Base frame named other than base_link, base_footprint or base base_frame:=<yours>
Several LiDAR or IMU topics, e.g. the LiDAR driver’s own IMU an rko_lio config file naming yours and your base frame, below
LiDAR and IMU messages share one frame_id and no TF links it to a base frame, e.g. a Livox with its built-in IMU an rko_lio config file with identity extrinsics, below
Topics or TF take over 10 s to appear autodetect_timeout:=<seconds>
Something else already publishes odom <- <your base frame>, e.g. robot_localization or the bag’s /tf turn it off, or run with your own odometry, below

An rko_lio config file, passed with rko_lio_config_file:=<file>, replaces the autodetection (all keys):

lidar_topic: /livox/lidar
imu_topic: /livox/imu
# LiDAR and IMU in one frame, no TF
base_frame: livox_frame
extrinsic_lidar2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]
extrinsic_imu2base_quat_xyzw_xyz: [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0]

With your own odometry

slam.launch.py starts rko_slam alone, on any locally consistent odometry that publishes odom <- base_link on TF:

```bash

File truncated at 100 lines see the full file