录制器配置
压缩选项
创建录制器时可分别设置压缩算法和 MCAP 分块大小。分块大小是每块未压缩数据的目标值,默认 4 MiB。默认使用 LZ4 压缩。- Python
- C
compression 接受 "lz4"、"zstd" 或 "none"。省略 chunk_size 使用默认大小。注册录制通道
每个通道对应一个可订阅的公开资源。先按设备发现与连接连接设备。设备通道在 MCAP 中以设备序列号为前缀,重复注册同一通道会报错。按设备选择以下资源:
下面以 Wuji Hand 2 为例,演示如何注册录制通道。录制 Wuji Glove 时,使用上表对应的资源,完整程序的修改步骤见示例。
- Python
- C
传入订阅对象,录制器读取其中的资源与设备信息。
录制全局资源
全局资源可与设备通道注册到同一录制器。例如,tf_static 保存全局静态坐标变换,其 MCAP 通道名不加设备前缀。
- Python
- C
使用连接示例中的
manager = SdkManager.instance()。录制会话
开始录制
至少注册 1 个通道后,指定输出路径开始录制。每次启动都返回独立的录制会话,用于后续控制和监控。- Python
- C
暂停与恢复
暂停、恢复操作均等待状态变更生效后完成。暂停期间仍接收设备数据,但不写入文件,也不在恢复后补录。- Python
- C
Episode 切换
同一录制器可重复启动,无需重新注册通道。每段停止后使用新路径开始下一段,生成独立的 MCAP 文件。以下每段录制 10 秒。- Python
- C
在异步函数中运行,使用
import asyncio。录制监控
录制期间监控丢帧率、帧间抖动和同步偏差。状态与质量指标只保留最新值,不能用通知次数计算录制帧数。完整指标与各通道健康明细见QualityMetrics。- Python
- C
在异步函数中创建后台任务,同时继续执行录制控制。
质量告警
质量指标持续超过阈值时,统计过程控制(SPC)监控发出告警,包含指标、当前值、阈值和说明。- Python
- C
消费速度不足时,SDK 跳过未及时消费的告警并记录丢失数量,迭代继续。
录制状态
状态通知包含运行状态、已写入消息数和经过时间。- Python
- C
监控生命周期
- Python
- C
结束监控时取消并等待任务。取消任务不会停止录制,监控流结束也不代表文件写入成功。调用
await handle.stop() 完成文件写入并检查错误。录制结果与资源释放
录制摘要
停止录制后获取总消息数、文件大小、持续时间、质量统计和逐通道消息数。通道按 ID 排序,包含未收到消息的通道。total_frames 是各 MCAP 通道的消息数之和。录制 Wuji Hand 2 的 joint_states 和 joint_diagnostics 时,两路消息分别计数,不能将总数当作设备原始采样数。duration_s 包含暂停和缓冲数据处理时间,不包含文件收尾、刷新及等待回调结束的时间。
- Python
- C
消息时间戳
MCAP 中每条消息包含log_time 和 publish_time。log_time 是主机收到消息的时刻。publish_time 取 FrameHeader.timestamp_us 并换算为纳秒,保留设备侧事件时间。对带有效设备侧时间戳的消息,下游可按 publish_time 对齐多路数据流,避免传输与排队延迟影响对齐。
不带 FrameHeader 的资源(如普通标量参数),以及 timestamp_us=0 的帧,publish_time 回退为主机接收时刻,不适用上述对齐方式。设备时间戳的含义与同步状态有关,见时间同步与坐标变换。
控制与资源释放
显式停止录制并检查结果,然后结束监控、释放资源,最后断开设备。重复停止同一会话会报错。- Python
- C
录制操作通过异常报告错误。以下示例结束前文创建的 3 个监控任务,应用应在 即使录制控制中途失败,也应在
finally 中执行清理。finally 中停止录制。文件收尾错误由 await handle.stop() 抛出。示例
以下示例以 Wuji Hand 2 为例。程序通过序列号连接设备,将joint_states 和 joint_diagnostics 写入 MCAP 文件。录制 5 秒后暂停 2 秒,再录制 5 秒,最后输出总消息数和各通道消息数。运行时传入 DEVICE_SN 和输出文件路径,输出目录需预先存在。
- Python
- C
保存为
record_topics.py,运行 python record_topics.py DEVICE_SN ./data/session.mcap。Total frames 大于 0 且各通道有消息,说明所选资源的数据已写入文件。
录制 Wuji Glove
将示例中的设备连接和通道注册改为 Wuji Glove 对应的代码,录制控制步骤保持不变。
- Python
- C
在
record_topics.py 中修改:- 将设备连接语句改为
glove = manager.connect(sn=sn, device_name="recording_glove")。 - 将两条通道注册语句改为
recorder.record(glove.emf_poses().subscribe())和recorder.record(glove.imu_palm().subscribe())。 - 将
hand2.disconnect()改为glove.disconnect()。
DEVICE_SN 换成 Wuji Glove 的序列号,并使用不同的输出路径,避免覆盖前一次录制文件。
接口清单
“—”表示 Python 没有对应的手动释放接口。