Skip to main content

High-performance pure Python ROS2 message serialization and deserialization for MCAP files

Project description

mcap-ros2-support-fast

High-performance pure Python ROS2 message serialization and deserialization for MCAP files.

No dependencies on ROS2 or a ROS2 environment.

Installation

uv add mcap-ros2-support-fast

Usage

Decoding Messages

from small_mcap import read_message_decoded
from mcap_ros2_support_fast.decoder import DecoderFactory

decoder_factory = DecoderFactory()

with open("recording.mcap", "rb") as f:
    for msg in read_message_decoded(f, decoder_factories=[decoder_factory]):
        print(f"{msg.channel.topic}: {msg.decoded_message}")

Encoding Messages

from small_mcap import McapWriter
from mcap_ros2_support_fast import ROS2EncoderFactory

encoder_factory = ROS2EncoderFactory()

with open("output.mcap", "wb") as f:
    writer = McapWriter(f, encoder_factory=encoder_factory)
    writer.start(profile="ros2")

    schema_id = writer.add_schema(
        name="geometry_msgs/msg/Point",
        encoding="ros2msg",
        data=b"float64 x\nfloat64 y\nfloat64 z"
    )
    channel_id = writer.add_channel("/point", "cdr", schema_id=schema_id)

    point = {"x": 1.0, "y": 2.0, "z": 3.0}
    writer.add_message_encode(channel_id, log_time=0, data=point)

    writer.finish()

Benchmarks

Full benchmark suite comparing against reference mcap-ros2 implementation, rosbags library, and pybag.

Read Performance

-------------------------------------------------------------------------------------- benchmark 'msgs-10': 4 tests --------------------------------------------------------------------------------------
Name (time in ms)                                  Min                 Max                Mean             StdDev              Median                IQR                 OPS            Rounds  Iterations
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_decoder[mcap_ros2_fast-10]       5.9309 (1.0)        6.6827 (1.0)        6.2876 (1.0)       0.2078 (1.0)        6.2848 (1.0)       0.3145 (1.36)     159.0425 (1.0)          24           1
test_benchmark_decoder[rosbags-10]              7.8039 (1.32)       9.4448 (1.41)       8.2345 (1.31)      0.3564 (1.72)       8.1815 (1.30)      0.2311 (1.0)      121.4397 (0.76)         17           1
test_benchmark_decoder[pybag-10]               28.2604 (4.76)      34.4526 (5.16)      29.2232 (4.65)      1.5174 (7.30)      28.7849 (4.58)      0.7441 (3.22)      34.2194 (0.22)         17           1
test_benchmark_decoder[mcap_ros2-10]          344.9453 (58.16)    393.5084 (58.88)    371.4299 (59.07)    19.4372 (93.54)    368.3629 (58.61)    30.0467 (130.00)     2.6923 (0.02)          5           1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------- benchmark 'msgs-100': 4 tests ------------------------------------------------------------------------------------------
Name (time in ms)                                     Min                   Max                  Mean             StdDev                Median                IQR                OPS            Rounds  Iterations
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_decoder[mcap_ros2_fast-100]        36.1641 (1.0)         41.7886 (1.0)         38.7671 (1.0)       2.4714 (1.0)         37.0456 (1.0)       4.7878 (1.0)      25.7951 (1.0)          17           1
test_benchmark_decoder[rosbags-100]               64.0870 (1.77)        73.8624 (1.77)        67.7211 (1.75)      3.3350 (1.35)        66.9847 (1.81)      5.7329 (1.20)     14.7665 (0.57)         13           1
test_benchmark_decoder[pybag-100]                116.3701 (3.22)       126.1597 (3.02)       120.2669 (3.10)      3.8116 (1.54)       118.5586 (3.20)      6.1874 (1.29)      8.3148 (0.32)          7           1
test_benchmark_decoder[mcap_ros2-100]          1,304.4500 (36.07)    1,341.5722 (32.10)    1,325.5776 (34.19)    16.4693 (6.66)     1,332.5642 (35.97)    28.6133 (5.98)      0.7544 (0.03)          5           1
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------- benchmark 'msgs-1000': 3 tests -----------------------------------------------------------------------------------------
Name (time in ms)                                      Min                   Max                  Mean             StdDev                Median                IQR               OPS            Rounds  Iterations
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_decoder[mcap_ros2_fast-1000]       126.9185 (1.0)        136.1736 (1.0)        132.6490 (1.0)       3.0011 (1.22)       133.3180 (1.0)       3.0429 (1.07)     7.5387 (1.0)           7           1
test_benchmark_decoder[rosbags-1000]              230.6469 (1.82)       236.9495 (1.74)       234.7352 (1.77)      2.4632 (1.0)        235.5722 (1.77)      2.8371 (1.0)      4.2601 (0.57)          5           1
test_benchmark_decoder[mcap_ros2-1000]          4,034.0901 (31.78)    4,092.9589 (30.06)    4,075.4871 (30.72)    24.8972 (10.11)    4,087.6284 (30.66)    31.2742 (11.02)    0.2454 (0.03)          5           1
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Read Summary:

  • 31-59x faster than reference mcap-ros2
  • 1.31-1.77x faster than rosbags
  • 3.10-4.65x faster than pybag (10-100 msgs; pybag skipped at 1000 due to decoder limitations)

