#### 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/MirrorSentinel-Elevator" target="_blank">![Hugging Face](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Dataset-yellow)</a>

# MirrorSentinel Elevator → FiftyOne (Native Multimodal MCAP)

![preview](https://huggingface.co/datasets/Voxel51/MirrorSentinel-Elevator/resolve/main/preview.gif)

The
[KevinWong216/MirrorSentinel-Elevator](https://huggingface.co/datasets/KevinWong216/MirrorSentinel-Elevator)
recordings, converted from ROS 2 bags to native multimodal MCAP episodes.

A rig carrying a ZED2 stereo camera, an Ouster 3D LiDAR and the Ouster IMU was
walked through elevator cabins to record what mirrors and glass do to range
measurements. A LiDAR pointed at a mirror reports returns from behind it, so
the cabin appears to extend into space that is solid wall. Eight traversals
cover seven physical cabins, with E02 and E03 being two runs of the same one.

Each cabin was measured by hand and the resulting rectangle ships with the
recordings, so the real boundary can be compared against what the sensors
report.

## Installation

```bash
pip install fiftyone
```

## Usage

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

dataset = fouh.load_from_hub(
    "Voxel51/MirrorSentinel-Elevator",
    name="MirrorSentinel-Elevator",
    persistent=True,
)
fo.launch_app(dataset)
```

One run per physical cabin:

```python
view = dataset.match({"sequence": {"$ne": "elevator_03"}})
```

## What you get

Eight episodes and 265 seconds of recording. Each episode carries:

- `/camera`, the rectified left ZED2 view at 960x540, as
  `foxglove.CompressedImage`
- `/camera-calibration`, the intrinsics recorded alongside it, as
  `foxglove.CameraCalibration`
- `/lidar-points`, the Ouster sweeps at 10 Hz, as `foxglove.PointCloud`
  carrying `x`, `y`, `z`, `intensity`, `t`, `reflectivity`, `ring`,
  `ambient` and `range`
- `/imu.plot`, three-axis acceleration and angular rate at 100 Hz
- `/transforms` and `/transforms-static`, the sensor transform tree, as
  `foxglove.FrameTransform`
- `/cabin-boundary`, the hand-measured cabin rectangle, as
  `foxglove.SceneUpdate`
- `/sequence`, naming the run

Across the whole set that comes to 7,776 camera frames, 2,651 LiDAR sweeps
holding 238.9 million points, and 26,525 inertial samples.

Episodes carry the fields `sequence`, `footprint`, `recorded`,
`num_camera_frames`, `num_lidar_scans`, `num_lidar_points`,
`num_imu_samples`, `num_transforms`, `num_static_transforms`,
`cabin_length`, `cabin_width`, `cabin_height` and `duration`.

Cabins range from 1.35 to 2.40 m on a side and are 2.50 m tall.

## Notes on the conversion

Camera frames are JPEG at quality 92. The source publishes `bgra8` with the
alpha channel uniformly opaque, and it is dropped.

The Ouster per-point `t` is nanoseconds relative to the start of its sweep,
which the point cloud format’s 32-bit floats hold without loss at this
magnitude. It is carried through unchanged.

Static transforms are stamped at the start of the recording. The source
latches them when the sensor drivers come up, which is between 34 and 58
seconds before recording starts, and carrying those stamps would stretch the
episode timeline well past the sensor data.

The cabin boundary is drawn from the eight corners as recorded rather than
fitted to a box. It is a manually measured geometric reference, not a
laser scan, and it is not a trajectory ground truth. The source release is
explicit that it supports cabin-boundary map-quality evaluation only.

E02 and E03 are two runs of one physical cabin. The `footprint` field groups
them, so keep them together when independence at the cabin level matters.

## License & attribution

The source dataset is released by Yugong Wang, Shengzhe Gan, Qi Shen and
Sirun Pan under
[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), and this
conversion is distributed under the same license.

Changes from the source: conversion from ROS 2 bags to the FiftyOne MCAP
flavor, JPEG encoding of the camera frames, and the cabin annotation
rendered as a scene entity.

Code accompanying the recordings is at
[KvnWong216/MirrorSentinel](https://github.com/KvnWong216/MirrorSentinel).
