PERSONAL R&D / ROBOTICS & DIGITAL TWINS

Procedural workflows
for physical simulation.

Building on a background in Houdini, simulation, and procedural workflows, I am exploring their close connection to OpenUSD, Physical AI, and digital twins. I am currently learning OpenUSD composition and layering while developing a bridge between procedural Houdini environments and digital-twin simulations in NVIDIA Isaac Sim.

Explore the projects
STUDY 01 / HOUDINI → OPENUSD → ISAAC SIM

Procedural Streets for Autonomous Driving

LiDAR + pedestrian crossing

From Houdini
to a driving test.

I built the street district as a Houdini Digital Asset, with controls for the road layout, buildings, and street furniture. It exports to OpenUSD and becomes the environment for a physical vehicle in Isaac Sim.

The current test combines a predefined route, a PhysX vehicle, RTX LiDAR, and a pedestrian walking on a baked NavMesh. When the pedestrian enters the car’s forward detection area, the controller applies the brake and waits for new LiDAR returns before moving again.

Native Houdini SOPsHDA controlsOpenUSDPhysX vehiclePure pursuitRTX LiDARAction GraphPedestrian navigation
1.5 m/svehicle cruise target
0.5 m/spedestrian patrol setting
4 mminimum brake trigger distance
1 scontinuous clear-scan requirement

These are the controller settings used in the recorded run, not performance guarantees. The braking threshold also increases with vehicle speed. The crossing sequence worked in this test; I have not yet run a larger repeatability study.

SENSING AND RESPONSE

How the car handles the crossing

For this test, the pedestrian crosses on a baked navigation surface while the vehicle approaches in its lane. The controller checks fresh LiDAR returns inside a narrow area ahead of the car and overrides the driving commands when that area is occupied.

01 / APPROACH

Follow the route

Vehicle position, orientation, and velocity feed a pure-pursuit controller. Steering, accelerator, and brake commands flow through an Action Graph into the PhysX vehicle.

02 / YIELD

Brake for occupied space

Fresh LiDAR points are transformed into the vehicle frame. A forward corridor rejects road and chassis returns, then measures obstacle clearance. The crossing test produced a full brake command and a visible stop.

03 / CONTINUE

Wait for clear evidence

The controller holds the stop while space remains blocked or uncertain. New returns beyond the previously blocked location must confirm clearance before driving resumes. The car continued after the pedestrian cleared the lane.

System diagram: Houdini exports city geometry and a route into a layered USD scene; vehicle feedback drives route tracking, while RTX LiDAR supplies a brake and resume gate before vehicle commands.
Controller architecture diagram. The camera currently provides a visual view; LiDAR supplies the obstacle measurements used by the braking logic.
BUILT IN HOUDINI

A district controlled by an HDA

01

Lay out the streets

The procedural layout generates the street network, raised sidewalks, block parcels, markings, and crossings. Block count, spacing, road width, and sidewalk width remain editable.

02

Vary the architecture

Three building modules combine floor bands, glazing, roof equipment, and entry canopies. Seeded variant selection and Attribute Randomize change their distribution and footprints across the generated building sites.

03

Export the cooked result

The native USD File Export node writes named geometry groups and display colors. Metres and Y-up are preserved in Isaac Sim, where static collision surfaces and vehicle physics are added.

Actual Houdini viewport and Street District HDA controls for block count, street spacing, road width, and sidewalks
HDA controls and the cooked district in Houdini. Select the image to inspect the interface at full resolution.
OPENUSD HANDOFF

From HDA to simulation

The HDA writes the city geometry and route points to a dedicated environment USD file. I keep the car, collision overrides, sensors, and Action Graph in a separate simulation layer. This lets me re-export the Houdini environment without rebuilding the vehicle setup. When the route changes, a reset branch reads its new starting point and direction, places the car above the road, and clears its velocity. I tested the link by changing the block spacing in Houdini and reloading the export in Isaac Sim.

ISAAC SIM / ACTION GRAPH

The driving and reset graph

Current Isaac Sim Action Graph: route and vehicle state feed the controller, three chained writers apply vehicle commands, and a separate branch resets the vehicle after a route change
The actual project graph. Route points, position, orientation, and velocity feed the driving Script Node. Its outputs command steering, throttle, and brake through three sequential Write Prim Attribute nodes. The left branch handles initial placement and route-change resets. The controller also exposes obstacle distance and sensor readiness. Select the image to inspect the full-resolution graph.
DEVELOPMENT PROCESS

