news 2026/9/19 0:53:59

Rerun Position2D 组件深度解析:2D 空间坐标的编码、序列化与多语言使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rerun Position2D 组件深度解析:2D 空间坐标的编码、序列化与多语言使用

Rerun Position2D 组件深度解析:2D 空间坐标的编码、序列化与多语言使用

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

导读

Position2D是 Rerun 类型系统中描述"二维空间位置"的核心组件,被Points2DBoxes2DArrows2DEllipses2DGraphNodes等二维图元(archetype)广泛引用,是构建 2D 可视化数据流(如机器人位姿、检测框、路点图)的基础要素。本文以 docs/content/reference/types/components/position2d.md 为骨架,结合仓库中的类型定义、SDK 绑定、序列化实现与官方示例,完整讲解其数据结构、Arrow 编码、各语言 API 用法及底层实现原理。

Position2D 是什么

根据类型定义文档,Position2D的语义非常简洁:一个 2D 空间中的位置(A position in 2D space)。它本身只是一个承载坐标数据的组件,不含颜色、半径、标签等显示属性——这些显示属性由使用它的图元(archetype)另行携带。

其状态被标记为stable(见类型定义源文件 crates/build/re_type_definitions/rerun/components/position2d.def.rs),意味着该类型已进入稳定的公共 API,可用于长期数据记录与跨版本读取。

