#### NOTE
This is a **Hugging Face dataset**. For large datasets, ensure `huggingface_hub>=1.1.3` to avoid rate limits. Learn more in the <a href="https://docs.voxel51.com/integrations/huggingface.html#loading-datasets-from-the-hub" target="_blank">Hugging Face integration docs</a>.

<a href="https://huggingface.co/datasets/Voxel51/Hilti-Trimble-SLAM-Challenge-2026" target="_blank">![Hugging Face](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Dataset-yellow)</a>

# Hilti x Trimble SLAM Challenge 2026 → FiftyOne (Native Multimodal MCAP)

![preview](https://huggingface.co/datasets/Voxel51/Hilti-Trimble-SLAM-Challenge-2026/resolve/main/preview.gif)

The [Hilti x Trimble SLAM Challenge 2026](https://hilti-trimble-challenge.com/dataset-2026) recordings, converted from ROS 2 bags to native multimodal MCAP episodes.

The fourth Hilti challenge drops the multi-sensor rig of the earlier years for a single consumer 360 camera, and adds the thing none of the others have: the building’s own floor plans. A run is solved twice over, once as plain SLAM in whatever frame the system likes, and once as localization in the coordinates of the drawing the building was made from.

The recordings are an Insta360 ONE RS 1-Inch 360 Edition: two roughly 200-degree fisheye lenses at 1472x1440 and 30 Hz, back to back, with a 1000 Hz inertial unit inside the body. The lenses are published as they were recorded rather than stitched into a panorama, since the two optical centres are 40 mm apart and stitching them invents parallax that is not there.

30 runs over 1h 20m, across 10 floors of one active construction site recorded on 8 dates between 2025-05-05 and 2025-12-03. 8 of those floors were walked more than once, which is what makes the revisit and change cases work.

> The site was active during recording and the operator carrying the rig appears in the rear lens throughout. The recordings are republished here unchanged from a public release.

## Installation

```bash
pip install fiftyone
```

## Usage

```python
import fiftyone as fo
import fiftyone.utils.huggingface as fouh

dataset = fouh.load_from_hub(
    "Voxel51/Hilti-Trimble-SLAM-Challenge-2026",
    name="Hilti-Trimble-SLAM-Challenge-2026",
    persistent=True,
)
fo.launch_app(dataset)
```

Every run on one floor, in the order they were recorded:

```python
view = dataset.match({"floor": "floor_UG1"}).sort_by("recorded")
fo.launch_app(dataset, view=view)
```

## Reference trajectories and floor plans

Every run has a continuous 6-DoF reference trajectory, solved by a LiDAR-inertial mapping system carried rigidly alongside the camera and then transformed onto it. It gives the pose of `cam0` in the mapping frame. The LiDAR starts recording a little after the camera does, so the reference begins a few seconds into each run rather than at its first frame. The raw LiDAR is not part of the release.

The building’s floor plans ship alongside the episodes as vector drawings, rendered images, and binary occupancy masks in two variants, one treating windows as openings and one not. Each episode names the plan its floor belongs to and carries a measured starting pose in that plan’s coordinates, which is the prior the localization task is given.

## What you get

Each episode carries:

- `/cam0` and `/cam1`, the front and rear fisheye lenses at
  1472x1440, as `foxglove.CompressedImage`
- `/cam0-calibration` and `/cam1-calibration`, the intrinsics, as
  `foxglove.CameraCalibration`
- `/imu.plot`, three-axis acceleration and angular rate at 1000 Hz
- `/ground-truth-pose`, the reference trajectory, as
  `foxglove.PoseInFrame` in the `map` frame
- `/ground-truth.plot`, the same trajectory as a timeline track
- `/floorplan-pose`, the measured starting pose in the floor
  plan’s own frame, as `foxglove.PoseInFrame`
- `/tf`, both lenses against the inertial frame, as
  `foxglove.FrameTransform`
- `/sequence`, naming the run

Across the whole set that comes to 290,250 camera frames, 4,859,264 inertial samples and 142,423 reference poses.

| Sequence                     | Floor   | Recorded   |   Frames |   Reference | Plan            | Duration   |
|------------------------------|---------|------------|----------|-------------|-----------------|------------|
| `floor_UG2_2025-12-02_run_1` | UG2     | 2025-12-02 |   13,552 |       6,687 | `floor_UG2.png` | 3m 46s     |
| `floor_UG1_2025-05-19_run_1` | UG1     | 2025-05-19 |   12,366 |       6,159 | `floor_UG1.png` | 3m 26s     |
| `floor_UG1_2025-06-18_run_1` | UG1     | 2025-06-18 |   10,140 |       4,971 | `floor_UG1.png` | 2m 49s     |
| `floor_UG1_2025-10-16_run_1` | UG1     | 2025-10-16 |   12,344 |       6,124 | `floor_UG1.png` | 3m 26s     |
| `floor_UG1_2025-12-02_run_1` | UG1     | 2025-12-02 |   15,438 |       7,636 | `floor_UG1.png` | 4m 18s     |
| `floor_UG1_2025-12-02_run_2` | UG1     | 2025-12-02 |   13,360 |       6,585 | `floor_UG1.png` | 3m 43s     |
| `floor_UG1_2025-12-03_run_1` | UG1     | 2025-12-03 |    8,308 |       4,030 | `floor_UG1.png` | 2m 19s     |
| `floor_EG_2025-10-16_run_1`  | EG      | 2025-10-16 |   14,712 |       7,280 | `floor_EG.png`  | 4m 05s     |
| `floor_EG_2025-12-02_run_1`  | EG      | 2025-12-02 |    7,762 |       3,788 | `floor_EG.png`  | 2m 09s     |
| `floor_EG_2025-12-02_run_2`  | EG      | 2025-12-02 |    9,902 |       4,872 | `floor_EG.png`  | 2m 45s     |
| `floor_1_2025-05-05_run_1`   | 1       | 2025-05-05 |    8,076 |       3,923 | `floor_1.png`   | 2m 15s     |
| `floor_1_2025-07-07_run_1`   | 1       | 2025-07-07 |    8,264 |       4,007 | `floor_1.png`   | 2m 18s     |
| `floor_1_2025-12-02_run_1`   | 1       | 2025-12-02 |   16,658 |       8,283 | `floor_1.png`   | 4m 38s     |
| `floor_2_2025-05-05_run_1`   | 2       | 2025-05-05 |   11,270 |       5,594 | `floor_2.png`   | 3m 08s     |
| `floor_2_2025-10-28_run_1`   | 2       | 2025-10-28 |    6,360 |       3,067 | `floor_2.png`   | 1m 46s     |
| `floor_2_2025-10-28_run_2`   | 2       | 2025-10-28 |    5,392 |       2,569 | `floor_2.png`   | 1m 30s     |
| `floor_2_2025-12-02_run_1`   | 2       | 2025-12-02 |    8,980 |       4,309 | `floor_2.png`   | 2m 30s     |
| `floor_2_2025-12-03_run_1`   | 2       | 2025-12-03 |    9,168 |       4,492 | `floor_2.png`   | 2m 33s     |
| `floor_3_2025-05-19_run_1`   | 3       | 2025-05-19 |    7,092 |       3,464 | `floor_3.png`   | 1m 58s     |
| `floor_3_2025-12-02_run_1`   | 3       | 2025-12-02 |    8,130 |       3,977 | `floor_3.png`   | 2m 16s     |
| `floor_4_2025-05-19_run_1`   | 4       | 2025-05-19 |    5,576 |       2,755 | `floor_4.png`   | 1m 33s     |
| `floor_4_2025-12-02_run_1`   | 4       | 2025-12-02 |   11,730 |       5,797 | `floor_4.png`   | 3m 16s     |
| `floor_5_2025-12-02_run_1`   | 5       | 2025-12-02 |    9,834 |       4,810 | `floor_5.png`   | 2m 44s     |
| `floor_6_2025-06-18_run_1`   | 6       | 2025-06-18 |    4,414 |       2,078 | `floor_6.png`   | 1m 14s     |
| `floor_6_2025-07-07_run_1`   | 6       | 2025-07-07 |    4,566 |       2,189 | `floor_6.png`   | 1m 16s     |
| `floor_6_2025-12-02_run_1`   | 6       | 2025-12-02 |   10,434 |       5,118 | `floor_6.png`   | 2m 54s     |
| `floor_6_2025-12-02_run_2`   | 6       | 2025-12-02 |    7,640 |       3,734 | `floor_6.png`   | 2m 07s     |
| `floor_7_2025-12-02_run_1`   | 7       | 2025-12-02 |    7,280 |       3,533 | `floor_7.png`   | 2m 01s     |
| `floor_7_2025-12-02_run_2`   | 7       | 2025-12-02 |    9,404 |       4,648 | `floor_7.png`   | 2m 37s     |
| `floor_7_2025-12-03_run_1`   | 7       | 2025-12-03 |   12,098 |       5,944 | `floor_7.png`   | 3m 22s     |

Episodes carry the fields `sequence`, `floor`, `recorded`, `run`, `cameras`, `floorplan`, `has_floorplan_pose`, `num_camera_frames`, `num_imu_samples`, `num_ground_truth_poses` and `duration`.

## Notes on the conversion

The source frames are already compressed, so their bytes are carried through rather than decoded and encoded again. Nothing is resampled: both lenses keep their 30 Hz and the inertial unit its 1000 Hz.

The lenses are fisheye and are published under the `equidistant` model, fitted by the release to the extended unified camera model it calibrated them with. The release publishes both fits; the one carried here is the one a pinhole-equidistant pipeline can read.

`/tf` is derived from the release’s Kalibr camera chain, which gives each lens against the inertial frame. Inverting it recovers the rig: the two optical centres 40 mm apart and 179.6 degrees opposed, which is the camera’s physical geometry.

The bags carry a session clock rather than wall time, starting near 9,999 seconds, and the reference trajectories and floor-plan poses are on that same clock. Timestamps are left as the release wrote them so they still line up; the calendar date of each run is on the episode as `recorded`.

The reference trajectory is in the mapping system’s own frame and the floor-plan pose is in the building drawing’s. Neither has a measured relation to the other or to the rig, since recovering them is what the challenge asks, so they sit in their own frames rather than hanging off the rig tree.

The release’s floor plans, its two Kalibr chains and the table of starting poses are republished at the repo root. The calibration recordings the chains were solved from are not.

## License & attribution

The source dataset is released under
[CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/),
and this conversion is distributed under the same license. Use is limited to non-commercial purposes, attribution is required, and adaptations must be distributed under the same or a compatible license.

Changes from the source: conversion from ROS 2 bags to the FiftyOne MCAP flavor, and the reference trajectories, floor-plan poses, camera intrinsics and calibrated frame tree carried as streams alongside the episodes. The frames themselves are the release’s own bytes.

## Citation

```bibtex
@misc{hiltitrimble2026,
  title  = {Hilti-Trimble-Oxford Dataset: 360 Visual-Inertial Benchmark with Floor Plan Priors for SLAM and Localization},
  author = {{Hilti Research} and {Trimble} and {Dynamic Robot Systems Group, University of Oxford}},
  year   = {2026},
  note   = {https://arxiv.org/abs/2607.06464}
}
```
