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 ofCameratuned 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.com/developer.
License
MIT
Metadata
Release files for spatialai 0.5.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| spatialai-0.5.2.tar.gz | 34.2 kB | Without provenance | Details for spatialai-0.5.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| spatialai-0.5.2-py3-none-any.whl | Python 3 | none | any | Details for spatialai-0.5.2-py3-none-any.whl |
Total release size: 66.2 kB
Release files / spatialai-0.5.2.tar.gz
| Download URL | spatialai-0.5.2.tar.gz |
|---|---|
| Size | 34.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3bbdc03a5e59cbbd29f805d94db0ea09597644df4fb26d42e35e821206abe1db
|
|
BLAKE2b-256 checksum How to use checksums |
4a01345c7312f1c9aff8c02915d656c12ef2072cea2215d3fd5a4c876598e508
|
| 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.2-py3-none-any.whl
| Download URL | spatialai-0.5.2-py3-none-any.whl |
|---|---|
| Size | 32.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1047be0b62ef54090fa5b68059522f935fed43605786675433818d3daab359ec
|
|
BLAKE2b-256 checksum How to use checksums |
4ee318693876f4d15db38c044cd738d5df5b3a7a8c6ea9b775dd6a52a7abece8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|
Security for spatialai 0.5.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.