从数据结构看,它内部仅包含一个字段xy,类型为rerun::encodings::Vec2D——即两个f32组成的定长向量。也就是说,Position2D是对底层编码类型Vec2D语义包装(newtype):两者内存布局一致(#[repr(transparent)]),但语义上区分"位置"与"向量"。

Rerun 编码与 Arrow 数据类型

Position2D在 Rerun 的存储与传输体系中对应如下 Arrow 数据类型:

FixedSizeList(2 x non-null Float32)

即一个定长 2 元素的Float32列表,两个元素均为非空(non-null)。这个类型正是其底层编码Vec2D的 Arrow 表示(见 docs/content/reference/types/encodings/vec2d.md)。

底层编码 Vec2D

Vec2D定义于 crates/store/re_sdk_types/src/encodings/vec2d.rs,其 Rust 表示为:

#[repr(C)] pub struct Vec2D(pub [f32; 2usize]);

它实现了ArrowDataTypetrait,明确声明其 Arrow 数据类型为FixedSizeList(元素类型Float32、长度 2、不允许 null):

DataType::FixedSizeList( std::sync::Arc::new(Field::new("item", DataType::Float32, false)), 2, )

其中Field::new("item", DataType::Float32, false)的第三个参数false表示子元素不可为空,与文档中的 "non-null" 一一对应。

序列化与反序列化实现

在 vec2d.rs 的to_arrow实现中,数据被扁平化为一个连续的f32数组,再装入FixedSizeListArray,每个外层元素固定占用 2 个f32。反序列化时(from_arrow),代码会校验value_length() == 2,若不满足则返回DeserializationError::datatype_mismatch错误——这保证了读取到的数据始终符合定长 2 元素的约定。

由于内部结构是连续内存,Rust 端反序列化使用bytemuck::try_cast_slice::<_, [f32; 2usize]>将底层Float32Array的字节直接 reinterpret 为[f32; 2]切片,几乎没有逐元素拷贝开销,这对海量点云等大数据量场景非常关键。

Position2D 的 Rust 实现与便捷 API

生成的 Rust 类型位于 crates/store/re_sdk_types/src/components/position2d.rs:

#[repr(transparent)] pub struct Position2D(pub crate::encodings::Vec2D);
  • 组件全名(ComponentType)为"rerun.components.Position2D"
  • 实现了WrapperComponenttrait,Encoding = Vec2D,即记录、查询时统一走Vec2D的 Arrow 序列化路径;
  • 自动派生CloneDebugDefaultCopyPartialEqbytemuck::Podbytemuck::ZeroableSizeBytes等 trait,支持零拷贝内存操作与按值传递;
  • 实现了Deref/DerefMut,可透明地当作Vec2D使用。

扩展方法(position2d_ext.rs)

手写的扩展代码在 crates/store/re_sdk_types/src/components/position2d_ext.rs 中,提供:

方法说明
Position2D::ZERO原点常量(0.0, 0.0)
Position2D::new(x: f32, y: f32)由 x/y 坐标构造位置
x() -> f32取 x 坐标(索引 0)
y() -> f32取 y 坐标(索引 1)

并提供了与常用数学库的互转:

  • From<Position2D> for glam::Vec2:直接转 2D 向量;
  • From<Position2D> for glam::Vec3:转 3D 向量,z 补 0;
  • From<Position2D> for mint::Point2<f32>与反向转换:与mint生态互通。

此外还实现了From<T: Into<Vec2D>> for Position2D,因此[f32; 2]等可转Vec2D的类型都能直接构造成Position2D

Python API:别名系统与批量组件

Python 绑定生成于 rerun_py/rerun_sdk/rerun/components/position2d.py,Position2D继承自encodings.Vec2D并混入ComponentMixinPosition2DBatch则继承Vec2DBatch并声明组件类型"rerun.components.Position2D"

根据类型定义文件中的 Python 注解,Position2D构造时可接受以下别名(aliases):

npt.NDArray[np.float32] | Sequence[float] | Tuple[float, float]

而批量参数(array_aliases)接受:

npt.NDArray[np.float32] | Sequence[float]

也就是说,Python 端既可以传入(x, y)元组,也可以传入numpy数组或任意浮点序列,SDK 会自动完成到Vec2D的转换,无需显式构造组件对象。

Python 示例:记录 Points2D 点集

import rerun as rr rr.init("rerun_example_points2d") rr.spawn() positions = [ (0.0, 0.0), (1.0, 1.0), (-1.0, 0.5), ] rr.log("points", rr.Points2D(positions))

这里rr.Points2D内部即使用Position2DBatch承载每个点的Position2D组件数据。

C++ API:头文件结构与构造方式

C++ 绑定生成于 rerun_cpp/src/rerun/components/position2d.hpp,结构体包含一个rerun::encodings::Vec2D xy字段,并支持多种构造:

Position2D(float x, float y) // 直接由 x/y 构造 Position2D(rerun::encodings::Vec2D xy_) // 由编码类型构造 Position2D(std::array<float, 2> xy_) // 由 std::array 构造

同时提供x()y()访问器,以及到Vec2D的隐式转换。这些扩展方法的来源是手写文件 rerun_cpp/src/rerun/components/position2d_ext.cpp,通过代码生成标记// <CODEGEN_COPY_TO_HEADER>注入到头文件中,属于典型的"生成代码 + 手写扩展"混合模式。

另外,文件末尾的static_assert(sizeof(rerun::encodings::Vec2D) == sizeof(components::Position2D))从编译期保证了Position2DVec2D内存布局完全一致。

C++ 示例:随机点云

仓库官方示例 docs/snippets/all/archetypes/points2d_random.cpp 展示了批量构造与记录方式:

#include <rerun.hpp> #include <random> const auto rec = rerun::RecordingStream("rerun_example_points2d_random"); rec.spawn().exit_on_failure(); std::default_random_engine gen; std::uniform_real_distribution<float> dist_pos(-3.0f, 3.0f); std::vector<rerun::Position2D> points2d(10); std::generate(points2d.begin(), points2d.end(), [&] { return rerun::Position2D(dist_pos(gen), dist_pos(gen)); }); rec.log("random", rerun::Points2D(points2d));

示例中rec.log一次记录 10 个点,位置由均匀分布在[-3, 3]的随机数生成,展示了Position2D作为批量数据(std::vector)直接传入图元的用法。

使用 Position2D 的图元(Archetype)

根据类型文档的 "Used by" 一节,以下 5 个二维图元都使用Position2D

图元用途
Points2D2D 散点/点云
Boxes2D2D 边界框
Arrows2D2D 箭头
Ellipses2D2D 椭圆
GraphNodes图节点布局

对应的 Rust 类型分别位于 crates/store/re_sdk_types/src/archetypes/points2d.rs、boxes2d.rs、arrows2d.rs、ellipses2d.rs、graph_nodes.rs。此外,蓝图系统(blueprint)中的力导向布局参数ForcePosition也复用同一坐标编码。

Boxes2D为例,其内部同时使用Position2D(中心位置)与HalfSize2D(半宽高),二者都依赖Vec2D编码;Arrows2D则用Position2D表示箭头起点。在实际使用中,Position2D常与ColorRadiusLabel等组件组合,共同描述一个完整的 2D 视觉元素。

从类型定义到多语言 SDK:代码生成流程

值得指出的是,仓库中所有语言的Position2D绑定都由统一类型定义驱动:

  1. 类型定义源:crates/build/re_type_definitions/rerun/components/position2d.def.rs(含#[rerun::rerun_type]#[python(aliases = ...)]#[rust(...)]#[rerun(state = "stable")]等元数据);
  2. crates/build/re_types_builder的代码生成器分别产出 Rust、Python、C++ 绑定(各生成文件头部均有 "DO NOT EDIT! This file was auto-generated" 注释);
  3. 每种语言通过独立的*_ext文件(如 position2d_ext.rs、position2d_ext.cpp)注入手写扩展逻辑。

这意味着三种语言的Position2D在语义、数据布局与序列化格式上完全一致:都是 2 个非空Float32,组件标识符均为rerun.components.Position2D。跨语言记录的数据(如 Python 写入的 rrd 文件)可以被 Rust 或 C++ 的 Viewer 正确读取,这也是 Rerun 类型系统"一次定义、多端复用"的典型体现。

小结

  • Position2D是 Rerun 中表达 2D 空间位置的稳定组件,内部仅封装一个Vec2D(2 个f32);
  • 其 Arrow 编码为FixedSizeList(2 x non-null Float32),序列化全程零拷贝友好,反序列化时会严格校验定长约束;
  • Rust 提供new/x/y/ZERO等便捷 API 及glammint互转;Python 支持元组、序列、NumPy 数组多种入参;C++ 支持(x, y)std::arrayVec2D多种构造;
  • 它被Points2DBoxes2DArrows2DEllipses2DGraphNodes五个二维图元复用,是所有 2D 可视化数据流的基础坐标载体。

如需深入了解,可继续阅读 Rerun 类型系统文档 docs/content/reference/types/encodings/vec2d.md 及上述各图元文档,或直接查看 Points2D 官方示例 体验完整用法。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 0:53:49

SketchUp模型如何高效导入UE4:FBX与Datasmith管线全流程解析

最近好几位做方案的朋友在问我同一个问题&#xff1a;手头这堆skp文件&#xff0c;到底怎么才能干净利落地弄进UE4&#xff1f;说实话&#xff0c;SketchUp和UE4之间不存在单击拖拽就完成的神奇操作——skp是SketchUp的私有格式&#xff0c;UE4原生不认识它。但把它转进去这件事…

作者头像 李华
网站建设 2026/9/17 22:35:19

3 步装好 Zola 主题 kirifuji:从克隆仓库到自定义导航菜单

3 步装好 Zola 主题 kirifuji&#xff1a;从克隆仓库到自定义导航菜单 【免费下载链接】zola A fast static site generator in a single binary with everything built-in. https://www.getzola.org 项目地址: https://gitcode.com/GitHub_Trending/zo/zola kirifuji 是…

作者头像 李华