数据质检
数据质检按规则扫描每条 MCAP 录制的结构化报告,对数据集给出通过或未通过的判定,并在数据集上汇总展示结论。规则分项目级与全局两级,判定可被人工覆盖,结论与系统标签、导出拦截联动。
数据质检的对象是 ROS 录制数据(当前以 MCAP 为主)。
使用前提
| 项 | 内容 |
|---|---|
| 菜单入口 | 数据 → 质检 |
| 路由 | 规则列表 /qc/rules;执行日志 /qc/logs;数据集质检详情 /qc/dataset/{id} |
| 必需权限 | 「查看质检」 |
| 相关权限 | 「执行质检」(质检执行回写)、「质检规则管理」、「数据计算/预处理」(在数据集侧手动触发质检) |
| 依赖 | 数据集为 MCAP;规则所选算法已注册且声明非空指标 schema |
| 生效规则 | 管理员不受模块权限限制;其他角色按角色默认模板生效,用户级覆盖优先于角色默认 |
模块权限的配置方式见 模块权限。各角色的模块默认级别:
| 角色 | 「查看质检 」 | 「执行质检」 | 「质检规则管理」 |
|---|---|---|---|
| 项目经理 | 只读 | 读写 | 读写 |
| 采集员 | 只读 | 读写 | 禁止 |
| 标注员 | 禁止 | 禁止 | 禁止 |
| 审核员 | 禁止 | 禁止 | 禁止 |
规则与指标
角色与规则维护范围
| 操作 | 管理员 | 项目经理 | 其他角色 |
|---|---|---|---|
| 查看规则与执行日志 | 允许 | 允许,受项目数据范围约束 | 需「查看质检」 |
| 维护项目规则 | 允许 | 允许,限所属项目 | 禁止 |
| 维护全局规则 | 允许 | 禁止 | 禁止 |
| 覆盖执行结果 | 允许 | 允许,限所属项目的数据集 | 禁止 |
全局规则的创建、编辑、删除、复制仅管理员可执行;非管理员在列表中可见全局规则,但不能修改。
质检规则
一条规则绑定一种质检算法、一个作用域与一组断言。

| 字段 | 类型 | 必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
| 规则名 | 文本 | 是 | — | 最多 200 字 | 规则标识 |
| 规则说明 | 文本 | 否 | 空 | 最多 500 字 | 规则用途备注 |
| 作用域 | 选项 | 是 | 项目 | 全局、项目 | 全局规则对全平台 MCAP 生效;项目规则仅对所选项目生效 |
| 匹配数据名 | 文本 | 否 | * | glob,支持 * 与 ? | 对数据集名称匹配;留空表示作用域内全部数据名 |
| 质检算法 | 选项 | 是 | — | 已注册且声明指标 schema 的算法 | 决定报告指标的来源 |
| 启用 | 开关 | 是 | 启用 | 启用、停用 | 停用后不参与匹配与自动排队 |
| 优先级 | 整数 | 是 | 100 | 整数,越小越优先 | 决定列表与执行排序;命中规则各自独立判定 |
| 断言 | 列表 | 否 | 空 | — | 见「断言」 |
有项目归属的数据集同时匹配全局规则与所属项目规则,两级规则各自产生独立的执行记录。

