Quickstart Guide#

This guide is written for those who just can’t wait to get their hands dirty and will touch on the most common concepts you will encounter as you build your own projects with Isaac Lab! This includes installation, running RL, finding environments, creating new projects, and more!

The power of Isaac Lab comes from from a few key features that we will very briefly touch on in this guide.

  1. Vectorization: Reinforcement Learning requires attempting a task many times. Isaac Lab speeds this process along by vectorizing the environment, a process by which training can be run in parallel across many copies of the same environment, thus reducing the amount of time spent on collecting data before the weights of the model can be updated. Most of the codebase is devoted to defining those parts of the environment that need to be touched by this vectorization system

  2. Modular Design: Isaac Lab is designed to be modular, meaning that you can design your projects to have various components that can be swapped out for different needs. For example, suppose you want to train a policy that supports a specific subset of robots. You could design the environment and task to be robot agnostic by writing a controller interface layer in the form of one of our Manager classes (the ActionManager in this specific case). Most of the rest of the codebase is devoted to defining those parts of your project that need to be touched by this manager system.

To get started, we will first install Isaac Lab and launch a training script.

Quick Installation Guide#

There are many ways to install Isaac Lab, but for the purposes of this quickstart guide, we will follow the pip install route using virtual environments.

Note

If you are using Ubuntu 20.04, you will need to follow the Binary Installation Guide instead of the pip install route described below.

To begin, we first define our virtual environment.

# create a virtual environment named env_isaaclab with python3.10
python3.10 -m venv env_isaaclab
# activate the virtual environment
source env_isaaclab/bin/activate
# create a virtual environment named env_isaaclab with python3.10
python3.10 -m venv env_isaaclab
# activate the virtual environment
env_isaaclab\Scripts\activate

Next, we need to install the CUDA-enabled version of PyTorch 2.5.1. This step is optional for Linux, but required for Windows to ensure a CUDA-compatible version of PyTorch is installed. If in doubt on which version to use, use 11.8.

pip install torch==2.5.1 torchvision==0.20.1 --index-url https://download.pytorch.org/whl/cu118
pip install torch==2.5.1 torchvision==0.20.1 --index-url https://download.pytorch.org/whl/cu121

Before we can install Isaac Sim, we need to make sure pip is updated. To update pip, run

pip install --upgrade pip
python -m pip install --upgrade pip

and now we can install the Isaac Sim packages.

pip install 'isaacsim[all,extscache]==4.5.0' --extra-index-url https://pypi.nvidia.com

Finally, we can install Isaac Lab. To start, clone the repository using the following

git clone git@github.com:isaac-sim/IsaacLab.git
git clone https://github.com/isaac-sim/IsaacLab.git

Installation is now as easy as navigating to the repo and then calling the root script with the --install flag!

./isaaclab.sh --install # or "./isaaclab.sh -i"
isaaclab.bat --install :: or "isaaclab.bat -i"

Launch Training#

The various backends of Isaac Lab are accessed through their corresponding train.py and play.py scripts located in the isaaclab/scripts/reinforcement_learning directory. Invoking these scripts will require a Task Name and a corresponding Entry Point to the gymnasium API. For example

python scripts/reinforcement_learning/skrl/train.py --task=Isaac-Ant-v0

This will train the mujoco ant to “run”. You can see the various launch option available to you with the --help flag. Note specifically the --num_envs option and the --headless flag, both of which can be useful when trying to develop and debug a new environment. Options specified at this level automatically overwrite any configuration equivalent that may be defined in the code (so long as those definitions are part of a @configclass, see below).

List Available Environments#

Above, Isaac-Ant-v0 is the task name and skrl is the RL framework being used. The Isaac-Ant-v0 environment has been registered with the Gymnasium API, and you can see how the entry point is defined by calling the list_envs.py script, which can be found in isaaclab/scripts/environments/lsit_envs.py. You should see entries like the following

$> python scripts/environments/list_envs.py

