Loading URDF models
Rerun features a built-in data-loader for URDF files.
Overview overview
Using a URDF in Rerun only requires you to load the file with the logging API.
This will automatically invoke the data-loader, which will take care of:
- resolving paths to meshes
- loading meshes and shapes as Rerun entities
- loading the joint transforms and associated frame IDs of links
Once that is done, the joints can be updated by sending Transform3Ds, where you have to set the parent_frame and child_frame fields explicitly to each joint's specific frame IDs.
⚠️ Note: previous versions required you to send transforms with implicit frame IDs, i.e. having to send each joint transform on a specific entity path. This was dropped in favor of explicitly-named frame IDs, which is more in line with ROS and allows you to send all transform updates on one entity (e.g. a
transformsentity like in the example below).
Example example
Here is an example that demonstrates how to load and update a URDF with the Python SDK:
from pathlib import Path
import rerun as rr
rr.init("urdf_example", spawn=True)
# `log_file_from_path` automatically uses the built-in URDF data-loader.
urdf_path = Path("/path/to/robot.urdf")
rr.log_file_from_path(urdf_path, static=True)
# Later, in your logging code, you'll update the joints using transforms.
# A minimal example for updating a revolute joint that connects two links:
joint_axis = [0, 1, 0] # comes from URDF
joint_angle = 1.216 # radians
rotation = rr.RotationAxisAngle(axis=joint_axis, angle=joint_angle)
# Make sure that `parent_frame` and `child_frame` match the joint's frame IDs in the URDF file.
rr.log(
"transforms",
rr.Transform3D(
rotation=rotation,
parent_frame="link_1",
child_frame="link_2"
)
)For similar code in Rust, we have a full example here.