Skip to content

Commit 1c4e0ac

Browse files
qianl-nvcvolkcvolkalexmillane
authored
Update IsaacLab to latest main (#336)
## Summary Update IsaacLab/IsaacSim for Quest teleop ## Detailed description - What was the reason for the change? Pull in IsaacLab support for Meta Quest3 for locomanipulation teleop - What has been changed? Update isaaclab submodule commit to [5528d986](isaac-sim/IsaacLab@5528d98) (branch `arena/arena_2_on_lab_23`) This includes a fix for deferred `isaaclab.utils` imports to after `AppLauncher` starts, required because a recent merge from main added `pxr` (OpenUSD) as a transitive import in `utils/__init__.py`. Update the base isaac sim image version from 5.0 to 5.1 IsaacSim 5.1 switch to default non-root user, need to configure the Docker file with root user for app install - What is the impact of this change? No change expected. Loco manip example data generation & replay is verified to work. Open microwave example Gr00t policy eval is verified to work. AVP teleop has not been verified. --------- Signed-off-by: Clemens Volk <cvolk@nvidia.com> Co-authored-by: Clemens Volk <cvolk@nvidia.com> Co-authored-by: alex <amillane@nvidia.com>
1 parent fbf2893 commit 1c4e0ac

File tree

8 files changed

+53
-38
lines changed

8 files changed

+53
-38
lines changed

docker/Dockerfile.isaaclab_arena

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
ARG BASE_IMAGE=nvcr.io/nvidia/isaac-sim:5.0.0
1+
ARG BASE_IMAGE=nvcr.io/nvidia/isaac-sim:5.1.0
22

33
FROM ${BASE_IMAGE}
44

5+
# Set user to root (Isaac Sim base image defaults to non-root user)
6+
USER root
7+
58
# GR00T Policy Build Arguments, these are only used if INSTALL_GROOT is true
69
ARG INSTALL_GROOT=false
710

@@ -22,9 +25,6 @@ RUN apt-get update && apt-get install -y \
2225
sudo \
2326
python3-pip
2427

25-
# Update pip to the latest version
26-
RUN pip3 install --upgrade pip
27-
2828
################################
2929
# Install Isaac Lab
3030
################################
@@ -37,9 +37,12 @@ ENV TERM=xterm
3737
# Symlink isaac sim to IsaacLab
3838
RUN ln -s /isaac-sim/ ${WORKDIR}/submodules/IsaacLab/_isaac_sim
3939
# Install IsaacLab dependencies
40-
RUN for DIR in ${WORKDIR}/submodules/IsaacLab/source/isaaclab*/; do pip install --no-deps -e "$DIR"; done
40+
RUN for DIR in ${WORKDIR}/submodules/IsaacLab/source/isaaclab*/; do /isaac-sim/python.sh -m pip install --no-deps -e "$DIR"; done
4141
# Logs and other stuff appear under dist-packages per default, so this dir has to be writeable.
4242
RUN chmod 777 -R /isaac-sim/kit/
43+
# Make /isaac-sim directory traversable and readable by all users
44+
# This is needed when entrypoint switches to non-root user
45+
RUN chmod a+x /isaac-sim
4346
# NOTE(alexmillane, 2026-02-10): We started having issues with flatdict 4.0.1 installation
4447
# during IsaacLab install. We install here with build isolation which seems to fix the issue.
4548
RUN /isaac-sim/python.sh -m pip install flatdict==4.0.1 --no-build-isolation
@@ -49,7 +52,7 @@ RUN ${ISAACLAB_PATH}/isaaclab.sh -i
4952
# Patch for osqp in IsaacLab. Downgrade qpsolvers
5053
# TODO(alexmillane): Watch the thread here: https://nvidia.slack.com/archives/C06HLQ6CB41/p1764680205807019
5154
# and remove this thread when IsaacLab has a fix.
52-
RUN if python -c "import qpsolvers; print(qpsolvers.available_solvers)" | grep -q "osqp"; then \
55+
RUN if /isaac-sim/python.sh -c "import qpsolvers; print(qpsolvers.available_solvers)" | grep -q "osqp"; then \
5356
echo "OSQP is installed. You can remove this clause from the Arena dockerfile."; \
5457
else \
5558
echo "OSQP missing, installing... This is a patch for an Isaac Lab bug."; \
@@ -79,7 +82,7 @@ ENV LW_API_ENDPOINT="https://api-dev.lightwheel.net"
7982

8083
# HuggingFace for downloading datasets and models.
8184
# NOTE(alexmillane, 2025-10-28): For some reason the CLI has issues when installed in the IsaacSim version of python.
82-
RUN pip install huggingface-hub[cli]
85+
RUN pip install --break-system-packages huggingface-hub[cli]
8386
# Create alias for hf command to use the system-installed version
8487
RUN echo "alias hf='/usr/local/bin/hf'" >> /etc/bash.bashrc
8588

@@ -136,7 +139,7 @@ RUN echo "alias pytest='/isaac-sim/python.sh -m pytest'" >> /etc/bash.bashrc
136139
# It will pause waiting for the debugger to attach.
137140
# 3) Attach to the running container with VSCode using the "Attach to debugpy session"
138141
# configuration from the Run and Debug panel.
139-
RUN pip3 install debugpy
142+
RUN /isaac-sim/python.sh -m pip install debugpy
140143
RUN echo "alias debugpy='python -Xfrozen_modules=off -m debugpy --listen localhost:5678 --wait-for-client'" >> /etc/bash.bashrc
141144

142145
# Change prompt so it's obvious we're inside the arena container

docker/setup/entrypoint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ userdel ubuntu || true
2121
useradd --no-log-init \
2222
--uid "$DOCKER_RUN_USER_ID" \
2323
--gid "$DOCKER_RUN_GROUP_NAME" \
24-
--groups sudo \
24+
--groups sudo,isaac-sim \
2525
--shell /bin/bash \
2626
$DOCKER_RUN_USER_NAME
2727
chown $DOCKER_RUN_USER_NAME:$DOCKER_RUN_GROUP_NAME /home/$DOCKER_RUN_USER_NAME

isaaclab_arena/scripts/imitation_learning/generate_dataset.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@
7070
import asyncio
7171
import gymnasium as gym
7272
import inspect
73+
import logging
7374
import numpy as np
7475
import os
7576
import random
7677
import torch
7778

7879
import isaaclab_mimic.envs # noqa: F401
79-
import omni
8080
from isaaclab.envs import ManagerBasedRLMimicEnv
8181
from isaaclab.envs.mdp.recorders.recorders_cfg import ActionStateRecorderManagerCfg
8282
from isaaclab.managers import DatasetExportMode, RecorderTerm, RecorderTermCfg
@@ -91,6 +91,8 @@
9191
from isaaclab_mimic.datagen.generation import env_loop, setup_async_generation
9292
from isaaclab_mimic.datagen.utils import setup_output_paths
9393

94+
logger = logging.getLogger(__name__)
95+
9496

9597
class PreStepFlatCameraObservationsRecorder(RecorderTerm):
9698
"""Recorder term that records the camera observations in each step."""
@@ -199,7 +201,7 @@ def main():
199201

200202
# check if the mimic API from this environment contains decprecated signatures
201203
if "action_noise_dict" not in inspect.signature(env.target_eef_pose_to_action).parameters:
202-
omni.log.warn(
204+
logger.warning(
203205
f'The "noise" parameter in the "{env_name}" environment\'s mimic API "target_eef_pose_to_action", '
204206
"is deprecated. Please update the API to take action_noise_dict instead."
205207
)

isaaclab_arena/scripts/imitation_learning/record_demos.py

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,18 @@
8686

8787
# Third-party imports
8888
import gymnasium as gym
89+
import logging
8990
import os
9091
import time
9192
import torch
9293

9394
import isaaclab_mimic.envs # noqa: F401
94-
95-
# Omniverse logger
96-
import omni.log
9795
import omni.ui as ui
9896
from isaaclab.devices import Se3Keyboard, Se3KeyboardCfg, Se3SpaceMouse, Se3SpaceMouseCfg
9997
from isaaclab.devices.openxr import remove_camera_configs
10098
from isaaclab.devices.teleop_device_factory import create_teleop_device
99+
100+
logger = logging.getLogger(__name__)
101101
from isaaclab_mimic.ui.instruction_display import InstructionDisplay, show_subtask_instructions
102102

103103
# Imports have to follow simulation startup.
@@ -196,7 +196,7 @@ def create_environment_config(
196196
env_name, env_cfg = arena_builder.build_registered()
197197

198198
except Exception as e:
199-
omni.log.error(f"Failed to parse environment configuration: {e}")
199+
logger.error(f"Failed to parse environment configuration: {e}")
200200
exit(1)
201201

202202
# extract success checking function to invoke in the main loop
@@ -205,7 +205,7 @@ def create_environment_config(
205205
success_term = env_cfg.terminations.success
206206
env_cfg.terminations.success = None
207207
else:
208-
omni.log.warn(
208+
logger.warning(
209209
"No success termination term was found in the environment."
210210
" Will not be able to mark recorded demos as successful."
211211
)
@@ -246,7 +246,7 @@ def create_environment(env_cfg: ManagerBasedRLEnvCfg | DirectRLEnvCfg, env_name:
246246
env = gym.make(env_name, cfg=env_cfg).unwrapped
247247
return env
248248
except Exception as e:
249-
omni.log.error(f"Failed to create environment: {e}")
249+
logger.error(f"Failed to create environment: {e}")
250250
exit(1)
251251

252252

@@ -271,26 +271,28 @@ def setup_teleop_device(callbacks: dict[str, Callable]) -> object:
271271
if hasattr(env_cfg, "teleop_devices") and args_cli.teleop_device in env_cfg.teleop_devices.devices:
272272
teleop_interface = create_teleop_device(args_cli.teleop_device, env_cfg.teleop_devices.devices, callbacks)
273273
else:
274-
omni.log.warn(f"No teleop device '{args_cli.teleop_device}' found in environment config. Creating default.")
274+
logger.warning(
275+
f"No teleop device '{args_cli.teleop_device}' found in environment config. Creating default."
276+
)
275277
# Create fallback teleop device
276278
if args_cli.teleop_device.lower() == "keyboard":
277279
teleop_interface = Se3Keyboard(Se3KeyboardCfg(pos_sensitivity=0.2, rot_sensitivity=0.5))
278280
elif args_cli.teleop_device.lower() == "spacemouse":
279281
teleop_interface = Se3SpaceMouse(Se3SpaceMouseCfg(pos_sensitivity=0.2, rot_sensitivity=0.5))
280282
else:
281-
omni.log.error(f"Unsupported teleop device: {args_cli.teleop_device}")
282-
omni.log.error("Supported devices: keyboard, spacemouse, avp_handtracking")
283+
logger.error(f"Unsupported teleop device: {args_cli.teleop_device}")
284+
logger.error("Supported devices: keyboard, spacemouse, avp_handtracking")
283285
exit(1)
284286

285287
# Add callbacks to fallback device
286288
for key, callback in callbacks.items():
287289
teleop_interface.add_callback(key, callback)
288290
except Exception as e:
289-
omni.log.error(f"Failed to create teleop device: {e}")
291+
logger.error(f"Failed to create teleop device: {e}")
290292
exit(1)
291293

292294
if teleop_interface is None:
293-
omni.log.error("Failed to create teleop interface")
295+
logger.error("Failed to create teleop interface")
294296
exit(1)
295297

296298
return teleop_interface

isaaclab_arena/scripts/imitation_learning/teleop.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@
5757
"""Rest everything follows."""
5858

5959

60+
import logging
6061
import torch
6162

6263
import isaaclab_tasks # noqa: F401
63-
import omni.log
6464
from isaaclab.devices import Se3Gamepad, Se3GamepadCfg, Se3Keyboard, Se3KeyboardCfg, Se3SpaceMouse, Se3SpaceMouseCfg
6565
from isaaclab.devices.openxr import remove_camera_configs
6666
from isaaclab.devices.teleop_device_factory import create_teleop_device
@@ -70,6 +70,8 @@
7070
if args_cli.enable_pinocchio:
7171
import isaaclab_tasks.manager_based.manipulation.pick_place # noqa: F401
7272

73+
logger = logging.getLogger(__name__)
74+
7375

7476
def main() -> None:
7577
"""
@@ -103,12 +105,12 @@ def main() -> None:
103105
env = gym.make(env_name, cfg=env_cfg).unwrapped
104106
# check environment name (for reach , we don't allow the gripper)
105107
if "Reach" in args_cli.task:
106-
omni.log.warn(
108+
logger.warning(
107109
f"The environment '{args_cli.task}' does not support gripper control. The device command will be"
108110
" ignored."
109111
)
110112
except Exception as e:
111-
omni.log.error(f"Failed to create environment: {e}")
113+
logger.error(f"Failed to create environment: {e}")
112114
simulation_app.close()
113115
return
114116

@@ -180,7 +182,9 @@ def stop_teleoperation() -> None:
180182
args_cli.teleop_device, env_cfg.teleop_devices.devices, teleoperation_callbacks
181183
)
182184
else:
183-
omni.log.warn(f"No teleop device '{args_cli.teleop_device}' found in environment config. Creating default.")
185+
logger.warning(
186+
f"No teleop device '{args_cli.teleop_device}' found in environment config. Creating default."
187+
)
184188
# Create fallback teleop device
185189
sensitivity = args_cli.sensitivity
186190
if args_cli.teleop_device.lower() == "keyboard":
@@ -196,8 +200,8 @@ def stop_teleoperation() -> None:
196200
Se3GamepadCfg(pos_sensitivity=0.1 * sensitivity, rot_sensitivity=0.1 * sensitivity)
197201
)
198202
else:
199-
omni.log.error(f"Unsupported teleop device: {args_cli.teleop_device}")
200-
omni.log.error("Supported devices: keyboard, spacemouse, gamepad, avp_handtracking")
203+
logger.error(f"Unsupported teleop device: {args_cli.teleop_device}")
204+
logger.error("Supported devices: keyboard, spacemouse, gamepad, avp_handtracking")
201205
env.close()
202206
simulation_app.close()
203207
return
@@ -207,15 +211,15 @@ def stop_teleoperation() -> None:
207211
try:
208212
teleop_interface.add_callback(key, callback)
209213
except (ValueError, TypeError) as e:
210-
omni.log.warn(f"Failed to add callback for key {key}: {e}")
214+
logger.warning(f"Failed to add callback for key {key}: {e}")
211215
except Exception as e:
212-
omni.log.error(f"Failed to create teleop device: {e}")
216+
logger.error(f"Failed to create teleop device: {e}")
213217
env.close()
214218
simulation_app.close()
215219
return
216220

217221
if teleop_interface is None:
218-
omni.log.error("Failed to create teleop interface")
222+
logger.error("Failed to create teleop interface")
219223
env.close()
220224
simulation_app.close()
221225
return
@@ -250,7 +254,7 @@ def stop_teleoperation() -> None:
250254
should_reset_recording_instance = False
251255
print("Environment reset complete")
252256
except Exception as e:
253-
omni.log.error(f"Error during simulation step: {e}")
257+
logger.error(f"Error during simulation step: {e}")
254258
break
255259

256260
# close the simulator

isaaclab_arena/scripts/reinforcement_learning/play.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@
5353
"""Rest everything follows."""
5454

5555
import gymnasium as gym
56+
import logging
5657
import os
5758
import time
5859
import torch
5960

6061
import isaaclab_tasks # noqa: F401
61-
import omni.log
6262
from isaaclab.envs import DirectMARLEnv, multi_agent_to_single_agent
6363
from isaaclab.utils.assets import retrieve_file_path
6464
from isaaclab.utils.dict import print_dict
@@ -71,6 +71,8 @@
7171

7272
# PLACEHOLDER: Extension template (do not remove this comment)
7373

74+
logger = logging.getLogger(__name__)
75+
7476

7577
def main():
7678
"""Play with RSL-RL agent."""
@@ -81,7 +83,7 @@ def main():
8183
env_name, env_cfg = arena_builder.build_registered()
8284

8385
except Exception as e:
84-
omni.log.error(f"Failed to parse environment configuration: {e}")
86+
logger.error(f"Failed to parse environment configuration: {e}")
8587
exit(1)
8688

8789
agent_cfg = get_agent_cfg(args_cli)

isaaclab_arena/scripts/reinforcement_learning/train.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@
8484
"""Rest everything follows."""
8585

8686
import gymnasium as gym
87+
import logging
8788
import os
8889
import torch
8990
from datetime import datetime
9091

9192
import isaaclab_tasks # noqa: F401
92-
import omni.log
9393
from isaaclab.envs import DirectMARLEnv, ManagerBasedRLEnvCfg, multi_agent_to_single_agent
9494
from isaaclab.utils.dict import print_dict
9595
from isaaclab.utils.io import dump_yaml
@@ -102,6 +102,8 @@
102102

103103
# PLACEHOLDER: Extension template (do not remove this comment)
104104

105+
logger = logging.getLogger(__name__)
106+
105107
torch.backends.cuda.matmul.allow_tf32 = True
106108
torch.backends.cudnn.allow_tf32 = True
107109
torch.backends.cudnn.deterministic = False
@@ -116,7 +118,7 @@ def main():
116118
env_name, env_cfg = arena_builder.build_registered()
117119

118120
except Exception as e:
119-
omni.log.error(f"Failed to parse environment configuration: {e}")
121+
logger.error(f"Failed to parse environment configuration: {e}")
120122
exit(1)
121123

122124
agent_cfg = get_agent_cfg(args_cli)
@@ -158,7 +160,7 @@ def main():
158160
if isinstance(env_cfg, ManagerBasedRLEnvCfg):
159161
env_cfg.export_io_descriptors = args_cli.export_io_descriptors
160162
else:
161-
omni.log.warn(
163+
logger.warning(
162164
"IO descriptors are only supported for manager based RL environments. No IO descriptors will be exported."
163165
)
164166

submodules/IsaacLab

Submodule IsaacLab updated 1379 files

0 commit comments

Comments
 (0)