Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

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.3.0rc1

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.0rc1
File
roboto_mcap_codec-0.3.0rc1-cp310-abi3-win_arm64.whl CPython 3.10 abi3 Windows ARM64 Details
roboto_mcap_codec-0.3.0rc1-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
roboto_mcap_codec-0.3.0rc1-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
roboto_mcap_codec-0.3.0rc1-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
roboto_mcap_codec-0.3.0rc1-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.0rc1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
roboto_mcap_codec-0.3.0rc1-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
roboto_mcap_codec-0.3.0rc1-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.0rc1-cp310-abi3-win_arm64.whl

Download URL roboto_mcap_codec-0.3.0rc1-cp310-abi3-win_arm64.whl
Size 2.1 MB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
7662610c2160ffc1aed3c181b44af18b1682fde41869e3a9204175cee8df1fde
BLAKE2b-256 checksum
How to use checksums
8bc1e082bf9228ab8ce36d79451baa212d6dd33434b9fce075d715c4f0a49123
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.3.0rc1-cp310-abi3-win_amd64.whl

Download URL roboto_mcap_codec-0.3.0rc1-cp310-abi3-win_amd64.whl
Size 2.2 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
42445c06aeb93a794bd885b49a4580821edc44309b38964330d3f873fd7d54d6
BLAKE2b-256 checksum
How to use checksums
56d408ef3aaa5e327ab986127bc812b8b0d928dcaebc3cb3ea865e29c7483e5b
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.3.0rc1-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL roboto_mcap_codec-0.3.0rc1-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
101008be954cdf99d876336744bcfce4804b9725351a72148d772a1373d5cf01
BLAKE2b-256 checksum
How to use checksums
4f207ec3abfc9cc12f7d4491e4f67b588073311c10bde2973a416ab650d0c937
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.3.0rc1-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL roboto_mcap_codec-0.3.0rc1-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
dc8efca29cd4413b1b745094f365198f40c99d51b8fc9fb82223a5aaf049e009
BLAKE2b-256 checksum
How to use checksums
428499aa5b805c10d46ebd38331b71f901a3ed4cce1949c5f38b85b560699769
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.3.0rc1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL roboto_mcap_codec-0.3.0rc1-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
0f3ac00c99782dc976a71465b65916d8d36377b10e8cd184c3e2db350f68d909
BLAKE2b-256 checksum
How to use checksums
a2de6eaf76a9363da8737af5e8e508df04c2e352ebb01fe63aafc30d93ba16b0
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.3.0rc1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL roboto_mcap_codec-0.3.0rc1-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
54e0f642eebbec10eb76c6425066f2210e9fcee7d5f1c123fb98fc4c3ae780f6
BLAKE2b-256 checksum
How to use checksums
670fcc3f7f173f71a67fb62089b5244182353a4746069f9da70243ba25c91bf2
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.3.0rc1-cp310-abi3-macosx_11_0_arm64.whl

Download URL roboto_mcap_codec-0.3.0rc1-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
fe7a4bac73f7f0b47abd5a3ed57b6c67bfac0f733c0ea6f0585973371410ad9d
BLAKE2b-256 checksum
How to use checksums
c30012daff05d80bf7f780024cf1ea7cc5ca31a4ede86a34b9bd0b77e6f883ad
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.3.0rc1-cp310-abi3-macosx_10_12_x86_64.whl

Download URL roboto_mcap_codec-0.3.0rc1-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
000609978f7112ac8d10b6c8b82c2d3355b5d33255e4d98ca4b8523db293a6f0
BLAKE2b-256 checksum
How to use checksums
a6d5c0190dceccea0a00b857e272feea305d13abc54c63dd18668ae0b36ab90e
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