Zero-copy CDR message types for EdgeFirst Perception (ROS 2 + Foxglove + custom)
Project description
edgefirst-schemas (Python)
Zero-copy CDR message types for EdgeFirst Perception. Wraps the
edgefirst-schemas Rust crate via PyO3.
pip install edgefirst-schemas
The wheel ships as cp311-abi3 (Python 3.11+, single wheel per OS/arch).
For an older Python floor, build from source with --no-default-features --features abi3-py38 — see Build from source.
Quick start
from edgefirst.schemas.builtin_interfaces import Time
from edgefirst.schemas.std_msgs import Header
from edgefirst.schemas.sensor_msgs import Image
import numpy as np
pixels = np.zeros((720, 1280, 3), dtype=np.uint8)
img = Image(
header=Header(stamp=Time(sec=1, nanosec=0), frame_id="cam"),
height=720, width=1280, encoding="rgb8",
is_bigendian=0, step=1280 * 3,
data=pixels, # any contiguous buffer-protocol object
)
# Zero-copy view of the pixel data — `np.frombuffer` aliases the same
# bytes the message was constructed with, no copy.
arr = np.frombuffer(img.data, dtype=np.uint8).reshape(720, 1280, 3)
# Wire bytes for transport:
buf = img.to_bytes()
img2 = Image.from_cdr(buf)
assert img2.width == 1280
Forwarding raw CDR bytes without a copy
For publish paths where you want to hand the wire bytes straight to a
transport (Zenoh, raw socket, mcap writer), cdr_view() exposes the
full CDR buffer (header + payload) as a zero-copy BorrowedBuf:
transport.publish(memoryview(img.cdr_view())) # zero-copy
to_bytes() is the explicit-copy alternative when the consumer wants
an owned bytes value.
Zero-copy contract — BorrowedBuf
Every bulk byte payload (Image.data, Mask.mask, RadarCube.cube,
PointCloud2.data, CompressedVideo.data, CompressedImage.data)
returns a BorrowedBuf view that aliases the parent message's bytes —
not a copy. The BorrowedBuf holds a strong reference to the parent,
so it's safe to keep it (or a memoryview derived from it) live after
the original message reference is dropped.
| Method | Returns | Cost |
|---|---|---|
borrowed_buf itself |
wraps the bytes | zero-copy, O(1) |
np.frombuffer(borrowed_buf, dtype=...) |
numpy ndarray aliasing the bytes | zero-copy, O(1) (Py 3.11+) |
memoryview(borrowed_buf) |
parent-anchored memoryview | zero-copy, O(1) (Py 3.11+) |
borrowed_buf.tobytes() |
owned bytes |
one memcpy |
borrowed_buf.view() |
memoryview (Py 3.11+) / bytes (abi3-py38) | zero-copy / one memcpy |
Migrating from the pycdr2-backed edgefirst.schemas
This release replaces the pure-Python pycdr2 codec with a Rust-backed
pyo3 binding. Wire-format bytes are unchanged — anything encoded by the
previous pycdr2 module decodes through from_cdr() and vice-versa — but
the Python API surface is narrower and stricter.
What changed at the call site
# pycdr2-backed (old) # pyo3-backed (new)
img = Image() img = Image(
img.height = 720 header=Header(stamp=Time(1, 0)),
img.width = 1280 height=720, width=1280,
img.encoding = "rgb8" encoding="rgb8", is_bigendian=0,
img.data = pixels step=1280 * 3, data=pixels,
buf = img.serialize() )
img2 = Image.deserialize(buf) buf = img.to_bytes()
img2 = Image.from_cdr(buf)
| pycdr2 pattern | pyo3 replacement |
|---|---|
Foo() then field assignment |
Foo(field=value, …) constructor only — pyclasses are frozen |
.serialize() |
.to_bytes() |
Foo.deserialize(buf) |
Foo.from_cdr(buf) |
msg.data returning bytes |
msg.data returning BorrowedBuf (zero-copy view); use .tobytes() for the old shape |
from_schema(), decode_pcd(), colormap(), registry helpers |
removed — the legacy module survives only at benches/python/legacy/ for benchmark parity |
std_msgs.{String, Int32, Float64, …} primitive wrappers |
removed — these were pycdr2-generated single-value wrappers; pass raw Python values instead |
| Mutable dataclass-style instances | Frozen pyclasses; rebuild instead of mutate |
What stays the same
- All field names and types match the ROS 2 / Foxglove / EdgeFirst schemas verbatim.
- Wire-format CDR1 LE bytes are byte-equivalent across versions.
- The
edgefirst.schemas.<submodule>import paths (sensor_msgs.Image,std_msgs.Header, etc.) are preserved.
abi3-py38 builds — typed numpy caveats
The default wheel is cp311-abi3, where the buffer protocol is in the
limited API and typed numpy arrays (np.uint16, np.float32, …) work
zero-copy as constructor inputs. On the opt-in abi3-py38 build the
buffer protocol isn't available; pass arr.tobytes() for typed arrays,
and BorrowedBuf.view() returns bytes (one copy) instead of a
parent-anchored memoryview. Plain bytes / bytearray / np.uint8
arrays work on either build.
shape = np.array([2, 128, 12, 128], dtype=np.uint16)
# Default cp311-abi3 wheel — works directly:
RadarCube(..., shape=shape, ...)
# abi3-py38 build — pass bytes:
RadarCube(..., shape=shape.tobytes(), ...)
Build from source
Default (cp311-abi3 wheel for Python 3.11+):
maturin develop --release --manifest-path crates/python/Cargo.toml
abi3-py38 wheel (for embedded targets pinning an older Python):
maturin build --release \
--manifest-path crates/python/Cargo.toml \
--no-default-features --features abi3-py38
Cross-compile manylinux2014 wheels via zig:
maturin build --release --zig --compatibility manylinux2014 \
--target aarch64-unknown-linux-gnu \
--manifest-path crates/python/Cargo.toml
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file edgefirst_schemas-3.2.0.tar.gz.
File metadata
- Download URL: edgefirst_schemas-3.2.0.tar.gz
- Upload date:
- Size: 823.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f29164fe35d52a8b72c8f7674603d137b7dba4610211dd627944294745f5902
|
|
| MD5 |
2a6aa03fa26b9a168b6a88ff7b148126
|
|
| BLAKE2b-256 |
45051e53df42f2717acd41edb9d2257394b3d002b879c6cdbbb7d57a81de0e11
|
Provenance
The following attestation bundles were made for edgefirst_schemas-3.2.0.tar.gz:
Publisher:
release.yml on EdgeFirstAI/schemas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edgefirst_schemas-3.2.0.tar.gz -
Subject digest:
0f29164fe35d52a8b72c8f7674603d137b7dba4610211dd627944294745f5902 - Sigstore transparency entry: 1397949228
- Sigstore integration time:
-
Permalink:
EdgeFirstAI/schemas@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/EdgeFirstAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file edgefirst_schemas-3.2.0-cp311-abi3-win_amd64.whl.
File metadata
- Download URL: edgefirst_schemas-3.2.0-cp311-abi3-win_amd64.whl
- Upload date:
- Size: 518.2 kB
- Tags: CPython 3.11+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee8b7b026865b3aaf5e455baf2444c7df54959962fd651f61d2693be130ab64c
|
|
| MD5 |
4e16b63b071cec766e95a5dbca8154fe
|
|
| BLAKE2b-256 |
21e8bd4e85116dd97b0beabc4937802664e4e0a1b2c8c0f0ffeec7be31358de1
|
Provenance
The following attestation bundles were made for edgefirst_schemas-3.2.0-cp311-abi3-win_amd64.whl:
Publisher:
release.yml on EdgeFirstAI/schemas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edgefirst_schemas-3.2.0-cp311-abi3-win_amd64.whl -
Subject digest:
ee8b7b026865b3aaf5e455baf2444c7df54959962fd651f61d2693be130ab64c - Sigstore transparency entry: 1397949274
- Sigstore integration time:
-
Permalink:
EdgeFirstAI/schemas@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/EdgeFirstAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file edgefirst_schemas-3.2.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: edgefirst_schemas-3.2.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 584.7 kB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc36e79a8e8f5da4c2ce4832482a41f3cd7124a9dbde89df2982826e7a05c91a
|
|
| MD5 |
024bf975dd8ce844d3e552e3e15b83bc
|
|
| BLAKE2b-256 |
d2eb82dc5dd7dd51f95b8e5c994d629f6af1f9003a798cef27efb650d64478e2
|
Provenance
The following attestation bundles were made for edgefirst_schemas-3.2.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on EdgeFirstAI/schemas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edgefirst_schemas-3.2.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
bc36e79a8e8f5da4c2ce4832482a41f3cd7124a9dbde89df2982826e7a05c91a - Sigstore transparency entry: 1397949255
- Sigstore integration time:
-
Permalink:
EdgeFirstAI/schemas@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/EdgeFirstAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file edgefirst_schemas-3.2.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: edgefirst_schemas-3.2.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 559.0 kB
- Tags: CPython 3.11+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf66693a7719a0a40eff1044fa9f9cc4b604b03f33f6bb53331a497bb690981f
|
|
| MD5 |
140868d54cead9d261f470737644f35b
|
|
| BLAKE2b-256 |
2d860b57b3bfb1771b59f2261327c10072750d3b8eae71e24997b9331d310a7b
|
Provenance
The following attestation bundles were made for edgefirst_schemas-3.2.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on EdgeFirstAI/schemas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edgefirst_schemas-3.2.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
cf66693a7719a0a40eff1044fa9f9cc4b604b03f33f6bb53331a497bb690981f - Sigstore transparency entry: 1397949265
- Sigstore integration time:
-
Permalink:
EdgeFirstAI/schemas@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/EdgeFirstAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file edgefirst_schemas-3.2.0-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: edgefirst_schemas-3.2.0-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 531.7 kB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0202b4cb69606468020be6a468447da275de44c332850cc706d71f319fca56c0
|
|
| MD5 |
05ec1e5972303e540aa6e9ad2b9c0f32
|
|
| BLAKE2b-256 |
88541a058e06e6ae56830dea2f142238643bc4848cb6e9d3e0e28e6b53d4913b
|
Provenance
The following attestation bundles were made for edgefirst_schemas-3.2.0-cp311-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on EdgeFirstAI/schemas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edgefirst_schemas-3.2.0-cp311-abi3-macosx_11_0_arm64.whl -
Subject digest:
0202b4cb69606468020be6a468447da275de44c332850cc706d71f319fca56c0 - Sigstore transparency entry: 1397949240
- Sigstore integration time:
-
Permalink:
EdgeFirstAI/schemas@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/EdgeFirstAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file edgefirst_schemas-3.2.0-cp311-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: edgefirst_schemas-3.2.0-cp311-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 560.4 kB
- Tags: CPython 3.11+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5ee71d0a1de873d6e2a368653530547079d0f5d7cd74c29d5a026b86a704071b
|
|
| MD5 |
cd24dd92a1e3294cae65eb49c0b2faad
|
|
| BLAKE2b-256 |
6028bdb842ad20a4205aed77165395dbe1469115175869f54899be827077ae67
|
Provenance
The following attestation bundles were made for edgefirst_schemas-3.2.0-cp311-abi3-macosx_10_12_x86_64.whl:
Publisher:
release.yml on EdgeFirstAI/schemas
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
edgefirst_schemas-3.2.0-cp311-abi3-macosx_10_12_x86_64.whl -
Subject digest:
5ee71d0a1de873d6e2a368653530547079d0f5d7cd74c29d5a026b86a704071b - Sigstore transparency entry: 1397949245
- Sigstore integration time:
-
Permalink:
EdgeFirstAI/schemas@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Branch / Tag:
refs/tags/v3.2.0 - Owner: https://github.com/EdgeFirstAI
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d362c241d877ea9c53ead97c4bab9b1642908ed8 -
Trigger Event:
push
-
Statement type: