Skip to the content
PCBKitNew board
2 layers66.5 × 36.5 mmSyncBoard, the printed circuit board in 3D

OctoSense is a multimodal dataset

Size
66.5 × 36.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
9
Nets
66
Pads
105
Tracks, vias
141, 7
Pours
3
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
15 Jun 2026
Updated
26 Jun 2026

Overview

SyncBoard is an open-source printed circuit board by anthonytec2, from the anthonytec2/OctoSense repository on GitHub, published under the MIT licence. It is a 2-layer board of 66.5 × 36.5 mm with 9 parts on 66 nets, routed with 141 tracks and 7 vias.

It is built around the TEENSY 4.1. Its parts include 4 connectors and 1 IC. It belongs with the NXP (LPC, Kinetis, i.MX RT) boards of this library.

Main components

1

README

README.md

OctoSense

Self-Supervised Learning for Multimodal Robot Perception

arXiv HF Dataset Open in Colab MIT License

Watch the OctoSense overview video


OctoSense is a multimodal dataset spanning a car, boat, and quadruped on a shared sensor platform. The bulk is large-scale driving: 59 hours / 2,474 km / 8.43 TB of time-synchronized data from stereo RGB + event cameras, LiDAR, thermal, IMU, RTK-GPS, and the vehicle CAN bus, recorded across urban, suburban, and rural roads from sunrise to night and through degraded sensors, with ground truth for depth, optical flow, semantic segmentation, and ego-motion. We also include sequences recorded on a boat and a Unitree quadruped using the same sensor platform. Every sequence is captured by a fully open-source sensor platform and processed with the pipeline in this repo.

Getting started with OctoSense data: the getting-started notebook downloads a sequence and walks through every modality. Open it with zero setup in Colab, or run it locally after the install below (activate the env first: conda activate octosense).

The dataset (sensor specs, HDF5 schema, per-sequence metadata, and downloads) lives on the Hugging Face dataset page. This repository is the tooling around it: how the data is collected, visualized, and produced.

Installation

OctoSense has two parts with separate environments:

  • Data acquisition + conversion: the ROS 2 capture stack (OctoSense/) and the raw-bag conversion run in a custom-built Docker container (ROS 2 Jazzy + source-built FFmpeg); only the raw-bag conversion in data_processing/timesync/ needs the ROS 2 container. See OctoSense/README.md to build and run it.
  • Data loading + processing: loading/visualizing the data, deriving flow, and the depth/segmentation ground-truth and semantic-search tooling run in the conda env below.
bash
git clone https://github.com/anthonytec2/OctoSense.git
cd OctoSense
conda env create -f environment.yml      # installs Python, FFmpeg, and a CPU build of PyTorch
conda activate octosense

This installs a CPU build of PyTorch + torchcodec by default. On a CUDA GPU (faster video decoding and model inference) reinstall the GPU wheels for torch, torchvision, and torchcodec after activating, picking versions per the torchcodec compatibility table:

bash
pip install 'torch==2.12.*' 'torchvision==0.27.*' 'torchcodec>=0.14' \
  --index-url https://download.pytorch.org/whl/cu130

Download the dataset

The full dataset (8+ TB) lives on the Hugging Face dataset page. Use download_octosense.py (repo root) to grab a subset by platform, sequence, and modality, and skip the raw event streams (events.h5, ~78% of each sequence's bytes):

bash
pip install huggingface_hub

# all car sequences (everything)
python download_octosense.py --platform car --out ./octosense

# the same, but skip the raw event streams (events.h5, ~78% of the bytes)
python download_octosense.py --platform car --no-events

# one sequence, only the core LiDAR/IMU/GPS h5 + depth + segmentation
python download_octosense.py --sequence rosbag2_2026_01_04-13_51_24 --modalities data,depth,seg

# download_octosense.py just wraps huggingface_hub, so you can also use the HF CLI directly
hf download anthonytec2/OctoSense --repo-type dataset --local-dir ./octosense

--modalities picks from data, events, captions, depth, seg, rgb, ir.

Five entry points into OctoSense from this repository, start with the notebook:

Start here: the quickstart notebook (octosense_quickstart.ipynb)

The getting-started notebook downloads a sequence and walks through every modality (LiDAR, stereo RGB, events, depth, segmentation, GPS, IMU, CAN, and captions). Open it with zero setup in Colab, or run it locally after the install above (activate the env first: conda activate octosense).

Visualize a sequence (data_processing/viz/)

Rerun viewer scrubbing an OctoSense sequence across every modality.

Generate a Rerun recording from a downloaded sequence with the script below, then open the resulting .rrd in the Rerun viewer to scrub every modality on one shared timeline (LiDAR, stereo RGB, reconstructed event video, depth, GPS track, IMU, CAN signals, and captions) with a bundled viewer layout:

bash
python data_processing/viz/rerun_viz.py --dir <sequence_dir>

Search the dataset in natural language (data_processing/sem_search/)

OctoSense semantic-search web UI

The serve web UI: a natural-language query returning ranked clips with scores and scene captions.

Every 5s of image sensor data is captioned and embedded into a hybrid FAISS + BM25 index, so you can find moments across all 2,474 km by description ("a car turning left at dusk", "wet road at night", "pedestrian crossing"). Download the prebuilt index from the dataset and query it from the CLI (CPU works; a GPU just speeds up the query encoder):

bash
# 1) prebuilt search index (~700 MB) from the dataset
hf download anthonytec2/OctoSense --repo-type dataset --include "semantic_search/*" --local-dir ./octosense

# 2) natural-language query -> ranked sequences + timestamps (run from data_processing/)
cd data_processing
python -m sem_search.main query "a car turning left at dusk" --index-dir ../octosense/semantic_search

# 3) or browse results in a web UI (matching video clips in the browser at http://localhost:8000)
#    set DATA_BASE_PATH so the UI can play each result's clip (see note below)
DATA_BASE_PATH=./octosense/car python -m sem_search.main serve --index-dir ../octosense/semantic_search --port 8000

First run pulls the Qwen3-Embedding query encoder. Searching needs no video, but to play the matching clips in the web UI, set the DATA_BASE_PATH env var to the dataset root that holds <session>/<bag>/{img_left.mp4, data.h5} (e.g. ./octosense/car); the clip/thumbnail endpoints read img_left.mp4 from there per request. Results can come from any sequence, so a clip only plays if that sequence's img_left.mp4 is present under DATA_BASE_PATH (others return 404; the text results still show). For how the index is built, see the sem_search stage details.

Collect your own data (OctoSense/)

Everything to reproduce the sensor platform and record your own synchronized data: the ROS 2 (Jazzy) capture stack, hardware PPS time-sync (Teensy firmware + KiCad SyncBoard distributing a pulse-per-second to every sensor), the mechanical CAD, the containerized capture environment, and a web monitor to watch per-sensor health and start/stop recording. Build and run instructions

OctoSense sensor platform (CAD)SyncBoard with the Teensy PPS clock
OctoSense Sensor Platform (CAD)Time Synchronization Custom PCB

Process ROS2 Bags into OctoSense (data_processing/)

The pipeline that turns a raw ROS 2 bag into the released sequences, as independent stages: timesync (PPS clock-sync of all sensors to per-bag HDF5 + H.265 video), lidar_cal (LiDAR/camera extrinsics), depth_gt (accumulated-LiDAR depth + derived ego-motion optical flow), seg_gt (EoMT semantic labels), and sem_search (caption + embed to natural-language search index). Per-stage details

This repo releases the platform + data tooling only. The multi-modal masked auto-encoder (model, training, and dataloader code) will be released at a later date.

Citation

bibtex
@misc{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},
  year         = {2026},
  howpublished = {Preprint},
}

