Rerun Measurements 原语:为标量数据记录不确定性并绘制误差带
【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun
Measurements是 Rerun 新增的标量测量原语(archetype),用于一次性记录「数值 + 方差 + 单位」,面向压力、温度、照度、相对湿度、测距等带不确定性的传感器数据。在时序视图(TimeSeriesView)中,每条序列会被绘制为一条折线,并在其上下各延伸一个标准差(方差的平方根)宽的半透明误差带。读完本文,你将掌握Measurements的完整字段语义、Python/Rust 调用方式、底层可视化实现,以及它与Scalars原语的关键区别。
背景:为什么需要 Measurements
常规的Scalars原语只记录标量值本身,样式(颜色、线宽等)需要额外的SeriesLines原语另行指定。而真实传感器不仅输出测量值,还往往同时报告不确定性(方差)。Measurements把「值、不确定性、单位、样式」绑定到一个原语里,一次log调用即可完成记录,专为传感器类多模态数据设计。
从类型定义看,该原语以"Plotting"分类收录、标记为未发布(unreleased)且状态为 unstable,其类型定义文件位于 measurements.def.rs。MCAP 导入器已经为 ROS 的sensor_msgs消息生成了对应的快照验证(如 ros_fluid_pressure.snap),说明它天然服务于压力、温度、照度、湿度等常见 ROS 传感器数据流。
核心概念:值 + 方差 + 单位
Measurements的核心语义在 类型参考文档 中定义:
- 每个测量值附带一个方差
variances(σ²,单位为测量值单位的平方); - 在时序视图中,每条序列绘制为一条折线,外加一个半透明误差带,上下各为一个标准差(方差的平方根)宽;
- 若不确定性未知,则可以不设置
variances,此时只画折线不画误差带; 0方差表示该值被完美已知,同样不绘制误差带。
两个伴随新组件
Measurements引入了两个新组件:
Variance:方差的 Float64 封装,语义为「测量值的方差 σ²,单位为测量值单位的平方」,0表示完美已知、不画误差带。实现见 variance.rs。Unit:Utf8 字符串封装,仅用于展示(如"Pa"、"lux"),显示在图例(legend)和 tooltip 中,不影响数值计算。实现见 unit.rs。
字段总览:required / recommended / optional
依据 类型参考文档,Measurements共有 9 个字段,按必需程度分为三档:
| 级别 | 字段 | 对应组件 | 说明 |
|---|---|---|---|
| Required | values | Scalar | 被测标量值 |
| Recommended | variances | Variance | 方差 σ²,长度需与values一致,可留空 |
| Optional | units | Unit | 展示用单位,出现在图例与 tooltip,长度需与values一致,预期不随时间变化 |
| Optional | colors | Color | 对应序列的颜色,可随时间变化,但可能造成折线不连续 |
| Optional | widths | StrokeWidth | 对应序列的线宽,可随时间变化,但可能造成折线不连续 |
| Optional | names | Name | 序列显示名,用于图例,预期不随时间变化 |
| Optional | visible_series | Visible | 控制哪些序列可见;通过它隐藏的序列仍会出现在图例中 |
| Optional | aggregation_policy | AggregationPolicy | 缩放相关的标量聚合策略:仅当 X 轴步长小于单个像素(一个像素覆盖多个数据刻度)时触发,可显著提升性能并避免过度绘制 |
| Optional | interpolation_mode | InterpolationMode | 数据点之间的插值方式,默认线性插值,可用Step*变体得到阶梯线 |
Rust 侧生成的Measurements结构体与其with_*构造方法一一对应,见 measurements.rs(其中with_many_aggregation_policy、with_many_interpolation_mode用于配合columns批量列式写入)。
快速上手:三种语言的最小示例
官方示例「Pressure with variance」展示了两路并行压力传感器(单位 Pa)随时间缓慢漂移方差的记录方式,对应的可运行片段位于 measurements_simple.py、measurements_simple.rs 与 measurements_simple.cpp。
Python:
import math import rerun as rr rr.init("rerun_example_measurements_simple", spawn=True) # 两路并行压力传感器(Pa),各自带有缓慢漂移的方差 for step in range(64): rr.set_time("step", sequence=step) pressures = [ 101_325.0 + 50.0 * math.sin(step / 10.0), 101_300.0 + 30.0 * math.cos(step / 8.0), ] variances = [ 100.0 + 25.0 * math.sin(step / 7.0), 80.0 + 15.0 * math.cos(step / 11.0), ] rr.log( "pressure", rr.Measurements(values=pressures, variances=variances, units="Pa"), )Rust:
let rec = rerun::RecordingStreamBuilder::new("rerun_example_measurements_simple").spawn()?; for step in 0..64 { rec.set_time_sequence("step", step); let pressures = [ 101_325.0 + 50.0 * (step as f64 / 10.0).sin(), 101_300.0 + 30.0 * (step as f64 / 8.0).cos(), ]; let variances = [ 100.0 + 25.0 * (step as f64 / 7.0).sin(), 80.0 + 15.0 * (step as f64 / 11.0).cos(), ]; rec.log( "pressure", &rerun::Measurements::new(pressures) .with_variances(variances) .with_units(["Pa"]), )?; }注意Measurements::new(values)只接受值数组,方差与单位通过with_variances、with_units链式追加。每次时间步都重新 log 完整的两路值,多路传感器共享同一实体路径"pressure"时会被视为多条序列。
渲染原理:MeasurementsSeries 可视化系统
在源码层面,Measurements由时序视图中的专用可视化系统MeasurementsSeriesSystem负责渲染,见 measurements_visualizer_system.rs。
值得关注的是查询约束中的with_allow_static_data(false):Measurements不允许静态数据,因为时间轴(X 轴)取当前时间线的值,静态数据没有时间维度,无法正确绘制。这也解释了参考文档中的约定——测量值不应是 static,且每个时间戳的数值数量预期随时间保持一致。
在数据加载阶段,MeasurementsSeriesSystem通过load_line_series_with_styling与LineSeriesSource组装序列:
value_descriptor指向Measurements.values;variance_descriptor指向Measurements.variances,填充PlotSeries::variances并绘制为误差带;unit_descriptor指向Measurements.units,填充到图例与 tooltip;- 样式列(颜色、线宽、名称、可见性、聚合策略、插值模式)全部来自
Measurements自身的组件描述符(LineSeriesStyling::measurements())。
这与 line_series_loader.rs 中的设计一致:SeriesLinesSystem与MeasurementsSeriesSystem都绘制「每条序列一条线」,二者的差异只体现在「值从哪来、样式从哪来」。Measurements把样式内聚到自己身上,因此无需像Scalars那样额外配套SeriesLines。
对应的渲染测试覆盖了误差带绘制、图例与 tooltip 行为,见 re_view_time_series/tests/measurements.rs 与 basic.rs。
与 Scalars 的对比
| 维度 | Scalars | Measurements |
|---|---|---|
| 记录内容 | 纯标量值 | 值 + 方差 + 单位 |
| 样式来源 | 需要单独的SeriesLines原语 | 自带全部样式字段,一次 log 完成 |
| 不确定性 | 不支持 | 通过variances绘制 ±1σ 误差带 |
| 单位展示 | 不支持 | units显示于图例与 tooltip |
| 静态数据 | 允许 | 不允许(依赖时间线驱动 X 轴) |
使用约束与兼容性提醒
- 稳定性:
Measurements、Variance、Unit均标注为unstable,后续可能发生不向后兼容的变更,生产环境接入前请关注版本演进(见 measurements.md); - 时序一致:每个时间戳的数值数量应保持一致,
variances、units的长度需与values匹配; - 样式字段限制:
units、names、aggregation_policy、interpolation_mode预期不随时间变化;colors、widths、visible_series允许变化,但可能导致折线出现不连续; - 可展示视图:
Measurements可显示在时序视图(TimeSeriesView)与数据表视图(DataframeView)中; - 适用于:压力、温度、照度、相对湿度、测距等「数值 + 不确定性」成对出现的传感器场景;不确定性未知时,留空
variances即可退化为普通折线。
【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考