Please change branch to Bunker-DVI-Dataset-reg-1 for quick experiment.
Download the dataset from Bunker DVI Dataset
Runs the MAP_LIO LiDAR-inertial odometry on a ROS 1 bag file and converts the output to an HDMapping session.
MAP_LIO (E. Vezeteu et al.) is a single-state maximum a posteriori (MAP) LiDAR-inertial estimator with data-driven covariances from local geometric uncertainty. It can additionally fuse a prior airborne (ALS) map and GNSS-INS poses; this benchmark builds and runs the LiDAR-inertial part only (no prior map). MAP_LIO is released for academic research use only, see its repository.
- Docker
- A ROS 1 bag with a
sensor_msgs/PointCloud2LiDAR topic and asensor_msgs/Imutopic (ROS 2 bags are automatically converted to ROS 1 format). MAP_LIO reads the Hesai driver's point format:x,y,z,intensityand a per-pointtimestamp(float64, absolute time in seconds). Clouds with a relative per-pointtime(float32, seconds after the header stamp), e.g. Livox clouds aggregated by livox_bag_aggregate, are converted to that format automatically.
git clone https://github.com/MapsHD/benchmark-MAP_LIO-to-HDMapping.git --recursive
cd benchmark-MAP_LIO-to-HDMappingdocker build -t map-lio_noetic .This installs:
- Ubuntu 20.04 + ROS 1 Noetic
- Eigen3, PCL, GeographicLib and the ROS packages MAP_LIO needs
- Sophus (non-templated version, the commit MAP_LIO pins)
- catkin workspace with
map_lioandmap_lio_to_hdmapping
chmod +x docker_session_run-ros1-map-lio.sh
./docker_session_run-ros1-map-lio.sh /path/to/input.bag /path/to/output/dirOr with no arguments to use a GUI file selector (requires zenity).
| Variable | Default | Meaning |
|---|---|---|
CONFIG_FILE |
hesai.yaml |
MAP_LIO parameter file: LiDAR/IMU topics, LiDAR-IMU extrinsics, noise, range limits. A file on the host, or the name of one shipped in the image |
USE_RVIZ |
1 |
RViz live view |
MAP_LIO's sensor setup lives in its parameter file. The image ships two:
| Name | Sensor |
|---|---|
hesai.yaml |
MAP_LIO's own, Hesai LiDAR (/hesai/pandar, /imu/data_raw) |
bunker.yaml |
Livox Mid-360 with its built-in IMU (/livox/pointcloud, /livox/imu), see overlay/config/bunker.yaml |
For your own sensor, copy one of them, set common/lid_topic,
common/imu_topic and the LiDAR-IMU extrinsics, and pass it:
CONFIG_FILE=/path/to/my_sensor.yaml \
./docker_session_run-ros1-map-lio.sh /path/to/input.bag /path/to/output/dirBefore anything starts, the script checks that both topics of the parameter
file are in the bag and looks at the LiDAR point format: Hesai points are used
as they are, points with a relative per-point time are converted to the Hesai
format first (inside the container, the input bag is not changed), anything
else gets a warning (MAP_LIO then does not deskew the scans).
What happens:
The script opens a Docker container with a tmux session containing four panes
on window 0 and a control window (window 1, the attach target):
| Pane | Role |
|---|---|
| 0 | roscore |
| 1 | rosbag record /Odometry /cloud_registered |
| 2 | roslaunch map_lio map_lio_bench.launch — MAP_LIO reading your bag (+ RViz live view) |
| 3 | diagnostics — shows active topics and publishing rates |
MAP_LIO does not need rosbag play: it opens the bag itself and processes it
as fast as it can. When it reports the end of the bag, the control window stops
the recorder, kills all nodes and RViz, 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-MAP_LIO/:
lio_initial_poses.reg
poses.reg
scan_lio_0.laz
...
session.json
trajectory_lio_0.csv
...
Open session.json with the
multi_view_tls_registration_step_2
application.
MAP_LIO publishes:
| Topic | Type | Meaning |
|---|---|---|
/Odometry |
nav_msgs/Odometry |
the 6-DoF IMU (body) pose in the world frame, one per scan |
/cloud_registered |
sensor_msgs/PointCloud2 |
the registered scan in the world frame, one per scan |
/Laser_map |
sensor_msgs/PointCloud2 |
the local map, for display |
The converter records /Odometry + /cloud_registered. MAP_LIO publishes the
registered scan only while someone subscribes to it, so the recorder is started
before MAP_LIO.
Timestamps: the benchmark does not change MAP_LIO's clock (no
use_sim_time). MAP_LIO reads the bag directly and stamps every output with the
scan's end time taken from the input messages, so the result is in bag time
without any translation.