ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Rerun State Timeline 视图完全指南:离散状态变迁可视化与 VisibleTimeRange 可见时间范围控制

Rerun State Timeline 视图完全指南:离散状态变迁可视化与 VisibleTimeRange 可见时间范围控制 Rerun State Timeline 视图完全指南离散状态变迁可视化与 VisibleTimeRange 可见时间范围控制【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerunState Timeline状态时间线是 Rerun 中专门用于展示实体在离散状态之间切换的可视化视图每个实体占据一条水平泳道每次记录的状态显示为一段彩色色带一直延续到下一次状态变化为止。本文以 Rerun 官方 state-timeline 使用指南 为骨架结合StateChange/StateConfiguration类型定义与re_view_state_timelinecrate 的源码和测试用例完整讲解如何记录状态变化、自定义样式、将任意组件重映射为状态以及如何通过VisibleTimeRange精确控制视图展示的时间窗口。读完本文你将能够用 Python/Rust/C 三端 API 构建自己的状态机、传感器健康或模式切换可视化并精细控制每个时间范围的行为。State Timeline 视图为我现在处于什么状态而设计StateTimelineView把实体在一段时间内的离散状态铺成水平泳道每个实体一条泳道每条记录的StateChange渲染为一段彩色色带色带持续到该实体的下一次状态变化为止。它非常适合状态机、模式切换、传感器健康监测以及任何与其说是一个数值不如说是当前处于什么状态的数据。rr.init(rerun_example_howto_state_timeline, spawnTrue) # 记录两条泳道的状态变迁 rr.set_time(step, sequence0) rr.log(door, rr.StateChange(stateopen)) rr.log(window, rr.StateChange(stateclosed)) rr.set_time(step, sequence1) rr.log(door, rr.StateChange(stateclosed)) rr.set_time(step, sequence3) rr.log(window, rr.StateChange(stateopen)) rr.set_time(step, sequence4) rr.log(door, rr.StateChange(stateopen))上述代码来自 docs/snippets/all/howto/state_timeline.py对应的可运行示例还包括 examples/python/state_timeline/state_timeline.py 与 examples/rust/state_timeline/Rust 端以及 docs/snippets/all/howto/state_timeline.cppC 端。需要说明的是当前StateTimelineView在官方参考文档中被明确标注为unstable类型可能发生不向后兼容的显著变化见 state_timeline_view.md因此把它用于生产级管线时需要注意版本适配。三条核心规则官方指南明确了该视图的渲染语义按实体路径分组视图以实体路径为单位聚合状态变化。对/door和/window分别记录会得到两条独立的泳道。重复值不产生新阶段连续两次记录相同的状态值在可视化上是 no-op只有切换到不同的值才会开启新的色带阶段phase。阶段边界由时间决定每个阶段从该实体的本次StateChange时间开始持续到该实体的下一次StateChange时间最后一个阶段无限延伸。此外StateChange类型定义中还有一条重要语义见 state_change.md记录一个null状态会重置该实体的状态在状态时间线视图中显示为一段间隙gap而不是色带。从源码实现看re_view_state_timeline的视图类把最后一段开放色带专门处理为延伸到略微扩展后的时间线末尾紧贴锯齿状的时间线结束条带而不是停在时间线终点留下一小段空白相关逻辑见 view_class.rs 中open_end_time的计算。自定义标签、颜色与可见性StateConfiguration默认情况下每个状态值使用原始字符串作为标签、哈希颜色作为颜色、默认可见。要覆盖这套样式只需向同一实体路径记录一个StateConfiguration# 记录为 static使配置在整个录制期间生效 rr.log( door, rr.StateConfiguration( values[open, closed], labels[Open, Closed], colors[0x4CAF50FF, 0xEF5350FF], ), staticTrue, )values、labels、colors、visible是平行数组每个数组中索引i描述的是同一个状态值。任何未提供的字段都会回退到默认行为原始值作为标签、哈希颜色、可见。类型定义强调见 state_configuration.md四个数组的长度应当匹配任何比values短的辅助数组labels/colors/visible缺失的条目使用默认值建议将StateConfiguration记录为static因为它描述的是如何显示值而非某个时间点的事件。将任意组件重映射为状态分离建模与可视化使用 State Timeline 视图并不强制要求记录StateChange。任何字符串、布尔或数值类型的组件都可以通过**重映射remapping**驱动泳道——把视觉化器的StateChange:state输入改读为其他组件即可。这样你可以把如何建模数据与如何可视化数据解耦例如把机器人模式作为普通字符串通过AnyValues或DynamicArchetype记录再映射到状态槽位思路同 Plot any scalar 应用于状态槽位。官方支持作为状态源的组件类型类别类型渲染方式字符串Utf8、LargeUtf8字符串状态布尔Boolean两种状态数值Int8/Int16/Int32/Int64、UInt8/UInt16/UInt32/UInt64、Float16/Float32/Float64数值状态操作上只需两步先以普通字符串组件记录数据示例见 docs/snippets/all/howto/state_timeline.rs 及同目录的state_remapping系列片段再在蓝图中把状态时间线视觉化器的StateChange:state重映射到该组件。关于视觉化器如何解析输入可参考 Component mappings 与 Customize views。交互式拖拽添加数据同样的映射也可以在界面上交互完成从 streams 树中把组件拖到 State Timeline 视图上。如果组件是兼容的源类型字符串、布尔或数值视图会新增一条泳道并自动重映射StateChange:state不兼容的组件如 blob、tensor会被拒绝重复拖拽已被视图可视化的组件同样会被拒绝。通过 Blueprint 显式配置视图当数据中出现StateChange时视图会自动创建但也可以使用 Blueprint API 显式控制 origin、名称与布局blueprint rrb.Blueprint( rrb.StateTimelineView(origin/, nameDoors and windows), ) rr.send_blueprint(blueprint)Blueprint 层面对应的视图类型参考见 state_timeline_view.mdPython 端的类定义在 rerun_sdk/rerun/blueprint/views/state_timeline_view.pyRust 端定义在 crates/store/re_sdk_types/src/blueprint/views/state_timeline_view.rs。核心专题用 VisibleTimeRange 控制可见时间范围StateTimelineView的蓝图属性time_ranges决定了该视图在每个时间线上展示哪一段范围除非按实体单独指定。官方属性说明见 state_timeline_view.md未指定时默认展示完整时间线如果同一个时间线被指定多次使用第一个条目。time_ranges的底层类型是VisibleTimeRanges其组成关系为VisibleTimeRange指定时间线 TimeRange→TimeRangestartend两个TimeRangeBoundary。边界类型是一个密集联合见 visible_time_range.md 与 time_range.md 中的 Arrow 数据结构定义边界值含义Absolute(Int64)绝对时间/序列值如第 10 帧CursorRelative(Int64)相对于当前时间游标的偏移如游标前后 5 帧Infinite无限边界用于从起点开始或延伸到末尾_null_markersNull空标记未指定视图级与实体级两种作用范围re_view_state_timeline的专门测试 tests/visible_time_range.rs 明确了该视图对VisibleTimeRanges的支持方式——与时间序列time series视图一致分为两种模式1. 视图级设置view-wide作用于整个视图所有泳道都被限制在该范围内。测试test_visible_time_range_for_viewvisible_time_range.rs逐一验证了以下边界组合测试场景startend预期行为everythingInfiniteInfinite展示全部数据absoluteAbsolute(10)Absolute(25)只绘制第 10~25 帧之间的内容around_cursorCursorRelative(-5)CursorRelative(5)以游标为中心的前后各 5 帧absolute_until_endAbsolute(15)Infinite从第 15 帧一直到末尾start_until_absoluteInfiniteAbsolute(15)从起点到第 15 帧disjointAbsolute(100)Absolute(200)范围完全落在数据之外数据只到第 40 帧值得注意的细节是disjoint场景当可见范围与数据完全不重叠时泳道变空但视图仍然保留标签和坐标轴而不是坍缩成无状态数据的占位符——这对长时间轴下保持布局稳定非常重要。测试中还刻意把时间线数据延伸到最后一个状态变化之后MAX_TIME 40以验证最后阶段无限延伸与可见范围裁剪的交互。2. 实体级覆盖per-entity overridetest_visible_time_range_for_entityvisible_time_range.rs演示了只限制单个实体泳道的情形——对state/robot应用Absolute(10)..Absolute(25)后只有该泳道被裁剪其他泳道state/power继续使用视图级默认值展示全部数据。在代码中构造可见时间范围测试中的构造方式Rust 端对应 blueprint API// 视图级整个视图只展示 10~25 帧 let property re_viewport_blueprint::ViewProperty::from_archetype_for_view:: VisibleTimeRanges, (ctx, view.id); property.save_blueprint_component( ctx, VisibleTimeRanges::descriptor_ranges(), visible_time_range(timeline, absolute(10, 25)), ); // 实体级仅覆盖某个实体 ctx.save_blueprint_archetype( ViewContents::base_override_path_for_entity(view.id, entity_path), VisibleTimeRanges::new([visible_time_range(timeline, absolute(10, 25))]), );其中absolute(10, 25)对应TimeRange { start: Absolute(10), end: Absolute(25) }around_cursor对应TimeRange { start: CursorRelative(-5), end: CursorRelative(5) }完整的VisibleTimeRange构造见 visible_time_range.rs。时间范围与游标跟随的交互CursorRelative边界的价值在于让可见范围跟随播放游标最近的变更 preserve-cursor-relative-time-ranges.md 指出时间序列与状态时间线视图在缩放、平移时会保持游标相对的时间范围边界即使游标移出了可见窗口游标相对范围也继续跟随播放而不是退化为固定绝对时间。这意味着用CursorRelative配置的游标前后 N 帧窗口在用户缩放、平移后依然锚定游标适合需要持续跟踪当前时刻前后上下文的场景。源码视角TimeRangesUi 与时间轴交互re_view_state_timeline的视图实现crates/viewer/re_view_state_timeline/src/view_class.rs把时间 ↔ 屏幕坐标的映射封装在TimeRangesUi中构造时把当前可见时间范围与数据段一起传入TimeRangesUi::new约 view_class.rs当前实现使用单一连续段不做间隙折叠与时间面板行为一致时间游标交互通过x_from_time_f32把当前时间换算为横坐标并允许点击/拖拽游标对应on_hover_cursor(ResizeColumn)平移与缩放分别对应time_ranges_ui.pan(-pan_dx)与time_ranges_ui.zoom_at(pointer_pos.x, zoom_delta)约 view_class.rs即上面提到的缩放/平移行为正是在这一层实现顶部时间标尺由re_time_rulercrate 的paint_time_ranges_and_ticks绘制与整个 Rerun 的时间面板保持一致的时间类型序列/时间戳与时间戳格式选项。该 crate 的测试套件还覆盖了大量边界行为可作为行为契约参考state_timeline_pan_before_data数据之前平移、state_timeline_pan_past_data平移越过数据、state_timeline_null_is_resetnull 重置、state_timeline_merge_small_phases小阶段合并、state_timeline_time_cursor时间游标等均可在 crates/viewer/re_view_state_timeline/tests/ 中找到对应的快照与测试源文件。集成层面tests/rust/re_integration_test/tests/integration/drop_component_to_state_timeline_view.rs验证了从 streams 树拖拽组件到视图的交互流程。小结State Timeline 视图把当前处于什么状态这类离散时序数据转化为直观的彩色泳道其完整工作流包括用StateChange记录变迁null重置、用StateConfiguration定制样式、用组件重映射解耦建模与可视化、用 Blueprint 显式布局最后用VisibleTimeRange配合Absolute/CursorRelative/Infinite三种边界在视图级或实体级精确裁剪可见时间窗口。该视图当前标记为 unstable且游标相对范围在缩放平移后保持跟随属于近期行为变更在升级版本时留意对应 CHANGELOG 说明即可。无论使用 Python、Rust 还是 C SDK上述概念与配置方式保持一致。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表