Note
This is a Hugging Face dataset. For large datasets, ensure huggingface_hub>=1.1.3 to avoid rate limits. Learn more in the Hugging Face integration docs.
Dataset Card for OctoSense (FiftyOne Multimodal)#

OctoSense is a time-synchronized, calibrated multi-sensor robot perception dataset captured by an open-source eight-sensor rig on three platforms: a car, a boat, and a Unitree Go2-W quadruped. This FiftyOne version packages eight representative episodes as MCAP files β one sample per episode β loadable directly in the FiftyOne Appβs multimodal viewer with synchronized playback across all sensor streams.
Installation#
pip install -U fiftyone
Usage#
import fiftyone as fo
import fiftyone.utils.huggingface as fouh
dataset = fouh.load_from_hub("Voxel51/OctoSense")
session = fo.launch_app(dataset)
Dataset Details#
Dataset Description#
OctoSense provides 59 hours of time-synchronized driving data from eight sensors: stereo RGB and event cameras, a thermal camera, an Ouster OS1-64 LiDAR, an IMU, RTK-corrected GPS, and vehicle CAN bus (car) or joint-angle proprioception (quadruped). Sensors are hardware PPS-locked to a single clock and post-processed with Kalman-smoothed affine synchronization. All sensors record at native rates without dropped data: the RGB pair at 100 Hz, event cameras at up to ~7 MEv/s, LiDAR at 10 Hz, IMU at 400 Hz (VectorNav) and 100 Hz (in-LiDAR), and GPS at 5 Hz. Car sequences additionally include ego-motion optical flow, dense LiDAR-projected depth, pseudo-label semantic segmentation, LiDAR-inertial odometry, and a fused GPS/LIO trajectory. The dataset spans urban, suburban, and rural environments at sunrise through nighttime, and includes deliberately degraded-sensor recordings.
Curated by: Harpreet Sahota (FiftyOne multimodal packaging)
Original dataset by: Anthony Bisulco, Jeremy Wang, Kostas Daniilidis, Randall Balestriero, Pratik Chaudhari (GRASP Laboratory, University of Pennsylvania; Brown University)
Funded by: [More Information Needed]
Shared by: Harpreet Sahota
Language(s): Not applicable (sensor data)
License: MIT
Dataset Sources#
Repository: https://huggingface.co/datasets/anthonytec2/OctoSense
Paper: https://arxiv.org/abs/2606.27317
Demo: https://abisulco.com/octosense/
Uses#
Direct Use#
Visual inspection and debugging of synchronized multi-sensor recordings in the FiftyOne multimodal viewer (Image, 3D, Map, Plot, and Logs tiles on a shared timeline).
Filtering episodes by platform, split, sensor coverage, geographic bounding box, speed, idle fraction, or ground-truth availability using the FiftyOne SDK and App sidebar.
Prototyping multi-modal perception pipelines against a known-good subset before scaling to the full 382-sequence release.
Evaluating sensor coverage and calibration quality across platforms before importing additional sequences.
Out-of-Scope Use#
This FiftyOne package contains eight sequences (a curated subset). Training
production models requires the full OctoSense release
(anthonytec2/OctoSense). Radar range and bearing values use fitted scales
(1/16 m per count, β1 bearing sign) derived from LiDAR cross-validation;
they are not manufacturer-documented and should not be used as ground truth
for radar calibration.
Dataset Structure#
Overview#
Media type: multimodal β one fo.Sample per episode, filepath
pointing to a .mcap file. All sensor streams are encoded inside the MCAP
with time-aligned messages on a shared nanosecond clock. The FiftyOne App
renders them in synchronized Image, 3D, Map, Plot, and Logs tiles.
Sample count: 8 episodes (6 car, 1 boat, 1 Unitree quadruped)
Total recording time: ~46 minutes across all 8 episodes
Sample Fields#
Field |
FiftyOne type |
Description |
|---|---|---|
|
|
Absolute path to the episodeβs |
|
|
ROS 2 bag identifier (e.g. |
|
|
Session label within the platform (e.g. |
|
|
Recording platform: |
|
|
Sequence wall-clock start time (ISO 8601) |
|
|
|
|
|
Whether the sequence was recorded in daylight |
|
|
Whether sensor degradation was logged for this sequence |
|
|
Whether pseudo-label semantic segmentation GT is available |
|
|
Episode duration in seconds (from MCAP message timestamps) |
|
|
Total MCAP messages across all channels |
|
|
Number of distinct MCAP channels |
|
|
All MCAP topic strings in the episode |
|
|
All MCAP schema names (use for capability filtering) |
|
|
Number of LiDAR sweeps |
|
|
Number of RGB camera frames |
|
|
Number of IMU samples |
|
|
GPS fixes logged (includes zero-fix rows on unitree) |
|
|
GPS fixes with valid lock |
|
|
Total events from left event camera |
|
|
Total events from right event camera |
|
|
GPS fix quality string (e.g. |
|
|
Southern edge of episode geographic bounding box (degrees) |
|
|
Northern edge of episode geographic bounding box (degrees) |
|
|
Western edge of episode geographic bounding box (degrees) |
|
|
Eastern edge of episode geographic bounding box (degrees) |
|
|
Mean driving speed in mph |
|
|
Fraction of recording time at near-zero speed |
|
|
Total distance driven in metres |
|
|
Camera calibration file identifier |
|
|
IMU calibration file identifier |
|
|
LiDAR calibration file identifier |
|
|
Dropout description if a sensor outage was logged; null otherwise |
MCAP Stream Contents#
Each .mcap file is a multi-channel recording. Topics and their schemas vary
by platform:
Topic |
Schema |
Tile |
Platforms |
|---|---|---|---|
|
|
Image |
all |
|
|
Image |
all |
|
|
Image |
all |
|
|
Image |
car |
|
|
Image |
car daytime |
|
|
Image |
car |
|
|
3D |
all |
|
|
Map |
car, boat |
|
|
3D |
car |
|
|
Plot |
all |
|
|
Plot |
all |
|
JSON scalars (speed, wheels, steer, CAN) |
Plot |
car |
|
JSON scalars (low_state, sport, controller) |
Plot |
unitree |
|
|
Logs |
car |
|
|
β |
all |
Ground Truth Coverage#
Ground truth |
Source |
Coverage |
Notes |
|---|---|---|---|
Dense depth |
LiDAR accumulation, |
All 6 car episodes |
~12 % of pixels valid; 3β102 m range |
Semantic segmentation |
EoMT-Cityscapes-DINOv2-L-1024 pseudo-labels |
Daytime car only (all 5 daytime car episodes in this subset) |
19 Cityscapes classes; |
Ego-motion optical flow |
Derived at conversion from depth + poses |
All 6 car episodes |
Ego-motion only; moving objects are holes |
Radar tracks |
Mazda CAN |
Car |
Range 1/16 m per count (fitted); bearing sign inverted |
Filtering by Capability#
Use the schemas list field to filter episodes rather than topic names (topic
substrings false-positive against non-decodable packet channels):
import fiftyone as fo
from fiftyone import ViewField as F
dataset = fo.load_dataset("octosense")
# Car episodes with semantic segmentation
car_with_seg = dataset.match(F("has_seg") == True)
# Episodes with GPS
has_gps = dataset.match(F("schemas").contains("foxglove.LocationFix"))
# Filter by platform
cars = dataset.match(F("platform") == "car")
Dataset Creation#
Curation Rationale#
The eight episodes were selected to provide maximum coverage of platforms, modalities, and conditions within a manageable subset:
Daytime car with all GT (
car/sess8, 53 s): shortest car sequence with depth, semantic segmentation, and all CAN channels present.Car sessions (sess8 long, sess9, sess10 Γ2, sess11): 163β597 s each, from both train and test splits, spanning all four car sessions; selected for near-zero sensor dropout, valid GPS lock, and minimal idle time.
Boat (
boat/sess1, 54 s): the only platform where the LiDAR ships raw range images rather than XYZ, and where the boat IMU extrinsic differs.Unitree (
unitree/sess1, 112 s): the only platform with/robotjoint state and no GPS or CAN data.
Source Data#
Data Collection and Processing#
Data was collected from a single OctoSense rig mounted on each platform.
All sensors are hardware PPS-locked for temporal alignment and
post-processed with Kalman-smoothed affine synchronization. Source recordings
are ROS 2 bags converted to HDF5 and H.265 video files; the raw release is
hosted at anthonytec2/OctoSense on Hugging Face (~8.5 TB). This FiftyOne
package re-encodes video streams from HEVC to H.264 (libx264, no B-frames,
one access unit per MCAP message) for browser WebCodecs compatibility and
packages all channels into MCAP files using the Foxglove schema registry.
LiDAR points are stored at a 20-byte stride (x, y, z, intensity as float32;
r, g, b, a as uint8), with colour sampled from the nearest left-camera frame.
Who are the source data producers?#
The OctoSense hardware platform and dataset were developed at the General, Robotics, Automation, Sensing and Perception (GRASP) Laboratory, University of Pennsylvania (Anthony Bisulco, Jeremy Wang, Kostas Daniilidis, Pratik Chaudhari) and Brown University (Randall Balestriero). Data was collected on Long Island and in Philadelphia, PA, USA.
Annotations#
Annotation process#
All ground truth in OctoSense is machine-generated:
Depth is accumulated from LiDAR sweeps projected onto the rectified left camera frame.
Semantic segmentation is produced by EoMT-Cityscapes-DINOv2-L-1024 applied to CLAHE-enhanced rectified left frames; it is a modelβs output, not human annotation.
Optical flow is derived at MCAP-conversion time from depth and LiDAR-inertial poses (
flow_gap = 2frames, i.e. 0.2 s lookahead); it captures ego-motion only β pixels covering dynamic objects (vehicles, pedestrians) were excluded from the depth accumulation and appear as invalid.Radar detection geometry (range, bearing) uses scales fitted against LiDAR-projected vehicle pixels in birdβs-eye view (1/16 m per
DIST_OBJcount, negativeANG_OBJsign). These are not manufacturer-documented values.
Who are the annotators?#
No human annotators. All labels are generated programmatically from sensor data and pre-trained models as described above.
Personal and Sensitive Information#
Recordings were made on public roads and a private waterway. No personally identifiable information was intentionally captured. Faces and licence plates visible in RGB frames are not blurred in the source data.
Citation#
BibTeX:
@article{bisulco2026octosense,
title={OctoSense: Self-Supervised Learning for Multimodal Robot Perception},
author={Bisulco, Anthony and Wang, Jeremy and Daniilidis, Kostas and Balestriero, Randall and Chaudhari, Pratik},
journal={arXiv preprint arXiv:2606.27317},
year={2026}
}
APA:
Bisulco, A., Wang, J., Daniilidis, K., Balestriero, R., & Chaudhari, P. (2026). OctoSense: Self-Supervised Learning for Multimodal Robot Perception. arXiv preprint arXiv:2606.27317.
More Information#
Full dataset (8.5 TB, 382 sequences): https://huggingface.co/datasets/anthonytec2/OctoSense
Devkit and conversion scripts: https://github.com/anthonytec2/OctoSense
Project page and supplementary videos: https://abisulco.com/octosense/
FiftyOne multimodal documentation: https://docs.voxel51.com/user_guide/app.html#multimodal-viewer
Dataset Card Contact#
harpreetsahota