ARTICLE DETAIL

资讯详情

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

rerun 数据类型指南:IVec3D 编码详解 —— 三维 int32 向量与 VoxelGridMap 体素索引的实现原理

rerun 数据类型指南:IVec3D 编码详解 —— 三维 int32 向量与 VoxelGridMap 体素索引的实现原理 rerun 数据类型指南IVec3D 编码详解 —— 三维 int32 向量与 VoxelGridMap 体素索引的实现原理【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerunIVec3D 是 rerun 数据模型中用于表示三维空间整数向量的编码类型encoding以三个 int32 分量承载 X/Y/Z 坐标并直接支撑稀疏三维体素网格原型VoxelGridMap的索引表达。本篇指南以 ivec3d.md 为骨架结合类型定义、代码生成管线与使用该类型的组件原型源码说明 IVec3D 的 Arrow 存储表示、Rust/Python/C 三端绑定形态、坐标系语义以及在机器人多模态数据可视化中的实际落点。一、IVec3D 是什么类型定位与核心语义按照官方参考页的定义IVec3D 是一个3D 空间中的 int3232 位有符号整数向量。在 rerun 的类型体系里它归属于encodings编码类别即它是构建更上层组件components与原型archetypes的底层数据单元而不是一个能直接独立绘制的语义组件。其原始类型定义位于 crates/build/re_type_definitions/rerun/encodings/ivec3d.def.rs文件头部明确说明这类.def.rs文件是供 SDK 使用的 Rerun 类型定义而非可执行代码会被re_types_builder解析进而生成 Rust、Python、C 三种语言的绑定/// An int32 vector in 3D space. #[rerun::rerun_type] #[arrow(transparent)] #[rust(derive(Default, Copy, PartialEq, Eq, Hash, bytemuck::Pod, bytemuck::Zeroable))] #[rust(repr C)] #[rust(tuple_struct)] #[rerun(state stable)] pub struct IVec3D { pub xyz: [i32; 3], }从这份定义可以提炼出几个关键事实内部表示字段xyz是一个[i32; 3]数组即三个 int32 连续排布无多余填充Arrow 透明编码#[arrow(transparent)]声明该类型在 Arrow 层面透明暴露其内部结构下文详述状态为 stable#[rerun(state stable)]表明该类型的 ABI 与数据格式已稳定不会随意发生不兼容变更——这与它作为底层编码类型的定位一致Rust 派生特性自动派生Default / Copy / PartialEq / Eq / Hash并实现bytemuck::PodPlain Old Data与Zeroable意味着它可以被零拷贝地当作原始字节处理这在流式传输与 Arrow 列式存储中非常关键repr C 且为元组结构体内存布局符合 C 语言规则便于跨语言 FFI 与 C 绑定对齐。二、Arrow 数据表示FixedSizeList 背后的设计参考页给出了 IVec3D 对应的 Arrow datatypeFixedSizeList(3 x non-null Int32)这表示该类型在 Arrow 内存格式中编码为一个固定长度为 3 的列表每个元素是非空 int32。结合#[arrow(transparent)]可知整个 IVec3D 会被序列化为三层结构FixedSizeList外层 → 子列表[Int32, Int32, Int32]。选择FixedSizeList而不是可变长List的原因很直接三个分量永远同时出现、长度恒定固定宽度布局可以让每个元素占用固定字节数便于向量化计算与随机访问省去可变长列表的长度前缀与偏移数组开销与 glTF、体素网格等以[x, y, z]三元组为基本单位的行业格式天然对齐。同样值得注意VoxelIndex组件详见下文第四节的 Arrow datatype 与 IVec3D 完全一致也是FixedSizeList(3 x non-null Int32)这正是编码类型被组件透明复用的直接体现组件层不引入额外包装列数据依然是一列紧凑的 int32 三元组。三、Rust API 详解从构造到互转的完整工具链IVec3D 的 Rust 绑定主体由代码生成器产出crates/store/re_sdk_types/src/encodings/ivec3d.rs而开发者手写的扩展则集中在 crates/store/re_sdk_types/src/encodings/ivec3d_ext.rs。扩展文件提供了开箱即用的实用接口常量与构造器impl IVec3D { /// The zero vector, i.e. the additive identity. pub const ZERO: Self Self([0; 3]); /// The unit vector [1, 1, 1], i.e. the multiplicative identity. pub const ONE: Self Self([1; 3]); /// Create a new vector. pub const fn new(x: i32, y: i32, z: i32) - Self { Self([x, y, z]) } }IVec3D::ZERO为零向量[0, 0, 0]即加法单位元IVec3D::ONE为全一向量[1, 1, 1]即乘法单位元new(x, y, z)是 const 构造函数可在编译期常量上下文中使用。分量访问器pub fn x(self) - i32 { self.0[0] } pub fn y(self) - i32 { self.0[1] } pub fn z(self) - i32 { self.0[2] }三个访问器分别返回下标 0、1、2 对应的 X/Y/Z 分量。多种来源的 From 转换impl From(i32, i32, i32) for IVec3D { ... } impla Froma Self for IVec3D { ... } impla Froma (i32, i32, i32) for IVec3D { ... } impla Froma [i32; 3] for IVec3D { ... }除了元组和数组字面量扩展还特意为所有源类型实现了引用版本。源码注释说明了动机当用户在各种Into/IntoIterator层之间传递切片时Rust 无法跨层追踪固有的Copy能力——因此这些 by-ref 实现能让用户在持有引用时免去手动解引用直接用.into()完成转换。索引与显示implIdx std::ops::IndexIdx for IVec3D where Idx: std::slice::SliceIndex[i32], { type Output Idx::Output; fn index(self, index: Idx) - Self::Output { self.0[index] } }类型实现了std::ops::Index支持任意SliceIndex[i32]既可以用整数下标v[0]也可以切片v[0..2]。同时实现了Display打印格式为[x, y, z]便于日志与调试输出。与 glam 的互操作#[cfg(feature glam)] impl FromIVec3D for glam::IVec3 { ... } #[cfg(feature glam)] impl Fromglam::IVec3 for IVec3D { ... }在启用glamfeature 时IVec3D 可以与glam::IVec3双向零成本转换。这对使用 glam 作为数学库的机器人/图形学代码非常友好日志侧可以直接把引擎中的体素索引或网格坐标转成 IVec3D 交给 rerun。四、实际应用VoxelIndex 组件与 VoxelGridMap 原型IVec3D 在仓库中最直接的消费方是VoxelIndex组件其类型定义在 crates/build/re_type_definitions/rerun/components/voxel_index.def.rs/// Integer index of a voxel in a sparse 3D voxel grid. /// /// The voxel center in local grid coordinates is (index 0.5) * voxel_size. #[rerun::rerun_type] #[rust(repr transparent)] pub struct VoxelIndex { pub index: rerun::encodings::IVec3D, }注意#[rust(repr transparent)]VoxelIndex 是一个单字段透明包装结构体其唯一字段类型正是 IVec3D。生成的 Rust APIcrates/store/re_sdk_types/src/components/voxel_index.rs进一步体现了这层关系#[repr(transparent)] pub struct VoxelIndex(pub crate::encodings::IVec3D); impl ::re_types_core::WrapperComponent for VoxelIndex { type Encoding crate::encodings::IVec3D; fn name() - ComponentType { rerun.components.VoxelIndex.into() } fn into_inner(self) - Self::Encoding { self.0 } }这里的关键机制是WrapperComponenttrait它声明Encoding IVec3D意味着 VoxelIndex 在数据层完全复用 IVec3D 的编码方案并通过Deref/DerefMut把 IVec3D 的x() / y() / z()等方法透传给组件。因此对使用者来说VoxelIndex 就是一个带语义名字的 IVec3D。VoxelIndex 向上服务于VoxelGridMap原型docs/content/reference/types/archetypes/voxel_grid_map.md。该原型面向稀疏 3D 体素网格地图如三维占据栅格地图、体素化体积数据坐标语义为The minimum corner of the voxel with[0, 0, 0]index is located at the origin of the entitys coordinate frame and can have an additional offset from there through the optional translation and rotation fields. A voxel center is at(index 0.5) * voxel_sizein local grid coordinates (i.e. relative to the minimum corner).即索引为[0, 0, 0]的体素最小角位于实体坐标系原点可通过可选的 translation/rotation 字段再加偏移体素中心在局部网格坐标中的位置是(index 0.5) * voxel_size其中index就是 IVec3D 类型的三元组。由于voxel_size为场景单位尺寸整个地图可以按 X/Y/Z 三个局部轴精确布局。VoxelGridMap在Spatial3DView与DataframeView中均可展示并在参考页中被标注为unstable即未来可能发生不兼容变更——这与 IVec3D 本身的 stable 状态形成对比说明底层编码是稳定基石而上层原型仍在演化。在渲染链路中VoxelGridMap由 Spatial3DView 消费docs/content/reference/types/views/spatial3d_view.md列出了该原型见 voxel_grid_map.md 的 Can be shown in 一节体素索引 IVec3D 直接决定了每个体素在网格中的逻辑位置。五、Python / C 端绑定形态定义文件中的 python 属性为三端 SDK 生成了统一的类型别名#[python(aliases npt.NDArray[Any] | npt.ArrayLike | Sequence[int])] #[python( array_aliases npt.NDArray[Any] | npt.ArrayLike | Sequence[Sequence[int]] | Sequence[int] )]这意味着 Python 端单值场景接受numpy.ndarray、ArrayLike或Sequence[int]如[1, 2, 3]批量数组场景接受Sequence[Sequence[int]]如[[1, 2, 3], [4, 5, 6]]可直接把 NumPy 数组当作列式数据传入。C 端则通过rerun::encodings::IVec3D结构体名与 Rust 完全一致暴露参考页中给出了对应的 API 文档入口由于底层采用repr C[i32; 3]布局C 绑定可以直接以等价的int32_t[3]语义进行内存对齐交互适合与原生机器人中间件如 ROS 消息中的网格/地图结构做低成本桥接。官方参考页分别提供了 C API docs forIVec3D、Python API docs forIVec3D与 Rust API docs forIVec3D三个入口可按语言分别查阅完整签名。六、文档如何产生IVec3D 参考页背后的代码生成管线值得说明的是ivec3d.md 顶部标注着!-- DO NOT EDIT! This file was auto-generated by crates/build/re_types_builder/src/codegen/docs/website.rs --即该参考页并非手写而是由re_types_builder的文档生成器自动产出。生成入口位于 crates/build/re_types_builder/src/bin/build_re_types.rs调用re_types_builder::generate_docs(...)核心实现在 crates/build/re_types_builder/src/lib.rs 的generate_docs函数pub fn generate_docs( reporter: Reporter, output_docs_dir: impl AsRefUtf8Path, objects: Objects, type_registry: TypeRegistry, check: bool, ) { let mut generator DocsCodeGenerator::new(output_docs_dir.as_ref()); // ... generate_code(reporter, objects, type_registry, mut generator, mut formatter, orphan_path_opt_out, check); }它读取Objects即所有.def.rs类型定义包括 ivec3d.def.rs用DocsCodeGenerator为每个类型生成参考页。因此参考页中的 Arrow datatype、API reference links、Used by反向引用列表都是解析自类型注册表后自动填写的——比如 Used by 中的VoxelIndex条目正是re_types_builder根据 VoxelIndex 定义中对 IVec3D 的引用关系自动生成的交叉索引。理解了这条管线就能明白只要类型定义def.rs变更参考文档、三端绑定与组件索引会同步重新生成避免手写文档与实现漂移。七、实践要点小结何时使用 IVec3D当需要表达三维空间中的整数坐标/索引体素索引、网格单元坐标、离散栅格位置时使用浮点位置应选用Vec3D等浮点编码类型。坐标系语义作为体素索引时中心位置为(index 0.5) * voxel_size索引[0,0,0]的体素最小角落在实体坐标系原点可叠加 translation/rotation 偏移。跨语言一致性Rust 元组结构体IVec3D([i32; 3])、Python 接受[x, y, z]序列或 NumPy 数组、Crerun::encodings::IVec3D底层全部映射到FixedSizeList(3 x non-null Int32)不存在跨语言数据表示分歧。稳定性IVec3D 本身标记为 stable可作为长期依赖的稳定编码上层VoxelGridMap原型仍标记为 unstable接入时应关注版本变更。如需继续深入可依次阅读IVec3D 类型定义 → VoxelIndex 组件定义 → VoxelGridMap 原型参考从而完整追踪从底层编码到上层体素地图的完整数据链路。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表