尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Rerun 加载与驱动 URDF 机器人模型实战:内置导入器、命名帧 Transform3D 与 rr.urdf 工具

Rerun 加载与驱动 URDF 机器人模型实战:内置导入器、命名帧 Transform3D 与 rr.urdf 工具 Rerun 加载与驱动 URDF 机器人模型实战内置导入器、命名帧 Transform3D 与 rr.urdf 工具【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerunRerun 针对 ROS 生态中最常见的机器人描述格式 URDFUnified Robot Description Format内置了一个文件导入器只要把.urdf文件交给日志 APIPython / Rust / C 的log_file_from_path它就会自动解析网格引用、加载几何体为 Rerun 实体、并为每个 link 生成带 frame ID 的关节变换。读完本文你将掌握URDF 导入器在底层做了什么、如何在运行时用命名帧的Transform3D驱动关节运动、如何用rr.urdf.UrdfTree访问关节/连杆结构并计算关节变换以及如何把 URDF 合并进一个已经打开的录制例如 ROS 2 MCAP中。内置 URDF 导入器与一次导入背后发生的事情Rerun 内置了面向 URDF 的UrdfImporter导入器名称为rerun.importers.Urdf实现在 crates/data_flow/re_importer/src/importer_urdf/mod.rs。在导入器框架中所有导入器都会被无条件通知待打开的文件路径URDF 导入器通过检查扩展名不区分大小写的urdf决定是否接手该文件不匹配则返回ImporterError::Incompatible。这与 导入器总览 中描述的内置/外部/自定义三类导入器机制一致。在 Rerun 中使用 URDF 非常简单——只需用日志 API 加载文件导入器会自动完成三件事解析网格mesh的路径引用并加载它们把网格与基本几何体box、cylinder、capsule、sphere作为 Rerun 实体加载加载各 link 的关节变换joint transforms以及对应的 frame ID。实体路径布局从 urdf_tree.rs 中UrdfLogPaths::new的源码可以看到模型被组织到几个固定的实体路径下entity_path_prefix可选内容默认实体路径说明机器人根坐标系{robot_name}可加前缀由CoordinateFrame标记值为 root link 的 frame ID视觉几何体{prefix}{robot_name}/visual_geometries/{link}/{visual_name}便于整体切换视觉几何体显隐碰撞几何体{prefix}{robot_name}/collision_geometries/{geometry_type}/{link}/{collision_name}按几何类型分目录可单独隐藏某类碰撞体如只隐藏 mesh 保留基本体静态关节变换/tf_static所有默认变换集中到同一个实体路径且不受entity_path_prefix影响所有静态关节变换会被合并为一个 chunk 批量写入/tf_static见emit_static_transforms_batch。源码注释明确说明“对 URDF 总是以 static 方式写入”这样用户后续可以在任意自己选择的变换实体上覆盖它们。网格资源如何被解析load_ros_resource支持四种资源寻址方式相对路径相对.urdf文件所在目录解析file://协议直接读取本地绝对路径package://协议在ROS_PACKAGE_PATHROS 1和AMENT_PREFIX_PATHROS 2中查找entry/pkg_name或entry/share/pkg_name适用于 ROS 包内引用的网格见resolve_package_urihttp(s)://协议通过 HTTP 下载网格连接超时 30 秒且单次下载有 512 MiB 的内存保护上限MAX_MESH_DOWNLOAD_SIZE。对于无法解析的网格资源导入不会整体失败错误会被收集并按原因汇总、去重后以警告形式输出例如“Could not resolve package URI…”其余 link、joint 与几何体照常导入。这一点有端到端测试佐证test_urdf_importer.rs 中的test_urdf_importer_dangling_mesh专门验证“网格无法加载时其余实体仍然全部产出且不会发出任何Asset3D”。另外在 WebAssembly 目标上ROS 资源加载不可用返回UnsupportedInWasm。几何体与材质的映射emit_geometry给出了 URDF 几何类型到 Rerun 原语/资产的映射关系URDF 几何Rerun 输出meshAsset3D按扩展名猜测 MediaType支持albedo_factorboxBoxes3D带颜色cylinderCylinders3DURDF 与 Rerun 都以 Z 为主轴capsuleCapsules3D同上sphereEllipsoids3D带颜色材质处理上优先使用 visual 内联定义的 color/texture否则回退到按名称查找全局material未指定颜色时回退为白色。纹理texture目前未支持会输出一次性警告源码中的warn_once!(Material texture not supported)。碰撞几何体不携带材质统一按白色渲染。用命名帧的 Transform3D 更新关节模型加载完成后关节的驱动方式是通过发送[Transform3D](https://link.gitcode.com/i/45e8ba7e4c8c00777da1c66c744bf20a)完成的关键要求是必须显式设置parent_frame和child_frame为每个关节对应的 frame IDURDF 中即 parent link 与 child link 的名字。版本提示≥ 0.28 的行为变化0.28 之前的版本要求使用“隐式 frame ID”即把每个关节的变换分别发送到特定实体路径上。该方案已被命名 frame ID取代这与 ROS 的 TF 语义更一致并且允许你在一个实体例如示例中的transforms实体上发送全部关节的变换更新。下面是一个最小可运行的加载并更新关节的 Python 示例来自文档配套片段 docs/snippets/all/howto/load_urdf.pyfrom pathlib import Path import rerun as rr from rerun import RecordingStream with RecordingStream(rerun_example_load_urdf) as rec: rec.spawn() # log_file_from_path 会自动调用内置的 URDF 导入器。 urdf_path Path(__file__).parent / minimal.urdf rec.log_file_from_path(urdf_path, staticTrue) # 可选的 flush确保 URDF 加载完成后再继续后续日志。 rec.flush() # 后续在日志代码中用 Transform3D 更新关节。 joint_axis [0, 0, 1] # 取自 URDF joint_angle 1.216 # 弧度 origin_xyz [0, 0, 0.1] # 取自 URDF # 务必保证 parent_frame / child_frame 与 URDF 中关节的 frame ID 一致。 rec.log( transforms, rr.Transform3D( rotationrr.RotationAxisAngle(axisjoint_axis, anglejoint_angle), translationorigin_xyz, parent_framebase_link, child_framechild_link, ), )Rust 与 C SDK 同样通过RecordingStream::log_file_from_path触发同一套内置导入器之后也以Transform3D含parent_frame/child_frame更新关节。完整动画示例animated_urdf文档推荐了两个可直接运行的动画示例Python 版 animated_urdfpython -m animated_urdfRust 版 animated_urdf加载并驱动同一份so100.urdf机械臂以 Python 版为例它的核心循环展示了几种典型用法一次性加载模型rec.log_file_from_path(urdf_path)然后用rr.urdf.UrdfTree.from_file_path(urdf_path)把 URDF 结构读入内存隐藏碰撞几何体通过 blueprint 对so_arm100/collision_geometries设置rrb.EntityBehavior(visibleFalse)这正是前文实体路径布局中“视觉/碰撞分离”设计的目的逐关节驱动对每个revolute关节用joint.compute_transform(angle, clampTrue)计算变换并rec.log(transforms, transform)——compute_transform会自动填好 frame ID无需手动指定运行期修改材质通过urdf_tree.get_joint_child(joint)拿到关节的子 link再对get_visual_geometry_paths(link)返回的每个视觉几何体路径用rr.Asset3D.from_fields(albedo_factorrgba)按关节角度动态改颜色/透明度示例中“jaw”关节的夹爪颜色随角度从红渐变到绿假关节角度_fake_angle使用joint.limit_lower/joint.limit_upper生成在限位内振荡的正弦角模拟真实测量数据。Python URDF 工具rr.urdf除了导入器Rerun 还在 Python 侧提供了 rerun_py/rerun_sdk/rerun/urdf.py 模块即rr.urdf可作为yourdfpy、pytransform3d等第三方包之外的轻量替代。它的底层是rerun_bindings中暴露的_UrdfTreeInternal/_UrdfJointInternal等原生绑定再封装为符合 Rerun 日志语义的高层 API。UrdfTree加载并访问模型结构urdf_tree rr.urdf.UrdfTree.from_file_path(robot.urdf, entity_path_prefixNone) # 访问属性 robot_name urdf_tree.name root_link urdf_tree.root_link() joints urdf_tree.joints() # 按名字查找 urdf_tree.get_joint_by_name(shoulder) urdf_tree.get_link_by_name(base_link) # 获取某个 link 的视觉/碰撞几何体实体路径 # 可用于运行期修改颜色/透明度 for visual_path in urdf_tree.get_visual_geometry_paths(gripper): rec.log(visual_path, rr.Asset3D.from_fields(albedo_factor[255, 0, 0, 100]), staticTrue)UrdfTree.from_file_path的完整签名还支持三个配置参数源码见 urdf.py参数作用entity_path_prefix可选给几何体实体路径加前缀frame_prefix可选给所有 frame ID 加前缀用于多次加载同一份 URDFstatic_transform_entity_path可选静态变换写入的实体路径默认/tf_static不受entity_path_prefix影响UrdfTree还提供get_joint_child(joint)取关节子 link、log_urdf_to_recording()把完整模型——几何体 静态变换——写入录制是log_file_from_path在需要frame_prefix等额外配置时的替代方案、stream()实验性的惰性 chunk 流等接口。多机器人场景frame prefix当需要把同一份 URDF 加载多次例如双臂设置时用frame_prefix让每份实例的 frame ID 唯一用entity_path_prefix在实体树中隔离几何体然后通过log_urdf_to_recording()写入带前缀 frame ID 的模型left rr.urdf.UrdfTree.from_file_path(robot.urdf, entity_path_prefixleft, frame_prefixleft/) right rr.urdf.UrdfTree.from_file_path(robot.urdf, entity_path_prefixright, frame_prefixright/) left.log_urdf_to_recording() right.log_urdf_to_recording()之后通过joint.compute_transform()计算出的变换会自动带上前缀 frame ID例如left/base、right/shoulder。这正是 animated_urdf 示例中--dual模式的实现方式左右臂分别以left/、right/前缀加载再各自rec.log(left, rr.Transform3D(translation[-0.2, 0, 0]), staticTrue)平移错开位置。UrdfJoint读取关节属性并计算变换每个关节都暴露了来自 URDF 文件的属性namejoint_type如revolute、continuous、prismatic、fixedparent_link、child_linkaxis、origin_xyz、origin_rpylimit_lower、limit_upper、limit_effort、limit_velocitymimic若该关节带mimic标签返回UrdfMimic含joint、multiplier、offset语义为value multiplier * driver_value offset否则为None用compute_transform()得到Transform3D其parent_frame与child_frame已自动设置好# 对 revolute / continuous 关节传入弧度角 # 对 prismatic 关节传入平移距离米 transform joint.compute_transform(angle) rec.log(transforms, transform)compute_transform(value, clampTrue)的行为细节对应底层实现 joint_transform.rsrevolute 关节在值超出[limit_lower, limit_upper]时会被钳制clamp并产生一条警告clampFalse时不做钳制、不警告continuous 关节没有限位因此不检查变换由 origin 姿态与绕关节轴axis的动态旋转轴角组合而成prismatic 关节则在 origin 平移基础上叠加沿轴的位移。此外UrdfJoint还提供面向批量数据的两组方法compute_transform_columns(values, clampTrue)对同一关节的多个值批量计算返回列式columnar数据可直接配合rerun.send_columns使用适合一次性发送整段关节轨迹UrdfTree.compute_joint_transform_batches(names, values, clampFalse)接收 ArrowListArray关节名 关节值按行成对输出包含translation、quaternion、parent_frame、child_frame的ListArray源码注释说明这是为 lens查询/变换流水线设计的辅助接口——下游通常再接一个把每个 batch 展开成最终Transform3D行的 lens。把 URDF 加载进已有的录制如果 Rerun 中已经打开了一个带变换的录制想往里追加 URDF可以通过拖拽文件进 Viewer或使用菜单中的“Import into current recording”实现。一个典型场景加载 ROS 2 的.mcap文件时TF 消息会被自动翻译为 Rerun 的Transform3D但示例 MCAP 的变换树中会缺失一些连接Viewer 中会以错误形式提示这些缺失的静态变换。这些缺失的静态变换往往存放在与 MCAP 分离的 URDF 模型里。此时只需把对应的 URDF 文件直接拖入已加载 MCAP 的 Viewer 窗口缺失的静态 link 就会补上变换树随之闭合。参考与进一步阅读三种语言统一的文件入口Pythonrerun.log_file_from_path、RustRecordingStream::log_file_from_path、CRecordingStream::log_file_from_path导入器框架总览了解内置/外部/自定义三类导入器及扩展方式Transform3D 原型参考parent_frame/child_frame/旋转/平移的完整字段说明Rust 端导入器实现 与 URDF 树构造、关节变换计算导入器端到端测试验证网格悬空dangling mesh时导入仍能容错完成配套片段资源load_urdf.py 与 minimal.urdf仓库中以 Git LFS 指针形式存储完整动画示例Python animated_urdf 与 Rust animated_urdf。【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表