断言
断言是规则内的判定条件,共三种类型。
| 类型 | 判定对象 | 判定规则 |
|---|---|---|
| 数值阈值 | 报告指标 | 按比较符与阈值判定,如 frame_rate >= 20 |
| 必需 Topic | 全文件 Topic 列表 | 报告中必须出现指定 Topic |
| 禁止 Topic | 全文件 Topic 列表 | 报告中不得出现指定 Topic |
数值断言带比较符、阈值、严重度与范围:
| 属性 | 取值 | 说明 |
|---|---|---|
| 比较符 | <=、>=、<、>、==、!= | 与阈值比较 |
| 严重度 | 不通过(error)、警告(warning) | 任一不通过级断言失败即判定本次未通过;警告仅记录 |
| 范围 | 全部、按 Topic、按 Schema | 全局指标仅支持「全部」;逐 Topic 指标须选「按 Topic」或「按 Schema」 |
范围决定指标的取值来源:范围为「全部」时读取全文件指标;范围为「按 Topic」或「按 Schema」时,对匹配到的每一行 Topic 明细独立比对,任一行失败则该断言失败。按 Schema 比对前会归一化消息类型名称(小写,移除 /msg/)。
全局指标与逐 Topic 指标的取值范围不通用。错误组合会直接 判定失败,失败明细标明配置错误。范围「按 Topic」或「按 Schema」的模式未匹配到任何 Topic 时,该断言判定失败。
检测指标
质检由算法容器与平台两层完成:容器扫描 MCAP 并输出结构化报告,平台依据规则中的断言对报告字段逐项评估。
全局指标
全局指标取自报告的全文件标量,配置数值断言时范围须为「全部」。
| 界面名称(单位) | 指标键 | 方向 | 检测目的 | 计算方法 | 默认建议值 |
|---|---|---|---|---|---|
| 录制时长(s) | record_duration_sec | 越大越好 | 有效录制时间过短 | 全文件所有 Topic 时间跨度的最大值减最小值 | >= 3 |
| 时间戳回退次数 | timestamp_monotonic_violations | 越小越好 | 时间戳非单调或写入乱序 | 各 Topic 内 t[i] < t[i-1] 的次数之和 | <= 0 |
| 参考 topic 帧率(Hz) | frame_rate | 越大越好 | 主数据流平均发布频率偏低 | 参考 Topic 消息数除以文件时间跨度 | >= 20 |
| 帧间隔中位数(ms) | frame_gap_median_ms | 越小越好 | 主数据流基准间隔偏大 | 参考 Topic 相邻时间差序列的中位数 | <= 50 |
| 帧间隔 P95(ms) | frame_gap_p95_ms | 越小越好 | 间歇性发布延迟 | 同一序列的 95 分位 | <= 200 |
| 帧间隔 P99(ms) | frame_gap_p99_ms | 越小越好 | 偶发长间隔 | 同一序列的 99 分位 | <= 500 |
| 最大帧间隔(ms) | frame_gap_max_ms | 越小越好 | 单次最长发布间隔 | 同一序列的最大值 | <= 1000 |
| 丢帧次数 | drop_frame_count | 越小越好 | 相对正常节律的异常长间隔 | 参考 Topic 上相邻间隔大于 1.5 倍中位间隔的次数 | <= 0 |
| 跨 topic 同步 P95(ms) | cross_topic_sync_p95_ms | 越小越好 | 多通道时间对齐误差 | 各非参考 Topic 与参考 Topic 最近邻差 P95 的最大值 | <= 50 |
| 跨 topic 同步 P99(ms) | cross_topic_sync_p99_ms | 越小越好 | 多通道对齐误差尾部 | 全部采样最近邻差合并后的 99 分位 | <= 100 |
| 跨 topic 同步最大(ms) | cross_topic_sync_max_ms | 越小越好 | 单次最大对齐偏差 | 全部采样最近邻差的最大值 | <= 200 |
| 开头关节静止时长(s) | leading_joint_still_sec | 越小越好 | 录制开始后长时间未运动 | 文件起点到任一关节首次有效运动 | <= 3 |
| 结尾关节静止时长(s) | trailing_joint_still_sec | 越小越好 | 任务结束后长时间未停录 | 末次有效运动到文件终点 | <= 3 |
| 图像清晰度 P90 | blur_score_p90 | 越大越好 | 图像整体清晰度不 足 | 采样帧拉普拉斯方差的 90 分位 | >= 40 |
| 曝光异常帧比例 | exposure_outlier_ratio | 越小越好 | 亮度异常帧占比过高 | 亮度偏离均值 2 倍标准差的帧数占采样帧数之比 | <= 0.05 |
参考 Topic:先排除名称含 /tf、/tf_static、/rosout、/parameter_events、/clock 的 Topic,再取剩余中消息条数最多者。帧率、帧间隔、丢帧与跨 Topic 同步均以该 Topic 为基准。图像与关节指标仅在报告中存在相应 Topic 时输出;缺失字段被规则引用时,断言因实际值为空而失败。
逐 Topic 指标
逐 Topic 指标取自报告的每条 Topic 明细,配置数值断言时范围须为「按 Topic」或「按 Schema」。
| 界面名称(单位) | 指标键 | 方向 | 检测目的 | 计算方法 | 默认建议值 |
|---|---|---|---|---|---|
| 单 topic 消息频率(Hz) | frequency_hz | 越大越好 | 指定通道发布频率不足 | 消息数除以首末时间跨度;消息不超过 1 条或跨度为 0 时取 0 | >= 10 |
| 单 topic 最大帧间隔(ms) | topic_frame_gap_max_ms | 越小越好 | 指定通道单次最长发布间隔 | 相邻消息时间差的最大值;消息少于 2 条时为 0 | <= 500 |
| 单 topic 帧间隔超过 50ms 的次数 | topic_frame_gap_over_50ms_count | 越小越好 | 偶尔丢帧可接受,太多次才判不合格 | 相邻间隔严格大于 50ms 的次数;消息少于 2 条时为 0 | <= 5 |
| 单 topic 帧间隔超过 100ms 的次数 | topic_frame_gap_over_100ms_count | 越小越好 | 较长间隔出现太多次 | 相邻间隔严格大于 100ms 的次数;消息少于 2 条时为 0 | <= 5 |
| 单 topic 消息条数 | message_count | 越大越好 | 通道无有效数据 | 该 Topic 消息总数 | >= 1 |
| 单 topic 时间跨度(s) | duration_sec | 越大越好 | 通道中途断流或有效窗口过短 | 末条与首条时间之差 | >= 0.1 |
| 单 topic 首条时间(s) | first_ts_sec | 按任务定义 | 通道是否延后启动 | 相对录制起点(全文件最早消息为 0) | 建议 <= 1 |
| 单 topic 末条时间(s) | last_ts_sec | 按任务定义 | 通道结束时刻 | 相对录制起点的末条时刻 | 建议 <= 3600 |
表中的默认建议值来自平台内置的指标预设,须按现场采集配置调整。次数类指标适合配在图像等高频通道上(例如 Schema *CompressedImage*、允许 5 次);10Hz 关节流的名义间隔已经是 100ms,套用「超过 50ms 的次数」几乎每帧都会计数。一条 200ms 间隔会同时计入 50ms 与 100ms 两条指标。
执行与结果
执行方式
| 触发方式 | 触发时机 | 说明 |
|---|---|---|
| 自动执行 | MCAP 数据预处理成功后 | 对命中已启用规则的数据集自动入队,无需逐条手动发起 |
| 手动执行 | 数据集质检详情或数据集操作 | 对当前数据集命中规则入队,可限定规则子集;需「数据计算/预处理」 |
| 规则回灌 | 规则新建或启用后 | 对历史命中数据异步补跑;已有排队中或执行中记录的数据集不重复入队 |
| 全量回灌 | 管理员发起 | 对全部启用规则补跑,仅管理员可执行;数据量较大时任务排队执行 |
自动入队与回灌均以 MCAP 数据为范围;非 MCAP 数据不进入质检队列。
结果查看
执行状态
单次执行的状态取值:
| 状态 | 含义 |
|---|---|
| 排队中 | 已入队,等待执行 |
| 进行中 | 执行中,含进度百分比 |
| 已完成 | 执行完成且断言全部满足 |
| 完成(含不通过项) | 执行完成且存在不通过级断言失败 |
| 运行异常 | 执行过程报错,附异常说明 |
| 已取消 | 执行被终止 |
| 未执行 | 该规则尚无执行记录 |