How rainbroken/lio works
IteraLIO is a ROS 2 LiDAR–inertial odometry and mapping system. Its central workflow accepts sensor measurements, synchronizes and prepares scans, estimates motion by scan-to-map correction, updates local and global maps, and publishes odometry and map outputs. Optional backend keyframes and loop verification support pose-graph correction; evaluation records and run-comparison tools provide a separate analysis branch. The main pipeline and selected backend/loop internals are sampled; links for other subsystems follow the documented capabilities and repository layout, so uncertain internal call paths are omitted.
Main entry points: lio_pipeline.cpp LIO pipeline · itera_lio_node.cpp ROS node · input_adapter.cpp ROS input adapter · compare_lio_runs.py Run comparison
Components 27
ROS input/output
- Livox adapter
src/interfaces/src/livox_to_pointcloud2_node.cpp - ROS input adapter
src/itera_lio/src/ros/input_adapter.cpp - Measurement synchronizer
src/itera_lio/src/sensor/measurement_synchronizer.cpp - LiDAR parser
src/itera_lio/src/sensor/lidar_parser.cpp - ROS node
src/itera_lio/src/itera_lio_node.cpp - Output publisher
src/itera_lio/src/ros/publishers/output_publisher.cpp
Odometry frontend
- LIO pipeline
src/itera_lio/src/system/lio_pipeline.cpp - LIO processor
src/itera_lio/src/system/lio_processor.cpp - Iterated ESKF
src/itera_lio/src/estimator/iterated_eskf.cpp - LiDAR correction
src/itera_lio/src/estimator/lidar_update.cpp - Scan deskewer
src/itera_lio/src/frontend/deskewer.cpp - Scan-to-map registration
src/itera_lio/src/frontend/scan_to_map.cpp
Mapping
- Local map store
src/itera_lio/src/frontend/ikd_map.cpp - Local map manager
src/itera_lio/src/frontend/local_map_manager.cpp - Global map archive
src/itera_lio/src/frontend/global_map.cpp - Colored map
src/itera_lio/src/mapping/color/colored_global_map.cpp - PCD writer
src/itera_lio/src/output/pcd_writer.cpp
Backend and loops
- Backend manager
src/itera_lio/src/backend/backend_manager.cpp - Pose graph optimizer
src/itera_lio/src/backend/pose_graph_optimizer.cpp - Loop closure manager
src/itera_lio/src/loop/loop_closure_manager.cpp - Keyframe cloud store
src/itera_lio/src/loop/keyframe_cloud_store.cpp
Evaluation
- Evaluation logger
src/itera_lio/src/output/evaluation_logger.cpp - Run comparison
tools/compare_lio_runs.py - Run records
- Comparison report
Other components
- LiDAR and IMU
- ROS user
Connections 29
- LiDAR and IMU → Livox adapter: publishes scans
- Livox adapter → ROS input adapter: adapts messages
- LiDAR and IMU → ROS input adapter: sends measurements
- ROS input adapter → Measurement synchronizer: buffers measurements
- Measurement synchronizer → LiDAR parser: supplies scans
- ROS node → ROS input adapter: receives input
- ROS node → LIO processor: processes frames
- LIO processor → LIO pipeline: runs odometry
- LIO pipeline → Scan deskewer: prepares scan
- LIO pipeline → Scan-to-map registration: registers scan
- LIO pipeline → LiDAR correction: corrects state
- LiDAR correction → Iterated ESKF: updates estimate
- Scan-to-map registration → Local map store: queries map
- LIO pipeline → Local map manager: updates window
- Local map manager → Local map store: prunes points
- LIO pipeline → Global map archive: archives points
- LIO pipeline → Backend manager: adds keyframes
- LIO pipeline → Loop closure manager: submits keyframes
- Loop closure manager → Keyframe cloud store: stores clouds
- Backend manager → Pose graph optimizer: optimizes graph
- LIO pipeline → Colored map: optional coloring
- ROS node → Output publisher: publishes results
- Output publisher → ROS user: emits ROS outputs
- LIO pipeline → PCD writer: exports map
- ROS node → Evaluation logger: records run
- Evaluation logger → Run records: writes metrics
- ROS user → Run comparison: selects runs
- Run records → Run comparison: reads records
- Run comparison → Comparison report: writes report