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.4.3.tar.gz (869.5 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.4.3-cp311-abi3-win_amd64.whl (597.1 kB view details)

Uploaded CPython 3.11+Windows x86-64

edgefirst_schemas-3.4.3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (665.1 kB view details)

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

edgefirst_schemas-3.4.3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (637.3 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

edgefirst_schemas-3.4.3-cp311-abi3-macosx_11_0_arm64.whl (615.7 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

edgefirst_schemas-3.4.3-cp311-abi3-macosx_10_12_x86_64.whl (642.7 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: edgefirst_schemas-3.4.3.tar.gz
  • Upload date:
  • Size: 869.5 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.4.3.tar.gz
Algorithm Hash digest
SHA256 72a0bdc99051b945a2153941f02478012f03e157841b6510bfbf9eb622b7a412
MD5 a646aa1d9c14b06b2a92ddd30b58d889
BLAKE2b-256 f1c5022d5671548dc3e559e7a544a98f2b33b6868ac8cb857f5230a6334d2afd

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.4.3.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.4.3-cp311-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.3-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 c6ece5d1b314925a491bee6dfd53bcd31f61882ce0d63dd95d668241d4159bb0
MD5 6d4b6295c4f4b7aa1fed37d0d2541173
BLAKE2b-256 af0c7772dacc19ac07ea020220142090c79ba7f0400695f651bc30c49c126cd9

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.4.3-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.4.3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e23699b871aaed886bfd1349ef2abb6eae1b92da7205f28a1e918bdb07e6a462
MD5 6fd58f114eadef5aceec8a718765f5a8
BLAKE2b-256 4ae32f5d9452d27d8c801cf7a16f22901483bc544e7a29e1c1cd0faac2ba3959

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.4.3-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.4.3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 5ebe7fa857da518354c39df3f49e697e327b877c344b3b9c9c84dcaaff3ddd0b
MD5 e97fff1555e9a68831912f1ef20b7b82
BLAKE2b-256 f8f725097b3f0ab670f3f0c30c074b615c0216021ad3df7f61ff3afe7fcbbbe9

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.4.3-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.4.3-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.3-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad2d0a97bda3df5eb28d589f054980568062cd838716614fcc59caf6bc41860e
MD5 a98505f1f02809f79d9dc7758b9b50fb
BLAKE2b-256 3be7aaba9fa18f40836646ebf6fe033c12b1ea7dad30a5335dca028259311c07

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.4.3-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.4.3-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.3-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9754069146440b7c38aa70fefe561e4a4a7e3ffe6130e1753095ac50facc4036
MD5 a5925462ebc18162b467efb7a14c88bc
BLAKE2b-256 1e913122f1b748135370eafa0689d080dbf560275583d905971d2004d1ae1f2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for edgefirst_schemas-3.4.3-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