Skip to content

feat(ur5_ws): Add UR5e bringup, Isaac Sim, and Isaac Lab support - #120

Open
stanl1y wants to merge 2 commits into
j3soon:mainfrom
stanl1y:feat/ur5_ws-isaac
Open

feat(ur5_ws): Add UR5e bringup, Isaac Sim, and Isaac Lab support#120
stanl1y wants to merge 2 commits into
j3soon:mainfrom
stanl1y:feat/ur5_ws-isaac

Conversation

@stanl1y

@stanl1y stanl1y commented May 13, 2026

Copy link
Copy Markdown

Summary

  • Enable Isaac Sim 5.1.0 and Isaac Lab 2.3.2 in ur5_ws/docker/compose.yaml
    (uncomment the two version build args that were pre-staged but disabled).
  • Add UR5e bringup + calibration helper scripts (ur5e_bringup.sh,
    ur5e_calibration.sh) mirroring the existing UR5 ones.
  • Add Isaac Sim / Isaac Lab examples under ur5_ws/scripts/isaac/:
    • spawn_ur.py — Isaac Sim standalone, loads UR5/UR5e from bundled
      Isaac Robots assets, runs physics, supports
      --ur_type {ur5,ur5e}, --headless, --steps.
    • ur_isaaclab_minimal.py — Isaac Lab scaffold using
      InteractiveSceneCfg + ArticulationCfg + AssetBaseCfg-wrapped
      ground plane / dome light.
  • Add shell wrappers: isaac_sim_ur5.sh, isaac_sim_ur5e.sh,
    isaac_lab_ur_minimal.sh.
  • Update docs/ur5-ws/index.md with UR5e bringup variant, Isaac Sim
    section, Isaac Lab section, cross-link to so101_ws for X11 caveats.

Test plan

End-to-end smoke-tested on Ubuntu 22.04 + RTX 4090 + docker:

  • ./tests/test_all.sh passes
  • docker compose build ur5-ws succeeds with Isaac flags uncommented
  • ROS Humble UR packages present (ur, ur_calibration, ur_client_library,
    ur_controllers, ur_dashboard_msgs, ur_description, ur_moveit_config,
    ur_msgs, ur_robot_driver)
  • /home/user/isaacsim/python.sh and /home/user/IsaacLab/isaaclab.sh
    resolve inside the image
  • ./scripts/isaac_sim_ur5e.sh --headless --steps 10
    "Simulation App Startup Complete", UR5E loaded at /World/UR5E/...,
    clean shutdown
  • ./scripts/isaac_lab_ur_minimal.sh --ur_type ur5e --headless
    initializes InteractiveScene without ValueError, Vulkan picks up GPU
  • Interactive Isaac Sim viewport renders UR5e via VNC (visual test)

Notes

  • Bundled Universal_Robots_ROS2_Description already includes per-variant
    configs for UR5e — no submodule update needed.
  • Follows the so101_ws paradigm; same X11 desktop assumptions.

Summary by CodeRabbit

  • Documentation

    • Updated documentation to reflect broader UR5 and UR5e support with Isaac Sim and Isaac Lab simulation setup instructions, including container assumptions and configuration guidance.
    • Added Isaac scripts documentation with usage examples.
  • New Features

    • Added Isaac Sim spawning scripts for UR5 and UR5e robot simulation.
    • Added Isaac Lab minimal simulation example with UR5/UR5e support.
    • Added UR5e calibration and bring-up automation scripts.
    • Updated Docker configuration with specific Isaac Sim and Isaac Lab versions.

Review Change Stack

Stanley Chiang and others added 2 commits May 8, 2026 15:36
- Enable Isaac Sim 5.1.0 and Isaac Lab 2.3.2 in compose.yaml
- Add ur5e_bringup.sh and ur5e_calibration.sh
- Add scripts/isaac/{spawn_ur.py,ur_isaaclab_minimal.py} examples
- Add isaac_sim_ur5.sh / isaac_sim_ur5e.sh / isaac_lab_ur_minimal.sh wrappers
- Document Isaac Sim, Isaac Lab, and UR5e usage in docs/ur5-ws/index.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
End-to-end test on winnie (docker compose build success, image ran
on RTX 4090) revealed two bugs in the Isaac Lab scaffold:

