资讯详情

资讯详情

Rerun 实时滚动折线图实战:基于 Blueprint 与 VisibleTimeRange 实现固定窗口数据可视化

Rerun 实时滚动折线图实战基于 Blueprint 与 VisibleTimeRange 实现固定窗口数据可视化【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun本文以 Rerun 官方示例live_scrolling_plot为线索讲解如何利用 Blueprint蓝图机制为每个TimeSeriesView动态配置time_ranges实现多路折线图的实时滚动显示——始终只展示一个固定时间窗口内的数据。读完本文你将掌握rrb.TimeSeriesView、rrb.VisibleTimeRange与rrb.TimeRangeBoundary的组合用法并能直接复刻到自己的实时数据流传感器、日志、机器人遥测可视化方案中。该示例的完整说明位于 examples/python/live_scrolling_plot/README.md完整可运行代码见 live_scrolling_plot.py。示例效果与核心思路live_scrolling_plot演示的是同时可视化多路实时标量流图表随时间水平滚动始终保持一个固定大小的数据窗口默认 5 秒。其关键并不在数据生成而在Blueprint 的time_ranges参数在 Rerun 中蓝图Blueprint决定了看什么、怎么看TimeSeriesView蓝图类型携带一个time_ranges参数用于声明该视图在每条时间轴timeline上展示哪一段数据范围本示例为每个要展示的曲线图动态创建一个TimeSeriesView将可见时间范围的起点设为当前时间减去窗口大小终点设为当前时间从而形成随数据实时推进的滚动窗口。数据侧则非常简单每个曲线图包含多条由随机游走random walk生成的标量序列通过rr.log持续写入。完整的数据流与计时逻辑见 live_scrolling_plot.py。用 Blueprint 配置滚动窗口示例中通过rr.send_blueprint一次性发送整个蓝图一个rrb.Grid网格容器里面按曲线数量动态生成若干个TimeSeriesView。代码如下rr.send_blueprint( rrb.Grid( contents[ rrb.TimeSeriesView( originplot_path, time_ranges[ rrb.VisibleTimeRange( time, startrrb.TimeRangeBoundary.cursor_relative(seconds-args.window_size), endrrb.TimeRangeBoundary.cursor_relative(), ) ], plot_legendrrb.PlotLegend(visibleFalse), ) for plot_path in plot_paths ] ), )这段代码的要点逐条拆解如下。Grid 网格容器rrb.Grid是一个蓝图容器Blueprint Container其contents接受一个视图列表并将它们按网格布局排列。容器与视图的完整 API 定义位于 rerun_py/rerun_sdk/rerun/blueprint/containers.py。因为列表推导式为每个曲线都生成一个视图网格会自动排列出num_plots个子图。TimeSeriesView 蓝图视图TimeSeriesView是 Rerun 的标量随时间变化专用视图对应rerun.archetypes.Scalars类型的数据其构造签名与全部参数见 time_series_view.py。本示例用到了其中三个参数本示例取值作用originplot_path如plot_0视图的实体路径原点该路径及其子树下的标量数据都会进入此视图time_ranges一个VisibleTimeRange列表配置每条时间轴上可见的数据范围未指定时默认显示整条时间线指定同一时间轴多次时以第一条为准plot_legendrrb.PlotLegend(visibleFalse)控制图例是否显示本示例为保持画面简洁将其隐藏该视图还支持axis_x横轴配置、axis_y纵轴范围与缩放锁定、background背景与网格、interaction悬停提示与数据点显示等参数详见同文件中的注释与示例。VisibleTimeRange声明可见范围VisibleTimeRange是一个编码类型表示针对某条特定时间轴的可见时间范围其底层结构为timelinerange(start, end)定义见 visible_time_range.py。构造时有两种方式同时给出start与end本示例采用的方式或直接传入一个range参数即TimeRange对象。若两者混用或都未提供构造函数会抛出ValueError相关校验逻辑见 visible_time_range_ext.py。本示例中time_ranges里只配置了一条名为time的时间轴——这正是数据侧用rr.set_time(time, timestampcur_time)写入的那条时间轴两者名称必须严格一致。TimeRangeBoundary三种边界语义滚动窗口的精髓在TimeRangeBoundary——时间范围的左、右边界。它支持三种语义见 time_range_boundary.py边界类型构造方式含义cursor_relativeTimeRangeBoundary.cursor_relative()或cursor_relative(seconds-5.0)等相对于时间光标播放头/当前时刻的偏移偏移为 0 即光标本身支持seq序列号、seconds秒、nanos纳秒三种单位absoluteTimeRangeBoundary.absolute(seconds300.0)等绝对时间点同样支持seq/seconds/nanos且三者必须恰好指定一个infiniteTimeRangeBoundary.infinite()延伸到无穷视上下文表现为时间线起点或终点具体实现见 time_range_boundary_ext.py。本示例的写法startrrb.TimeRangeBoundary.cursor_relative(seconds-args.window_size)起点 当前光标时间往回window_size秒默认 5 秒endrrb.TimeRangeBoundary.cursor_relative()终点 当前光标时间本身。由于边界是相对光标的每当新的数据推进一步、时间光标前移可见窗口便随之整体平移形成教科书式的滚动效果。cursor_relative还支持正偏移如seconds10表示光标之后 10 秒absolute与infinite常用于从某时刻看到时间线末尾等静态窗口场景。运行方式按以下步骤即可在本仓库环境中运行该示例。环境准备该示例仅依赖numpy与rerun-sdk两个 Python 包见 pyproject.toml。先安装依赖并克隆当前仓库pip install --upgrade rerun-sdk # 安装最新版 Rerun SDK git clone gitgitcode.com:GitHub_Trending/re/rerun.git # 克隆本仓库 cd rerun然后以可编辑模式安装示例所需的库pip install -e examples/python/live_scrolling_plot该命令会读取示例目录下的 pyproject.toml安装numpy与rerun-sdk并注册命令行入口live_scrolling_plot。启动示例python -m live_scrolling_plot脚本启动后会自动打开 Rerun Viewer你会看到 6 个实时滚动的曲线图默认配置每个图内有 5 条随机游走序列。命令行参数详解示例通过argparse暴露了 5 个可调参数解析逻辑见 live_scrolling_plot.py并调用了rr.script_add_args以支持 Rerun SDK 的标准脚本参数如--demo、--serve等参数默认值说明--num-plots6曲线图视图数量--num-series-per-plot5每个图内的标量序列数量--freq100日志写入频率Hz作用于所有序列--window-size5.0滚动窗口大小秒直接决定cursor_relative(seconds-...)的偏移量--duration60持续记录时长秒超时后自动结束例如想观察 20 秒窗口、50Hz 采样率、只保留 3 个图的场景python -m live_scrolling_plot --num-plots 3 --freq 50 --window-size 20 --duration 30源码级原理数据侧与窗口如何配合滚动效果是数据写入与蓝图窗口两侧协同的结果两者都绑定在同一条time时间轴上数据侧主循环以1.0 / freq秒为节拍推进调用rr.set_time(time, timestampcur_time)设置当前时间戳再对每个plot_path/series_path写入一个rr.Scalars(...)见 live_scrolling_plot.py。若某次循环因调度落后超过 0.1 秒脚本会打印警告提示错过了日志窗口——这对评估实时性很有帮助。蓝图侧TimeSeriesView在构造时把time_ranges包装为VisibleTimeRanges蓝图属性见 time_series_view.pyVisibleTimeRange内部则序列化为包含timeline与start/end边界的 Arrow 结构见 visible_time_range.py。Viewer 端据此裁剪显示范围凡是落在窗口外的数据点不参与绘制窗口内数据照常渲染。动态性由于边界定义为相对光标偏移Viewer 无需重新发送蓝图即可随光标平移窗口rr.send_blueprint也只需发送一次——示例注释明确指出蓝图是数据的函数因此总是发送见 live_scrolling_plot.py保证数据路径与窗口配置在时序上严格一致。延伸把滚动窗口用在其他视图上time_ranges并非TimeSeriesView独有。在 visible_time_range.py 的文档示例中同样的机制被用在Spatial3DView上为轨迹LineStrips3D实现只显示最近 5 秒的时间窗效果TimeSeriesView的构造文档time_series_view.py则演示了同一视图为不同时间轴配置不同窗口的进阶用法——例如序列时间轴用cursor_relative(seq-100)做滑窗同时绝对时间轴用absolute(seconds300.0)到infinite()展示从某时刻到时间线末尾。掌握TimeRangeBoundary的三种边界语义后你可以在任何支持时间范围的视图上自由组合出滑动窗口、固定窗口、历史回放等多种实时可视化形态。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →