跳转到主要内容
Wuji SDK 将多个可订阅资源写入同一个 MCAP 文件,供离线分析、算法调试和数据集构建使用。录制期间可暂停、恢复、监控数据质量或切换输出文件,停止后可查看统计摘要。

录制器配置

压缩选项

创建录制器时可分别设置压缩算法和 MCAP 分块大小。分块大小是每块未压缩数据的目标值,默认 4 MiB。默认使用 LZ4 压缩。
compression 接受 "lz4"、"zstd" 或 "none"。省略 chunk_size 使用默认大小。

注册录制通道

每个通道对应一个可订阅的公开资源。先按设备发现与连接连接设备。设备通道在 MCAP 中以设备序列号为前缀,重复注册同一通道会报错。按设备选择以下资源: 下面以 Wuji Hand 2 为例,演示如何注册录制通道。录制 Wuji Glove 时,使用上表对应的资源,完整程序的修改步骤见示例。
传入订阅对象,录制器读取其中的资源与设备信息。

录制全局资源

全局资源可与设备通道注册到同一录制器。例如,tf_static 保存全局静态坐标变换,其 MCAP 通道名不加设备前缀。
使用连接示例中的 manager = SdkManager.instance()。

录制会话

开始录制

至少注册 1 个通道后,指定输出路径开始录制。每次启动都返回独立的录制会话,用于后续控制和监控。
启动会覆盖已有同名文件,且不会创建父目录。先创建输出目录,并为每次录制选择独立文件名。启动失败可能留下不完整文件。

暂停与恢复

暂停、恢复操作均等待状态变更生效后完成。暂停期间仍接收设备数据,但不写入文件,也不在恢复后补录。

Episode 切换

同一录制器可重复启动,无需重新注册通道。每段停止后使用新路径开始下一段,生成独立的 MCAP 文件。以下每段录制 10 秒。
在异步函数中运行,使用 import asyncio。

录制监控

录制期间监控丢帧率、帧间抖动和同步偏差。状态与质量指标只保留最新值,不能用通知次数计算录制帧数。完整指标与各通道健康明细见QualityMetrics。
在异步函数中创建后台任务,同时继续执行录制控制。

质量告警

质量指标持续超过阈值时,统计过程控制(SPC)监控发出告警,包含指标、当前值、阈值和说明。
消费速度不足时,SDK 跳过未及时消费的告警并记录丢失数量,迭代继续。

录制状态

状态通知包含运行状态、已写入消息数和经过时间。

监控生命周期

结束监控时取消并等待任务。取消任务不会停止录制,监控流结束也不代表文件写入成功。调用 await handle.stop() 完成文件写入并检查错误。

录制结果与资源释放

录制摘要

停止录制后获取总消息数、文件大小、持续时间、质量统计和逐通道消息数。通道按 ID 排序,包含未收到消息的通道。total_frames 是各 MCAP 通道的消息数之和。录制 Wuji Hand 2 的 joint_states 和 joint_diagnostics 时,两路消息分别计数,不能将总数当作设备原始采样数。duration_s 包含暂停和缓冲数据处理时间,不包含文件收尾、刷新及等待回调结束的时间。

消息时间戳

MCAP 中每条消息包含 log_time 和 publish_time。log_time 是主机收到消息的时刻。publish_time 取 FrameHeader.timestamp_us 并换算为纳秒,保留设备侧事件时间。对带有效设备侧时间戳的消息,下游可按 publish_time 对齐多路数据流,避免传输与排队延迟影响对齐。 不带 FrameHeader 的资源(如普通标量参数),以及 timestamp_us=0 的帧,publish_time 回退为主机接收时刻,不适用上述对齐方式。设备时间戳的含义与同步状态有关,见时间同步与坐标变换。

控制与资源释放

显式停止录制并检查结果,然后结束监控、释放资源,最后断开设备。重复停止同一会话会报错。
录制操作通过异常报告错误。以下示例结束前文创建的 3 个监控任务,应用应在 finally 中执行清理。
即使录制控制中途失败,也应在 finally 中停止录制。文件收尾错误由 await handle.stop() 抛出。

示例

以下示例以 Wuji Hand 2 为例。程序通过序列号连接设备,将 joint_states 和 joint_diagnostics 写入 MCAP 文件。录制 5 秒后暂停 2 秒,再录制 5 秒,最后输出总消息数和各通道消息数。运行时传入 DEVICE_SN 和输出文件路径,输出目录需预先存在。
保存为 record_topics.py,运行 python record_topics.py DEVICE_SN ./data/session.mcap。
运行完成后,终端应输出总消息数和各通道消息数,指定路径应生成非空 MCAP 文件。若 Total frames 大于 0 且各通道有消息,说明所选资源的数据已写入文件。 录制 Wuji Glove 将示例中的设备连接和通道注册改为 Wuji Glove 对应的代码,录制控制步骤保持不变。
在 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 没有对应的手动释放接口。