{"id":31802046,"url":"https://github.com/prbonn/rko_lio","last_synced_at":"2025-10-11T00:16:27.471Z","repository":{"id":313058852,"uuid":"1049806969","full_name":"PRBonn/rko_lio","owner":"PRBonn","description":"A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modelling","archived":false,"fork":false,"pushed_at":"2025-10-04T00:53:20.000Z","size":4070,"stargazers_count":299,"open_issues_count":3,"forks_count":15,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-10-04T02:22:54.026Z","etag":null,"topics":["imu","inertial","lidar","lidar-inertial-odometry","mapping","odometry","robotics","ros","ros2","slam"],"latest_commit_sha":null,"homepage":"https://arxiv.org/abs/2509.06593","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PRBonn.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.rst","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-03T14:19:50.000Z","updated_at":"2025-10-04T00:53:17.000Z","dependencies_parsed_at":"2025-09-03T18:10:38.013Z","dependency_job_id":"64b335dd-60ab-4ac6-8112-240b67dbcc29","html_url":"https://github.com/PRBonn/rko_lio","commit_stats":null,"previous_names":["prbonn/rko_lio"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/PRBonn/rko_lio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PRBonn%2Frko_lio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PRBonn%2Frko_lio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PRBonn%2Frko_lio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PRBonn%2Frko_lio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PRBonn","download_url":"https://codeload.github.com/PRBonn/rko_lio/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PRBonn%2Frko_lio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279005657,"owners_count":26083941,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["imu","inertial","lidar","lidar-inertial-odometry","mapping","odometry","robotics","ros","ros2","slam"],"created_at":"2025-10-11T00:16:20.453Z","updated_at":"2025-10-11T00:16:27.466Z","avatar_url":"https://github.com/PRBonn.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  RKO LIO\n\u003c/h1\u003e\n\u003ch3 align=\"center\"\u003eRobust LiDAR-Inertial Odometry Without Sensor-Specific Modelling\u003c/h3\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![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/)\n\n\n\u003cp align=\"center\"\u003e\n  ROS Distros:\u003cbr /\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/ros_build_humble.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/ros_build_humble.yaml?branch=master\u0026label=Humble\" alt=\"Humble\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/ros_build_jazzy.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/ros_build_jazzy.yaml?branch=master\u0026label=Jazzy\" alt=\"Jazzy\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/ros_build_kilted.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/ros_build_kilted.yaml?branch=master\u0026label=Kilted\" alt=\"Kilted\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/ros_build_rolling.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/ros_build_rolling.yaml?branch=master\u0026label=Rolling\" alt=\"Rolling\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n  Python Bindings:\u003cbr /\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/python_bindings_ubuntu_2204.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/python_bindings_ubuntu_2204.yaml?branch=master\u0026label=Ubuntu%2022.04\" alt=\"Ubuntu 22.04\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/python_bindings_ubuntu_2204_arm.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/python_bindings_ubuntu_2204_arm.yaml?branch=master\u0026label=Ubuntu%2022.04%20ARM\" alt=\"Ubuntu 22.04 ARM\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/python_bindings_ubuntu_2404.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/python_bindings_ubuntu_2404.yaml?branch=master\u0026label=Ubuntu%2024.04\" alt=\"Ubuntu 24.04\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/python_bindings_ubuntu_2404_arm.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/python_bindings_ubuntu_2404_arm.yaml?branch=master\u0026label=Ubuntu%2024.04%20ARM\" alt=\"Ubuntu 24.04 ARM\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/python_bindings_macos_14.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/python_bindings_macos_14.yaml?branch=master\u0026label=macOS%2014\" alt=\"macOS 14\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/python_bindings_macos_15.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/python_bindings_macos_15.yaml?branch=master\u0026label=macOS%2015\" alt=\"macOS 15\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/python_bindings_windows_2022.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/python_bindings_windows_2022.yaml?branch=master\u0026label=Windows%202022\" alt=\"Windows 2022\" /\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/PRBonn/rko_lio/actions/workflows/python_bindings_windows_11_arm.yaml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/PRBonn/rko_lio/python_bindings_windows_11_arm.yaml?branch=master\u0026label=Windows%2011%20ARM\" alt=\"Windows 11 ARM\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.youtube.com/watch?v=NNpzXdf9XmU\" target=\"_blank\"\u003e\n    \u003cimg src=\"/docs/_static/example_multiple_platforms_shadow.png\" alt=\"Visualization of odometry system running on data from four different platforms in four different environments\" style=\"max-width: 100%; height: auto;\" width=\"800\"/\u003e\n  \u003c/a\u003e\n  \u003cbr /\u003e\n  \u003cem\u003eFour different platforms, four different environments, one odometry system\u003c/em\u003e\n\u003c/p\u003e\n\n## Quick Start\n\n\u003c!-- [demo video here] --\u003e\n\nAssuming you have a rosbag (ros1/ros2) which contains a TF tree, you can inspect the results of our odometry system with the following two steps\n\n```bash\npip install rko_lio rosbags rerun-sdk\n```\n\nWhy these three packages?\n- `rko_lio` -\u003e our odometry package\n- `rosbags` -\u003e required for our rosbag dataloader. Both ros1 and ros2 bags are supported!\n- `rerun-sdk` -\u003e required for our optional visualizer (`-v` flag)\n\nNext, run\n\n```bash\n# data path should be a directory with *.bag files (ROS1) or a metadata.yaml (ROS2)\nrko_lio -v /path/to/data\n```\n\nand you should be good to go!\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eClick here for some more details on how the above works and how to use RKO LIO!\u003c/b\u003e\u003c/summary\u003e\n\u003cbr /\u003e\n\nThe `-v` flag enables visualization.\n\nYou can specify a dataloader to use with `-d`, but if you don't, we try to guess the format based on the layout of the data.\n\nOur rosbag dataloader works with either ROS1 or ROS2 bags.\nPlace split ROS1 bags in a single folder and pass the folder as the data path.\nNote that we don't support running RKO LIO on partial or incomplete bags, though you can try (and maybe raise an issue if you think we should support this).\nROS2 especially will need a `metadata.yaml` file.\n\nBy default, we assume there is just one IMU topic and one LiDAR topic in the bag, in which case we automatically pick up the topic names and proceed further.\nIf there are multiple topics per sensor, you will be prompted to select one via the `--imu` or `--lidar` flags, which you can pass to `rko_lio`.\n\nNext, we assume there is a (static) TF tree in the bag.\nIf so, we take the frame ids from the message topics we just picked up, build a static TF tree, and then query it for the extrinsic from IMU to LiDAR.\nOur odometry estimates the robot pose with respect to a base frame, and by default, we assume the LiDAR frame to be the base frame.\nIf you would like to use a different frame, you can pass the frame id with `--base_frame` (note the other options available with `--help`).\nThe TF tree will be queried for the appropriate transformations (if they exist in the bag!).\n\nIn case there is no TF tree in the bag, then you will have to manually specify the extrinsics for IMU to base frame and LiDAR to base frame, as these two are **required** parameters.\nSet one of the extrinsics to identity if you want that one to be the base frame (you will still have to specify both parameters).\nYou can specify the extrinsics via a config YAML file with the keys `extrinsic_imu2base_quat_xyzw_xyz` and `extrinsic_lidar2base_quat_xyzw_xyz`.\n\nYou can dump a config with all the options set to default values by running `rko_lio --dump_config`.\nModify as you require, and pass this file to `rko_lio` using the `-c` flag.\nPlease check `python/config` in the GitHub repository for example configurations.\n\nAn example invocation would then be\n\n```bash\n# the config should have the sensor extrinsics if the rosbag doesn't\nrko_lio -v -c config.yaml --imu imu_topic --lidar lidar_topic /path/to/rosbag_folder\n```\n\nFor all possible CLI flags, please check `rko_lio --help`.\n\n\u003c/details\u003e\n\nFor more install and usage instructions of our python interface, please refer to the [python readme](/python/README.md#rko_lio---python-bindings), [config.md](/docs/config.md), and [data.md](/docs/data.md).\n\nThe python interface to our system can be convenient to investigate recorded data offline as you don't need to setup a ROS environment first.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eBut please prefer the ROS version over the python version if you can!\u003c/b\u003e\u003c/summary\u003e\n\u003cbr /\u003e\n\nThe ROS version is the intended way to use our odometry system on a robot.\nThe ROS version also has better performance mainly due to how we read incoming data.\nWithout getting into details, if you can, you should prefer using the ROS version.\nFor offline use, we provide a way to directly inspect and run our odometry on recorded rosbags (see offline mode in [ROS usage](/ros/README.md#usage)), which should be preferred over the python dataloader.\nThe python interface is merely meant to be a convenience.\n\n\u003c/details\u003e\n\n### ROS2\n\n\u003e We are working on getting the odometry package into the ROS index, so you can install it using system package managers instead of building from source.\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHere's a ROS2 quick start!\u003c/b\u003e\u003c/summary\u003e\n\u003cbr /\u003e\n\nClone the repository into your ROS workspace and then\n\n```bash\n# we use ninja to build by default\ncolcon build --packages-select rko_lio # --symlink-install --event-handlers console_direct+\n```\n\nTo launch the odometry node:\n\n```bash\nros2 launch rko_lio odometry.launch.py # config_file:=/path/to/a/config.yaml rviz:=true\n```\n\nNote that we have some [default build configuration options](ros/colcon.pkg) which should automatically get picked up by colcon.\nWe have a few dependencies, but as long as these defaults apply, the package should build without any further consideration.\nIf you encounter any issues, please check [docs/build.md](docs/build.md) for further details or open an issue afterwards.\n\n\u003c/details\u003e\n\nPlease refer to the [ROS readme](/ros/README.md) for further ROS-specific details.\n\n## License\n\nThis project is free software made available under the MIT license. For details, see the [LICENSE](LICENSE) file.\n\n## Citation\n\nIf you found this work useful, please consider leaving a star on this repository and citing our [paper](https://arxiv.org/abs/2509.06593):\n\n```bib\n@article{malladi2025arxiv,\n  author      = {M.V.R. Malladi and T. Guadagnino and L. Lobefaro and C. Stachniss},\n  title       = {A Robust Approach for LiDAR-Inertial Odometry Without Sensor-Specific Modeling},\n  journal     = {arXiv preprint},\n  year        = {2025},\n  volume      = {arXiv:2509.06593},\n  url         = {https://arxiv.org/pdf/2509.06593},\n}\n```\n\n### RA-L Submission\n\nYou can check out the branch `ral_submission` for the version of the code used for submission to RA-L. Please note that that branch is meant to be an as-is reproduction of the code used during submission and is not supported. The `master` and release versions are vastly improved, supported, and are the recommended way to use this system.\n\n## Acknowledgements\n\n\u003cdetails\u003e\n\u003csummary\u003eKISS-ICP, Kinematic-ICP, Bonxai, PlotJuggler, Rerun\u003c/summary\u003e\n\nThis package is inspired by and would not be possible without the work of [KISS-ICP](https://github.com/PRBonn/kiss-icp) and [Kinematic-ICP](https://github.com/PRBonn/kinematic-icp).\nAdditionally, we use and rely heavily on, either in the package itself or during development, [Bonxai](https://github.com/facontidavide/Bonxai), [PlotJuggler](https://github.com/facontidavide/PlotJuggler), [Rerun](https://github.com/rerun-io/rerun), and of course ROS itself.\n\nA special mention goes out to [Rerun](https://rerun.io/) for providing an extremely easy-to-use but highly performative visualization system. Without this, I probably would not have made a python interface at all.\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprbonn%2Frko_lio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprbonn%2Frko_lio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprbonn%2Frko_lio/lists"}