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.

Release files for roboto-mcap-codec 0.2.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.2.0
File
roboto_mcap_codec-0.2.0-cp310-abi3-win_arm64.whl CPython 3.10 abi3 Windows ARM64 Details
roboto_mcap_codec-0.2.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
roboto_mcap_codec-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
roboto_mcap_codec-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
roboto_mcap_codec-0.2.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.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
roboto_mcap_codec-0.2.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
roboto_mcap_codec-0.2.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.2.0-cp310-abi3-win_arm64.whl

Download URL roboto_mcap_codec-0.2.0-cp310-abi3-win_arm64.whl
Size 2.1 MB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
1c5c573e96fbe00d1ef784c4a93f34eefa33a47271bb0b3d983f5f0ff2fe41f0
BLAKE2b-256 checksum
How to use checksums
81285f545a041add6d0d5e00862af8253513ebf61f97f8b305e2fa92d616c41e
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 26, 2026.

Transparency log

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

Download URL roboto_mcap_codec-0.2.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
51ac13246c9df0d930a93160d40c1b92df5359b542c04e839e9e304422be3669
BLAKE2b-256 checksum
How to use checksums
031aae25f3aa1eb7489e474a5904b32c2c8941ce3bf923fa8588a4d7cfba55eb
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 26, 2026.

Transparency log

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

Download URL roboto_mcap_codec-0.2.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
789a608a80e5f77e682a7b8622a5caf888290cb016e783b61ea4261a084bfd3a
BLAKE2b-256 checksum
How to use checksums
e0991f6de7a1d1ccf8aa4a273d8c64e300cd1ea36c0ff83ff71d79603136c0c6
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 26, 2026.

Transparency log

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

Download URL roboto_mcap_codec-0.2.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
2dc3d9fb32757118e67f3a85c25aada96b7d7656a6e1b60ca1ca1aa0a9fb005c
BLAKE2b-256 checksum
How to use checksums
7321593945bbee3605553ed9cff1325cce2a0c0cd81ba7849d7084f7fa4a676c
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 26, 2026.

Transparency log

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

Download URL roboto_mcap_codec-0.2.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
d4f8931fae17307b563233b416ae0260b1d5fda7ec2c21a76a7406e45a0c1b85
BLAKE2b-256 checksum
How to use checksums
015397914e2e13bf07ba9d676926e6c25bff2c0f18e85e6f701e1c80655bd395
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 26, 2026.

Transparency log

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

Download URL roboto_mcap_codec-0.2.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
79bc482136259f239c252c29ac31f162527f1cc7b615590a28c1ca877676cfde
BLAKE2b-256 checksum
How to use checksums
cf3d148fab3ba017b3df470ce8491d9210fd5ff1081615a9d2dfa5f5f93dc51a
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 26, 2026.

Transparency log

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

Download URL roboto_mcap_codec-0.2.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
8f889a606b42e92747e534a768cfb0b414d0a65be0e4f7cd9e2127e452e2030d
BLAKE2b-256 checksum
How to use checksums
e25aca861047f23f784e85063d23de7a2d28cd90655e6d1a7e1faeb903155203
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 26, 2026.

Transparency log

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

Download URL roboto_mcap_codec-0.2.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
e433782eb91ec2ed9aa078debc8a92cee36a441cfdfb6c271c289b2f922d1d4f
BLAKE2b-256 checksum
How to use checksums
9c8b61cbdb6b98538777314b020e08c69c465efd2f2c793cb88596256caaaef1
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 26, 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