1. InteractiveSceneCfg fields must be AssetBaseCfg-wrapped, not raw
   spawn configs. Was:
       ground = sim_utils.GroundPlaneCfg()
       light  = sim_utils.DomeLightCfg(...)
   These crashed at scene init:
       ValueError: Unknown asset config type for ground: GroundPlaneCfg(...)
   Fix: wrap each in AssetBaseCfg(prim_path=..., spawn=...) per the
   Isaac Lab idiom.

2. Sim loop ran forever (no exit condition). Added --steps argument
   matching spawn_ur.py's pattern; default 0 keeps the loop infinite
   for interactive use, positive value exits after N steps for CI /
   headless smoke tests.

Verified on winnie:
  docker run ... --gpus all j3soon/ros2-ur5-ws:latest bash -c \
    './scripts/isaac_sim_ur5e.sh --headless --steps 10'
  -> Simulation App Startup Complete, UR5E loaded at /World/UR5E/...,
     clean shutdown.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented May 13, 2026

Copy link
Copy Markdown

Walkthrough

This PR adds UR5e support to the ros2-essentials workspace alongside Isaac Sim and Isaac Lab simulation capabilities. Changes include Docker version configuration for Isaac tools, Python scripts for spawning robots in simulation, bash launchers, ROS 2 calibration/bringup workflows, and updated documentation across all layers.

Changes

UR5e and Isaac Sim/Lab Integration

Layer / File(s) Summary
Docker infrastructure and Isaac versions
ur5_ws/docker/compose.yaml
ISAAC_SIM_VERSION and ISAAC_LAB_VERSION build arguments activated with pinned versions 5.1.0 and 2.3.2 respectively.
Isaac Sim spawner script and launchers
ur5_ws/scripts/isaac/spawn_ur.py, ur5_ws/scripts/isaac_sim_ur5.sh, ur5_ws/scripts/isaac_sim_ur5e.sh
spawn_ur.py creates a standalone Isaac Sim application that loads UR USD assets, configures physics, and runs a loop with optional step limits and headless mode. Robot-specific launchers (ur5.sh, ur5e.sh) invoke the spawner with appropriate arguments.
Isaac Lab minimal script and launcher
ur5_ws/scripts/isaac/ur_isaaclab_minimal.py, ur5_ws/scripts/isaac_lab_ur_minimal.sh
ur_isaaclab_minimal.py defines UR_CFG (robot articulation with explicit joint positions and implicit actuator) and URSceneCfg (scene with ground, light, and robot), then runs a simulation loop applying sinusoidal joint targets. Launcher wraps execution via Isaac Lab's environment.
UR5e calibration and bringup scripts
ur5_ws/scripts/ur5e_calibration.sh, ur5_ws/scripts/ur5e_bringup.sh
Calibration script invokes ROS 2 kinematics correction and outputs default_kinematics.yaml. Bringup script launches ur_robot_driver with ur_control.launch.py, enabling RG2 gripper and RViz.
Documentation for Isaac and robot setup
ur5_ws/scripts/isaac/README.md, docs/ur5-ws/index.md
Isaac README documents script purposes and container-based usage (including headless mode) plus guidance for extending Isaac Lab tasks. Main docs now include UR5e in tested platforms, separate calibration and bringup instructions for UR5e, and new "Simulation with Isaac Sim" and "Imitation Learning / RL with Isaac Lab" sections with asset assumptions and example commands.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • j3soon/ros2-essentials#114: Updates Isaac Sim version to 5.1.0 in Docker configuration, directly overlapping with this PR's Docker Compose changes for Isaac Sim version pinning.

Suggested reviewers

  • j3soon

Poem

