vbr

VBR, Vision Benchmark in Rome (https://rvp-group.net/slam-benchmark.html): one sensor head, carried by hand around four sites in Rome (colosseo, pincio, spagna, diag; Ouster OS0-128, 10 Hz) or mounted on a car (campus, ciampino; Ouster OS1-64, 20 Hz). Eight train sequences with public ground truth, eight test ones scored on the authors’ public leaderboard.

Upstream ships each sequence as ROS 1 bags split in ~10 GiB chunks (<seq>_00.bag, <seq>_01.bag, …) plus a “vbr_calib.yaml”. The bags carry no /tf at all, so every sensor pose below is fixed from that file, which is identical for both platforms. A LiDAR+IMU-only copy merged into a single <seq>_lio.bag works the same way.

base_link is the LiDAR (“os_sensor”): it is the calibration’s body frame (T_b = identity) and also the frame the ground truth is expressed in, so the estimate lands in the reference’s own frame with no offset to compose.

Two IMUs are recorded, both reading gravity along +Z:
  sbg     /imu/data    SBG Ellipse-E, 0.61 m below the LiDAR (default; the
                       one the dataset's camera-IMU calibration refers to)
  ouster  /ouster/imu  the LiDAR's internal IMU, ~10x noisier
VBR_IMU selects between them.

Running it

Online replay with the 3D GUI:

mola-lo-gui-vbr /path/to/<seq>/ [additional flags]

Offline batch run, writing a trajectory file:

mola-lo-cli-vbr /path/to/<seq>/ [additional flags]

What this profile sets, and why

These are defaults, not overrides: exporting any of these variables before running the wrapper takes precedence.

MOLA_LIDAR_TOPIC

Default: /ouster/points

LIDAR_POSE_X

Default: 0}" ; : "${LIDAR_POSE_Y:=0}" ; : "${LIDAR_POSE_Z:=0

LIDAR_POSE_YAW

Default: 0}" ; : "${LIDAR_POSE_PITCH:=0}" ; : "${LIDAR_POSE_ROLL:=0

MOLA_USE_FIXED_LIDAR_POSE

Default: true

VBR_IMU

Default: sbg

IMU poses are vbr_calib.yaml’s T_b (sensor pose in the LiDAR frame), rotations converted to yaw/pitch/roll in degrees.

MOLA_IMU_TOPIC

Default: /imu/data

IMU_POSE_X

Default: -0.045630

IMU_POSE_Y

Default: -0.007849

IMU_POSE_Z

Default: -0.608415

IMU_POSE_YAW

Default: -1.8340

IMU_POSE_PITCH

Default: -0.3841

IMU_POSE_ROLL

Default: 0.5167

MOLA_IMU_TOPIC

Default: /ouster/imu

IMU_POSE_X

Default: 0.006253

IMU_POSE_Y

Default: -0.011775

IMU_POSE_Z

Default: 0.007645

IMU_POSE_YAW

Default: 0}" ; : "${IMU_POSE_PITCH:=0}" ; : "${IMU_POSE_ROLL:=0

MOLA_USE_FIXED_IMU_POSE

Default: true

MOLA_CAMERA_TOPIC

Default: /camera_left/image_raw

CAMERA_POSE_X

Default: 0.070739

CAMERA_POSE_Y

Default: 0.234351

CAMERA_POSE_Z

Default: -0.666049

CAMERA_POSE_YAW

Default: -89.6782

CAMERA_POSE_PITCH

Default: -0.0757

CAMERA_POSE_ROLL

Default: -90.0742

MOLA_USE_FIXED_CAMERA_POSE

Default: true

MOLA_LO_INITIAL_LOCALIZATION_METHOD

Default: InitLocalization::PitchAndRollFromIMU

The clouds carry per-point time (“t”), and half the corpus is hand-held: IMU deskewing and IMU-derived initial pitch/roll, as for other hand-held rigs.

MOLA_DESKEW_METHOD

Default: MotionCompensationMethod::IMU

The clouds carry per-point time (“t”), and half the corpus is hand-held: IMU deskewing and IMU-derived initial pitch/roll, as for other hand-held rigs.

Under the hood

Online launch file

lidar_odometry_from_rosbag1.yaml

Offline CLI input

--input-rosbag1 <MOLA_LO_BAGS_JOINED>

Profile source

scripts/lib/profiles/vbr.sh