Please change branch to Bunker-DVI-Dataset-reg-1 for quick experiment.
Download the dataset from Bunker DVI Dataset
Runs the EllipseLIO LiDAR-Inertial odometry algorithm on a ROS 2 bag file and converts the output to an HDMapping session.
EllipseLIO is an Adaptive LiDAR Inertial Odometry approach with an Ellipsoid Representation, by V4RL, ETH/UCY.
- Docker
- A ROS 2 bag containing a
sensor_msgs/msg/PointCloud2topic and asensor_msgs/msg/Imutopic matching the topic names declared in the chosen EllipseLIO config file (ROS 1 bags are automatically converted to ROS 2 format).
git clone https://github.com/MapsHD/benchmark-EllipseLIO-to-HDMapping.git --recursive
cd benchmark-EllipseLIO-to-HDMappingdocker build -t ellipselio_humble .This installs:
- Ubuntu 22.04 + ROS 2 Humble
- Eigen3, PCL, OpenCV, Boost, OpenMP
- EllipseLIO (compiled from submodule)
- ROS 2 workspace with
ellipselioandellipselio-to-hdmapping
The build takes several minutes on first run.
chmod +x docker_session_run-ros2-ellipselio.sh
./docker_session_run-ros2-ellipselio.sh /path/to/input.bag /path/to/output/dirOr with no arguments to use a GUI file selector (requires zenity):
./docker_session_run-ros2-ellipselio.shBy default the script uses the mid360_hdmapping.yaml EllipseLIO config, the
Livox Mid-360 config the EllipseLIO authors prepared for HDMapping (Bunker DVI
dataset). Pick a different one with the CONFIG_FILE environment variable, e.g.:
CONFIG_FILE=os64_ncd.yaml ./docker_session_run-ros2-ellipselio.sh /path/to/input.bag /path/to/output/dirAvailable configs (from the ellipselio/config/ directory):
| Config | LiDAR | Typical dataset |
|---|---|---|
mid360_hdmapping.yaml |
Livox Mid-360 | Bunker DVI (HDMapping) — default |
mid360_grandtour.yaml |
Livox Mid-360 | GrandTour |
avia_geode.yaml |
Livox Avia | GEODE Gamma |
qt64_spires.yaml |
Hesai Pandar QT64 | Oxford Spires |
xt32_grandtour.yaml |
Hesai XT-32 | GrandTour |
os64_ncd.yaml |
Ouster OS-64 | Newer College |
os128_ncd.yaml |
Ouster OS-128 | Newer College |
os64_geode.yaml |
Ouster OS-64 | GEODE Beta |
vlp16_bot.yaml |
Velodyne VLP-16 | BotanicGarden |
vlp16_geode.yaml |
Velodyne VLP-16 | GEODE Alpha |
vlp16_graco.yaml |
Velodyne VLP-16 | GraCo |
vlp16_grandtour.yaml |
Velodyne VLP-16 | GrandTour |
This repository's config/ directory adds livox_reg.yaml (the earlier
benchmark config for the Bunker DVI Mid-360). A file in config/ is mounted
into the container and takes precedence over a package config of the same name.
What happens:
The script opens a Docker container with a tmux session containing five panes (six with a Livox config) and a control window:
| Pane | Role |
|---|---|
| 0 | ros2 launch ellipselio ellipselio_standalone.launch.py — subscribes to the LiDAR + IMU topics from the chosen config, publishes /ellipselio_odom + /cloud_scan |
| 1 | RViz2 — live visualization of the EllipseLIO map and trajectory |
| 2 | ros2 bag record — captures the two published topics |
| 3 | ros2 bag play — plays your input bag with simulated clock |
| 4 | diagnostics — shows active topics and publishing rates |
| 5 | Livox configs only (lidar.type: 1): livox_format_bridge — converts the bag's /livox/pointcloud (livox_ros_driver layout, per-point float time offset) into EllipseLIO's Livox point format (absolute double timestamp) and publishes it on the config's lidar.topic |
| control | auto-shutdown — waits for playback to finish, then stops all nodes |
After playback completes, the control window automatically stops the recorder, kills all nodes, and exits tmux. A second Docker run then converts the recorded bag into the HDMapping session format.
Output files appear in <output_dir>/output_hdmapping-EllipseLIO/:
lio_initial_poses.reg
poses.reg
scan_lio_0.laz
scan_lio_1.laz
...
session.json
trajectory_lio_0.csv
trajectory_lio_1.csv
...
Open session.json with the
multi_view_tls_registration_step_2
application.
EllipseLIO requires both LiDAR point clouds and IMU data. The input topic names are configured inside the YAML config file (not as command-line parameters like D-LIO). The relevant fields are:
lidar:
type: 1|2|3|4 # LIVOX, VELODYNE, OUSTER, HESAI
rate: 10
topic: "/your/lidar/topic"
t_imu_lidar: [x, y, z]
r_imu_lidar: [qx, qy, qz, qw] # or a 3x3 rotation matrix (9 values, row-major)
imu:
rate: 200
topic: "/your/imu/topic"If the topic names in your bag differ from the ones in the chosen config,
either pick another config or put a customised config into this repository's
config/ directory and select it with CONFIG_FILE=<file name>.
The recorded topics (used by the converter) are also tunable via env vars:
| Variable | Meaning | Default |
|---|---|---|
ODOM_TOPIC |
EllipseLIO odometry output | /ellipselio_odom |
CLOUD_TOPIC |
EllipseLIO per-scan cloud (world frame) | /cloud_scan |
Note: EllipseLIO publishes /cloud_scan already expressed in the
odom_ellipselio (world) frame, so the converter does not re-apply the
odometry to the points — it only uses /ellipselio_odom to build the
per-chunk trajectory files.