+--------------------------------------------------------------------------------------------------------------------------------------------+
|  Available Environments in Isaac Lab
+--------+----------------------+--------------------------------------------+---------------------------------------------------------------+
| S. No. | Task Name            | Entry Point                                | Config
.
.
.
+--------+----------------------+--------------------------------------------+---------------------------------------------------------------+
|   2    | Isaac-Ant-Direct-v0  |  isaaclab_tasks.direct.ant.ant_env:AntEnv  |  isaaclab_tasks.direct.ant.ant_env:AntEnvCfg
+--------+----------------------+--------------------------------------------+---------------------------------------------------------------+
.
.
.
+--------+----------------------+--------------------------------------------+---------------------------------------------------------------+
|   48   | Isaac-Ant-v0         | isaaclab.envs:ManagerBasedRLEnv            |   isaaclab_tasks.manager_based.classic.ant.ant_env_cfg:AntEnvCfg
+--------+----------------------+--------------------------------------------+---------------------------------------------------------------+

Notice that there are two different Ant tasks, one for a Direct environment and one for a ManagerBased environment. These are the two primary workflows that you can use with Isaac Lab out of the box. The Direct workflow will give you the shortest path to a working custom environment for reinforcement learning, but the Manager based workflow will give your project the modularity required for more generalized development. For the purposes of this quickstart guide, we will only focus on the Direct workflow.

Generate Your Own Project#

Getting a new project started with Isaac Lab can seem daunting at first, but this is why we provide the template generator, to rapidly boilerplate a new project via the command line.

./isaaclab.sh --new

This will create a new project for you based on the settings you choose

  • External vs Internal: Determines if the project is meant to be built as a part of the isaac lab repository, or if it is meant to be loaded as an external extension.

  • Direct vs Manager: A direct task primarily contains all the implementation details within the environment definition, while a manager based project is meant to use our modular definitions for the different “parts” of an environment.

  • Framework: You can select more than one option here. This determines which RL frameworks you intend to natively use with your project (which specific algorithm implementations you want to use for training).

Once created, navigate to the installed project and run

python -m pip install -e source/<given-project-name>

to complete the installation process and register the environment. Within the directories created by the template generator, you will find at least one __init__.py file with something that looks like the following

import gymnasium as gym

gym.register(
    id="Template-isaaclabtutorial_env-v0",
    entry_point=f"{__name__}.isaaclabtutorial_env:IsaaclabtutorialEnv",
    disable_env_checker=True,
    kwargs={
        "env_cfg_entry_point": f"{__name__}.isaaclabtutorial_env_cfg:IsaaclabtutorialEnvCfg",
        "skrl_cfg_entry_point": f"{agents.__name__}.skrl_ppo_cfg:PPORunnerCfg",
    },
)

This is the function that actually registers an environment for future use. Notice that the entry_point is literally just the python module path to the environment definition. This is why we need to install the project as a package: the module path is the entry point for the gymnasium API.

Configurations#

Regardless of what you are going to be doing with Isaac Lab, you will need to deal with Configurations. Configurations can all be identified by the inclusion of the @configclass decorator above their class definition and the lack of an __init__ function. For example, consider this configuration class for the cartpole environment.

@configclass
class CartpoleEnvCfg(DirectRLEnvCfg):
    # env
    decimation = 2
    episode_length_s = 5.0
    action_scale = 100.0  # [N]
    action_space = 1
    observation_space = 4
    state_space = 0

    # simulation
    sim: SimulationCfg = SimulationCfg(dt=1 / 120, render_interval=decimation)

    # robot
    robot_cfg: ArticulationCfg = CARTPOLE_CFG.replace(prim_path="/World/envs/env_.*/Robot")
    cart_dof_name = "slider_to_cart"
    pole_dof_name = "cart_to_pole"

    # scene
    scene: InteractiveSceneCfg = InteractiveSceneCfg(num_envs=4096, env_spacing=4.0, replicate_physics=True)

    # reset
    max_cart_pos = 3.0  # the cart is reset if it exceeds that position [m]
    initial_pole_angle_range = [-0.25, 0.25]  # the range in which the pole angle is sampled from on reset [rad]

    # reward scales
    rew_scale_alive = 1.0
    rew_scale_terminated = -2.0
    rew_scale_pole_pos = -1.0
    rew_scale_cart_vel = -0.01
    rew_scale_pole_vel = -0.005

Notice that the entire class definition is just a list of value fields and other configurations. Configuration classes are necessary for anything that needs to care about being vectorized by the lab during training. If you want to be able to copy an environment thousands of times, and manage the data from each asynchronously, you need to somehow “label” what parts of the scene matter to this copying process (vectorization). This is what the configuration classes accomplish!

