This repository is a ROS2 port of FAST-LIO-MULTI,
which itself is a multi-LiDAR extension of FAST-LIO2.
- Original project: FAST-LIO-MULTI (ROS1)
- This fork: FAST-LIO-MULTI_ROS2 (ROS2)
- ROS2 integration and structure inspired by: FAST_LIO_ROS2
Optionally, the user can choose one of:
- Bundle update
- Asynchronous update
- Adaptive update
The algorithmic behavior of the three update modes is kept as close as possible to the original ROS1 implementation, with only the ROS interface and required glue adapted to ROS2.
Original FAST-LIO-MULTI demo video (ROS1):
https://youtu.be/YQmjKMoBPNU
The update methods and performance characteristics described there also apply conceptually to this ROS2 port.
- ROS2 (tested with Humble)
- Ubuntu (tested with 22.04)
- PCL ≥ 1.8
- Eigen ≥ 3.3.4
For Livox sensors, use the ROS2 driver:
Example installation:
# In your ROS2 workspace
cd ~/your_ros2_ws/src
git clone https://github.com/Livox-SDK/livox_ros_driver2.git
cd ..
rosdep install --from-paths src --ignore-src -r -y
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
source install/setup.bashcd ~/your_ros2_ws/src
git clone https://github.com/Draxran/FAST_LIO_MULTI_ROS2.git
cd FAST_LIO_MULTI_ROS2
git submodule update --init --recursiveFrom the workspace root:
cd ~/your_ros2_ws
rosdep install --from-paths src --ignore-src -r -y
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
source install/setup.bashA ROS2 launch file is provided:
# Bundle update
ros2 launch fast_lio_multi fast_lio_multi.launch.py update_method:=bundle
# Asynchronous update
ros2 launch fast_lio_multi fast_lio_multi.launch.py update_method:=async
# Adaptive update
ros2 launch fast_lio_multi fast_lio_multi.launch.py update_method:=adaptiveThe launch file wraps the same three mapping nodes (bundle / async / adaptive) as in the original ROS1 project, but using ROS2 nodes, topics, and parameters.
- Bundle update: merge multi LiDAR scans into one pointcloud, and then update
- Prevent no scan data input in extreme situation, e.g., high altitude flight of drones
- Longer update interval (which may cause drift during aggresive and fast movement from state propagation with only IMU)
- NOTE: current code implementation will properly work for LiDARs with same scan rates (e.g., same 10Hz)
- Asynchronous update: update the filter whenever LiDAR scan inputs
- Shorter update interval (which may reduce drift from state propagation with only IMU)
- Depending on the sensor configuration, none-scanned data update may occur (which may result in divergence)
- Adaptive update method
- Asynchronous update => bundle update (only when data in FoV is not enough) => asynchronous update
- Shorter update interval + preventing no scan data input!
Update methods - (upper): Bundle, (middle): Asynchronous, (bottom): Adaptive
- By utilizing the forward and backward propagation structure of FAST-LIO2, each update method is implemented as follows:
Update methods - (left): Bundle (right): Asynchronous
Results of each method (for better understanding, please watch the related video)
- For two sensor configurations,
- Config1: Livox-MID360 x 2EA (each is tilted +143, -143 degree)
- Config2: Livox-MID360 x 1EA (0 degree tilted), Livox-AVIA x 1EA (90 degree tilted)
Sensor config - (left): config1 (right): config2
- For aggresive motion and middle-altitude flight situation with sensor config1, asynchronous update method shows better performance
- Green: ground-truth, turquoise: FAST-LIO-MULTI
Side view - (left): Bundle (right): Async
Top view - (left): Bundle (right): Async
- For high-altitude flight situation (no many scanned data) with sensor config2, bundle update method shows better and robust performance
- Green: ground-truth, turquoise: FAST-LIO-MULTI