Write Performance (Read + Write)

------------------------------------------------------------------------------------------ benchmark 'write-msgs-10': 4 tests -----------------------------------------------------------------------------------------
Name (time in ms)                                                Min                 Max                Mean             StdDev              Median                IQR                OPS            Rounds  Iterations
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_read_and_write[mcap_ros2_fast_writer-10]      17.6656 (1.0)       24.6546 (1.17)      19.1740 (1.0)       1.8360 (5.76)      18.8823 (1.0)       1.1571 (2.74)     52.1540 (1.0)          12           1
test_benchmark_read_and_write[rosbags_writer-10]             19.9034 (1.13)      21.1216 (1.0)       20.3388 (1.06)      0.3189 (1.0)       20.2124 (1.07)      0.4219 (1.0)      49.1670 (0.94)         13           1
test_benchmark_read_and_write[pybag_writer-10]               61.6168 (3.49)      84.1206 (3.98)      66.9191 (3.49)      6.0055 (18.83)     65.0424 (3.44)      6.6212 (15.69)    14.9434 (0.29)         13           1
test_benchmark_read_and_write[mcap_ros2_writer-10]          920.7613 (52.12)    992.4728 (46.99)    948.9506 (49.49)    35.9130 (112.61)   925.6756 (49.02)    64.1231 (151.99)    1.0538 (0.02)          5           1
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------- benchmark 'write-msgs-100': 4 tests ----------------------------------------------------------------------------------------------
Name (time in ms)                                                   Min                   Max                  Mean              StdDev                Median                 IQR               OPS            Rounds  Iterations
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_read_and_write[mcap_ros2_fast_writer-100]       108.6150 (1.0)      2,200.8597 (15.12)      380.2710 (2.84)     735.6531 (95.09)      121.3869 (1.0)        8.9596 (1.0)      2.6297 (0.35)          8           1
test_benchmark_read_and_write[rosbags_writer-100]              125.4855 (1.16)       145.5714 (1.0)        134.0954 (1.0)        7.7364 (1.0)        136.0569 (1.12)      12.2291 (1.36)     7.4574 (1.0)           7           1
test_benchmark_read_and_write[pybag_writer-100]                264.1394 (2.43)       290.3523 (1.99)       274.4185 (2.05)       9.9997 (1.29)       273.6181 (2.25)      12.1666 (1.36)     3.6441 (0.49)          5           1
test_benchmark_read_and_write[mcap_ros2_writer-100]          3,102.7205 (28.57)    3,390.4792 (23.29)    3,253.1039 (24.26)    126.2048 (16.31)    3,229.5814 (26.61)    225.6545 (25.19)    0.3074 (0.04)          5           1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------- benchmark 'write-msgs-1000': 3 tests ----------------------------------------------------------------------------------------------
Name (time in ms)                                                    Min                    Max                  Mean              StdDev                Median                 IQR               OPS            Rounds  Iterations
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_read_and_write[mcap_ros2_fast_writer-1000]       389.8025 (1.0)         418.4601 (1.0)        403.8736 (1.0)       12.1332 (1.0)        401.6407 (1.0)       21.0602 (1.0)      2.4760 (1.0)           5           1
test_benchmark_read_and_write[rosbags_writer-1000]              479.7473 (1.23)        513.6734 (1.23)       493.5608 (1.22)      15.2506 (1.26)       488.2160 (1.22)      27.0344 (1.28)     2.0261 (0.82)          5           1
test_benchmark_read_and_write[mcap_ros2_writer-1000]          8,899.2066 (22.83)    10,416.2178 (24.89)    9,589.6736 (23.74)    542.5575 (44.72)    9,552.1125 (23.78)    491.9584 (23.36)    0.1043 (0.04)          5           1
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Read+Write Summary:

  • 23-49x faster than reference mcap-ros2
  • 1.06-1.22x faster than rosbags
  • 2.05-3.49x faster than pybag (10-100 msgs; pybag skipped at 1000 due to decoder limitations)

Write-Only Performance

