背景
使用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 schemajointstate_schema = writer.register_msgdef("sensor_msgs/msg/JointState", SCHEMA) # Create messagetimestamp = 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 messagewriter.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