What I built and tested

01 / SCENE COMPOSITION

Keep the city editable

Separate environment exports from simulation authoring. Link the road layout and route to shared Houdini controls, reload the environment layer, and reset the vehicle from the updated route instead of entering coordinates manually.

02 / PHYSICS AND FEEDBACK

Build a physical driving loop

Add static collisions to roads, sidewalks, buildings, and street furniture. Configure the vehicle chassis, wheels, suspension, and steering, then connect route and vehicle state to the driving controller.

03 / SENSOR INTEGRATION

Check what the LiDAR sees

Parent the camera and LiDAR to the vehicle and position their mounts. Inspect the point cloud, resolve sensor and vehicle coordinate frames, and filter chassis and ground returns. Stationary scans expose missed obstacles and close-range visibility limits before another driving test.

04 / PEDESTRIAN NAVIGATION

Connect both sides of the crossing

Bake a walkable NavMesh for an Actor SDG patrol. Compare a simple test surface with the exported meshes, correct winding on navigation test copies, and exclude painted markings that fragmented the walking surface. A path query then connects both sides on the same navigation island.

05 / BRAKING AND RESUME

Separate absence from clearance

Use a minimum four-metre trigger with a speed-dependent stopping margin. Hold braking through uncertain scans and require fresh evidence beyond the blocked location before release. Test the sequence with a stationary cube, then a walking pedestrian.

06 / REPEATABLE SETTINGS

Verify the active behavior

Check the pedestrian’s authored patrol speed rather than relying only on the setup panel. Existing actors retain their scene behavior when setup skips respawning them. Save the corrected behavior and reload the scene before testing the next crossing.

Current result

In the recorded crossing run, the brake output reached 1 and the car stopped before the pedestrian. It moved again after the lane cleared. The system only detects occupied space; it does not identify pedestrians, choose its own route, or represent a complete autonomous-driving stack.

TECHNICAL NOTES

Environment tools meet vehicle control

What is procedural?

The city layout HDA is generated procedurally in Houdini. Python assembles the node graph; native Houdini operators cook the geometry. Six validation cases check repeatable seeds, alternate seeds, expanded layouts, tight block dimensions, and disabled street details.

How does the car drive?

A pure-pursuit controller turns route error into steering, and a speed controller supplies throttle and braking. The current implementation uses RTX LiDAR measurements to gate these commands when the forward corridor is blocked. Native graph nodes read the vehicle state and apply the outputs of a Python Script Node. Physics determines the motion through the wheels, suspension, and tire forces. The car uses simulator pose and an exported route; independent route selection is still planned.

Scope, attribution, and next steps

The Houdini district, HDA, vehicle appearance, route controller, test setup, and analysis form this personal study. The physical vehicle is configured with NVIDIA’s PhysX vehicle tooling. The environment is fictional, with no calibrated real-world twin. The camera, RTX LiDAR, and navigation-driven pedestrian form the sensing and interaction setup. The pedestrian uses a supplied NVIDIA character asset. The camera is available for inspection but does not yet classify road users. Next steps are repeatable crossing scenarios, destination and route planning, traffic rules, and perception from sensor observations. The current corridor filter is designed for a small, flat-road experiment and is not a complete collision predictor for turns.

STUDY 02 / ISAAC SIM

Procedural Robotics Test Cell

Simulation study
Franka Panda arm on a metal work platform, with amber safety markings and warehouse storage racks behind it
01 — The work cellActual Isaac Sim render

A reusable
Isaac Sim test cell.

I built this small warehouse scene to practice assembling an OpenUSD environment, controlling a robot, and measuring the result in one repeatable setup.

A Franka Panda moves a physical workpiece between marked zones. Each run records the object trajectory, robot joint positions, lift height, and placement error.

OpenUSDIsaac Sim 6.0.1PythonPhysXDifferential IK
12evaluated trials
12 / 12successful placements
11.3 mmmean placement error
3scenario variants

12 deterministic simulation trials across three pickup scenarios. Success: lift above 12 cm, final XY error below 6 cm, final height within 4 cm. These runs are a small experiment, not a production reliability estimate.

SEE IT RUN

From approach to release