In this case, the class defines the configuration for the entire training environment! Notice also the num_envs variable in the InteractiveSceneCfg. This actually gets overwritten by the CLI argument from within the train.py script. Configurations provide a direct path to any variable in the configuration hierarchy, making it easy to modify anything “configured” by the environment at launch time.

Robots#

Robots are entirely defined as instances of configurations within Isaac Lab. If you examine source/isaaclab_assets/isaaclab_assets/robots, you will see a number of files, each of which contains configurations for the robot in question. The purpose of these individual files is to better define scope for all the different robots, but there is nothing preventing you from adding your own to your project or even to the isaaclab repository! For example, consider the following configuration for the Dofbot

import isaaclab.sim as sim_utils
from isaaclab.actuators import ImplicitActuatorCfg
from isaaclab.assets.articulation import ArticulationCfg
from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR

DOFBOT_CONFIG = ArticulationCfg(
    spawn=sim_utils.UsdFileCfg(
        usd_path=f"{ISAAC_NUCLEUS_DIR}/Robots/Dofbot/dofbot.usd",
        rigid_props=sim_utils.RigidBodyPropertiesCfg(
            disable_gravity=False,
            max_depenetration_velocity=5.0,
        ),
        articulation_props=sim_utils.ArticulationRootPropertiesCfg(
            enabled_self_collisions=True, solver_position_iteration_count=8, solver_velocity_iteration_count=0
        ),
    ),
    init_state=ArticulationCfg.InitialStateCfg(
        joint_pos={
            "joint1": 0.0,
            "joint2": 0.0,
            "joint3": 0.0,
            "joint4": 0.0,
        },
        pos=(0.25, -0.25, 0.0),
    ),
    actuators={
        "front_joints": ImplicitActuatorCfg(
            joint_names_expr=["joint[1-2]"],
            effort_limit_sim=100.0,
            velocity_limit_sim=100.0,
            stiffness=10000.0,
            damping=100.0,
        ),
        "joint3_act": ImplicitActuatorCfg(
            joint_names_expr=["joint3"],
            effort_limit_sim=100.0,
            velocity_limit_sim=100.0,
            stiffness=10000.0,
            damping=100.0,
        ),
        "joint4_act": ImplicitActuatorCfg(
            joint_names_expr=["joint4"],
            effort_limit_sim=100.0,
            velocity_limit_sim=100.0,
            stiffness=10000.0,
            damping=100.0,
        ),
    },
)

This completely defines the dofbot! You could copy this into a .py file and import it as a module and you would be able to use the dofbot in your own lab sims. One common feature you will see in any config defining things with state is the presence of an InitialStateCfg. Remember, the configurations are what informs vectorization, and it’s the InitialStateCfg that describes the state of the joints of our robot when it gets created in each environment. The ImplicitActuatorCfg defines the joints of the robot using the default actuation model determined by the joint time. Not all joints need to be actuated, but you will get warnings if you don’t. If you aren’t planning on using those undefined joints, you can generally ignore these.

Apps and Sims#

Using the simulation means launching the Isaac Sim app to provide simulation context. If you are not running a task defined by the standard workflows, then you are responsible for creating the app, managing the context, and stepping the simulation forward through time. This is the “third workflow”: a Standalone app, which is what we call the scripts for the frameworks, demos, benchmarks, etc…

The Standalone workflow gives you total control over everything in the app and simulation context. Developing standalone apps is discussed at length in the Isaac Sim documentation but there are a few points worth touching on that can be incredibly useful.

import argparse

from isaaclab.app import AppLauncher
# add argparse arguments
parser = argparse.ArgumentParser(
    description="This script demonstrates adding a custom robot to an Isaac Lab environment."
)
parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to spawn.")
# append AppLauncher cli args
AppLauncher.add_app_launcher_args(parser)
# parse the arguments
args_cli = parser.parse_args()

# launch omniverse app
app_launcher = AppLauncher(args_cli)
simulation_app = app_launcher.app

The AppLauncher is the entrypoint to any and all Isaac Sim applications, like Isaac Lab! Many Isaac Lab and Isaac Sim modules cannot be imported until the app is launched!. This is done on the second to last line of the code above, when the AppLauncher is constructed. The app_launcher.app is our interface to the Kit App Framework; the broader interstitial code that binds the simulation to things the extension management system, or the GUI, etc… In the standalone workflow, this interface, often called the simulation_app is predominantly used to check if the simulation is running, and cleanup after the simulation finishes.