Skip to content
/ RESPLE Public

The first 6-DoF spline-based recursive motion esimator for LiDAR-based odometry

License

Notifications You must be signed in to change notification settings

ASIG-X/RESPLE

Repository files navigation

RESPLE: Recursive Spline Estimation for LiDAR-Based Odometry

YouTube | arXiv | Website

This is the offcial repository for RESPLE, the first B-spline-based recursive state estimation framework for estimating 6-DoF dynamic motions. Using RESPLE as the estimation backbone, we developed a unified suite of direct LiDAR-based odometry systems, including:

  • LiDAR-only odometry (LO)
  • LiDAR-inertial odometry (LIO)
  • Multi-LiDAR odometry (MLO)
  • Multi-LiDAR-inertial Odometry (MLIO)

These four variants have been tested in real-world datasets and our own experiments, covering aerial, wheeled, legged, and wearable platforms operating in indoor, urban, wild environments with diverse LiDAR types. We look forward to your comments and feedback!

BibTex Citation

@ARTICLE{cao2025resple,
  author={Cao, Ziyu and Talbot, William and Li, Kailai},
  title={RESPLE: Recursive Spline Estimation for LiDAR-Based Odometry}, 
  journal={arXiv preprint arXiv:2504.11580},
  year={2025}
}

Dependencies

Tested with ROS2 Humble on Ubuntu 22.04

sudo apt install libomp-dev libpcl-dev libeigen3-dev
sudo apt install ros-humble-pcl*
# Optional: sudo apt install ros-humble-rosbag2-storage-mcap (for playing .mcap file if testing GrandTour dataset)

Compilation

cd ~/ros2_ws/src
git clone --recursive [email protected]:ASIG-X/RESPLE.git
cd ..
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select estimate_msgs livox_ros_driver livox_interfaces livox_ros_driver2 resple

Docker Build

To build a docker image capable of running the examples and dataset:

cd ~/path/to/src
git clone --recursive [email protected]:ASIG-X/RESPLE.git
cd RESPLE
docker build --ssh default --tag lidar_spline_filter .

Own experimental datasets (LINK to SURFdrive)

Password: RESPLE2025


HelmDyn (Helm Dynamic) dataset

  • 1 Livox Mid360 mounted on a helmet as a mobile platform
  • 10 sequences recorded with very dynamic motions combining walking, running, jumping, and in-hand waving within a cubic space
  • Ground truth trajectory recorded using a high-precision (submillimeter), low-latency motion capture system (Qualisys) invovling 20 cameras

R-Campus dataset

  • 1 Livox Avia mounted on a bipedal wheeled robot (Direct Drive DIABLO)
  • 1 sequence in walking speed recorded in a large-scale campus environment
  • Trajectory starts and ends at the same location point.

Usage

For LIO use, change if_lidar_only in resple/config/config_xxx.yaml to false.

source install/setup.bash
ros2 launch resple resple_helmdyn01.launch.py
# Open another terminal and run
source install/setup.bash
ros2 bag play /path/to/bag/
source install/setup.bash
ros2 launch resple resple_r_campus.launch.py
# Open another terminal and run
source install/setup.bash
ros2 bag play /path/to/bag/
source install/setup.bash
ros2 launch resple resple_eee_02.launch.py
# Open another terminal and run
source install/setup.bash
ros2 bag play /path/to/bag/
  • MCD dataset (Livox Mid70)
source install/setup.bash
ros2 launch resple resple_ntu_day_01.launch.py
# Open another terminal and run
source install/setup.bash
ros2 bag play /path/to/bag/
  • GrandTour (Hesai XT32, Livox Mid360)
source install/setup.bash
ros2 launch resple resple_heap_testsite_hoenggerberg.launch.py
# ros2 launch resple resple_jungfraujoch_tunnel_small.launch.py
# Open another terminal and run
source install/setup.bash
ros2 bag play /path/to/hesai_livox_ap20_converted.mcap

Docker

With the docker image built (see docker build instructions), one can run the run the algorithm in a docker container by following these steps.

Allow the docker user to generate graphics:

xhost +local:docker

Replacing /path/to/data with the location of the datasets, run the container (with mounted source code for development):

docker run -it -e DISPLAY=$DISPLAY \
  -v .:/root/ros2_ws/src/RESPLE \
  -v /tmp/.X11-unix/:/tmp/.X11-unix/ \
  -v ~/data/resple_dataset/:/root/data/resple_dataset \
  -v ~/data/grand_tour_box/datasets:/root/data/grand_tour_box/datasets \
  --name lidar_spline_filter lidar_spline_filter

Note: To recompile inside the docker container run colcon build --packages-select resple. If no development is indended, then one can omit -v .:/root/ros2_ws/src/RESPLE.

Replacing <filename> with the launch file from above, launch with:

ros2 launch resple <filename>.launch.py

Create a second terminal attached to the container with:

docker exec -it lidar_spline_filter bash

In this second container, replacing <example>/<filename> to make a valid bag filepath, play the dataset:

ros2 bag play ~/data/resple_dataset/<example>/

If the container is already run, then:

  • It can be removed with:
docker rm lidar_spline_filter
  • It can be started with:
docker start lidar_spline_filter
  • It can be be attached to with:
docker attach lidar_spline_filter
  • It can be stopped with:
docker stop lidar_spline_filter

Contributors

Ziyu Cao (Email: [email protected])

William Talbot (Email: [email protected])

Kailai Li (Email: [email protected])

Credits

Thanks for SFUISE, ikd-Tree, FAST-LIO, Livox-SDK, and basalt.

License

The source code is released under GPLv3 license.