-------------------------------------------------------------------------------- benchmark 'write-only-msgs-10': 4 tests ---------------------------------------------------------------------------------
Name (time in ms)                                     Min                 Max                Mean            StdDev              Median               IQR                OPS            Rounds  Iterations
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_write_only[rosbags-10]             10.9500 (1.0)       14.6925 (1.0)       12.0007 (1.0)      0.8779 (1.0)       11.6257 (1.0)      1.3553 (6.55)     83.3284 (1.0)          24           1
test_benchmark_write_only[mcap_ros2_fast-10]      11.8910 (1.09)      15.5508 (1.06)      12.5770 (1.05)     0.9914 (1.13)      12.1515 (1.05)     0.2069 (1.0)      79.5100 (0.95)         23           1
test_benchmark_write_only[pybag-10]               32.2464 (2.94)      40.7300 (2.77)      34.2348 (2.85)     1.8887 (2.15)      33.4549 (2.88)     2.4743 (11.96)    29.2101 (0.35)         27           1
test_benchmark_write_only[mcap_ros2-10]          562.1606 (51.34)    564.9182 (38.45)    563.6723 (46.97)    1.1536 (1.31)     563.7195 (48.49)    1.9709 (9.52)      1.7741 (0.02)          5           1
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------- benchmark 'write-only-msgs-100': 4 tests --------------------------------------------------------------------------------
Name (time in ms)                                      Min                 Max                Mean            StdDev              Median               IQR                OPS            Rounds  Iterations
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_write_only[rosbags-100]             53.7435 (1.0)       87.0201 (1.30)      58.4993 (1.0)      7.7466 (4.42)      56.7353 (1.0)      2.6326 (1.0)      17.0942 (1.0)          16           1
test_benchmark_write_only[mcap_ros2_fast-100]      61.0728 (1.14)      66.7065 (1.0)       64.2220 (1.10)     1.7516 (1.0)       64.0696 (1.13)     2.7867 (1.06)     15.5710 (0.91)         14           1
test_benchmark_write_only[pybag-100]              107.3560 (2.00)     117.4027 (1.76)     112.6513 (1.93)     2.9156 (1.66)     111.6172 (1.97)     3.1993 (1.22)      8.8769 (0.52)          9           1
test_benchmark_write_only[mcap_ros2-100]          785.2788 (14.61)    792.8765 (11.89)    789.4166 (13.49)    3.3582 (1.92)     790.9028 (13.94)    5.7939 (2.20)      1.2668 (0.07)          5           1
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------- benchmark 'write-only-msgs-1000': 3 tests -------------------------------------------------------------------------------------
Name (time in ms)                                         Min                   Max                  Mean             StdDev                Median                IQR               OPS            Rounds  Iterations
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_benchmark_write_only[rosbags-1000]              181.6391 (1.0)        204.9827 (1.0)        188.3532 (1.0)       8.4449 (2.24)       186.1796 (1.0)       4.3215 (1.0)      5.3092 (1.0)           6           1
test_benchmark_write_only[mcap_ros2_fast-1000]       207.8413 (1.14)       217.3372 (1.06)       213.3029 (1.13)      3.7784 (1.0)        214.1898 (1.15)      5.7395 (1.33)     4.6882 (0.88)          5           1
test_benchmark_write_only[mcap_ros2-1000]          1,387.1190 (7.64)     1,442.0496 (7.03)     1,402.5220 (7.45)     22.3435 (5.91)     1,394.4735 (7.49)     15.6472 (3.62)     0.7130 (0.13)          5           1
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Write-Only Summary:

  • 7-47x faster than reference mcap-ros2
  • 0.91-1.05x similar to rosbags (rosbags slightly faster for write-only)
  • 1.76-2.85x faster than pybag (10-100 msgs; pybag skipped at 1000 due to decoder limitations)

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

mcap_ros2_support_fast-0.1.0.tar.gz (17.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcap_ros2_support_fast-0.1.0-py3-none-any.whl (22.4 kB view details)

Uploaded Python 3

File details

Details for the file mcap_ros2_support_fast-0.1.0.tar.gz.

File metadata

  • Download URL: mcap_ros2_support_fast-0.1.0.tar.gz
  • Upload date:
  • Size: 17.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for mcap_ros2_support_fast-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a028dcf082a09457d8aafa63a75678660735e7503540a37eeaf2d99fd2d9bf50
MD5 faa9433da6f25411e1ecb019da64fdde
BLAKE2b-256 48f948a9a86aed673fa76512525682d8148246970750fa06bbe5e333f30aec84

See more details on using hashes here.

File details

Details for the file mcap_ros2_support_fast-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: mcap_ros2_support_fast-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for mcap_ros2_support_fast-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b8507c1261a2aa49696c3f36ec70e1c01818574599ae499e5334fc8eaa0aae69
MD5 5c233fe59dffed11aad2e99adf40a02b
BLAKE2b-256 8145c509227c8d8776ab00ea9bdd75b3e0a7e90b9c2f99caf58657246fae214d

See more details on using hashes here.

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