Skip to main content

roboto-mcap-codec

Decodes one channel of an MCAP file into Apache Arrow, and single messages into Python objects. open_mcap_file reads the file through a byte-range reader you supply: its footer and summary, then only the chunks that hold the channel's messages within the requested row range and, for a window on log time, overlap that window. It decodes ROS 1 messages, ROS 2 and OMG IDL messages over CDR, and JSON or MessagePack messages described by a JSON Schema. The rows arrive as pyarrow.RecordBatch values, one per batch, each owning its data, so it stays valid after the file and the cursor that read it are gone.

Each open_mcap_file call opens a cursor over one channel of one file, and cursors on separate threads run in parallel, since each decodes without holding the interpreter lock. With the default limits, one cursor reads messages of up to 64 MiB, such as camera images and lidar point clouds.

The package ships prebuilt wheels for Linux (manylinux2014 and musllinux_1_2, x86-64 and aarch64), macOS (Intel and Apple Silicon) and Windows (x86-64 and ARM64). Each wheel targets CPython's stable ABI, so one wheel per platform serves CPython 3.10 and later. The package is published as these wheels only, so pip cannot install it on any other platform.

Install

pip install "roboto-mcap-codec[pyarrow]"

open_mcap_file needs PyArrow 20 or later, which the pyarrow extra installs. Without it, pip install roboto-mcap-codec installs only the per-message RosCdrCodec, and open_mcap_file raises ImportError naming the extra. PyArrow publishes no Windows ARM64 wheel, so there the extra installs nothing and open_mcap_file needs a PyArrow built separately.

Quick start

import os

import mcap_codec

path = "recording.mcap"
with open(path, "rb") as file:

    # Called for each byte range the cursor reads; return exactly `length` bytes.
    def read_bytes(offset: int, length: int) -> bytes:
        file.seek(offset)
        return file.read(length)

    with mcap_codec.open_mcap_file(
        read_bytes,
        os.path.getsize(path),
        channel=mcap_codec.TopicName("/odometry"),
        projection=mcap_codec.Projection(include=[["speed"], ["pose", "x"]]),
        timestamp=mcap_codec.TimestampSource("message_log_time"),
        time_window=(1_700_000_000_000_000_000, 1_700_000_060_000_000_000),
    ) as cursor:
        for batch in cursor:
            ...  # use the rows of this pyarrow.RecordBatch
  • Column 0 of every batch is the row number: the message's zero-based position among the channel's messages, in the order the file stores them. Column 1 is the timestamp in nanoseconds, from the source the timestamp argument names. The projected fields follow: a Projection's include paths, or every field without include, minus its exclude paths. An open_mcap_file call without projection gets every top-level field, and include=[] gets none.
  • Read each cursor from one thread at a time: a second call on a cursor while the first still runs raises RuntimeError.
  • cursor.to_record_batch_reader() returns a pyarrow.RecordBatchReader over the remaining batches, which PyArrow, DuckDB and Polars accept.
  • Close a cursor you stop reading, so it makes no further read_bytes calls; the with statement closes it when its block ends.
  • A failure raises CodecError, a ValueError whose code names it, such as unknown_channel, corrupt_input or resource_limit. The exceptions: an exception your read_bytes raises propagates unchanged, and a value of the wrong type, including a read_bytes result that is not bytes, raises TypeError.

The docstrings, such as help(mcap_codec.open_mcap_file), document every argument, class and error code.

Decoding single messages

A RosCdrCodec decodes one message at a time, from its bytes, without reading a file. Constructing one parses a schema, so build one per schema and reuse it for every message that schema describes:

from mcap_codec import RosCdrCodec, UnsupportedMessage

# schema_data: the schema's bytes, such as an MCAP Schema record's `data`
codec = RosCdrCodec("ros2msg", "cdr", schema_data, "sensor_msgs/msg/Imu")

# payload: a Message record's `data`; a CDR payload starts with its 4-byte
# encapsulation header
try:
    message = codec.decode(payload)
    partial = codec.decode_fields(
        payload, ["angular_velocity.x", "header.stamp.sec"]
    )
except UnsupportedMessage:
    message = partial = None  # a message the decoder declines; skip it

decode returns the message as dicts, lists and scalars, with each array of a fixed-width numeric type as an array.array. decode_fields returns the fields at the dotted paths it is given, nested as in the whole message, and builds no Python objects for the others. A message the decoder declines, such as one holding a wstring in a ROS 2 message or outside an IDL @mutable struct, raises UnsupportedMessage, a CodecError you can catch to skip it.

