Tooling Suite

Research Tools

A suite of automation scripts for USD inspection, articulation fixing, collision injection, and physics validation โ€” designed to dramatically reduce robot on-boarding time.

Overview

The research_tools/ directory contains standalone Python scripts that automate the most error-prone parts of integrating a new robot into Isaac Lab. Each script is independent and can be run headlessly via the isaacsim launcher. They were developed during the LeKiwi integration and are general enough to apply to any new robot USD.

๐Ÿš€
Recommended on-boarding order: inspect_usd.py โ†’ check_usd.py โ†’ fix_lekiwi_usd.py โ†’ find_collisions.py โ†’ add_wheel_collisions.py โ†’ check_wheel_physics.py

Tool Reference

๐Ÿ” inspect_usd.py

Traverses the entire USD prim tree and prints a human-readable summary of all prims, their types, and active APIs. Specifically identifies ArticulationRootAPI, RigidBodyAPI, CollisionAPI, and JointAPI applications. Essential first step before any modification.

python research_tools/inspect_usd.py \
  --usd /path/to/robot.usd
โœ… check_usd.py

Performs a validation pass on a USD file: verifies that exactly one prim has ArticulationRootAPI, that no FixedJoint connects to the world frame, and that the default prim is set. Reports PASS/FAIL for each check with detailed diagnostic output.

python research_tools/check_usd.py \
  --usd /path/to/robot.usd
๐Ÿ”ง fix_lekiwi_usd.py

The primary articulation repair script. Opens a USD as a sublayer, deactivates the root_joint prim that pins the robot to the world, and applies UsdPhysics.ArticulationRootAPI + PhysxSchema.PhysxArticulationAPI to the chassis body. Writes output as a new USD file (non-destructive).

python research_tools/fix_lekiwi_usd.py
# Input:  assets/robots/lekiwi/lekiwi.usd
# Output: assets/robots/lekiwi/lekiwi_floating.usd
๐Ÿ‘ป find_collisions.py

Scans a USD for all prims with UsdPhysics.CollisionAPI applied. Prints a count and list of all collision prim paths. If the count is zero, the robot is a "ghost" โ€” it has no physics surface and will fall through the floor or not generate traction.

python research_tools/find_collisions.py \
  --usd /path/to/robot.usd
# Output: "Found 0 collision prims" โ†’ ghost robot!
๐Ÿ’ฅ add_wheel_collisions.py

Procedurally injects collision geometry into a robot USD. For each configured wheel body path, creates a child collision prim: Cylinder for drive wheels (traction), Sphere for passive caster wheels (free rolling). Also disables self-collisions at the articulation level to prevent NaN explosions.

python research_tools/add_wheel_collisions.py
# Input:  lekiwi_floating.usd
# Output: lekiwi_final.usd

Key configuration at the top of the file:

WHEEL_RADIUS = 0.0325 * 0.95  # 5% smaller prevents ground interpenetration
WHEEL_WIDTH  = 0.03            # cylinder height in meters
WHEEL_BODIES = ["/LeKiwi/wheel_body_1", ...]
# is_caster = (i == 2)  โ†’ 3rd wheel gets Sphere shape
โš™๏ธ add_collisions.py

More general collision injection script (precursor to add_wheel_collisions.py). Supports adding Box, Sphere, and Cylinder shapes to arbitrary prim paths, with configurable dimensions and material bindings. Useful for adding body colliders in addition to wheel colliders.

๐Ÿ”ฌ check_wheel_physics.py

Physics validation script that loads a USD in IsaacSim, spawns the robot, applies motor commands at a fixed velocity, and reports: wheel joint velocities, base translation velocity, contact forces, and any NaN detection. Designed to be run after add_wheel_collisions.py to confirm that the robot actually moves.

python research_tools/check_wheel_physics.py
# Runs 500 simulation steps, prints:
# - Joint vel: [14.2, 16.1, 0.0] rad/s
# - Base vel:  [0.0, 0.0, 0.0] โ† still the traction problem!
๐Ÿฆด inspect_joints.py

Prints a complete list of all joints in the USD articulation tree with their types (RevoluteJoint, PrismaticJoint, FixedJoint), parent/child body paths, and current axis definitions. Critical for identifying the root_joint that needed to be deactivated.

๐Ÿงฎ simple_check.py

Minimal sanity check script. Opens a USD without launching the full simulation app, prints the prim tree structure, and checks for the most common integration errors. Useful for quick iteration without the 30-second Isaac Sim startup cost.

Recommended Workflow

When integrating a new robot USD, follow this systematic sequence:

1

Inspect the raw USD

python research_tools/simple_check.py --usd /path/to/robot.usd
python research_tools/inspect_joints.py --usd /path/to/robot.usd

Look for: any FixedJoint connecting to world, multiple ArticulationRootAPI prims, missing default prim

2

Fix the articulation root

python research_tools/fix_lekiwi_usd.py  # adapt paths inside script
python research_tools/check_usd.py --usd lekiwi_floating.usd  # validate
3

Check for ghost robot (missing collisions)

python research_tools/find_collisions.py --usd lekiwi_floating.usd
# If count is 0 โ†’ inject collisions:
python research_tools/add_wheel_collisions.py
4

Physics validation

python research_tools/check_wheel_physics.py
# Confirm: joint velocities > 0, base velocity > 0, no NaN
5

Update robot config and run evaluation

# Update configs/robots/your_robot_config.py with correct USD path
python eval_pointgoal_wheeled.py --robot your_robot --port 8888 \
  --scene_dir ./assets/scenes/cluttered_easy

Contributing New Tools

If you develop a useful diagnostic or integration tool during your research with this sandbox, consider contributing it back to the research_tools/ directory. Each tool should follow the conventions: