资讯动态

Rerun 绘制任意标量数据:用组件映射(Component Mappings)把非 Rerun 语义数据变成时序图

发布时间:2026/9/16 13:32:34 来源:尧图企业网站定制
Rerun 绘制任意标量数据用组件映射Component Mappings把非 Rerun 语义数据变成时序图【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun本文讲解 Rerun 的「任意标量Any Scalar」可视化能力通过组件映射Component Mappings将视觉化器visualizer的输入重定向到任意组件从而绘制那些并非以 Rerun 原生语义记录的数值数据——例如来自 MCAP 文件的自定义消息、用DynamicArchetype/AnyValues记录的灵活数据。读完本文你将掌握VisualizerComponentMapping的四种取值来源SourceComponent/Override/Default/AnnotationContext、jq风格嵌套字段选择器selector的写法以及如何在蓝图blueprint中为同一实体配置多条曲线实现「数据建模」与「数据可视化」的彻底解耦。Rerun 可以将数值数据绘制为时间序列即使这些数据当初并未以 Rerun 语义记录。通过重新指定视觉化器读取输入的位置即组件映射你可以把「如何建模数据」与「如何可视化数据」分开处理数据仍按你的业务结构记录而可视化时按需抽取任意字段。这对于绘制 MCAP 中的自定义消息、以及通过AnyValues和DynamicArchetype记录的灵活数据尤其有用。作为额外收益把多个标量集中记录到同一个实体上可以显著缩小.rrd文件的体积降低实体与元数据开销。核心机制视觉化器如何获取输入在 Rerun Viewer 中视图view负责展示实体而视图依赖**视觉化器visualizer**来渲染每个实体。例如 时序视图 使用SeriesLines视觉化器绘制折线图3D 视图使用Points3D视觉化器绘制点云参见 Customize views 中的可视化产生流程。每个视觉化器都以若干**组件component**作为输入例如SeriesLines的必填输入是Scalar可选输入包括Names、Colors等。默认情况下视觉化器从数据存储中自动读取这些组件当找不到匹配数据时除位置、标量这类必填组件外Viewer 会生成合理的默认值。组件映射正是用来定制这一行为的机制通过显式配置「目标组件 → 来源组件」你可以精确控制视觉化器每个输入的数据来源。其核心价值体现在两点控制从存储中拾取的数据——这允许你可视化任意数据即使它没有按照 Rerun 语义记录把可视化样式作为蓝图的一部分——例如颜色、名称等可选组件也可以映射到任意来源。关于视觉化器如何解析组件值的完整背景可阅读 Customize views组件映射的通用机制不限于标量详见 Component mappings。支持的数据类型视觉化器的组件映射对来源数据类型有明确要求Scalar输入支持以下类型Float32和Float64Int8、Int16、Int32和Int64UInt8、UInt16、UInt32和UInt64Boolean以上任意类型嵌套在 Arrow structStructArray中布尔值会被当作 0/1 标量绘制在 any_scalar 示例 中is_stable标志就是以步进函数形式绘制的 0/1 曲线。类型兼容时数据会被自动转换例如Float32数据会在视觉化器解析时自动转为所需的Float64。记录自定义数据DynamicArchetype 与 AnyValues要用组件映射绘制「非 Rerun 语义」的数据第一步是把它记录到存储中。推荐使用DynamicArchetype发送带有自定义组件名的数据它可以与常规 Rerun 数据如Scalars同时写入同一实体。扁平数组flat arrays和 ArrowStructArray两种形式都受支持。在 docs/snippets/all/howto/component_mapping.py 中/plot实体除了记录常规正弦标量外还通过DynamicArchetype.columns记录了两个自定义组件# Custom scalar batch with a cos using a custom component name. *rr.DynamicArchetype.columns( archetypecustom, components{my_custom_scalar: np.cos(times / 10.0)}, ), # Nested custom scalar batch with a sigmoid inside a struct. *rr.DynamicArchetype.columns( archetypecustom, components{my_nested_scalar: make_sigmoid_struct_array(64)}, ),对应的 Rust 版本见 docs/snippets/all/howto/component_mapping.rslet custom_columns: Vec_ rerun::DynamicArchetype::new(custom) .with_component_from_data(my_custom_scalar, cos_array) .as_serialized_batches() .into_iter() .map(|batch| batch.column_of_unit_batches()) .try_collect()?;数据通过send_columns以列式columnar方式批量写入配合时间列TimeColumn(step, sequencetimes)rr.send_columns( plot, indexes[rr.TimeColumn(step, sequencetimes)], columns[ # Regular scalar batch with a sin. *rr.Scalars.columns(scalarsnp.sin(times / 10.0)), # ...自定义组件如上 ], )从源码看DynamicArchetypererun_py/rerun_sdk/rerun/dynamic_archetype.py是「动态定义的原型」archetype参数指定原型名components字典的键作为组件名、值作为组件数据可以是任意可转为 pyarrow 数组的数据也可以是 Rerun 批类型。与之类似的 AnyValues 则直接以关键字参数形式记录任意组件集合。二者都要求同一组件只能保持单一类型首次记录的类型将决定后续所有日志的类型。记录完成后实体的组件列表中就会同时存在标准组件如Scalars:scalars与自定义组件如custom:my_custom_scalar、custom:my_nested_scalar。重映射组件把 Scalar 输入指向自定义组件视觉化器可以从任何数据类型兼容的组件获取输入。例如SeriesLines视觉化器对Scalar输入接受任意数值数据——无论它来自 MCAP 文件、AnyValues还是DynamicArchetype。可选组件如Names、Colors也可以用同样的方式从任意数据源获取。下面这段映射把Scalars:scalars输入重定向到custom:my_custom_scalar见 docs/snippets/all/howto/component_mapping.pyrr.SeriesLines(namescosine (custom)).visualizer( mappings[ # Map scalars to the custom component. VisualizerComponentMapping( targetScalars:scalars, source_kindComponentSourceKind.SourceComponent, # Map from custom component source_componentcustom:my_custom_scalar, ), ] )Rust 等价写法docs/snippets/all/howto/component_mapping.rsrerun::SeriesLines::new() .with_names([cosine (custom)]) .visualizer() .with_mappings(vec![ rerun::blueprint::VisualizerComponentMapping::new_source_component( rerun::Scalars::descriptor_scalars().component, custom:my_custom_scalar, ) .into(), ]),映射的四个字段VisualizerComponentMapping是蓝图编码类型encoding其 Python 定义位于 rerun_py/rerun_sdk/rerun/blueprint/encodings/visualizer_component_mapping.py四个字段的含义如下字段含义target映射的目标组件名即视觉化器上的输入「插槽」例如Scalars:scalars、SeriesLines:colorssource_kind取值的来源类型见下文四种枚举值source_component来源组件选择器未指定时默认等于targetselector可选的jq风格选择器字符串用于从source_component中挑选具体字段例如.x表示取名为x的字段未指定时默认为空字符串映射在 Arrow 层面对应一个 struct 批pa.struct([...])source_kind编码为uint8其余三个字段为 UTF-8 字符串。四种取值来源ComponentSourceKindsource_kind是ComponentSourceKind枚举rerun_py/rerun_sdk/rerun/blueprint/encodings/component_source_kind.py共四个变体SourceComponent1使用source_component显式选定的组件可搭配selector字符串使用。注意若所选源组件在实体上不存在会报错。Override2使用蓝图中定义的无时间timeless覆盖值覆盖值存储在视觉化器指令所在实体上、以target作为组件名。若目标组件没有对应的覆盖值会报错。Default3使用视图蓝图上指定的默认值若视图未为目标组件指定默认值则使用启发式确定的值。AnnotationContext4根据记录recording的标注上下文从类别 ID 和关键点 ID 解析值若标注上下文没有提供值则回退到默认值目标组件的记录值被忽略。仅对支持标注上下文的视觉化器可用用于不支持的组件会报错。Rust 侧对应的四个构造器见 crates/store/re_sdk_types/src/blueprint/encodings/visualizer_component_mapping_ext.rsnew_default、new_source_component、new_source_component_with_selector、new_override。注意组件映射 API 仍处于演进阶段Python 文档字符串与示例头部均标注了TODO(#12600)参见 docs/snippets/all/howto/component_mapping.py未来可能发生变化。交互式添加拖拽组件到时序视图除了通过蓝图 API 编写映射你也可以完全在 Viewer 界面中完成设置从流树streams tree中把一个组件拖拽到时序视图上。如果该组件具有兼容的数值数据类型就会新增一个SeriesLines视觉化器并把Scalars:scalars重映射到该组件。非数值组件例如字符串会被拒绝已经由该视图绘制的组件再次拖入也会被拒绝。具体而言在 UI 中还可以展开视觉化器的某个组件行从其Source下拉菜单切换不同的输入表示自动、来源组件、自定义值等详见 Customize views 与 Component mappings 的界面操作说明。嵌套数据与选择器jq 风格语法当数据位于 ArrowStructArray内部时需要用**选择器selector**抽取特定字段。选择器采用受jq启发的语法例如.values选择名为values的字段。首先创建嵌套的StructArraydocs/snippets/all/howto/component_mapping.pydef make_sigmoid_struct_array(steps: int) - pa.StructArray: Creates a StructArray with a values field containing sigmoid data. Note: We intentionally use float32 here to demonstrate that the data will be automatically cast to the correct type (float64) when resolved by the visualizer. x np.arange(steps, dtypenp.float32) / 10.0 sigmoid_values 1.0 / (1.0 np.exp(-(x - 3.0))) return pa.StructArray.from_arrays( [pa.array(sigmoid_values, typepa.float32())], names[values] )Rust 版本使用 Arrow 的StructArray::from(vec![(Field, Array), ...])构造docs/snippets/all/howto/component_mapping.rs。这里刻意使用Float32以演示自动类型转换视觉化器解析时会自动把Float32转为所需的Float64。下面的映射把Scalars:scalars输入重定向到custom:my_nested_scalar并用选择器.values抽取 struct 中的values字段docs/snippets/all/howto/component_mapping.pyrr.SeriesLines( namessigmoid (nested), colors[0, 0, 255] ).visualizer( mappings[ VisualizerComponentMapping( targetScalars:scalars, source_kindComponentSourceKind.SourceComponent, source_componentcustom:my_nested_scalar, selector.values, ), ] )Rust 等价写法docs/snippets/all/howto/component_mapping.rsrerun::SeriesLines::new() .with_names([sigmoid (nested)]) .with_colors([[0, 0, 255]]) .visualizer() .with_mappings(vec![ rerun::blueprint::VisualizerComponentMapping::new_source_component_with_selector( Scalars:scalars, custom:my_nested_scalar, .values, ) .into(), ]),深度嵌套真实项目中的多级选择器选择器支持任意深度的链式访问。在 any_scalar 示例 中市场数据演示market_demo.py把每个 ticker 的行情记录为单个嵌套结构{prices: {close: ..., normalized: ...}, details: {volume: ...}}再用选择器分别绘图.prices.normalized→ 相对开盘价的涨跌幅%用于「相对表现」视图.prices.close→ 原始收盘价用于「收盘价」视图。机器人 PID 演示robotics_demo.py同样把每步遥测记录为一个嵌套结构并用选择器抽出.state.setpoint、.state.position→ 目标轨迹与实际位置.control.error→ 误差同一字段同时映射给SeriesLines和SeriesPoints两个视觉化器分别展示趋势与采样点.control.effort→ 控制输出配合interpolation_modeStepAfter反映数字控制器在步间保持输出恒定的特性.status.is_stable→ 布尔稳定标志0/1 步进曲线。可以看到记录时只记录一份结构化遥测可视化时通过蓝图选择器自由抽取任意字段这正是「解耦」的实战体现。提供默认值把来源设为 Default有时需要强制视觉化器使用特定来源类型。将source_kind设为Default会让视觉化器忽略存储中的数据改用视图蓝图上的默认值rr.SeriesLines(namessine (store)).visualizer( mappings[ VisualizerComponentMapping( targetSeriesLines:colors, source_kindComponentSourceKind.Default, ), ] )代码见 docs/snippets/all/howto/component_mapping.pyRust 对应new_default见 docs/snippets/all/howto/component_mapping.rs。在这个映射中SeriesLines:colors的来源被明确指定为「视图默认值」即使实体自身记录了颜色示例中向/plot记录了静态红色rr.SeriesLines(colors[255, 0, 0])这条曲线也会使用视图默认的绿色。映射之外的其他输入如Scalars:scalars保持自动行为继续从存储中读取。完整示例三条曲线、三种映射策略完整示例把三条曲线记录到同一个实体/plot上并为每条曲线配置不同的组件映射策略正弦sine来自标准Scalars组件存储数据名称覆盖为 sine (store)颜色显式使用视图默认值Default余弦cosine来自自定义组件custom:my_custom_scalarSourceComponent名称覆盖为 cosine (custom)颜色自动使用视图默认值Sigmoidnested来自嵌套组件custom:my_nested_scalar 选择器.valuesSourceComponentselector名称覆盖为 sigmoid (nested)颜色显式设为蓝色。这三条曲线通过TimeSeriesView蓝图上的overrides{plot: [...]}一次性配置docs/snippets/all/howto/component_mapping.pyblueprint rrb.Blueprint( rrb.TimeSeriesView( nameComponent Mapping Demo, origin/, # Set default color for series to blue. defaults[rr.SeriesLines(colors[0, 255, 0])], overrides{ # Three line series visualizations for the plot entity: plot: [ rr.SeriesLines(namessine (store)).visualizer( mappings[ VisualizerComponentMapping( targetSeriesLines:colors, source_kindComponentSourceKind.Default, ), ] ), rr.SeriesLines(namescosine (custom)).visualizer( mappings[ VisualizerComponentMapping( targetScalars:scalars, source_kindComponentSourceKind.SourceComponent, source_componentcustom:my_custom_scalar, ), ] ), rr.SeriesLines( namessigmoid (nested), colors[0, 0, 255] ).visualizer( mappings[ VisualizerComponentMapping( targetScalars:scalars, source_kindComponentSourceKind.SourceComponent, source_componentcustom:my_nested_scalar, selector.values, ), ] ), ], }, ), ) rr.send_blueprint(blueprint)完整可运行的 Python 与 Rust 代码分别在 docs/snippets/all/howto/component_mapping.py 与 docs/snippets/all/howto/component_mapping.rs。运行后/plot实体上会存在三个SeriesLines视觉化器选中视图时选择面板会列出所有已配置的视觉化器概览三条曲线分别呈现红色正弦存储标量 视图默认色、绿色余弦自定义组件标量、蓝色 Sigmoid嵌套字段 选择器。同样的映射机制在 re_view_time_series 的蓝图测试 中有系统性的验证包括SeriesLines/SeriesPoints视觉化器组合、MarkerShape到标量的映射、颜色/名称目标映射等场景例如target: SeriesLines::descriptor_colors().component的用法可作为理解映射目标命名的参考。限制与注意事项API 演进中组件映射 API 标注为TODO(#12600)「仍在演进未来可能变化」且类型本身标记为 unstable、数据可能不向后兼容见 visualizer_component_mapping.py 的文档字符串。必填组件重映射范围有限目前只有时序视图标量与状态时间线视图状态值允许重映射必填组件其他视觉化器的必填字段仍要求匹配的 Rerun 语义正确的原型与类型元数据见 Customize views 中的说明。来源组件必须存在SourceComponent选择的组件在实体上不存在会报错Override没有对应覆盖值也是错误。组件类型必须单一Rerun 要求同一组件只能保持一种类型首次记录的类型决定后续类型跨类型转换由 numpy/arrow 尽力完成无法转换时会告警strict 模式下抛异常。类型自动转换数值类型兼容时自动转换如Float32→Float64但非数值来源如字符串无法映射到标量输入。参考文档Plot any scalar本文档源Customize views视觉化器与视图定制概念Component mappings组件映射通用指南Any Scalar 完整示例机器人 PID 遥测与实时行情演示蓝图编码实现VisualizerComponentMapping、ComponentSourceKind、Rust 构造器数据记录工具DynamicArchetype、AnyValues【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价