Rerun Measurements 原语:为标量数据记录不确定性并绘制误差带
2026/9/16 1:58:55 网站建设 项目流程

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 个字段,按必需程度分为三档:

级别字段对应组件说明
RequiredvaluesScalar被测标量值
RecommendedvariancesVariance方差 σ²,长度需与values一致,可留空
OptionalunitsUnit展示用单位,出现在图例与 tooltip,长度需与values一致,预期不随时间变化
OptionalcolorsColor对应序列的颜色,可随时间变化,但可能造成折线不连续
OptionalwidthsStrokeWidth对应序列的线宽,可随时间变化,但可能造成折线不连续
OptionalnamesName序列显示名,用于图例,预期不随时间变化
Optionalvisible_seriesVisible控制哪些序列可见;通过它隐藏的序列仍会出现在图例中
Optionalaggregation_policyAggregationPolicy缩放相关的标量聚合策略:仅当 X 轴步长小于单个像素(一个像素覆盖多个数据刻度)时触发,可显著提升性能并避免过度绘制
Optionalinterpolation_modeInterpolationMode数据点之间的插值方式,默认线性插值,可用Step*变体得到阶梯线

Rust 侧生成的Measurements结构体与其with_*构造方法一一对应,见 measurements.rs(其中with_many_aggregation_policywith_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_varianceswith_units链式追加。每次时间步都重新 log 完整的两路值,多路传感器共享同一实体路径"pressure"时会被视为多条序列。

渲染原理:MeasurementsSeries 可视化系统

在源码层面,Measurements由时序视图中的专用可视化系统MeasurementsSeriesSystem负责渲染,见 measurements_visualizer_system.rs。

值得关注的是查询约束中的with_allow_static_data(false)Measurements不允许静态数据,因为时间轴(X 轴)取当前时间线的值,静态数据没有时间维度,无法正确绘制。这也解释了参考文档中的约定——测量值不应是 static,且每个时间戳的数值数量预期随时间保持一致。

在数据加载阶段,MeasurementsSeriesSystem通过load_line_series_with_stylingLineSeriesSource组装序列:

  • value_descriptor指向Measurements.values
  • variance_descriptor指向Measurements.variances,填充PlotSeries::variances并绘制为误差带;
  • unit_descriptor指向Measurements.units,填充到图例与 tooltip;
  • 样式列(颜色、线宽、名称、可见性、聚合策略、插值模式)全部来自Measurements自身的组件描述符(LineSeriesStyling::measurements())。

这与 line_series_loader.rs 中的设计一致:SeriesLinesSystemMeasurementsSeriesSystem都绘制「每条序列一条线」,二者的差异只体现在「值从哪来、样式从哪来」。Measurements把样式内聚到自己身上,因此无需像Scalars那样额外配套SeriesLines

对应的渲染测试覆盖了误差带绘制、图例与 tooltip 行为,见 re_view_time_series/tests/measurements.rs 与 basic.rs。

与 Scalars 的对比

维度ScalarsMeasurements
记录内容纯标量值值 + 方差 + 单位
样式来源需要单独的SeriesLines原语自带全部样式字段,一次 log 完成
不确定性不支持通过variances绘制 ±1σ 误差带
单位展示不支持units显示于图例与 tooltip
静态数据允许不允许(依赖时间线驱动 X 轴)

使用约束与兼容性提醒

  • 稳定性MeasurementsVarianceUnit均标注为unstable,后续可能发生不向后兼容的变更,生产环境接入前请关注版本演进(见 measurements.md);
  • 时序一致:每个时间戳的数值数量应保持一致,variancesunits的长度需与values匹配;
  • 样式字段限制unitsnamesaggregation_policyinterpolation_mode预期不随时间变化;colorswidthsvisible_series允许变化,但可能导致折线出现不连续;
  • 可展示视图Measurements可显示在时序视图(TimeSeriesView)与数据表视图(DataframeView)中;
  • 适用于:压力、温度、照度、相对湿度、测距等「数值 + 不确定性」成对出现的传感器场景;不确定性未知时,留空variances即可退化为普通折线。

【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询