Skip to main content

SpatialAI SDK

Python SDK for VisionLibra ToF depth sensors and cameras.

Physical AI starts with Spatial Intelligence + AI Agents.

pip install spatialai

Five lines to spatial intelligence:

from spatialai import Camera

cam = Camera()
result = cam.detect_people()
print(result)
# {'people': 1, 'nearest_m': 1.42, 'positions': [...], 'source': 'simulator'}

Status — v0.5 (alpha)

Feature Status
Simulator (all products, depth frames included) ✅ works everywhere
Spatial Mini / DM0301 over I²C (native protocol @ 0x41) ✅ beta — Linux SBCs, pip install "spatialai[dm0301]"
Spatial Home / DMOS5030 over UART (protocol v1.4.4) ✅ beta — any OS via USB-serial, pip install "spatialai[dmos5030]"
Spatial Vision / OPN6001 toolkit (spatialai.opn6001) ✅ beta — RAW12 decode, post-filter chain, SPI/boot builders
Intel RealSense adapter (Camera("realsense")) ✅ run the models on any RealSense today
load_model() + presence-core, occupancy-home-v1 ✅ free, shipped with the SDK
Spatial Vision full V4L2 backend, Spatial Robot (UVC) 🚧 in development
Remaining marketplace models, agents, fleet 🚧 in development — load_model() raises with waitlist info

Hardware backends are implemented straight from the DOMI datasheets and protocol docs with full protocol-level test coverage; they carry a beta label until validated on production modules.

Models

Two production models ship free with the SDK today:

from spatialai import Camera

cam = Camera("spatial-home", simulate=True)
cam.load_model("occupancy-home-v1")    # room occupancy from depth CV
cam.load_model("presence-core")        # presence/approach with debouncing

for frame in cam.stream(hz=10, duration=5):
    occ = frame.models["occupancy"]
    print(f"people={occ['people']} pets={occ['pets']} occupied={occ['occupied']}")

occupancy-home-v1 is classic depth computer vision — background estimation, foreground clustering, person/pet size classification — so it needs no GPU and runs on a Raspberry Pi. Announced models that haven't shipped (people-tracking-v3, forklift-safety, …) raise ModelNotAvailableYet with waitlist instructions instead of failing silently.

Simulator — works on any machine

Every device can run in simulator mode, which generates realistic distance and people-detection streams. It is the default whenever no hardware is detected, so the quickstart above always runs.

from spatialai import Camera

cam = Camera("spatial-vision", simulate=True)
for frame in cam.stream(hz=10, duration=3):
    print(f"people={frame.people} nearest={frame.nearest_m:.2f}m")

Try it from the terminal:

spatialai demo                  # live simulated distance readout
spatialai demo --device spatial-vision
spatialai scan                  # look for real hardware on I2C

Real hardware — Spatial Mini (DM0301, I²C)

The DM0301 speaks its own register protocol at I²C address 0x41 (it is pin-compatible with the VL53L4CD, but not protocol-compatible — don't use ST drivers). Wiring on a Raspberry Pi: VIN→3V3, GND→GND, SDA→GPIO2, SCL→GPIO3, XSHUT pulled high.

sudo raspi-config          # enable I2C
pip install "spatialai[dm0301]"
from spatialai import Sensor

lock = Sensor("spatial-mini")      # auto-detects the sensor at 0x41
print(lock.distance_m())           # 0.734

for reading in lock.stream(hz=20):
    if reading.distance_m < 0.5:
        print("presence!", reading)

Real hardware — Spatial Home (DMOS5030, UART)

Wire the module to any USB-serial adapter (115200 8N1 by default) and pass the port:

pip install "spatialai[dmos5030]"
from spatialai import Camera

cam = Camera("spatial-home", port="/dev/ttyUSB0")   # COM3 on Windows
cam.load_model("occupancy-home-v1")
print(cam.infer()["occupancy"])

Defaults to 25×25 depth at 5 fps (fits 115200 baud). For the full 100×100 resolution pass resolution=(100, 100), baud=921600, fps=10.

Bring your own depth camera — Intel RealSense

Have a RealSense (D4xx/L5xx) on your desk? Run the whole SpatialAI stack on real depth frames today:

pip install "spatialai[realsense]"
from spatialai import Camera

cam = Camera("realsense")               # opens the first RealSense found
cam.load_model("occupancy-home-v1")
cam.load_model("presence-core")

for frame in cam.stream(hz=10):
    occ = frame.models["occupancy"]
    print(f"people={occ['people']} pets={occ['pets']} nearest={frame.nearest_m}")

The field of view is read from the stream intrinsics, so person/pet size classification stays physically correct on any RealSense model.

Real hardware — Spatial Vision (OPN6001/OPN6002, MIPI)

Spatial Vision streams 320×240 depth over MIPI CSI-2, which needs a platform kernel driver (V4L2) — the vendor provides an RK3566 reference. Everything above that layer ships in spatialai.opn6001 today:

from spatialai import opn6001

planes = opn6001.decode_frame(raw_u16)          # RAW12 → depth_m / ir / status / bk
depth = opn6001.ir_filter(planes["depth_m"], planes["ir"], ir_limit=50)
depth = opn6001.confidence_filter(depth, planes["status"])
depth = opn6001.median_filter(depth)            # vendor-recommended chain

words = opn6001.spi_write_words(0x4000E000, [0x80000082])   # control plane

The two vendor reference decoders disagree on line-1 bit positions, so decode_frame(variant=...) implements both — run the module's test-pattern modes on first bring-up to lock in the right one.

API overview

  • Camera(device_id=None, simulate=None) — unified entry point. .detect_people(), .stream(hz, duration), .distance_m(), .info()
  • Sensor(device_id) — alias of Camera tuned for 1D sensors.
  • spatialai.devices() — catalog of supported products.
  • Exceptions: DeviceNotFound, HardwareNotSupportedYet.

Roadmap

Spatial Vision full V4L2 backend, Spatial Robot (DMAS2M001) UVC backend, people-tracking models, and the agent/fleet APIs. Follow along at visionlibra.adamaohappy.workers.dev/developer.html.

License

MIT

Release files for spatialai 0.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for spatialai 0.5.1
File Size Uploaded
spatialai-0.5.1.tar.gz 34.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for spatialai 0.5.1
File Interpreter ABI Platform
spatialai-0.5.1-py3-none-any.whl Python 3 none any Details

Total release size: 66.5 kB

Release files / spatialai-0.5.1.tar.gz

Download URL spatialai-0.5.1.tar.gz
Size 34.5 kB
Tags Source
SHA-256 checksum
How to use checksums
7c5fb9f9bd31d316bac6ffa2cdf4a8867865a8ff2d3355ac729059466fcd1b3d
BLAKE2b-256 checksum
How to use checksums
44cdf72776f1537e96e8aac427a4d435881bee45bd04a5df7d2ce3bb782a43ea
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.15

Release files / spatialai-0.5.1-py3-none-any.whl

Download URL spatialai-0.5.1-py3-none-any.whl
Size 32.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1010244892c366e11321a28f84ece57dc90ceb14f5a09c0f9814cf4d9c7cbe3f
BLAKE2b-256 checksum
How to use checksums
a43996dd0301edb3b2cdc1a80aa2ab6f1ec7ed047c5fa28f77f3f695660083b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.15

Release history Release notifications | RSS feed

0.5.2

2 release files

This release

0.5.1 This release

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page