🐰 With whiskers twitching, scripts now bound,
UR5e hops where UR5 is found,
Isaac Sim and Lab unite,
Simulation's now a fluffy delight!
Calibration scripts—no fright! 🎉

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly and concisely summarizes the main changes: adding UR5e bringup support, Isaac Sim integration, and Isaac Lab support to the ur5_ws workspace.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@ur5_ws/scripts/isaac/README.md`:
- Around line 30-32: The fenced code block containing the path string
"$ISAACLAB_PATH/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/ur_10/"
is missing a language tag; update the fence from "```" to include a language
identifier (e.g., "```text" or "```bash") so the block becomes "```text"
followed by the path and a closing "```" to satisfy markdownlint MD040.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3c368bac-973b-4184-b8d4-c5d1b0ab3fec

📥 Commits

Reviewing files that changed from the base of the PR and between 63c8a76 and be5622d.

📒 Files selected for processing (10)
  • docs/ur5-ws/index.md
  • ur5_ws/docker/compose.yaml
  • ur5_ws/scripts/isaac/README.md
  • ur5_ws/scripts/isaac/spawn_ur.py
  • ur5_ws/scripts/isaac/ur_isaaclab_minimal.py
  • ur5_ws/scripts/isaac_lab_ur_minimal.sh
  • ur5_ws/scripts/isaac_sim_ur5.sh
  • ur5_ws/scripts/isaac_sim_ur5e.sh
  • ur5_ws/scripts/ur5e_bringup.sh
  • ur5_ws/scripts/ur5e_calibration.sh

Comment on lines +30 to +32
```
$ISAACLAB_PATH/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/ur_10/
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a language tag to the fenced code block.

The fence starting on Line 30 has no language, which triggers markdownlint MD040.

Suggested fix
-```
+```text
 $ISAACLAB_PATH/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/ur_10/
</details>

<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 30-30: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ur5_ws/scripts/isaac/README.md` around lines 30 - 32, The fenced code block
containing the path string
"$ISAACLAB_PATH/source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/reach/config/ur_10/"
is missing a language tag; update the fence from "```" to include a language
identifier (e.g., "```text" or "```bash") so the block becomes "```text"
followed by the path and a closing "```" to satisfy markdownlint MD040.

@YuZhong-Chen

Copy link
Copy Markdown
Collaborator

First of all, thank you for putting together this minimal pipeline for the UR5/UR5e in Isaac Sim / Isaac Lab! I was able to successfully run it on my local machine. However, I do have a few questions I'd like to clarify:

  1. Is this minimal pipeline based on a specific tutorial, or was it adapted directly from the official Isaac Lab repository? Having a reference would be incredibly helpful for future maintenance, especially when upgrading Isaac Sim versions, as it would make tracking necessary modifications much easier.
  2. Currently, this pipeline only spawns the robot in Isaac Sim, meaning it isn't fully ready for direct utilization yet (such as deploying an RL policy or interfacing with MoveIt2). Have you experimented with connecting it to a ROS 2 pipeline? Implementing this would allow people who don't have access to the physical hardware to run the exact same ROS 2 pipeline within Isaac Sim, which I believe would be a huge contribution. If you don't have experience with this or aren't sure how to approach it, no worries—we can proceed with reviewing the current PR first, and I can handle the ROS 2 integration later!

@YuZhong-Chen

Copy link
Copy Markdown
Collaborator

I have put together a simple demo pipeline that connects Isaac Sim with our existing ROS 2 pipeline using OmniGraph. The result is shown below:

isaacsim-omnigraph-ros.mp4

We can now control the simulated UR5e inside Isaac Sim using our original control methods. The entire architecture remains almost identical to working with the actual UR5e hardware, with the only change being replacing the UR5e driver with Isaac Sim. I believe this approach to using Isaac Sim might be more practical/helpful. However, this is just based on my own use case, so I'm not sure if you have similar requirements.

As a side note, the control demonstrated in the video uses a 3D SpaceMouse, which also runs entirely on the ROS 2 pipeline. I can contribute and integrate this part as well later on.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants