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.1.tar.gz (863.6 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.1-cp311-abi3-win_amd64.whl (594.7 kB view details)

Uploaded CPython 3.11+Windows x86-64

edgefirst_schemas-3.4.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (663.2 kB view details)

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

edgefirst_schemas-3.4.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (635.4 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ ARM64

edgefirst_schemas-3.4.1-cp311-abi3-macosx_11_0_arm64.whl (612.2 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

edgefirst_schemas-3.4.1-cp311-abi3-macosx_10_12_x86_64.whl (639.6 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: edgefirst_schemas-3.4.1.tar.gz
  • Upload date:
  • Size: 863.6 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.1.tar.gz
Algorithm Hash digest
SHA256 49fe1209559ee7d0174478758d3a45fcd10ab197543d5afba986446d6597268f
MD5 5e700351f63169b113dd2d07515c4c37
BLAKE2b-256 3e3ae52403ee643c09cf70113a2686118673a16c5f74416f0934169076592ab4

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.1-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 9b05736586c27db456cab2481f71b7469f109920782dba2cc2c9a2559d15d7ec
MD5 7e7fa51e7755edab83ff7dc6839c103b
BLAKE2b-256 ce7867878888c495ce412011bfa810fa44cf4f7e2d0978489e7f2586b9a40ea7

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.1-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f7fcb2dfb40243dc05840e231bdd56738ab77c847f2dad10163d899585c6fefb
MD5 88fedd14a772b7d956e6760747dca3cb
BLAKE2b-256 6748fad5ef42f2c346257ab8b205a8e4a1be663c7415c650ac9d0788761263ed

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.1-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0dd6b2d94e942b42d97aea8e5138a0c553140645622b25ff9677bdbb8c652735
MD5 bfd90cf1265aedb82c5d6277c7b07f63
BLAKE2b-256 5d36a806b3b694f38e6a100ff01f92527b7c3a58ac8e3abfe0e1ab2058212828

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.1-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 54a33ff80e818148c13fa8eaa635a9596b51c587cb6bc59230a19d2b2e861d2a
MD5 fd005e37092e019f0680b9551a3a6fe6
BLAKE2b-256 358433539238d3a47242d58ed59c5bab5d1610bfde333dcccad85301c16341d3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for edgefirst_schemas-3.4.1-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b66aef9b977c1d3faf2c42b9c9ecef4dc63c9d8a814e72f186ec60a9d4846c9a
MD5 7b9f90b1fc65e354152cd65d2fe13f85
BLAKE2b-256 2d1aa7a3c37e239dd344ba6cc90c785b7ebb5009a7d3f184435041060b6f2f21

See more details on using hashes here.

Provenance

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