Changes from 0.1

  • McapBatchDecoder is removed; use open_mcap_file.
  • UnsupportedMessage derives from CodecError, and so from ValueError, where 0.1 derived it from Exception. Place an except UnsupportedMessage clause before any except ValueError clause, which would otherwise catch it.
  • RosCdrCodec raises CodecError, still a ValueError, with message text that differs from 0.1's; match on code, not on the text.

License

The package is licensed under MPL-2.0; see LICENSE. Versions 0.1.19 and earlier were published under Apache-2.0 and remain under it. NOTICE and THIRD_PARTY_LICENSES/ cover the third-party components compiled into the wheels.

Metadata

Release files for roboto-mcap-codec 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for roboto-mcap-codec 0.3.0
File
roboto_mcap_codec-0.3.0-cp310-abi3-win_arm64.whl CPython 3.10 abi3 Windows ARM64 Details
roboto_mcap_codec-0.3.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
roboto_mcap_codec-0.3.0-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
roboto_mcap_codec-0.3.0-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
roboto_mcap_codec-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
roboto_mcap_codec-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
roboto_mcap_codec-0.3.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
roboto_mcap_codec-0.3.0-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 17.8 MB

Release files / roboto_mcap_codec-0.3.0-cp310-abi3-win_arm64.whl

Download URL roboto_mcap_codec-0.3.0-cp310-abi3-win_arm64.whl
Size 2.1 MB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
217120247c5f58c727cf8b485bd3f8a30c8c4a05833e5add121296fe72064cd6
BLAKE2b-256 checksum
How to use checksums
eacdecd3401e61d490a3eaeff489b1256a8c38705251ea2baa5664100592b082
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / roboto_mcap_codec-0.3.0-cp310-abi3-win_amd64.whl

Download URL roboto_mcap_codec-0.3.0-cp310-abi3-win_amd64.whl
Size 2.2 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
27845bc68465d87f6f4c089f56e485e584bc04c1787580602d3a8562933ecf96
BLAKE2b-256 checksum
How to use checksums
2904f0d1191980fbb78007009010ac8ef264e7ea486c1fa82a404a52c98382ab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / roboto_mcap_codec-0.3.0-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL roboto_mcap_codec-0.3.0-cp310-abi3-musllinux_1_2_x86_64.whl
Size 2.5 MB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
0a4e7bf878c312f490dd99cd4852b4c4252673b6d5e543c857b987d2aa7d3543
BLAKE2b-256 checksum
How to use checksums
cea574355127705d26c154f4e5a78c9c8b08719ffd0b17c383ae3475211e014c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / roboto_mcap_codec-0.3.0-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL roboto_mcap_codec-0.3.0-cp310-abi3-musllinux_1_2_aarch64.whl
Size 2.3 MB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
7c09cd86a464b09a14a125abd60bab07865b47f8278dea901fc2f112535435c2
BLAKE2b-256 checksum
How to use checksums
de6cef44006b44745fb69dd579516556dfccdbf8f5002344475585142820a54a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / roboto_mcap_codec-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL roboto_mcap_codec-0.3.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 2.3 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
5acf407be7557ceaed57bf18eb61cfd364088a22171c5bf4368177d50677d072
BLAKE2b-256 checksum
How to use checksums
343c6f12e08426e805357763dab0c9eafba7779b5b98b399172653d337b65d68
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / roboto_mcap_codec-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL roboto_mcap_codec-0.3.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 2.1 MB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
2883454eb347ea59aec17979e163b230760769fc40956a6704cb70c8f4b2067a
BLAKE2b-256 checksum
How to use checksums
648953baf56ee7ef76db8957d5068f22360e8dadf771ef44b92bdddbe1acc6a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / roboto_mcap_codec-0.3.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL roboto_mcap_codec-0.3.0-cp310-abi3-macosx_11_0_arm64.whl
Size 2.1 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
b65afcf8462a6b2612032975a2d2916c899dad31f5c430ac9e75345bd4e9374f
BLAKE2b-256 checksum
How to use checksums
c20268c50fd7a55338418ef50c03fdd7b71dadd884f81e3e930772c39ea125c5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log

Release files / roboto_mcap_codec-0.3.0-cp310-abi3-macosx_10_12_x86_64.whl

Download URL roboto_mcap_codec-0.3.0-cp310-abi3-macosx_10_12_x86_64.whl
Size 2.2 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
024a287e85c05f6e0e949a5b06107e343527ab1e2ba4bf15d0fd00a275831819
BLAKE2b-256 checksum
How to use checksums
52faebf4a9269eb0c38666a878e0636eec1cde09c890a4f8ee0c12a7c03cc418
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 28, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page