Rendering Tools
June 30, 2026 ยท View on GitHub
render_episode.py renders either a static resolved episode or a recorded state log
recorded by tools/teleop/franka_robotiq_task_teleop.py.
Run the commands below from the repository root with the Python environment
where isaacsim is installed.
The default mode is state-snapshot rendering:
- restore object state and robot state for every output frame
- zero velocities after restore
- run one
1/120physics sync tick so restored Isaac articulation poses reach the camera renderer - load the packaged background scene unless
--no-backgroundis passed - place the robot reference root at
(-0.05, 0.0, -0.1)unless--robot-position X Y Zis passed - use
15only as output video FPS metadata - write MP4 videos under
videos/<camera_id>.mp4 - skip per-frame PNG files unless
--save-imagesis passed
This avoids trajectory rollout drift from gravity, contacts, or residual
velocities while still making robot articulation state visible in rendered
camera images.
MP4 writing uses imageio with ffmpeg/pyav when available, otherwise OpenCV.
Render A Teleop Log
python tools/render/render_episode.py \
--record-path outputs/teleop/Packing_a_Fruit_Lunch/TV-01/success/episode_001.pkl \
--output-dir outputs/renders/Packing_a_Fruit_Lunch/TV-01/episode_001 \
--cameras all
This renders the full trajectory by default. Use --max-frames N only for a
quick smoke test.
The command writes outputs under:
outputs/renders/Packing_a_Fruit_Lunch/TV-01/episode_001/
videos/front_camera.mp4
manifest.jsonl
metadata.json
Pass --save-images only when you also need per-frame PNG files:
python tools/render/render_episode.py \
--record-path outputs/teleop/Packing_a_Fruit_Lunch/TV-01/success/episode_001.pkl \
--output-dir outputs/renders/Packing_a_Fruit_Lunch/TV-01/episode_001 \
--cameras all \
--save-images
By default only front_camera is rendered for quick inspection. The README
command above passes --cameras all to render the fixed benchmark views:
python tools/render/render_episode.py \
--record-path outputs/teleop/Packing_a_Fruit_Lunch/TV-01/success/episode_001.pkl \
--output-dir outputs/renders/Packing_a_Fruit_Lunch/TV-01/episode_001 \
--cameras all
--cameras all currently expands to front_camera, left_shoulder_camera,
and right_shoulder_camera. The wrist/Realsense view is intentionally not in
the default set because its mount prim depends on the robot USD.
Use --no-background to render against a local simple ground plane instead of
the packaged background scene. This fallback adds local Dome/Distant/Rect
lights by default and does not depend on Isaac/Nucleus asset discovery. Pass
--no-default-lights only when debugging lighting explicitly.
The default path renders with the packaged background scene. Keep
--startup-frames at its default unless you are debugging startup. When a
state log is provided, startup warmup restores deterministic random state rows,
renders them, reads camera buffers, and discards those frames before returning
to the first saved frame. This forces object materials, background lighting,
and camera buffers to settle before frame 0 is written to video.
Keep --first-frame-warmup-frames above 0 as a final guard. The first saved
state is restored again after this warmup, before frame 0 is captured.
Render One Static Episode
python tools/render/render_episode.py \
--output-dir outputs/renders/static_packing_fruit_lunch \
--max-frames 1
Physics Debug Mode
The default renderer uses exactly one small physics sync tick per saved state. It is not a dynamic rollout because every frame is restored from the log before that tick.
To intentionally test dynamic drift or contact stability, choose a larger rendering timestep so multiple physics steps are run after each restored state:
python tools/render/render_episode.py \
--record-path outputs/teleop/Packing_a_Fruit_Lunch/TV-01/success/episode_001.pkl \
--physics-dt 0.008333333333333333 \
--rendering-dt 0.06666666666666667 \
--max-frames 120
For debugging camera/render synchronization itself, --no-step-physics keeps
the simulation paused, but Isaac articulation poses may appear visually stale in
camera output.