Recorded in Isaac Sim. The object moves through physical contact with the gripper. The controller uses smooth waypoints and differential inverse kinematics.

THE WORKFLOW

Build. Simulate. Measure.

01

Procedural scene

Python generates the facility, safety markings, pallet stack, and storage modules. OpenUSD references and instancing keep the rack asset reusable.

02

Physical behavior

An articulated arm, collision shapes, gravity, and a dynamic workpiece form the test. A waypoint state machine drives the robot through a complete transfer.

03

Recorded evidence

Seeded scenarios vary the pickup location and lighting. Telemetry captures the actual motion, and an explicit geometric check determines success.

TECHNICAL NOTES

What this study establishes

Scope & contribution

A personal study covering procedural scene construction, scenario setup, experiment harness, telemetry, and presentation. The robot asset and differential IK helper come from NVIDIA’s installed Isaac Sim examples. The environment is authored with Python/OpenUSD; a Houdini export is a future extension.

What counts as success?

The object must lift above 12 cm, finish within 6 cm of the target in the horizontal plane, and settle within 4 cm of the target height. Finishing the controller sequence alone does not count. The downloadable results include each trial’s final position and lift height.

Limits & next experiment

This is a fictional cell for studying digital-twin workflows. It has no calibrated physical counterpart and makes no sim-to-real claim. Control uses known object poses, rather than visual perception. No reinforcement-learning policy was trained in Isaac Lab. Study 03 below extends this foundation with camera-based sorting and visual verification.

Implementation notes

Scene generation, the saved USD stage, and the experiment harness are maintained together. The study was run in Isaac Sim 6.0.1 with the Franka asset from NVIDIA’s asset library. Per-trial results and telemetry are available below.

STUDY 03 / PERCEPTION + MANIPULATION

Vision-Guided Sorting Cell

Closed-loop experiment
Franka sorting cell with an overhead camera gantry, three colored parts, and two receiving lanes
01 — From pixels to physical actionActual Isaac Sim render

Sorting from
camera observations.

I extended the test cell with an overhead camera so the robot could locate its pickup targets from RGB images instead of using the known scene position directly. Three colored parts are sent to two receiving lanes.

After each transfer, the arm moves out of the camera view and the controller checks the destination before continuing.

RGB perceptionOpenCVCamera calibrationMulti-part sortingVisual verification
9 / 9successful transfers
2.8 mmmean localization error
7.1 mmmean placement error
3seeded episodes

3 of 3 episodes completed all three placements. Each transfer requires the correct class, a physical lift, a placement within the geometric tolerances, and camera confirmation. This is a small controlled experiment.

SEE IT RUN

Three parts. Two destinations.

Actual PhysX manipulation recorded in Isaac Sim. Three manipulation excerpts are joined together; approach, retraction, settling, sensor-acquisition pauses, and arm-parking motions are omitted. Parts remain dynamic throughout each grasp.

THE CONTROL LOOP

A decision at every step

01 / OBSERVE

Pixels to positions

HSV color segmentation finds candidate parts in the input region. A calibrated pinhole projection maps image centroids onto the known part-height plane.

02 / ACT

Class to destination

A queue assigns each detection to an available slot in its color lane. Smooth Cartesian waypoints and differential IK drive the physical grasp and transfer.

03 / VERIFY

Check before continuing

A second RGB observation looks for the matching color at the destination. Missing detections or an unconfirmed placement stop the episode.

TECHNICAL NOTES

A more complete experiment

What changed from study 02?

The procedural warehouse becomes a vision-guided work cell with a camera gantry, input tray, two receiving lanes, and three dynamic parts. The new work adds RGB detection, image-to-world projection, destination-slot allocation, visual feedback, and separate localization and manipulation metrics.

How are the results measured?

Three seeded conditions vary pickup layout and lighting. The controller uses image-derived pickup coordinates. Simulator object positions are read separately for reset and scoring. Success requires a lift above 12 cm, final XY error below 6 cm, final height within 4 cm, correct color classification, and visual confirmation within 6.5 cm.

Assumptions & limits

The detector assumes known part height, two distinctive colors, a fixed calibrated camera, and an unobstructed input region. It uses classical image processing. This study does not include a trained vision model, collision-aware path planner, real-robot validation, or Isaac Lab policy training.

Implementation notes

