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
MOLA_TF_BASE_LINK
Default: os_sensor
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 |
|
Offline CLI input |
|
Profile source |