ARTICLE DETAIL

资讯详情

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

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

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 类型系统中描述二维空间位置的核心组件被Points2D、Boxes2D、Arrows2D、Ellipses2D、GraphNodes等二维图元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。底层编码 Vec2DVec2D定义于 crates/store/re_sdk_types/src/encodings/vec2d.rs其 Rust 表示为#[repr(C)] pub struct Vec2D(pub [f32; 2usize]);它实现了ArrowDataTypetrait明确声明其 Arrow 数据类型为FixedSizeList元素类型Float32、长度 2、不允许 nullDataType::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实现了WrapperComponenttraitEncoding Vec2D即记录、查询时统一走Vec2D的 Arrow 序列化路径自动派生Clone、Debug、Default、Copy、PartialEq、bytemuck::Pod、bytemuck::Zeroable、SizeBytes等 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 坐标索引 0y() - f32取 y 坐标索引 1并提供了与常用数学库的互转FromPosition2D for glam::Vec2直接转 2D 向量FromPosition2D for glam::Vec3转 3D 向量z 补 0FromPosition2D for mint::Point2f32与反向转换与mint生态互通。此外还实现了FromT: IntoVec2D for Position2D因此[f32; 2]等可转Vec2D的类型都能直接构造成Position2D。Python API别名系统与批量组件Python 绑定生成于 rerun_py/rerun_sdk/rerun/components/position2d.pyPosition2D继承自encodings.Vec2D并混入ComponentMixinPosition2DBatch则继承Vec2DBatch并声明组件类型rerun.components.Position2D。根据类型定义文件中的 Python 注解Position2D构造时可接受以下别名aliasesnpt.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::arrayfloat, 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))从编译期保证了Position2D与Vec2D内存布局完全一致。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_distributionfloat dist_pos(-3.0f, 3.0f); std::vectorrerun::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常与Color、Radius、Label等组件组合共同描述一个完整的 2D 视觉元素。从类型定义到多语言 SDK代码生成流程值得指出的是仓库中所有语言的Position2D绑定都由统一类型定义驱动类型定义源crates/build/re_type_definitions/rerun/components/position2d.def.rs含#[rerun::rerun_type]、#[python(aliases ...)]、#[rust(...)]、#[rerun(state stable)]等元数据由crates/build/re_types_builder的代码生成器分别产出 Rust、Python、C 绑定各生成文件头部均有 DO NOT EDIT! This file was auto-generated 注释每种语言通过独立的*_ext文件如 position2d_ext.rs、position2d_ext.cpp注入手写扩展逻辑。这意味着三种语言的Position2D在语义、数据布局与序列化格式上完全一致都是 2 个非空Float32组件标识符均为rerun.components.Position2D。跨语言记录的数据如 Python 写入的 rrd 文件可以被 Rust 或 C 的 Viewer 正确读取这也是 Rerun 类型系统一次定义、多端复用的典型体现。小结Position2D是 Rerun 中表达 2D 空间位置的稳定组件内部仅封装一个Vec2D2 个f32其 Arrow 编码为FixedSizeList(2 x non-null Float32)序列化全程零拷贝友好反序列化时会严格校验定长约束Rust 提供new/x/y/ZERO等便捷 API 及glam、mint互转Python 支持元组、序列、NumPy 数组多种入参C 支持(x, y)、std::array、Vec2D多种构造它被Points2D、Boxes2D、Arrows2D、Ellipses2D、GraphNodes五个二维图元复用是所有 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),仅供参考
返回列表