The scene generator, camera parameters, and controller share the warehouse foundation from study 02. Tested in Isaac Sim 6.0.1 using NVIDIA’s referenced Franka asset and differential IK helper. Per-transfer results and telemetry are available below.

STUDY 04 / ISAAC LAB & REINFORCEMENT LEARNING

Humanoid Balance & Recovery

Trained in simulation
Two Unitree G1 humanoids in a simulation arena, with amber and cyan floor markings for the controller comparison
03 — The balance arenaActual Isaac Sim render

Balance training
in Isaac Lab.

I trained a Unitree G1 balance controller from scratch, beginning with small disturbances and increasing their strength as training progressed.

The PPO policy adjusts twelve leg joints from body motion and joint feedback. I compared it with fixed posture, the original untrained network, and frozen trained targets under the same disturbance schedule.

Isaac LabUnitree G1PPO / RSL-RLPyTorchPhysX
19.7Mtraining transitions
46 / 64trained-policy test survivals
1,024parallel training environments
12learned leg-joint actions

64 held-out simulation episodes per controller, with four disturbance levels. Survival means reaching 9.98 seconds without a fall or excessive drift. One training seed; this is a controlled experiment, not a hardware reliability claim.

WATCH THE COMPARISON

Same disturbance. Different response.

Amber: trained targets frozen at 1.5 seconds. Cyan: trained policy. Continuous physics simulation, captured at 25 fps. Both begin with trained feedback; the amber controller then holds its last targets. This illustrative rollout uses level initial poses and is separate from the randomized evaluation. Both receive a 0.4 m/s horizontal velocity increment at 2 seconds and the opposite increment at 5 seconds. These are controlled simulation disturbances, not calibrated physical pushes.

THE LEARNING PROCESS

From falling to balancing

Measured training curves showing mean episode duration and reward over environment transitions
Logged PPO training feedback. Episode duration is capped at 9.98 seconds; the curves show a rolling average of completed episodes. Disturbance strength increases during training.
01

Define the task

Body velocity, projected gravity, leg-joint state, and previous actions form 45 observations. The policy produces bounded joint offsets; the upper body holds its nominal pose.

02

Train with a curriculum

PPO learns across 1,024 parallel environments. Random starting tilt and disturbances encourage feedback control. The maximum disturbance rises from 0.10 to 0.45 m/s.

03

Test against baselines

All four controllers face the same held-out directions and timings. The frozen-target baseline isolates the benefit of continued feedback after 1.5 seconds. Tests include 0.60 m/s disturbances, beyond the maximum used during training.

MEASURED RESULTS

Does learning improve survival?

Survival counts for fixed-posture, untrained, frozen-target, and trained controllers at four disturbance magnitudes
Sixteen episodes per disturbance level for each controller. Fixed posture: 0 / 64 overall. Untrained network: 0 / 64. Frozen trained targets: 0 / 64. Trained policy: 46 / 64. Results stop at the first failure. Baselines may fall before the first disturbance. The trained policy passed 16/16 at both lower levels, 12/16 at 0.4 m/s, and 2/16 at 0.6 m/s.
TECHNICAL NOTES

A reproducible learning experiment

What is trained?

A 45-input, 12-output neural network, initialized from scratch and optimized with PPO. Its hidden layers have 128, 128, and 64 units. It controls leg-joint targets at 50 Hz; PhysX runs at 200 Hz. The inference export includes the learned observation normalization.

What counts as a successful test?

The humanoid must remain above 0.48 m pelvis height, below roughly 49.5° of tilt, and within 1.5 m of its starting position for 9.98 seconds. Disturbances occur at 2 and 5 seconds. The second is opposite to the first. Starting tilt and horizontal velocity vary under a separate test seed. Survival does not require returning to the exact starting pose.

What does this project add?

The balance task, reward design, disturbance curriculum, paired evaluation, data analysis, and presentation. The G1 model and joint-drive configuration come from NVIDIA Isaac Lab; PPO comes from ETH Zurich and NVIDIA’s RSL-RL.

What are the limits?

This is simulated standing balance with one training seed and ideal state feedback. It does not demonstrate walking, getting up after a fall, navigation, or real-robot deployment. Broader tests would vary mass, friction, sensor noise, and control latency, then repeat training with additional seeds.

CONTACT

Procedural systems for simulation.

I am interested in Houdini, OpenUSD, simulation content, and digital-twin workflows.

Get in touch