Please change branch to Bunker-DVI-Dataset-reg-1 for quick experiment.
Download the dataset from Bunker DVI Dataset
Runs the FORM LiDAR odometry algorithm on a ROS bag file and converts the output to an HDMapping session.
FORM (Fixed-Lag Odometry with Reparative Mapping) is a real-time LiDAR odometry system from Carnegie Mellon University's Robotics Perception Lab (2025).
- Docker
- A ROS bag containing a
/velodyne_pointstopic (sensor_msgs/PointCloud2) — ideally with aringfield (Velodyne driver standard)
git clone https://github.com/MapsHD/benchmark-FORM-to-HDMapping.git --recursive
cd benchmark-FORM-to-HDMappingNote: Internet access is required at
docker buildtime because FORM fetches thetsl::robin_mapdependency via CMake FetchContent.
docker build -t form_noetic .This installs:
- Ubuntu 20.04 + ROS Noetic
- GTSAM 4.2 (from the borglab PPA)
- Intel TBB, Eigen3, PCL
- FORM C++ library (compiled from submodule)
- catkin workspace with
form_ros_nodeandform-to-hdmapping
The build takes several minutes on first run.
chmod +x docker_session_run-ros1-form.sh
./docker_session_run-ros1-form.sh /path/to/input.bag /path/to/output/dirOr with no arguments to use a GUI file selector (requires zenity):
./docker_session_run-ros1-form.shWhat happens:
The script opens a Docker container with a tmux session containing four panes:
| Pane | Role |
|---|---|
| 0 | roscore |
| 1 | form_ros_node — reads /velodyne_points, publishes /form/odometry + /form/registered_cloud |
| 2 | rosbag record — captures the two published topics |
| 3 | rosbag play — plays your input bag with simulated clock |
After playback completes, recording is stopped and a second Docker run converts
recorded-form.bag into the HDMapping session format.
Output files appear in <output_dir>/output_hdmapping-form/:
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.
The form_ros_node handles three input cloud types automatically:
| Cloud type | Handling |
|---|---|
Organized + ring field |
Ring field used as row index (best accuracy, Velodyne standard) |
Organized, no ring field |
Row index = point_index / width |
Unorganized (height == 1) |
Elevation-angle bucketing assigns synthetic rings |
Adjust num_rows and num_columns in src/form-ros-node/launch/form.launch
to match your sensor (default: 64 rows × 1024 columns for Velodyne HDL-64E).
| Sensor | num_rows | num_columns |
|---|---|---|
| Velodyne HDL-64E | 64 | 1024 |
| Velodyne VLP-16 | 16 | 1800 |
| Ouster OS1-64 | 64 | 1024 |
| Ouster OS0-128 | 128 | 1024 |