Skip to main content

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edgefirst_schemas-3.3.0.tar.gz (851.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

edgefirst_schemas-3.3.0-cp311-abi3-win_amd64.whl (557.2 kB view details)

Uploaded CPython 3.11+Windows x86-64

edgefirst_schemas-3.3.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (628.2 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

edgefirst_schemas-3.3.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (603.8 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

edgefirst_schemas-3.3.0-cp311-abi3-macosx_11_0_arm64.whl (578.1 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

edgefirst_schemas-3.3.0-cp311-abi3-macosx_10_12_x86_64.whl (606.0 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

Details for the file edgefirst_schemas-3.3.0.tar.gz.

File metadata

  • Download URL: edgefirst_schemas-3.3.0.tar.gz
  • Upload date:
  • Size: 851.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for edgefirst_schemas-3.3.0.tar.gz
Algorithm Hash digest
SHA256 dbe5fdb2c5d785fe28a29cebb7fc60843ca7c789d06f41c53b4c347ba76a07c6
MD5 3ac4cd24652be5195c1f1677b26c19b4
BLAKE2b-256 bfa044d446ca491ca644aeef076f7bdb54b4a2e7f1d0dc91503f7f1f9010d73c

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.3.0.tar.gz:

Publisher: release.yml on EdgeFirstAI/schemas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_schemas-3.3.0-cp311-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.3.0-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 924bd98062499f084eec6923d04eb5cffb262cc26a3034dfd2514fc8ef977e23
MD5 be0bd7a4042c6b12dc79ca15193b2342
BLAKE2b-256 438609f15ea49449653cd9fa5d46ec3cd79bb63e56fb2e61c820a275ec40b885

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.3.0-cp311-abi3-win_amd64.whl:

Publisher: release.yml on EdgeFirstAI/schemas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_schemas-3.3.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.3.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 296e6f7a1d4516ee35f200b7fa72265d2d894a09e249def9f3e7729516bf0d53
MD5 303fc612170e2328ceb78517ab9b9294
BLAKE2b-256 8279214cd66dfe739680c9ec59977d72db513e3b7023e719ec95c1a7b801043b

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.3.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on EdgeFirstAI/schemas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_schemas-3.3.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.3.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e87e4b6f511afd00da86349727e96dfd128f9feb32382c9cc29550aa4ed18530
MD5 64bcb2d879719e4e11e7649100200fd2
BLAKE2b-256 1e316fb948b0d9ac8506f6a5675f863a6722b7d38fc4ab22f32b43674431567b

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.3.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on EdgeFirstAI/schemas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_schemas-3.3.0-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.3.0-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c065a9500d87beb2aac0910831ea6786bd621788f4bc3b118ec993b14b2a021d
MD5 b8fcfbb6ea8e4fdf92338d6a7d2d6ed3
BLAKE2b-256 7a3edd49aa5a665da61181459765b9ddfbbe833409ebd80c66a6e52dcf0bcb15

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.3.0-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on EdgeFirstAI/schemas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file edgefirst_schemas-3.3.0-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.3.0-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6e1357651945b9330e13f6d537457fa358fa07f68c938c877679ccaf351ea6f7
MD5 daac2859841e8d372998245946b6c606
BLAKE2b-256 97c4135f62fa4caf80f9dfc64e0b1c6966610efb68862f6ac878efda9a424331

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.3.0-cp311-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on EdgeFirstAI/schemas

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page