License

Released under the MIT License: free to use, modify, and redistribute with attribution; provided "as is" without warranty. If you use OctoSense, please cite the paper above.

Parts

9
QtyValueFootprintReferences
3, ,
1Aux PinsConnector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_HorizontalJ4
1Connector for RTCConnector_PinHeader_2.54mm:PinHeader_1x06_P2.54mm_HorizontalJ2
1Teensy4.1teensy:Teensy41U1
1Trigger Pin ConnectorConnector_Molex:Molex_Micro-Fit_3.0_43045-1012_2x05_P3.00mm_VerticalJ1
1Trigger Pin Test Point ConnectorConnector_PinHeader_2.54mm:PinHeader_2x05_P2.54mm_VerticalJ3

The 8 most common of 9 parts.

Questions

How big is the SyncBoard PCB?

It measures 66.5 × 36.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the SyncBoard use?

9 parts, built around the TEENSY 4.1. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the SyncBoard KiCad files?

From the anthonytec2/OctoSense repository on GitHub, at the commit this page was made from: the board is OctoSense/SyncBoard/SyncBoard.kicad_pcb and its schematic OctoSense/SyncBoard/SyncBoard.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the SyncBoard design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers118.1 × 101.6 mmTeensy eurorack, the printed circuit board in 3D

    Teensy eurorack

    newdigate/teensy-eurorack

    Hardware Design: Eurorack shield for teensy 4.1 with 14 in / 16 out analog channels

    102 parts259MIT
  • 2 layers240 × 240 mmKfchess, the printed circuit board in 3D

    Kfchess

    misprit7/real-time-chess

    A physical chess board without the concept of turns

    235 parts254MIT
  • 2 layers304.8 × 170.8 mm00Key, the printed circuit board in 3D

    00Key

    ZeroZeroOne-dev/00Key

    00Key a 75% keyboard

    268 parts241GPL-3.0
  • 2 layers312 × 140 mmTsynth2 Rev1.3, the printed circuit board in 3D

    Tsynth2 Rev1.3

    Electrotechnique/TSynth-Teensy4.1

    TSynth for Teensy 4.1

    108 parts182
  • 2 layers316 × 119 mmTeensy Grovebox, the printed circuit board in 3D

    Teensy Grovebox

    jerry20091103/Teensy_Grovebox

    A portable synth and music multi-tool made with Teensy 4.1

    142 parts150MIT
  • 2 layers304.8 × 95.2 mmLMN, the printed circuit board in 3D

    LMN

    FundamentalFrequency/LMN-3-ECAD

    Electrical CAD Files for the LMN-3 Project

    106 parts106CC-BY-SA-4.0
  • 2 layersT41-Main+RF board V012, the printed circuit board in 3D

    T41-Main+RF board V012

    DRWJSCHMIDT/T41

    This is the repository for the officially released V10, V11, and V12 versions of the T41 Software Defined Transceiver hardware and kits.

    255 parts66
  • 2 layers96 × 85 mmTeensyELS, the printed circuit board in 3D

    TeensyELS

    NoEngineerHere/TeensyELS

    The "blessed" way to debug is to: - Use vscode - Set your environment to "native" (this is the default) - Ensure that 'gdb' is installed - Set your breakpoints in your code to test - note: if you want to debug a single…

    47 parts63