
Security News
Browserslist-rs Gets Major Refactor, Cutting Binary Size by Over 1MB
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
A simpler and easier-to-use library for loading, manipulating, saving, and visualizing URDF files.
Yet anOther URDF parser for Python. Yup, it's another one. Deal with it.
Yourdfpy is a simpler and easier-to-use library for loading, manipulating, validating, saving, and visualizing URDF files.
You can install yourdfpy directly from pip:
pip install yourdfpy
Once installed, you can visualize a URDF model from the command line:
yourdfpy ./my_description/urdf/robot.urdf
You can use the following keyboard shortcuts to inspect your model:
a
: Toggle rendered XYZ/RGB axis markers (off, world frame, every frame)w
: Toggle wireframe mode (good for looking inside meshes, off by default)c
: Toggle back face culling (on by default but in wireframe mode it is sometimes useful to see the back sides)Why are you wasting not only your but also our time?
you might ask. Fair point. There are already urdfpy and urdf_parser_py that deal with URDFs. Unfortunately, none of these solutions allow customizable URDF parsing that is fully independent of validation and mesh loading. Dealing with filenames, outdated dependencies, open bug reports, and limited flexibility when it comes to serialization are other disadvantages. As shown in the table below, yourdfpy is the most robust one when it comes to loading URDFs in the wild.
urdfpy | urdf_parser_py | yourdfpy | |
---|---|---|---|
Decouple parsing from validation | :heavy_check_mark: | ||
Decouple parsing from loading meshes | :heavy_check_mark: | :heavy_check_mark: | |
Visualize URDF | :heavy_check_mark: | :heavy_check_mark: | |
Forward Kinematics | :heavy_check_mark: | :heavy_check_mark: | |
Robustness test: loading 12 URDF files from here | 4/12 | 6/12 | 12/12 |
Avg. loading time per file (w/ mesh loading) | 480 ms | 370 ms | |
(w/o mesh loading) | 3.2 ms | 6.2 ms | |
Test on 4 URDF files on which urdfpy succeeds | 347.5 ms | 203 ms | |
Test on 6 URDF files on which urdf_parser_py succeeds | 2.6 ms | 3.8 ms |
robot_assets = ['robot-assets/urdfs/robots/barret_hand/bhand_model.URDF', 'robot-assets/urdfs/robots/robotiq_gripper/robotiq_arg85_description.URDF', 'robot-assets/urdfs/robots/anymal/anymal.urdf', 'robot-assets/urdfs/robots/franka_panda/panda.urdf', 'robot-assets/urdfs/robots/ginger_robot/gingerurdf.urdf', 'robot-assets/urdfs/robots/halodi/eve_r3.urdf', 'robot-assets/urdfs/robots/kinova/kinova.urdf', 'robot-assets/urdfs/robots/kuka_iiwa/model.urdf', 'robot-assets/urdfs/robots/pr2/pr2.urdf', 'robot-assets/urdfs/robots/ur10/ur10_robot.urdf', 'robot-assets/urdfs/robots/ur5/ur5_gripper.urdf', 'robot-assets/urdfs/robots/yumi/yumi.urdf']
import urdfpy
import urdf_parser_py
import yourdfpy
from functools import partial
def load_urdfs(fnames, load_fn):
results = {fname: None for fname in fnames}
for fname in fnames:
try:
x = load_fn(fname)
results[fname] = x
except:
print("Problems loading: ", fname)
pass
print(sum([1 for x, y in results.items() if y is not None]), "/", len(fnames))
return results
# parsing success rate
load_urdfs(robot_assets, urdfpy.URDF.load)
load_urdfs(robot_assets, urdf_parser_py.urdf.URDF.load)
load_urdfs(robot_assets, yourdfpy.URDF.load)
# parsing times
%timeit load_urdfs(robot_assets, urdfpy.URDF.load)
%timeit load_urdfs(robot_assets, urdf_parser_py.urdf.URDF.load)
%timeit load_urdfs(robot_assets, yourdfpy.URDF.load)
%timeit load_urdfs(robot_assets, partial(yourdfpy.URDF.load, load_meshes=False, build_scene_graph=False))
# fairer comparison with yourdfpy
urdfpy_fnames = [x for x, y in load_urdfs(robot_assets, urdfpy.URDF.load).items() if y is not None]
%timeit load_urdfs(urdfpy_fnames, yourdfpy.URDF.load)
# fairer comparison with urdf_parser_py
urdfparser_fnames = [x for x, y in load_urdfs(robot_assets, urdf_parser_py.urdf.URDF.from_xml_file).items() if y is not None]
%timeit load_urdfs(urdfparser_fnames, functools.partial(yourdfpy.URDF.load, load_meshes=False, build_scene_graph=False))
FAQs
A simpler and easier-to-use library for loading, manipulating, saving, and visualizing URDF files.
We found that yourdfpy demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
Research
Security News
Eight new malicious Firefox extensions impersonate games, steal OAuth tokens, hijack sessions, and exploit browser permissions to spy on users.
Security News
The official Go SDK for the Model Context Protocol is in development, with a stable, production-ready release expected by August 2025.