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.0.tar.gz (863.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.4.0-cp311-abi3-win_amd64.whl (594.9 kB view details)

Uploaded CPython 3.11+Windows x86-64

edgefirst_schemas-3.4.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (662.9 kB view details)

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

edgefirst_schemas-3.4.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (635.1 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

edgefirst_schemas-3.4.0-cp311-abi3-macosx_11_0_arm64.whl (612.1 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

edgefirst_schemas-3.4.0-cp311-abi3-macosx_10_12_x86_64.whl (639.3 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: edgefirst_schemas-3.4.0.tar.gz
  • Upload date:
  • Size: 863.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.4.0.tar.gz
Algorithm Hash digest
SHA256 31013fe9b921b3ffdf1d8ce0e7bd3cbf1537bdcf8b1accf74dae8a5d1fb23cbe
MD5 f728c9c74eb3ccdd5b175fa1514bde26
BLAKE2b-256 ab54d9dc9dcc25dd9931e5eb56e2788349c9eecbde4d93e3cf131f354f9936a5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.0-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 6707bb9ea607a7fbc66fd1cd890442e20ead6e6f8fd2adb23be02ccdae8cef5d
MD5 089030bc5a84ac3078f0432833038436
BLAKE2b-256 82204e14797246433770e454c4271c60febf1967a7e2a466e058a03080b93d46

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.0-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 912ac97186dd0cf03d4b9a0354682cb0cc08240e8c71fc34cd3b52e7247117ba
MD5 01174e10f17ed8d2a225c793d8c2b069
BLAKE2b-256 be7989eac129aeb0752483e38f7105fd129a8578bdf50c461574be925e7c0ffb

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.0-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 096814975b3c7738a00c00730ecf49efe9bac71d10ca49c563e5b2704093ba28
MD5 403e01c9947acdc849ac593fa62e14f9
BLAKE2b-256 599699ad9e4b92096d8d077189127b04bcf9f251a754ae5437c104a9299ff160

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.0-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d0e482b2964583e2b247dc7349ab356964af496afdc56b3f013560bbced65796
MD5 62c0a94434b6993c013c7d94ec6ef7ad
BLAKE2b-256 aea8225b926e8aae2ad3916cc6b8ccb6633473242f10022ce16f07c57cff2383

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.0-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d23c88d52c5c9e14461694b74cc8e598da0c10c2b833e0b9ec0725e65174e150
MD5 17ff982929158ea4e3d0024f9a0706e7
BLAKE2b-256 52cc1e17d971f078076bfdb579dc8f4b25c6b8ebe7719e4b85265cee51c9cd71

See more details on using hashes here.

Provenance

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