Setup: Isaac Lab-Arena#
In this lesson, we’ll install Isaac Lab-Arena and validate the Unitree G1 static apple-to-plate environment used by this simulation workflow.
To do that, we’ll:
Install Isaac Lab-Arena from source and initialize required submodules.
Prepare shared data and model directories for the simulation workflow.
Run automated tests that verify the scene, task, and termination logic.
Configure a standalone Isaac-GR00T checkout for post-training and evaluation.
Setup Isaac Lab-Arena#
Isaac Lab-Arena runs on Isaac Sim 6.0.0 and Isaac Lab 3.0.0. The Docker build installs these dependencies automatically.
Clone Isaac Lab-Arena to the release branch, and initialize its submodules.
This tutorial assumes you cloned Isaac Lab-Arena to ~/IsaacLab-Arena, but you can clone it somewhere else if you like.
cd ~/
git clone --branch release/0.2.1 --recurse-submodules git@github.com:isaac-sim/IsaacLab-Arena.git
The recursive submodule step is required because Arena depends on pinned external repositories, including Isaac Lab.
Isaac Lab-Arena installs from source inside its Docker container.
Change directory to the cloned Isaac Lab-Arena repository.
cd IsaacLab-Arena
Create host directories for datasets, models, and evaluation output before starting the container.
By default, the Docker run script mounts $HOME/datasets to /datasets, $HOME/models to /models, and $HOME/eval to /eval when those host directories exist.
However if you want to specify different directories, skip this step and use the -d, -m, and -e flags to specify directories when starting the container in the next step. (d for datasets, m for models, e for evaluation)
mkdir -p $HOME/datasets
mkdir -p $HOME/models
mkdir -p $HOME/eval
Start the base Isaac Lab-Arena Docker container:
./docker/run_docker.sh
Why not use the -g flag?
This simulation workflow uses a separate standalone Isaac-GR00T checkout for post-training and evaluation, so the base container is the default path. For reference, there is a -g flag available to use GR00T dependencies inside the container, but we won’t use that here.
Optionally, verify the Isaac Lab-Arena installation inside the container.
Optional verification
The full verification suite can take a significant amount of time: approximately 20-30 minutes on a performant workstation.
Later in this lesson, we’ll also run a focused static apple-to-plate test to validate the course environment directly.
pytest -sv -m "with_cameras and not with_subprocess" isaaclab_arena/tests/
pytest -sv -m "not with_cameras and not with_subprocess" isaaclab_arena/tests/
pytest -sv -m with_subprocess isaaclab_arena/tests/
Inside the container, create the folders for data and models and assign environment variables to point to them. This will make future commands easier to write.
export DATASET_DIR=/datasets/isaaclab_arena/static_apple_tutorial mkdir -p $DATASET_DIR export MODELS_DIR=/models/isaaclab_arena/static_apple_tutorial mkdir -p $MODELS_DIR
Validate the Environment With Automated Tests#
A dedicated pytest module covers the static apple-to-plate environment. It asserts two conditions:
The task does not terminate when the apple is at its initial pose.
The success termination fires after the apple is teleported above the plate and allowed to settle.
The tests run headlessly (no GUI) with cameras enabled. This is the fastest way to confirm the scene, task, and termination logic are wired correctly without requiring teleoperation hardware.
(Optional) Run the Automated Tests#
Inside the Isaac Lab-Arena container, run the automated environment tests. They take approximately 2 minutes to run in total.
python -m pytest isaaclab_arena/tests/test_g1_static_pick_and_place.py -v
Confirm that both tests pass. Example terminal output below:
=========== 2 passed, 3488 warnings in 95.54s (0:01:35) ===========
Note
If you see the apple fall through the shelf on the first execution, simply re-run the command once.
Here’s why:
First-run asset cache: The Objaverse apple USD streams from an S3 staging bucket and PhysX re-cooks its collision mesh at the baked-in 0.01x scale.
On the first execution, the colliders may land a frame after the first physics step, which can cause the apple to tunnel through the shelf surface on the first load.
Subsequent runs read the cached USD from /tmp/Assets/ and spawn correctly.
Setup Isaac GR00T (Outside the Container)#
Open a new terminal.
Outside the container in this new terminal, set an environment variable for where we will clone GR00T. You can change this if you like - we’ll reuse it for convenience.
export ISAAC_GR00T_DIR=$HOME/Isaac-GR00T
Clone the Isaac-GR00T repo for post-training and evaluation. We’ll checkout the commit this workflow was validated against.
git clone https://github.com/NVIDIA/Isaac-GR00T.git $ISAAC_GR00T_DIR cd $ISAAC_GR00T_DIR git checkout 4b1dca9d88d2a0b9ea5a65aa61c82ff89f5c4f0e
Create a new uv-managed virtual environment (venv). This venv is separate from Arena’s container.
uv sync
Fine-tuning and the policy server both run from this standalone checkout. This way you can update to newer GR00T releases without rebuilding Arena’s GR00T-flavored container or changing submodules/Isaac-GR00T.
Key Takeaways#
We installed Isaac Lab-Arena, prepared shared data and model directories, configured the standalone Isaac-GR00T checkout, and validated that the static apple-to-plate task loads correctly. Next, we’ll review the environment code before collecting teleoperation data.