Loading

零依赖使用mcap记录ros消息

背景

使用mcap配合foxglove做可视化,需要渲染urdf模型使用JointStates驱动。
由于foxglove stuido闭源前最后一个版本还未上线foxglove.JointStates格式。
只能退而求其次转化为sensors_msg/msg/JointState进行保存。
希望用最少的依赖(不安装完整ros2)完成sensors_msg/msg/JointState消息记录。

尝试

期间尝试过mcap-ros2-support-fast配合small-mcap方案,保存不定长度关节名称总遇到cdr反序列化问题。
偶然间发现了mcap官方示例,通过声明消息定义规避完整ROS2依赖。
仅需安装pip install mcap-ros2-support即可完成写入。

代码

#!/usr/bin/env python3
"""Minimal example: Save one JointState message to MCAP."""

from mcap_ros2.writer import Writer
import time

# Schema definition
SCHEMA = """std_msgs/Header header
string[] name
float64[] position
float64[] velocity
float64[] effort

================================================================================
MSG: std_msgs/Header
uint32 seq
builtin_interfaces/Time stamp
string frame_id

================================================================================
MSG: builtin_interfaces/Time
int32 sec
uint32 nanosec"""

with Writer("simple_joint_state.mcap") as writer:
    # Add schema
    jointstate_schema = writer.register_msgdef("sensor_msgs/msg/JointState", SCHEMA)   
    # Create message
    timestamp = time.time_ns()
    msg = {
        "header": {
            "seq": 0,
            "stamp": {"sec": timestamp // 1_000_000_000, 
                     "nanosec": timestamp % 1_000_000_000},
            "frame_id": "world"
        },
        "name": ["joint1", "joint2", "joint3"],
        "position": [1.0, 2.0, 3.0],
        "velocity": [0.1, 0.2, 0.3],
        "effort": [0.0, 0.0, 0.0]
    }
    
    # Write message
    writer.write_message(topic="/joint_states", schema=jointstate_schema, 
                         message=msg, log_time=timestamp, 
                         publish_time=timestamp, sequence=0)

参考

robotic-tools/mcap-ros2-support-fast at main · mrkbac/robotic-tools
robotic-tools/small-mcap at main · mrkbac/robotic-tools
Working with ROS 2 Messages — mcap documentation

posted @ 2026-05-21 12:17  azureology  阅读(56)  评论(0)    收藏  举报