ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rerun 增量式日志(Incremental Logging)实战:复用同一 Archetype 的跨帧数据

Rerun 增量式日志(Incremental Logging)实战:复用同一 Archetype 的跨帧数据 Rerun 增量式日志Incremental Logging实战复用同一 Archetype 的跨帧数据【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun本篇技术指南围绕 Rerun 官方 Python 示例incremental_logging展开讲解如何针对同一个Points3D点云实体做增量式记录把颜色、半径等“变化缓慢”的属性只上传一次之后每帧仅更新点位坐标其余数据自动被后续帧复用。读完本文你将掌握 Rerun 的实体-组件Entity-Component数据模型、static静态数据与时间轴Timeline的关系、Points3D.from_fields部分更新 API 的用法以及示例脚本中内置的 CLI 参数--connect、--save、--serve等的实战意义可以直接把这一模式套用到自己的机器人、SLAM、多模态传感器数据可视化任务中。示例要解决的问题在多模态机器人数据可视化中一个常见的场景是点云/路标/特征点的位姿坐标每帧都在变化而它们的视觉属性颜色、半径、标签长时间保持不变。最朴素的做法是每一帧都把完整属性重新上传一遍这既浪费带宽也让录制文件迅速膨胀。Rerun 示例incremental_logging展示的正是一种更优的做法数据按组件component独立管理每个组件都有自己独立的时间线历史。只要把不变的部分记录一次后续帧记录变化的部分即可查看器在查询任意时间点时会自动把不同“年龄”的组件拼合成一个完整的实体状态。该示例位于 examples/python/incremental_logging包含三个文件示例脚本 incremental_logging.py、包配置 pyproject.toml 和本文依据的 README.md。快速运行从仓库检出checkout后直接运行 Python 脚本即可需要 Python 环境与rerun-sdk、numpy依赖python examples/python/incremental_logging/incremental_logging.py注意原 README 中给出的命令路径写作increamental_logging.py与仓库中实际文件名incremental_logging.py存在拼写差异以实际文件名为准。依赖声明见 pyproject.toml仅需numpy与rerun-sdk两个运行时依赖[project] name incremental_logging version 0.1.0 readme README.md dependencies [numpy, rerun-sdk]脚本运行后会弹出 Rerun 查看器默认spawn模式并额外在场景中写入一段 Markdown 说明文档见后文“内置 README 面板”一节。核心代码逐段解析示例脚本 incremental_logging.py 的逻辑非常精简主干如下rr.script_setup(args, rerun_example_incremental_logging) # 只记录一次颜色与半径用 staticTrue 记录静态数据同样可行 rr.set_time(frame_nr, sequence0) rr.log(points, rr.Points3D.from_fields(colors0xFF0000FF, radii0.1)) rng default_rng(12345) # 之后每帧只记录点位坐标颜色和半径会被自动复用 for i in range(10): rr.set_time(frame_nr, sequencei) rr.log(points, rr.Points3D.from_fields(positionsrng.uniform(-5, 5, size[10, 3])))下面拆解每一步。第一步脚本脚手架script_setup / script_teardown脚本开头使用argparse构建命令行解析器并通过rr.script_add_args(parser)注入 Rerun 通用参数最后用rr.script_setup(args, application_id)初始化 SDK 并决定数据去向。这些辅助函数定义在 rerun_py/rerun_sdk/rerun/_script_helpers.py参数作用--headless不弹出 GUI适合 CI/后台运行--connect连接外部查看器可配合--url指定连接地址--serve启动 gRPC 与 Web 服务器并打开 Web 查看器--url指定要连接的 Rerun URL--save把数据保存为.rrd录制文件--stdout把数据输出到标准输出供管道导入查看器script_setup内部根据参数组合选择spawn()、connect_grpc()、save()、serve_grpc()等模式script_teardown在--serve模式下负责保持进程存活。这意味着同一个示例脚本可以无缝切换为“本机弹窗查看”“连接远程查看器”“保存.rrd离线分析”等多种工作流。第二步只记录一次的颜色与半径rr.set_time(frame_nr, sequence0) rr.log(points, rr.Points3D.from_fields(colors0xFF0000FF, radii0.1))这里在frame_nr时间轴的sequence0时刻为实体points写入了colors红色0xFF0000FF与radii0.1两个组件。后续所有帧都不再写这两个组件它们停留在第 0 帧构成该实体的“慢变属性”。set_time的三种重载定义在 rerun_py/rerun_sdk/rerun/time.pysequence整数序号适合帧计数、duration时长适合时间演进、timestamp时刻适合墙钟时间。示例统一使用sequence语义语义清晰且便于回放。第三步每帧只记录点位坐标for i in range(10): rr.set_time(frame_nr, sequencei) rr.log(points, rr.Points3D.from_fields(positionsrng.uniform(-5, 5, size[10, 3])))随机数生成器以固定种子12345初始化default_rng(12345)因此每次运行生成的点位序列完全一致便于对比验证。循环共 10 帧每帧向points实体写入positions一个组件。增量更新的底层原理from_fields 与实体-组件模型示例中反复使用的Points3D.from_fields定义于 rerun_py/rerun_sdk/rerun/archetypes/points3d.py。它的核心语义是只更新传入的字段未传入字段保持原样从而支持对同一实体的局部增量更新。classmethod def from_fields( cls, *, clear_unset: bool False, positions: encodings.Vec3DArrayLike | None None, radii: encodings.Float32ArrayLike | None None, colors: encodings.Rgba32ArrayLike | None None, labels: encodings.Utf8ArrayLike | None None, show_labels: encodings.BoolLike | None None, point_shading: components.PointShadingLike | None None, class_ids: encodings.ClassIdArrayLike | None None, keypoint_ids: encodings.KeypointIdArrayLike | None None, ) - Points3D:关键参数说明clear_unset若为True所有未指定的字段会被显式清空。示例中未使用该参数默认False因此缺省字段不会干扰既有数据。colors按 RGB/RGBA 解释处于 sRGB gamma 空间可传 0-1 浮点或 0-255 整数默认情况下 alpha 通道影响亮度而非透明度。radii点半径把点渲染成圆示例中传入标量0.1表示所有点共享同一半径。labels/show_labels可选文本标签及其显示开关show_labels未设置时仅当实体标签数量为 1 或实例数低于阈值时自动显示。class_ids/keypoint_ids分类与关键点 ID可配合分类颜色自动着色若只给keypoint_ids而未给class_idsclass_ids默认为 0。positions点云的三维坐标形状为[N, 3]的数组示例中每帧rng.uniform(-5, 5, size[10, 3])生成 10 个点。从实现上看from_fields把所有参数收集进kwargs后调用__attrs_init__构建实例clear_unsetTrue时把None替换为空数组以显式清空随后由rr.log把非空组件分条写入。每个字段对应一个独立的ComponentDescriptor如Points3D:positions、Points3D:colors这正是“组件独立时间线”能够成立的数据基础查看器查询某一帧时分别取回每个组件在该时刻或之前最近时刻的值再组合成完整实体。因此第 5 帧的查询结果就是“第 5 帧的 positions 第 0 帧的 colors/radii”。静态数据static与时间轴的取舍示例注释明确指出Logging as static would also work (i.e.staticTrue).即完全可以把颜色与半径记录为静态数据rr.log(points, rr.Points3D.from_fields(colors..., radii...), staticTrue)效果等价于它们“存在于所有时刻”。两种写法的取舍在于绑定到时间轴示例默认属性被记录在frame_nr0属于“第 0 帧的属性”在时间轴上可见、可被查询适合属性本身随时间演进例如颜色渐变的场景。静态数据static属性与时间无关始终存在不随任何时间轴变化适合真正恒定不变的元信息如传感器内参、坐标系定义。示例选择前者是为了直观演示“跨帧复用”当你拖动查看器的时间游标时能看到点位每帧变化而颜色与半径始终沿用第 0 帧的取值。示例脚本还把说明文本以静态方式记录进场景rr.log(readme, rr.TextDocument(README, media_typerr.MediaType.MARKDOWN), staticTrue)这使得录制的.rrd自带操作说明打开即可看到“Move the time cursor around, and notice how the colors and radii from frame 0 are still picked up by later frames”的提示方便复现验证。验证方式与延伸阅读手动验证运行脚本后在查看器中左右拖动时间游标positions每帧变化10 个点在[-5, 5]³立方体内随机跳动colors红色与radii0.1从第 0 帧起保持不变并持续作用于后续所有帧实体树中points的组件历史时间线各不相同直观体现“组件独立时间线”模型。深度延伸同主题的更多更新模式Points3D的类文档rerun_py/rerun_sdk/rerun/archetypes/points3d.py还展示了同一主题下的其他三种模式可作为增量日志的进阶参考逐行更新row updates每帧通过rr.set_timerr.log记录整行数据点云数量可以逐帧增减positions列表长度不一列式批量更新column updates通过rr.send_columns配合TimeColumn一次性发送 5 个时间步的全部数据并用Points3D.columns(...).partition(lengths[...])控制每个时间步的点数适合离线/批量导入部分更新partial updates正是本示例采用的from_fields模式——先记录positions之后只更新colors/radii或通过clear_unsetTrue在指定帧清空其余字段实现“只改一部分、其余保持”的精确控制。小结incremental_logging示例用不到 20 行核心代码演示了 Rerun 数据记录中极具价值的一条经验把实体的属性按变化频率分层慢变属性记录一次或设为 static快变属性逐帧记录。底层由实体-组件模型与组件独立时间线机制保证查询时的自动拼合用户无需手动做任何“合并”操作。对高频传感器数据、机器人状态流等场景这一模式能显著降低每帧日志的数据量同时让录制文件更小、回放更清晰。将该模式迁移到自己的项目时只需注意三点使用Points3D.from_fields或其他 archetype 的from_fields做部分更新为“不变属性”选择合适的时间轴语义或直接staticTrue利用示例脚本自带的--save、--stdout、--connect参数把演示无缝切换为离线录制或远程连接工作流。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表