diff --git a/.aws/mirror-buildspec.yml b/.aws/mirror-buildspec.yml
deleted file mode 100644
index a537f5bfd994..000000000000
--- a/.aws/mirror-buildspec.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-version: 0.2
-
-phases:
- install:
- runtime-versions:
- nodejs: 14
- pre_build:
- commands:
- - git config --global user.name "Isaac LAB CI Bot"
- - git config --global user.email "isaac-lab-ci-bot@nvidia.com"
- build:
- commands:
- - git remote set-url origin https://github.com/${TARGET_REPO}.git
- - git checkout $SOURCE_BRANCH
- - git push --force https://$GITHUB_TOKEN@github.com/${TARGET_REPO}.git $SOURCE_BRANCH:$TARGET_BRANCH
diff --git a/.aws/postmerge-ci-buildspec.yml b/.aws/postmerge-ci-buildspec.yml
deleted file mode 100644
index d58a4d043c5a..000000000000
--- a/.aws/postmerge-ci-buildspec.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-version: 0.2
-
-phases:
- build:
- commands:
- - echo "Building and pushing Docker image"
- - |
- # Determine branch name or use fallback
- if [ -n "$CODEBUILD_WEBHOOK_HEAD_REF" ]; then
- BRANCH_NAME=$(echo $CODEBUILD_WEBHOOK_HEAD_REF | sed 's/refs\/heads\///')
- elif [ -n "$CODEBUILD_SOURCE_VERSION" ]; then
- BRANCH_NAME=$CODEBUILD_SOURCE_VERSION
- else
- BRANCH_NAME="unknown"
- fi
-
- # Replace '/' with '-' and remove any invalid characters for Docker tag
- SAFE_BRANCH_NAME=$(echo $BRANCH_NAME | sed 's/[^a-zA-Z0-9._-]/-/g')
-
- # Use "latest" if branch name is empty or only contains invalid characters
- if [ -z "$SAFE_BRANCH_NAME" ]; then
- SAFE_BRANCH_NAME="latest"
- fi
-
- # Get the git repository short name
- REPO_SHORT_NAME=$(basename -s .git `git config --get remote.origin.url`)
- if [ -z "$REPO_SHORT_NAME" ]; then
- REPO_SHORT_NAME="verification"
- fi
-
- # Parse the env variable string into an array
- mapfile -d ' ' -t IMAGE_BASE_VERSIONS <<< "$ISAACSIM_BASE_VERSIONS_STRING"
- for IMAGE_BASE_VERSION in "${IMAGE_BASE_VERSIONS[@]}"; do
- IMAGE_BASE_VERSION=$(echo "$IMAGE_BASE_VERSION" | tr -d '[:space:]')
- # Combine repo short name and branch name for the tag
- COMBINED_TAG="${REPO_SHORT_NAME}-${SAFE_BRANCH_NAME}-${IMAGE_BASE_VERSION}"
-
- docker login -u \$oauthtoken -p $NGC_TOKEN nvcr.io
- docker build -t $IMAGE_NAME:$COMBINED_TAG \
- --build-arg ISAACSIM_BASE_IMAGE_ARG=$ISAACSIM_BASE_IMAGE \
- --build-arg ISAACSIM_VERSION_ARG=$IMAGE_BASE_VERSION \
- --build-arg ISAACSIM_ROOT_PATH_ARG=/isaac-sim \
- --build-arg ISAACLAB_PATH_ARG=/workspace/isaaclab \
- --build-arg DOCKER_USER_HOME_ARG=/root \
- -f docker/Dockerfile.base .
- docker push $IMAGE_NAME:$COMBINED_TAG
- docker tag $IMAGE_NAME:$COMBINED_TAG $IMAGE_NAME:$COMBINED_TAG-b$CODEBUILD_BUILD_NUMBER
- docker push $IMAGE_NAME:$COMBINED_TAG-b$CODEBUILD_BUILD_NUMBER
- done
diff --git a/.aws/premerge-ci-buildspec.yml b/.aws/premerge-ci-buildspec.yml
deleted file mode 100644
index 6bbfe081cd4b..000000000000
--- a/.aws/premerge-ci-buildspec.yml
+++ /dev/null
@@ -1,83 +0,0 @@
-version: 0.2
-
-phases:
- pre_build:
- commands:
- - echo "Launching EC2 instance to run tests"
- - |
- INSTANCE_ID=$(aws ec2 run-instances \
- --image-id ami-0e6cc441f9f4caab3 \
- --count 1 \
- --instance-type g5.2xlarge \
- --key-name production/ssh/isaaclab \
- --security-group-ids sg-02617e4b8916794c4 \
- --subnet-id subnet-0907ceaeb40fd9eac \
- --block-device-mappings '[{"DeviceName":"/dev/sda1","Ebs":{"VolumeSize":500}}]' \
- --output text \
- --query 'Instances[0].InstanceId')
- - aws ec2 wait instance-running --instance-ids $INSTANCE_ID
- - |
- EC2_INSTANCE_IP=$(aws ec2 describe-instances \
- --filters "Name=instance-state-name,Values=running" "Name=instance-id,Values=$INSTANCE_ID" \
- --query 'Reservations[*].Instances[*].[PrivateIpAddress]' \
- --output text)
- - mkdir -p ~/.ssh
- - |
- aws ec2 describe-key-pairs --include-public-key --key-name production/ssh/isaaclab \
- --query 'KeyPairs[0].PublicKey' --output text > ~/.ssh/id_rsa.pub
- - |
- aws secretsmanager get-secret-value --secret-id production/ssh/isaaclab \
- --query SecretString --output text > ~/.ssh/id_rsa
- - chmod 400 ~/.ssh/id_*
- - echo "Host $EC2_INSTANCE_IP\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
- - |
- aws ec2-instance-connect send-ssh-public-key \
- --instance-id $INSTANCE_ID \
- --availability-zone us-west-2a \
- --ssh-public-key file://~/.ssh/id_rsa.pub \
- --instance-os-user ubuntu
- build:
- commands:
- - echo "Running tests on EC2 instance"
- - SRC_DIR=$(basename $CODEBUILD_SRC_DIR)
- - cd ..
- - |
- bash -c '
- function retry_scp() {
- local retries=5
- local wait_time=30
- local count=0
- while [ $count -lt $retries ]; do
- sleep $wait_time
- scp -r $SRC_DIR ubuntu@$EC2_INSTANCE_IP:~
- if [ $? -eq 0 ]; then
- echo "SCP command succeeded"
- return 0
- fi
- count=$((count + 1))
- echo "SCP command failed. Retrying in $wait_time seconds..."
- done
- echo "SCP command failed after $retries attempts."
- return 1
- }
- retry_scp
- '
- - ssh ubuntu@$EC2_INSTANCE_IP "docker login -u \\\$oauthtoken -p $NGC_TOKEN nvcr.io"
- - |
- ssh ubuntu@$EC2_INSTANCE_IP "
- cd $SRC_DIR
- DOCKER_BUILDKIT=1 docker build -t isaac-lab-dev \
- --build-arg ISAACSIM_BASE_IMAGE_ARG=$ISAACSIM_BASE_IMAGE \
- --build-arg ISAACSIM_VERSION_ARG=$ISAACSIM_BASE_VERSION \
- --build-arg ISAACSIM_ROOT_PATH_ARG=/isaac-sim \
- --build-arg ISAACLAB_PATH_ARG=/workspace/isaaclab \
- --build-arg DOCKER_USER_HOME_ARG=/root \
- -f docker/Dockerfile.base .
- docker run --rm --entrypoint bash --gpus all --network=host \
- --name isaac-lab-test isaac-lab-dev ./isaaclab.sh -t && exit \$?
- "
-
- post_build:
- commands:
- - echo "Terminating EC2 instance"
- - aws ec2 terminate-instances --instance-ids $INSTANCE_ID
diff --git a/.dockerignore b/.dockerignore
index 6f6867127cff..b6687c95fa7a 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -4,12 +4,15 @@
.gitignore
# ignore docs
docs/
+# copy in licenses folder to the container
+!docs/licenses/
# ignore logs
**/logs/
**/runs/
**/output/*
**/outputs/*
**/videos/*
+**/wandb/*
*.tmp
# ignore docker
docker/cluster/exports/
@@ -21,3 +24,7 @@ recordings/
**/*.egg-info/
# ignore isaac sim symlink
_isaac_sim?
+# Docker history
+docker/.isaac-lab-docker-history
+# ignore uv environment
+env_isaaclab
diff --git a/.flake8 b/.flake8
deleted file mode 100644
index 9b4a023d685b..000000000000
--- a/.flake8
+++ /dev/null
@@ -1,23 +0,0 @@
-[flake8]
-show-source=True
-statistics=True
-per-file-ignores=*/__init__.py:F401
-# E402: Module level import not at top of file
-# E501: Line too long
-# W503: Line break before binary operator
-# E203: Whitespace before ':' -> conflicts with black
-# D401: First line should be in imperative mood
-# R504: Unnecessary variable assignment before return statement.
-# R505: Unnecessary elif after return statement
-# SIM102: Use a single if-statement instead of nested if-statements
-# SIM117: Merge with statements for context managers that have same scope.
-# SIM118: Checks for key-existence checks against dict.keys() calls.
-ignore=E402,E501,W503,E203,D401,R504,R505,SIM102,SIM117,SIM118
-max-line-length = 120
-max-complexity = 30
-exclude=_*,.vscode,.git,docs/**
-# docstrings
-docstring-convention=google
-# annotations
-suppress-none-returning=True
-allow-star-arg-any=True
diff --git a/.gitattributes b/.gitattributes
index 65a6b946ab24..e3c0ead689d1 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -10,3 +10,5 @@
*.pt filter=lfs diff=lfs merge=lfs -text
*.jit filter=lfs diff=lfs merge=lfs -text
*.hdf5 filter=lfs diff=lfs merge=lfs -text
+
+*.bat text eol=crlf
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index f21bd729c898..cdee41345d25 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -16,62 +16,86 @@
# App experience files
# These are the files that are used to launch the app with the correct settings and configurations
-/apps/ @kellyguo11 @hhansen-bdai @Mayankm96 @Dhoeller19
+/apps/ @kellyguo11 @hhansen-bdai @Mayankm96
# Core Framework
-/source/isaaclab/ @Dhoeller19 @Mayankm96 @jsmith-bdai @kellyguo11
-/source/isaaclab/isaaclab/actuators @Dhoeller19 @Mayankm96 @nikitardn @jtigue-bdai
+/source/isaaclab/isaaclab/actuators @Mayankm96 @jtigue-bdai
/source/isaaclab/isaaclab/app @hhansen-bdai @kellyguo11
-/source/isaaclab/isaaclab/assets @jsmith-bdai @Dhoeller19 @kellyguo11 @Mayankm96 @jtigue-bdai
-/source/isaaclab/isaaclab/assets/deformable_object @kellyguo11 @Mayankm96 @masoudmoghani
+/source/isaaclab/isaaclab/assets @kellyguo11 @Mayankm96 @jtigue-bdai
+/source/isaaclab/isaaclab/assets/deformable_object @masoudmoghani @ooctipus
/source/isaaclab/isaaclab/controllers @Mayankm96
-/source/isaaclab/isaaclab/envs @jsmith-bdai @Dhoeller19 @kellyguo11 @Mayankm96
-/source/isaaclab/isaaclab/envs/manager_based_* @jsmith-bdai @Dhoeller19 @Mayankm96
+/source/isaaclab/isaaclab/envs/manager_based_* @Mayankm96 @jtigue-bdai @ooctipus
/source/isaaclab/isaaclab/envs/direct_* @kellyguo11
-/source/isaaclab/isaaclab/managers @jsmith-bdai @Dhoeller19 @Mayankm96
-/source/isaaclab/isaaclab/sensors @jsmith-bdai @Dhoeller19 @pascal-roth @Mayankm96 @jtigue-bdai
+/source/isaaclab/isaaclab/envs/mdp @ooctipus
+/source/isaaclab/isaaclab/envs/mimic_* @peterd-NV
+/source/isaaclab/isaaclab/envs/ui @ooctipus @ossamaAhmed
+/source/isaaclab/isaaclab/envs/utils @Toni-SM
+/source/isaaclab/isaaclab/managers @jtigue-bdai @Mayankm96 @ooctipus
+/source/isaaclab/isaaclab/sensors/sensor_base* @pascal-roth
/source/isaaclab/isaaclab/sensors/camera @kellyguo11 @pascal-roth
-/source/isaaclab/isaaclab/sensors/contact_sensor @jtigue-bdai
-/source/isaaclab/isaaclab/sensors/frame_transformer @jsmith-bdai
-/source/isaaclab/isaaclab/sensors/ray_caster @pascal-roth @Dhoeller19
-/source/isaaclab/isaaclab/sim @Mayankm96 @jsmith-bdai
-/source/isaaclab/isaaclab/sim/simulation_context.py @Dhoeller19 @kellyguo11
-/source/isaaclab/isaaclab/terrains @Dhoeller19 @Mayankm96 @nikitardn
-/source/isaaclab/isaaclab/utils @Mayankm96 @jsmith-bdai
-/source/isaaclab/isaaclab/utils/modifiers @jtigue-bdai
+/source/isaaclab/isaaclab/sensors/contact_sensor @jtigue-bdai @ooctipus
+/source/isaaclab/isaaclab/sensors/imu @jtigue-bdai @pascal-roth
+/source/isaaclab/isaaclab/sensors/ray_caster @pascal-roth
+/source/isaaclab/isaaclab/sensors/frame_transformer @jtigue-bdai
+/source/isaaclab/isaaclab/sim/converters @Mayankm96 @jtigue-bdai @kellyguo11
+/source/isaaclab/isaaclab/sim/schemas @Mayankm96 @jtigue-bdai @kellyguo11
+/source/isaaclab/isaaclab/sim/spawners @Mayankm96 @jtigue-bdai @ooctipus
+/source/isaaclab/isaaclab/sim/simulation_* @matthewtrepte @ossamaAhmed @kellyguo11
+/source/isaaclab/isaaclab/terrains @Mayankm96
+/source/isaaclab/isaaclab/ui @pascal-roth @jtigue-bdai
+/source/isaaclab/isaaclab/utils/buffers @ooctipus @jtigue-bdai
+/source/isaaclab/isaaclab/utils/datasets @Peter-NV
/source/isaaclab/isaaclab/utils/interpolation @jtigue-bdai
+/source/isaaclab/isaaclab/utils/io @ooctipus
+/source/isaaclab/isaaclab/utils/modifiers @jtigue-bdai
/source/isaaclab/isaaclab/utils/noise @jtigue-bdai @kellyguo11
-/source/isaaclab/isaaclab/utils/warp @Dhoeller19 @pascal-roth
-/source/isaaclab/isaaclab/utils/assets.py @Dhoeller19 @kellyguo11 @Mayankm96
-/source/isaaclab/isaaclab/utils/math.py @jsmith-bdai @Dhoeller19 @Mayankm96
-/source/isaaclab/isaaclab/utils/configclass.py @Mayankm96 @Dhoeller19
+/source/isaaclab/isaaclab/utils/warp @pascal-roth
+/source/isaaclab/isaaclab/utils/assets.py @kellyguo11 @Mayankm96
+/source/isaaclab/isaaclab/utils/math.py @jtigue-bdai @Mayankm96
+/source/isaaclab/isaaclab/utils/configclass.py @Mayankm96
+/source/isaaclab/isaaclab/utils/sensors.py @kellyguo11 @pascal-roth
# RL Environment
-/source/isaaclab_tasks/ @Dhoeller19 @Mayankm96 @jsmith-bdai @kellyguo11
-/source/isaaclab_tasks/isaaclab_tasks/direct @Dhoeller19 @kellyguo11
-/source/isaaclab_tasks/isaaclab_tasks/manager_based @Dhoeller19 @Mayankm96 @jsmith-bdai @jtigue-bdai
+/source/isaaclab_tasks/isaaclab_tasks/direct @kellyguo11
+/source/isaaclab_tasks/isaaclab_tasks/manager_based @Mayankm96
+/source/isaaclab_tasks/isaaclab_tasks/utils @Mayankm96
# Assets
-/source/isaaclab_assets/isaaclab_assets/ @Dhoeller19 @pascal-roth @jsmith-bdai
+/source/isaaclab_assets/isaaclab_assets/ @pascal-roth
+
+# Mimic
+/source/isaaclab_mimic/isaaclab_mimic @peterd-NV
+/source/isaaclab_mimic/isaaclab_mimic @njawale42
+/source/isaaclab_mimic/isaaclab_mimic @michaellin6
+/source/isaaclab_mimic/isaaclab_mimic @jaybdub
+/source/isaaclab_mimic/isaaclab_mimic @huihuaNvidia2023
+/source/isaaclab_mimic/isaaclab_mimic @xyao-nv
+
+# RL
+/source/isaaclab_rl/isaaclab_rl/rsl_rl @Mayankm96 @ClemensSchwarke
+/source/isaaclab_rl/isaaclab_rl/rl_games @Toni-SM
+/source/isaaclab_rl/isaaclab_rl/sb3 @Toni-SM
+/source/isaaclab_rl/isaaclab_rl/skrl @Toni-SM
# Standalone Scripts
-/scripts/demos/ @jsmith-bdai @jtigue-bdai @Dhoeller19 @kellyguo11 @Mayankm96
-/scripts/environments/ @Mayankm96
-/scripts/tools/ @jsmith-bdai @Mayankm96
-/scripts/tutorials/ @jsmith-bdai @pascal-roth @kellyguo11 @Dhoeller19 @Mayankm96
-/scripts/reinforcement_learning/ @jsmith-bdai @Dhoeller19 @kellyguo11 @Mayankm96
-/scripts/imitation_learning/ @jsmith-bdai @Dhoeller19 @kellyguo11 @Mayankm96
+/scripts/benchmarks/ @ooctipus @kellyguo11
+/scripts/demos/ @ooctipus
+/scripts/environments/ @ooctipus
+/scripts/imitation_learning/ @Peter-NV
+/scripts/reinforcement_learning/ @ooctipus @Toni-NV
+/scripts/tools/ @jtigue-bdai @Mayankm96
+/scripts/tutorials/ @jtigue-bdai @pascal-roth
# Github Actions
# This list is for people wanting to be notified every time there's a change
# related to Github Actions
-/.github/ @kellyguo11 @jsmith-bdai
+/.github/ @kellyguo11 @hhansen-bdai
# Visual Studio Code
/.vscode/ @hhansen-bdai @Mayankm96
# Infrastructure (Docker, Docs, Tools)
/docker/ @hhansen-bdai @pascal-roth
-/docs/ @jsmith-bdai @Dhoeller19 @kellyguo11 @Mayankm96
-/tools/ @hhansen-bdai @jsmith-bdai @Dhoeller19
-/isaaclab.* @hhansen-bdai @Dhoeller19 @Mayankm96 @kellyguo11
+/docs/ @jtigue-bdai @kellyguo11 @Mayankm96
+/tools/ @hhansen-bdai
+/isaaclab.* @hhansen-bdai @Mayankm96 @kellyguo11
diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md
index 1ea755acc6c5..54d6f21a8086 100644
--- a/.github/ISSUE_TEMPLATE/bug.md
+++ b/.github/ISSUE_TEMPLATE/bug.md
@@ -31,11 +31,11 @@ Describe the characteristic of your environment:
- Commit: [e.g. 8f3b9ca]
-- Isaac Sim Version: [e.g. 2022.2.0, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
-- OS: [e.g. Ubuntu 20.04]
-- GPU: [e.g. RTX 2060 Super]
-- CUDA: [e.g. 11.4]
-- GPU Driver: [e.g. 470.82.01, this can be seen by using `nvidia-smi` command.]
+- Isaac Sim Version: [e.g. 5.0, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
+- OS: [e.g. Ubuntu 22.04]
+- GPU: [e.g. RTX 5090]
+- CUDA: [e.g. 12.8]
+- GPU Driver: [e.g. 553.05, this can be seen by using `nvidia-smi` command.]
### Additional context
diff --git a/.github/ISSUE_TEMPLATE/proposal.md b/.github/ISSUE_TEMPLATE/proposal.md
index 9946d02165da..c07d7f56dc85 100644
--- a/.github/ISSUE_TEMPLATE/proposal.md
+++ b/.github/ISSUE_TEMPLATE/proposal.md
@@ -21,6 +21,14 @@ If this is related to another GitHub issue, please link here too.
A clear and concise description of any alternative solutions or features you've considered, if any.
+### Build Info
+
+Describe the versions where you are observing the missing feature in:
+
+
+- Isaac Lab Version: [e.g. 2.3.2]
+- Isaac Sim Version: [e.g. 5.1, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
+
### Additional context
Add any other context or screenshots about the feature request here.
diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
index b6e18b7fd54f..6e0582f37379 100644
--- a/.github/ISSUE_TEMPLATE/question.md
+++ b/.github/ISSUE_TEMPLATE/question.md
@@ -10,4 +10,12 @@ Basic questions, related to robot learning, that are not bugs or feature request
Advanced/nontrivial questions, especially in areas where documentation is lacking, are very much welcome.
-For questions that are related to running and understanding Isaac Sim, please post them at the official [Isaac Sim forums](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/isaac_sim_forums.html).
+For questions that are related to running and understanding Isaac Sim, please post them at the official [Isaac Sim forums](https://forums.developer.nvidia.com/c/omniverse/simulation/69).
+
+### Build Info
+
+Describe the versions that you are currently using:
+
+
+- Isaac Lab Version: [e.g. 2.3.2]
+- Isaac Sim Version: [e.g. 5.1, this can be obtained by `cat ${ISAACSIM_PATH}/VERSION`]
diff --git a/.github/LICENSE_HEADER.txt b/.github/LICENSE_HEADER.txt
index e9b115861a5f..f078a3a4e8a7 100644
--- a/.github/LICENSE_HEADER.txt
+++ b/.github/LICENSE_HEADER.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
All rights reserved.
SPDX-License-Identifier: BSD-3-Clause
diff --git a/.github/LICENSE_HEADER_MIMIC.txt b/.github/LICENSE_HEADER_MIMIC.txt
index 6196e791dc7c..d5779ee27290 100644
--- a/.github/LICENSE_HEADER_MIMIC.txt
+++ b/.github/LICENSE_HEADER_MIMIC.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2024-2025, The Isaac Lab Project Developers.
+Copyright (c) 2024-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
All rights reserved.
SPDX-License-Identifier: Apache-2.0
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index e9176cc47f5b..ee9fa4ebdc5e 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -4,6 +4,8 @@
Thank you for your interest in sending a pull request. Please make sure to check the contribution guidelines.
Link: https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html
+
+๐ก Please try to keep PRs small and focused. Large PRs are harder to review and merge.
-->
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context.
@@ -21,8 +23,8 @@ is demanded by more than one party. -->
- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)
-- Breaking change (fix or feature that would cause existing functionality to not work as expected)
-- This change requires a documentation update
+- Breaking change (existing functionality will not work without user modification)
+- Documentation update
## Screenshots
@@ -40,6 +42,7 @@ To upload images to a PR -- simply drag and drop an image while in edit mode and
## Checklist
+- [ ] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html)
- [ ] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format`
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
diff --git a/.github/actions/combine-results/action.yml b/.github/actions/combine-results/action.yml
new file mode 100644
index 000000000000..8ed66e3b4603
--- /dev/null
+++ b/.github/actions/combine-results/action.yml
@@ -0,0 +1,103 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: 'Combine XML Test Results'
+description: 'Combines multiple XML test result files into a single file'
+
+inputs:
+ tests-dir:
+ description: 'Directory containing test result files'
+ default: 'tests'
+ required: false
+ output-file:
+ description: 'Output combined XML file path'
+ required: true
+ reports-dir:
+ description: 'Directory to store the combined results'
+ default: 'reports'
+ required: false
+
+runs:
+ using: composite
+ steps:
+ - name: Combine XML Test Results
+ shell: sh
+ run: |
+ # Function to combine multiple XML test results
+ combine_xml_results() {
+ local tests_dir="$1"
+ local output_file="$2"
+ local reports_dir="$3"
+
+ echo "Combining test results from: $tests_dir"
+ echo "Output file: $output_file"
+ echo "Reports directory: $reports_dir"
+
+ # Check if reports directory exists
+ if [ ! -d "$reports_dir" ]; then
+ echo "โ ๏ธ Reports directory does not exist: $reports_dir"
+ mkdir -p "$reports_dir"
+ fi
+
+ # Check if tests directory exists
+ if [ ! -d "$tests_dir" ]; then
+ echo "โ ๏ธ Tests directory does not exist: $tests_dir"
+ echo "Creating fallback XML..."
+ echo 'Tests directory was not found' > "$output_file"
+ return
+ fi
+
+ # Find all XML files in the tests directory
+ echo "Searching for XML files in: $tests_dir"
+ xml_files=$(find "$tests_dir" -name "*.xml" -type f 2>/dev/null | sort)
+
+ if [ -z "$xml_files" ]; then
+ echo "โ ๏ธ No XML files found in: $tests_dir"
+ echo "Creating fallback XML..."
+ echo 'No XML test result files were found' > "$output_file"
+ return
+ fi
+
+ # Count XML files found
+ file_count=$(echo "$xml_files" | wc -l)
+ echo "โ Found $file_count XML file(s):"
+ echo "$xml_files" | while read -r file; do
+ echo " - $file ($(wc -c < "$file") bytes)"
+ done
+
+ # Create combined XML
+ echo "๐ Combining $file_count XML files..."
+ echo '' > "$output_file"
+ echo '' >> "$output_file"
+
+ # Process each XML file
+ combined_count=0
+ echo "$xml_files" | while read -r file; do
+ if [ -f "$file" ]; then
+ echo " Processing: $file"
+ # Remove XML declaration and outer testsuites wrapper from each file
+ # Remove first line (XML declaration) and strip outer / tags
+ sed '1d; s/^//; s/<\/testsuites>$//' "$file" >> "$output_file" 2>/dev/null || {
+ echo " โ ๏ธ Warning: Could not process $file, skipping..."
+ }
+ combined_count=$((combined_count + 1))
+ fi
+ done
+
+ echo '' >> "$output_file"
+ echo "โ Successfully combined $combined_count files into: $output_file"
+
+ # Verify output file was created
+ if [ -f "$output_file" ]; then
+ echo "โ Final output file created: $output_file"
+ echo "๐ Output file size: $(wc -c < "$output_file") bytes"
+ else
+ echo "โ Failed to create output file: $output_file"
+ exit 1
+ fi
+ }
+
+ # Call the function with provided parameters
+ combine_xml_results "${{ inputs.tests-dir }}" "${{ inputs.output-file }}" "${{ inputs.reports-dir }}"
diff --git a/.github/actions/docker-build/action.yml b/.github/actions/docker-build/action.yml
new file mode 100644
index 000000000000..2db402d42042
--- /dev/null
+++ b/.github/actions/docker-build/action.yml
@@ -0,0 +1,78 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: 'Build Docker Image'
+description: 'Builds a Docker image with IsaacSim and IsaacLab dependencies'
+
+inputs:
+ image-tag:
+ description: 'Docker image tag to use'
+ required: true
+ isaacsim-base-image:
+ description: 'IsaacSim base image'
+ required: true
+ isaacsim-version:
+ description: 'IsaacSim version'
+ required: true
+ dockerfile-path:
+ description: 'Path to Dockerfile'
+ default: 'docker/Dockerfile.curobo'
+ required: false
+ context-path:
+ description: 'Build context path'
+ default: '.'
+ required: false
+
+runs:
+ using: composite
+ steps:
+ - name: NGC Login
+ shell: sh
+ run: |
+ # Only attempt NGC login if API key is available
+ if [ -n "${{ env.NGC_API_KEY }}" ]; then
+ echo "Logging into NGC registry..."
+ docker login -u \$oauthtoken -p ${{ env.NGC_API_KEY }} nvcr.io
+ echo "โ Successfully logged into NGC registry"
+ else
+ echo "โ ๏ธ NGC_API_KEY not available - skipping NGC login"
+ echo "This is normal for PRs from forks or when secrets are not configured"
+ fi
+
+ - name: Build Docker Image
+ shell: sh
+ run: |
+ # Function to build Docker image
+ build_docker_image() {
+ local image_tag="$1"
+ local isaacsim_base_image="$2"
+ local isaacsim_version="$3"
+ local dockerfile_path="$4"
+ local context_path="$5"
+
+ echo "Building Docker image: $image_tag"
+ echo "Using Dockerfile: $dockerfile_path"
+ echo "Build context: $context_path"
+
+ # Build Docker image
+ docker buildx build --progress=plain --platform linux/amd64 \
+ -t isaac-lab-dev \
+ -t $image_tag \
+ --build-arg ISAACSIM_BASE_IMAGE_ARG="$isaacsim_base_image" \
+ --build-arg ISAACSIM_VERSION_ARG="$isaacsim_version" \
+ --build-arg ISAACSIM_ROOT_PATH_ARG=/isaac-sim \
+ --build-arg ISAACLAB_PATH_ARG=/workspace/isaaclab \
+ --build-arg DOCKER_USER_HOME_ARG=/root \
+ --cache-from type=gha \
+ --cache-to type=gha,mode=max \
+ -f $dockerfile_path \
+ --load $context_path
+
+ echo "โ Docker image built successfully: $image_tag"
+ docker images | grep isaac-lab-dev
+ }
+
+ # Call the function with provided parameters
+ build_docker_image "${{ inputs.image-tag }}" "${{ inputs.isaacsim-base-image }}" "${{ inputs.isaacsim-version }}" "${{ inputs.dockerfile-path }}" "${{ inputs.context-path }}"
diff --git a/.github/actions/run-tests/action.yml b/.github/actions/run-tests/action.yml
new file mode 100644
index 000000000000..467122860141
--- /dev/null
+++ b/.github/actions/run-tests/action.yml
@@ -0,0 +1,157 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: 'Run Tests in Docker Container'
+description: 'Runs pytest tests in a Docker container with GPU support and result collection'
+
+inputs:
+ test-path:
+ description: 'Path to test directory or pytest arguments'
+ required: true
+ result-file:
+ description: 'Name of the result XML file'
+ required: true
+ container-name:
+ description: 'Name for the Docker container'
+ required: true
+ image-tag:
+ description: 'Docker image tag to use'
+ required: true
+ reports-dir:
+ description: 'Directory to store test results'
+ default: 'reports'
+ required: false
+ pytest-options:
+ description: 'Additional pytest options (e.g., -k filter)'
+ default: ''
+ required: false
+ filter-pattern:
+ description: 'Pattern to filter test files (e.g., isaaclab_tasks)'
+ default: ''
+ required: false
+
+runs:
+ using: composite
+ steps:
+ - name: Run Tests in Docker Container
+ shell: bash
+ run: |
+ # Function to run tests in Docker container
+ run_tests() {
+ local test_path="$1"
+ local result_file="$2"
+ local container_name="$3"
+ local image_tag="$4"
+ local reports_dir="$5"
+ local pytest_options="$6"
+ local filter_pattern="$7"
+
+ echo "Running tests in: $test_path"
+ if [ -n "$pytest_options" ]; then
+ echo "With pytest options: $pytest_options"
+ fi
+ if [ -n "$filter_pattern" ]; then
+ echo "With filter pattern: $filter_pattern"
+ fi
+
+ # Create reports directory
+ mkdir -p "$reports_dir"
+
+ # Clean up any existing container
+ docker rm -f $container_name 2>/dev/null || true
+
+ # Build Docker environment variables
+ docker_env_vars="\
+ -e OMNI_KIT_ACCEPT_EULA=yes \
+ -e ACCEPT_EULA=Y \
+ -e OMNI_KIT_DISABLE_CUP=1 \
+ -e ISAAC_SIM_HEADLESS=1 \
+ -e ISAAC_SIM_LOW_MEMORY=1 \
+ -e PYTHONUNBUFFERED=1 \
+ -e PYTHONIOENCODING=utf-8 \
+ -e TEST_RESULT_FILE=$result_file"
+
+ if [ -n "$filter_pattern" ]; then
+ if [[ "$filter_pattern" == not* ]]; then
+ # Handle "not pattern" case
+ exclude_pattern="${filter_pattern#not }"
+ docker_env_vars="$docker_env_vars -e TEST_EXCLUDE_PATTERN=$exclude_pattern"
+ echo "Setting exclude pattern: $exclude_pattern"
+ else
+ # Handle positive pattern case
+ docker_env_vars="$docker_env_vars -e TEST_FILTER_PATTERN=$filter_pattern"
+ echo "Setting include pattern: $filter_pattern"
+ fi
+ else
+ echo "No filter pattern provided"
+ fi
+
+ echo "Docker environment variables: '$docker_env_vars'"
+
+ # Run tests in container with error handling
+ echo "๐ Starting Docker container for tests..."
+ if docker run --name $container_name \
+ --entrypoint bash --gpus all --network=host \
+ --security-opt=no-new-privileges:true \
+ --memory=$(echo "$(free -m | awk '/^Mem:/{print $2}') * 0.9 / 1" | bc)m \
+ --cpus=$(echo "$(nproc) * 0.9" | bc) \
+ --oom-kill-disable=false \
+ --ulimit nofile=65536:65536 \
+ --ulimit nproc=4096:4096 \
+ $docker_env_vars \
+ $image_tag \
+ -c "
+ set -e
+ cd /workspace/isaaclab
+ mkdir -p tests
+ echo 'Starting pytest with path: $test_path'
+ /isaac-sim/python.sh -m pytest --ignore=tools/conftest.py $test_path $pytest_options -v --junitxml=tests/$result_file || echo 'Pytest completed with exit code: $?'
+ "; then
+ echo "โ Docker container completed successfully"
+ else
+ echo "โ ๏ธ Docker container failed, but continuing to copy results..."
+ fi
+
+ # Copy test results with error handling
+ echo "๐ Attempting to copy test results..."
+ if docker cp $container_name:/workspace/isaaclab/tests/$result_file "$reports_dir/$result_file" 2>/dev/null; then
+ echo "โ Test results copied successfully"
+ else
+ echo "โ Failed to copy specific result file, trying to copy all test results..."
+ if docker cp $container_name:/workspace/isaaclab/tests/ "$reports_dir/" 2>/dev/null; then
+ echo "โ All test results copied successfully"
+ # Look for any XML files and use the first one found
+ if [ -f "$reports_dir/full_report.xml" ]; then
+ mv "$reports_dir/full_report.xml" "$reports_dir/$result_file"
+ echo "โ Found and renamed full_report.xml to $result_file"
+ elif [ -f "$reports_dir/test-reports-"*".xml" ]; then
+ # Combine individual test reports if no full report exists
+ echo "๐ Combining individual test reports..."
+ echo '' > "$reports_dir/$result_file"
+ for xml_file in "$reports_dir"/test-reports-*.xml; do
+ if [ -f "$xml_file" ]; then
+ echo " Processing: $xml_file"
+ sed '1d; /^> "$reports_dir/$result_file" 2>/dev/null || true
+ fi
+ done
+ echo '' >> "$reports_dir/$result_file"
+ echo "โ Combined individual test reports into $result_file"
+ else
+ echo "โ No test result files found, creating fallback"
+ echo "Container may have failed to generate any results" > "$reports_dir/$result_file"
+ fi
+ else
+ echo "โ Failed to copy any test results, creating fallback"
+ echo "Container may have failed to generate results" > "$reports_dir/$result_file"
+ fi
+ fi
+
+ # Clean up container
+ echo "๐งน Cleaning up Docker container..."
+ docker rm $container_name 2>/dev/null || echo "โ ๏ธ Container cleanup failed, but continuing..."
+ }
+
+ # Call the function with provided parameters
+ run_tests "${{ inputs.test-path }}" "${{ inputs.result-file }}" "${{ inputs.container-name }}" "${{ inputs.image-tag }}" "${{ inputs.reports-dir }}" "${{ inputs.pytest-options }}" "${{ inputs.filter-pattern }}"
diff --git a/.github/labeler.yml b/.github/labeler.yml
new file mode 100644
index 000000000000..2e6837fdb71a
--- /dev/null
+++ b/.github/labeler.yml
@@ -0,0 +1,76 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Documentation-related changes
+documentation:
+ - all:
+ - changed-files:
+ - any-glob-to-any-file:
+ - 'docs/**'
+ - '**/README.md'
+ - all-globs-to-all-files:
+ - '!docs/licenses/**'
+
+# Infrastructure changes
+infrastructure:
+ - changed-files:
+ - any-glob-to-any-file:
+ - .github/**
+ - docker/**
+ - .dockerignore
+ - tools/**
+ - .vscode/**
+ - environment.yml
+ - setup.py
+ - pyproject.toml
+ - .pre-commit-config.yaml
+ - isaaclab.sh
+ - isaaclab.bat
+ - docs/licenses/**
+
+# Assets (USD, glTF, etc.) related changes.
+asset:
+ - changed-files:
+ - any-glob-to-any-file:
+ - source/isaaclab_assets/**
+
+# Isaac Sim team related changes.
+isaac-sim:
+ - changed-files:
+ - any-glob-to-any-file:
+ - apps/**
+
+# Isaac Mimic team related changes.
+isaac-mimic:
+ - changed-files:
+ - any-glob-to-any-file:
+ - source/isaaclab/isaaclab/devices/**
+ - source/isaaclab_mimic/**
+ - source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack**
+ - source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/pick_and_place**
+ - scripts/imitation_learning/**
+
+# Isaac Lab team related changes.
+isaac-lab:
+ - all:
+ - changed-files:
+ - any-glob-to-any-file:
+ - source/**
+ - scripts/**
+ - all-globs-to-all-files:
+ - '!source/isaaclab_assets/**'
+ - '!source/isaaclab_mimic/**'
+ - '!source/isaaclab/isaaclab/devices'
+ - '!scripts/imitation_learning/**'
+
+# Add 'enhancement' label to any PR where the head branch name
+# starts with `feature` or has a `feature` section in the name
+enhancement:
+ - head-branch: ['^feature', 'feature']
+
+# Add 'bug' label to any PR where the head branch name
+# starts with `fix`/`bug` or has a `fix`/`bug` section in the name
+bug:
+ - head-branch: ['^fix', 'fix', '^bug', 'bug']
diff --git a/.github/stale.yml b/.github/stale.yml
index 9df5640208f0..6205170b38bd 100644
--- a/.github/stale.yml
+++ b/.github/stale.yml
@@ -1,3 +1,8 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
# Configuration for probot-stale - https://github.com/probot/stale
# Number of days of inactivity before an Issue or Pull Request becomes stale
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 000000000000..cbaa8f7b8e99
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,222 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: Build and Test
+
+on:
+ pull_request:
+ branches:
+ - devel
+ - main
+ - 'release/**'
+
+# Concurrency control to prevent parallel runs on the same PR
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+ pull-requests: write
+ checks: write
+ issues: read
+
+env:
+ NGC_API_KEY: ${{ secrets.NGC_API_KEY }}
+ ISAACSIM_BASE_IMAGE: ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }}
+ ISAACSIM_BASE_VERSION: ${{ vars.ISAACSIM_BASE_VERSION || '5.1.0' }}
+ DOCKER_IMAGE_TAG: isaac-lab-dev:${{ github.event_name == 'pull_request' && format('pr-{0}', github.event.pull_request.number) || github.ref_name }}-${{ github.sha }}
+
+jobs:
+ test-isaaclab-tasks:
+ runs-on: [self-hosted, gpu]
+ timeout-minutes: 180
+ continue-on-error: true
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ lfs: true
+
+ - name: Build Docker Image
+ uses: ./.github/actions/docker-build
+ with:
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
+ isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }}
+ isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }}
+
+ - name: Run IsaacLab Tasks Tests
+ uses: ./.github/actions/run-tests
+ with:
+ test-path: "tools"
+ result-file: "isaaclab-tasks-report.xml"
+ container-name: "isaac-lab-tasks-test-$$"
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
+ pytest-options: ""
+ filter-pattern: "isaaclab_tasks"
+
+ - name: Copy Test Results from IsaacLab Tasks Container
+ run: |
+ CONTAINER_NAME="isaac-lab-tasks-test-$$"
+ if docker ps -a | grep -q $CONTAINER_NAME; then
+ echo "Copying test results from IsaacLab Tasks container..."
+ docker cp $CONTAINER_NAME:/workspace/isaaclab/tests/isaaclab-tasks-report.xml reports/ 2>/dev/null || echo "No test results to copy from IsaacLab Tasks container"
+ fi
+
+ - name: Upload IsaacLab Tasks Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: isaaclab-tasks-test-results
+ path: reports/isaaclab-tasks-report.xml
+ retention-days: 1
+ compression-level: 9
+
+ - name: Check Test Results for Fork PRs
+ if: github.event.pull_request.head.repo.full_name != github.repository
+ run: |
+ if [ -f "reports/isaaclab-tasks-report.xml" ]; then
+ # Check if the test results contain any failures
+ if grep -q 'failures="[1-9]' reports/isaaclab-tasks-report.xml || grep -q 'errors="[1-9]' reports/isaaclab-tasks-report.xml; then
+ echo "Tests failed for PR from fork. The test report is in the logs. Failing the job."
+ exit 1
+ fi
+ else
+ echo "No test results file found. This might indicate test execution failed."
+ exit 1
+ fi
+
+ test-general:
+ runs-on: [self-hosted, gpu]
+ timeout-minutes: 180
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ lfs: true
+
+ - name: Build Docker Image
+ uses: ./.github/actions/docker-build
+ with:
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
+ isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }}
+ isaacsim-version: ${{ env.ISAACSIM_BASE_VERSION }}
+
+ - name: Run General Tests
+ id: run-general-tests
+ uses: ./.github/actions/run-tests
+ with:
+ test-path: "tools"
+ result-file: "general-tests-report.xml"
+ container-name: "isaac-lab-general-test-$$"
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
+ pytest-options: ""
+ filter-pattern: "not isaaclab_tasks"
+
+ - name: Copy Test Results from General Tests Container
+ run: |
+ CONTAINER_NAME="isaac-lab-general-test-$$"
+ if docker ps -a | grep -q $CONTAINER_NAME; then
+ echo "Copying test results from General Tests container..."
+ docker cp $CONTAINER_NAME:/workspace/isaaclab/tests/general-tests-report.xml reports/ 2>/dev/null || echo "No test results to copy from General Tests container"
+ fi
+
+ - name: Upload General Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: general-test-results
+ path: reports/general-tests-report.xml
+ retention-days: 1
+ compression-level: 9
+
+ - name: Check Test Results for Fork PRs
+ if: github.event.pull_request.head.repo.full_name != github.repository
+ run: |
+ if [ -f "reports/general-tests-report.xml" ]; then
+ # Check if the test results contain any failures
+ if grep -q 'failures="[1-9]' reports/general-tests-report.xml || grep -q 'errors="[1-9]' reports/general-tests-report.xml; then
+ echo "Tests failed for PR from fork. The test report is in the logs. Failing the job."
+ exit 1
+ fi
+ else
+ echo "No test results file found. This might indicate test execution failed."
+ exit 1
+ fi
+
+ combine-results:
+ needs: [test-isaaclab-tasks, test-general]
+ runs-on: [self-hosted, gpu]
+ if: always()
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ lfs: false
+
+ - name: Create Reports Directory
+ run: |
+ mkdir -p reports
+
+ - name: Download Test Results
+ uses: actions/download-artifact@v4
+ with:
+ name: isaaclab-tasks-test-results
+ path: reports/
+ continue-on-error: true
+
+ - name: Download General Test Results
+ uses: actions/download-artifact@v4
+ with:
+ name: general-test-results
+ path: reports/
+
+ - name: Combine All Test Results
+ uses: ./.github/actions/combine-results
+ with:
+ tests-dir: "reports"
+ output-file: "reports/combined-results.xml"
+
+ - name: Upload Combined Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: pr-${{ github.event.pull_request.number }}-combined-test-results
+ path: reports/combined-results.xml
+ retention-days: 7
+ compression-level: 9
+
+ - name: Comment on Test Results
+ id: test-reporter
+ if: github.event.pull_request.head.repo.full_name == github.repository
+ uses: EnricoMi/publish-unit-test-result-action@v2
+ with:
+ files: "reports/combined-results.xml"
+ check_name: "Tests Summary"
+ comment_mode: changes
+ comment_title: "Test Results Summary"
+ report_individual_runs: false
+ deduplicate_classes_by_file_name: true
+ compare_to_earlier_commit: true
+ fail_on: errors
+ action_fail_on_inconclusive: true
+
+ - name: Report Test Results
+ if: github.event.pull_request.head.repo.full_name == github.repository
+ uses: dorny/test-reporter@v1
+ with:
+ name: IsaacLab Build and Test Results
+ path: reports/combined-results.xml
+ reporter: java-junit
+ fail-on-error: true
+ only-summary: false
+ max-annotations: '50'
+ report-title: "IsaacLab Test Results - ${{ github.workflow }}"
diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml
new file mode 100644
index 000000000000..a5f91e934032
--- /dev/null
+++ b/.github/workflows/check-links.yml
@@ -0,0 +1,120 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: Check Documentation Links
+
+on:
+ # Run on pull requests that modify documentation
+ pull_request:
+ paths:
+ - 'docs/**'
+ - '**.md'
+ - '.github/workflows/check-links.yml'
+ # Run on pushes to main branches
+ push:
+ branches:
+ - main
+ - devel
+ - 'release/**'
+ paths:
+ - 'docs/**'
+ - '**.md'
+ - '.github/workflows/check-links.yml'
+ # Allow manual trigger
+ workflow_dispatch:
+ # Run weekly to catch external links that break over time
+ schedule:
+ - cron: '0 0 * * 0' # Every Sunday at midnight UTC
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check-links:
+ name: Check for Broken Links
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Restore lychee cache
+ uses: actions/cache@v4
+ with:
+ path: .lycheecache
+ key: cache-lychee-${{ github.sha }}
+ restore-keys: cache-lychee-
+
+ - name: Run Link Checker
+ uses: lycheeverse/lychee-action@v2
+ with:
+ # Check all markdown files and documentation
+ args: >-
+ --verbose
+ --no-progress
+ --cache
+ --max-cache-age 1d
+ --exclude-path './docs/_build'
+ --exclude-path './apps/warp-*'
+ --exclude-path './logs'
+ --exclude-path './outputs'
+ --exclude-loopback
+ --exclude '^file://'
+ --exclude '^mailto:'
+ --exclude 'localhost'
+ --exclude '127\.0\.0\.1'
+ --exclude 'example\.com'
+ --exclude 'your-organization'
+ --exclude 'YOUR_'
+ --exclude 'yourdomain'
+ --exclude 'user@'
+ --exclude 'helm\.ngc\.nvidia\.com'
+ --exclude 'slurm\.schedmd\.com'
+ --max-retries 3
+ --retry-wait-time 5
+ --timeout 30
+ --accept 200,201,202,203,204,206,301,302,303,307,308,429
+ --scheme https
+ --scheme http
+ '*.md'
+ '**/*.md'
+ 'docs/**/*.rst'
+ 'docs/**/*.html'
+ # Output results to a file
+ output: ./lychee-output.md
+ # Fail action on broken links
+ fail: true
+ # Optional: Use GitHub token for authenticated requests (higher rate limit)
+ token: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Print results to logs
+ if: always()
+ run: |
+ echo "========================================"
+ echo "Link Checker Results:"
+ echo "========================================"
+ if [ -f ./lychee-output.md ]; then
+ cat ./lychee-output.md
+ echo ""
+ echo "========================================"
+
+ # Also add to GitHub step summary for easy viewing
+ echo "## Link Checker Results" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ cat ./lychee-output.md >> $GITHUB_STEP_SUMMARY
+ else
+ echo "No output file generated"
+ echo "========================================"
+ fi
+
+ - name: Fail job if broken links found
+ if: failure()
+ run: |
+ echo "โ Broken links were found in the documentation!"
+ echo "Please review the link checker report above and fix all broken links."
+ exit 1
diff --git a/.github/workflows/daily-compatibility.yml b/.github/workflows/daily-compatibility.yml
new file mode 100644
index 000000000000..bbf59e45160d
--- /dev/null
+++ b/.github/workflows/daily-compatibility.yml
@@ -0,0 +1,257 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: Backwards Compatibility Tests
+
+on:
+ schedule:
+ # Run daily at 8 PM PST (4 AM UTC)
+ - cron: '0 4 * * *'
+
+ workflow_dispatch:
+ inputs:
+ isaacsim_version:
+ description: 'IsaacSim version image tag to test'
+ required: true
+ default: '4.5.0'
+ type: string
+
+# Concurrency control to prevent parallel runs
+concurrency:
+ group: compatibility-${{ github.ref }}-${{ github.event_name }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+ pull-requests: write
+
+env:
+ NGC_API_KEY: ${{ secrets.NGC_API_KEY }}
+ ISAACSIM_BASE_IMAGE: ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }}
+
+jobs:
+ setup-versions:
+ runs-on: ubuntu-latest
+ outputs:
+ versions: ${{ steps.set-versions.outputs.versions }}
+ steps:
+ - name: Set Isaac Sim Versions
+ id: set-versions
+ run: |
+ # Define all versions to test in one place
+ DEFAULT_VERSIONS='["4.5.0", "5.0.0"]'
+
+ if [ -n "${{ github.event.inputs.isaacsim_version }}" ]; then
+ # If a specific version is provided via workflow_dispatch, use only that
+ echo "versions=[\"${{ github.event.inputs.isaacsim_version }}\"]" >> $GITHUB_OUTPUT
+ else
+ # Otherwise, use all default versions
+ echo "versions=$DEFAULT_VERSIONS" >> $GITHUB_OUTPUT
+ fi
+
+ test-isaaclab-tasks-compat:
+ needs: setup-versions
+ runs-on: [self-hosted, gpu]
+ timeout-minutes: 180
+ continue-on-error: true
+ strategy:
+ matrix:
+ isaacsim_version: ${{ fromJson(needs.setup-versions.outputs.versions) }}
+ fail-fast: false
+ env:
+ CUDA_VISIBLE_DEVICES: all
+ NVIDIA_VISIBLE_DEVICES: all
+ NVIDIA_DRIVER_CAPABILITIES: all
+ CUDA_HOME: /usr/local/cuda
+ LD_LIBRARY_PATH: /usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
+ DOCKER_IMAGE_TAG: isaac-lab-compat:${{ github.ref_name }}-${{ github.sha }}-${{ matrix.isaacsim_version }}
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ lfs: true
+
+ - name: Build Docker Image
+ uses: ./.github/actions/docker-build
+ with:
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
+ isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }}
+ isaacsim-version: ${{ matrix.isaacsim_version }}
+
+ - name: Run IsaacLab Tasks Tests
+ uses: ./.github/actions/run-tests
+ with:
+ test-path: "tools"
+ result-file: "isaaclab-tasks-compat-report.xml"
+ container-name: "isaac-lab-tasks-compat-test-$$"
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
+ pytest-options: ""
+ filter-pattern: "isaaclab_tasks"
+
+ - name: Copy All Test Results from IsaacLab Tasks Container
+ run: |
+ CONTAINER_NAME="isaac-lab-tasks-compat-test-$$"
+ if docker ps -a | grep -q $CONTAINER_NAME; then
+ echo "Copying all test results from IsaacLab Tasks container..."
+ docker cp $CONTAINER_NAME:/workspace/isaaclab/tests/isaaclab-tasks-compat-report.xml reports/ 2>/dev/null || echo "No test results to copy from IsaacLab Tasks container"
+ fi
+
+ - name: Upload IsaacLab Tasks Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: isaaclab-tasks-compat-results-${{ matrix.isaacsim_version }}
+ path: reports/isaaclab-tasks-compat-report.xml
+ retention-days: 7
+ compression-level: 9
+
+ test-general-compat:
+ needs: setup-versions
+ runs-on: [self-hosted, gpu]
+ timeout-minutes: 180
+ strategy:
+ matrix:
+ isaacsim_version: ${{ fromJson(needs.setup-versions.outputs.versions) }}
+ fail-fast: false
+ env:
+ CUDA_VISIBLE_DEVICES: all
+ NVIDIA_VISIBLE_DEVICES: all
+ NVIDIA_DRIVER_CAPABILITIES: all
+ CUDA_HOME: /usr/local/cuda
+ LD_LIBRARY_PATH: /usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
+ DOCKER_IMAGE_TAG: isaac-lab-compat:${{ github.ref_name }}-${{ github.sha }}-${{ matrix.isaacsim_version }}
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ lfs: true
+
+ - name: Build Docker Image
+ uses: ./.github/actions/docker-build
+ with:
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
+ isaacsim-base-image: ${{ env.ISAACSIM_BASE_IMAGE }}
+ isaacsim-version: ${{ matrix.isaacsim_version }}
+
+ - name: Run General Tests
+ uses: ./.github/actions/run-tests
+ with:
+ test-path: "tools"
+ result-file: "general-tests-compat-report.xml"
+ container-name: "isaac-lab-general-compat-test-$$"
+ image-tag: ${{ env.DOCKER_IMAGE_TAG }}
+ pytest-options: ""
+ filter-pattern: "not isaaclab_tasks"
+
+ - name: Copy All Test Results from General Tests Container
+ run: |
+ CONTAINER_NAME="isaac-lab-general-compat-test-$$"
+ if docker ps -a | grep -q $CONTAINER_NAME; then
+ echo "Copying all test results from General Tests container..."
+ docker cp $CONTAINER_NAME:/workspace/isaaclab/tests/general-tests-compat-report.xml reports/ 2>/dev/null || echo "No test results to copy from General Tests container"
+ fi
+
+ - name: Upload General Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: general-tests-compat-results-${{ matrix.isaacsim_version }}
+ path: reports/general-tests-compat-report.xml
+ retention-days: 7
+ compression-level: 9
+
+ combine-compat-results:
+ needs: [test-isaaclab-tasks-compat, test-general-compat]
+ runs-on: [self-hosted, gpu]
+ if: always()
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ lfs: false
+
+ - name: Create Reports Directory
+ run: |
+ mkdir -p reports
+
+ - name: Download All Test Results
+ uses: actions/download-artifact@v4
+ with:
+ pattern: '*-compat-results-*'
+ path: reports/
+ merge-multiple: true
+ continue-on-error: true
+
+ - name: Combine All Test Results
+ uses: ./.github/actions/combine-results
+ with:
+ tests-dir: "reports"
+ output-file: "reports/combined-compat-results.xml"
+
+ - name: Upload Combined Test Results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: daily-compat-${{ github.run_id }}-combined-test-results
+ path: reports/combined-compat-results.xml
+ retention-days: 30
+ compression-level: 9
+
+ - name: Report Test Results
+ uses: dorny/test-reporter@v1
+ if: always()
+ with:
+ name: IsaacLab Compatibility Test Results (${{ github.event_name }})
+ path: reports/combined-compat-results.xml
+ reporter: java-junit
+ max-annotations: '50'
+ report-title: "IsaacLab Compatibility Test Results - ${{ github.event_name }} - ${{ github.ref_name }}"
+
+ notify-compatibility-status:
+ needs: [setup-versions, combine-compat-results]
+ runs-on: [self-hosted, gpu]
+ if: always()
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v3
+ with:
+ fetch-depth: 0
+ lfs: false
+
+ - name: Create Compatibility Report
+ run: |
+ TRIGGER_INFO="**Trigger:** ${{ github.event_name }}"
+ ISAACSIM_VERSIONS="${{ join(fromJson(needs.setup-versions.outputs.versions), ', ') }}"
+ echo "## Daily Backwards Compatibility Test Results" > compatibility-report.md
+ echo "" >> compatibility-report.md
+ echo "$TRIGGER_INFO" >> compatibility-report.md
+ echo "**IsaacSim Versions Tested:** $ISAACSIM_VERSIONS" >> compatibility-report.md
+ echo "**Branch:** ${{ github.ref_name }}" >> compatibility-report.md
+ echo "**Commit:** ${{ github.sha }}" >> compatibility-report.md
+ echo "**Run ID:** ${{ github.run_id }}" >> compatibility-report.md
+ echo "" >> compatibility-report.md
+ echo "### Test Status:" >> compatibility-report.md
+ echo "- Results: ${{ needs.combine-compat-results.result }}" >> compatibility-report.md
+ echo "" >> compatibility-report.md
+ echo "### Artifacts:" >> compatibility-report.md
+ echo "- [Combined Test Results](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})" >> compatibility-report.md
+ echo "" >> compatibility-report.md
+ echo "---" >> compatibility-report.md
+ echo "*This report was generated automatically by the daily compatibility workflow.*" >> compatibility-report.md
+
+ - name: Upload Compatibility Report
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: compatibility-report-${{ github.run_id }}
+ path: compatibility-report.md
+ retention-days: 30
diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml
index 4680ef667f52..9af2d6e94f0b 100644
--- a/.github/workflows/docs.yaml
+++ b/.github/workflows/docs.yaml
@@ -1,3 +1,8 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
name: Build & deploy docs
on:
@@ -5,6 +10,7 @@ on:
branches:
- main
- devel
+ - 'release/**'
pull_request:
types: [opened, synchronize, reopened]
@@ -22,8 +28,7 @@ jobs:
- id: trigger-deploy
env:
REPO_NAME: ${{ secrets.REPO_NAME }}
- BRANCH_REF: ${{ secrets.BRANCH_REF }}
- if: "${{ github.repository == env.REPO_NAME && github.ref == env.BRANCH_REF }}"
+ if: "${{ github.repository == env.REPO_NAME && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/devel' || startsWith(github.ref, 'refs/heads/release/')) }}"
run: echo "defined=true" >> "$GITHUB_OUTPUT"
build-docs:
@@ -38,7 +43,7 @@ jobs:
- name: Setup python
uses: actions/setup-python@v2
with:
- python-version: "3.10"
+ python-version: "3.11"
architecture: x64
- name: Install dev requirements
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml
new file mode 100644
index 000000000000..593aec9a2cb0
--- /dev/null
+++ b/.github/workflows/labeler.yml
@@ -0,0 +1,17 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: "Pull Request Labeler"
+on:
+- pull_request_target
+
+jobs:
+ labeler:
+ permissions:
+ contents: read
+ pull-requests: write
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/labeler@v6
diff --git a/.github/workflows/license-check.yaml b/.github/workflows/license-check.yaml
new file mode 100644
index 000000000000..e3753ffcb6b5
--- /dev/null
+++ b/.github/workflows/license-check.yaml
@@ -0,0 +1,136 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: Check Python Dependency Licenses
+
+on:
+ pull_request:
+ types: [opened, synchronize, reopened]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ license-check:
+ runs-on: ubuntu-24.04
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v3
+
+ # - name: Install jq
+ # run: sudo apt-get update && sudo apt-get install -y jq
+
+ - name: Clean up disk space
+ run: |
+ rm -rf /opt/hostedtoolcache
+ rm -rf /usr/share/dotnet
+ rm -rf /opt/ghc
+ docker container prune -f
+ docker image prune -af
+ docker volume prune -f || true
+
+
+ - name: Set up Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: '3.11' # Adjust as needed
+
+ - name: Install dependencies using ./isaaclab.sh -i
+ run: |
+ # first install isaac sim
+ pip install --upgrade pip
+ pip install 'isaacsim[all,extscache]==${{ vars.ISAACSIM_BASE_VERSION || '5.0.0' }}' --extra-index-url https://pypi.nvidia.com
+ chmod +x ./isaaclab.sh # Make sure the script is executable
+ # install all lab dependencies
+ ./isaaclab.sh -i
+
+ - name: Install pip-licenses
+ run: |
+ pip install pip-licenses
+ pip install -r tools/template/requirements.txt
+ pip install -r docs/requirements.txt
+
+ # Optional: Print the license report for visibility
+ - name: Print License Report
+ run: pip-licenses --from=mixed --format=markdown
+
+ # Print pipdeptree
+ - name: Print pipdeptree
+ run: |
+ pip install pipdeptree
+ pipdeptree
+
+ - name: Check licenses against whitelist and exceptions
+ run: |
+ # Define the whitelist of allowed licenses
+ ALLOWED_LICENSES="MIT Apache BSD ISC zlib"
+
+ # Load the exceptions list from the exceptions.json file
+ EXCEPTIONS_FILE=".github/workflows/license-exceptions.json"
+
+ # Initialize counter for failed packages
+ FAILED_PACKAGES=0
+
+ # Get the list of installed packages and their licenses
+ pip-licenses --from=mixed --format=json > licenses.json
+
+ # Check the output of pip-licenses to ensure it is valid JSON
+ if ! jq empty licenses.json; then
+ echo "ERROR: Failed to parse pip-licenses output. Exiting..."
+ exit 1
+ fi
+
+ # Split ALLOWED_LICENSES into individual words
+ IFS=' ' read -r -a allowed_licenses <<< "$ALLOWED_LICENSES"
+
+ # Loop through the installed packages and their licenses
+ for pkg in $(jq -r '.[].Name' licenses.json); do
+ LICENSE=$(jq -r --arg pkg "$pkg" '.[] | select(.Name == $pkg) | .License' licenses.json)
+
+ # Check if any of the allowed licenses are a substring of the package's license
+ match_found=false
+ for allowed_license in "${allowed_licenses[@]}"; do
+ if [[ "$LICENSE" == *"$allowed_license"* ]]; then
+ match_found=true
+ break
+ fi
+ done
+
+ if [ "$match_found" = false ]; then
+ # Check if the package is in the exceptions list
+ EXCEPTION=$(jq -r --arg pkg "$pkg" --arg license "$LICENSE" \
+ '.[] | select(.package == $pkg)' "$EXCEPTIONS_FILE")
+
+ # If the package is in the exceptions list
+ if [ -n "$EXCEPTION" ]; then
+ # If the license is provided in the exceptions list, check the license
+ EXCEPTION_LICENSE=$(echo "$EXCEPTION" | jq -r '.license')
+
+ # echo "Comparing licenses for $pkg:"
+ # echo " EXCEPTION_LICENSE='${EXCEPTION_LICENSE}' (len=${#EXCEPTION_LICENSE})"
+ # echo " LICENSE='${LICENSE}' (len=${#LICENSE})"
+
+ # If the exceptions list has a license and doesn't match the current license
+ if [ "$EXCEPTION_LICENSE" != "null" ] && [ "$EXCEPTION_LICENSE" != "$LICENSE" ]; then
+ echo "ERROR: $pkg has license: $LICENSE"
+ FAILED_PACKAGES=$((FAILED_PACKAGES + 1)) # Increment the counter
+ fi
+ else
+ # If the package is not in the exceptions list
+ echo "ERROR: $pkg has license: $LICENSE"
+ FAILED_PACKAGES=$((FAILED_PACKAGES + 1)) # Increment the counter
+ fi
+ fi
+ done
+
+ # After all packages are processed, check if there were any errors
+ if [ "$FAILED_PACKAGES" -gt 0 ]; then
+ echo "ERROR: $FAILED_PACKAGES packages were flagged."
+ exit 1 # Fail the build
+ else
+ echo "All packages were checked."
+ fi
diff --git a/.github/workflows/license-exceptions.json b/.github/workflows/license-exceptions.json
new file mode 100644
index 000000000000..27b3b9c65522
--- /dev/null
+++ b/.github/workflows/license-exceptions.json
@@ -0,0 +1,448 @@
+[
+ {
+ "package": "isaaclab",
+ "license": null
+ },
+ {
+ "package": "isaaclab_assets",
+ "license": null
+ },
+ {
+ "package": "isaaclab_contrib",
+ "license": null
+ },
+ {
+ "package": "isaaclab_mimic",
+ "license": null
+ },
+ {
+ "package": "isaaclab_rl",
+ "license": null
+ },
+ {
+ "package": "isaaclab_tasks",
+ "license": null
+ },
+ {
+ "package": "isaacsim",
+ "license": null
+ },
+ {
+ "package": "isaacsim-app",
+ "license": null
+ },
+ {
+ "package": "isaacsim-asset",
+ "license": null
+ },
+ {
+ "package": "isaacsim-benchmark",
+ "license": null
+ },
+ {
+ "package": "isaacsim-code-editor",
+ "license": null
+ },
+ {
+ "package": "isaacsim-core",
+ "license": null
+ },
+ {
+ "package": "isaacsim-cortex",
+ "license": null
+ },
+ {
+ "package": "isaacsim-example",
+ "license": null
+ },
+ {
+ "package": "isaacsim-extscache-kit",
+ "license": null
+ },
+ {
+ "package": "isaacsim-extscache-kit-sdk",
+ "license": null
+ },
+ {
+ "package": "isaacsim-extscache-physics",
+ "license": null
+ },
+ {
+ "package": "isaacsim-gui",
+ "license": null
+ },
+ {
+ "package": "isaacsim-kernel",
+ "license": null
+ },
+ {
+ "package": "isaacsim-replicator",
+ "license": null
+ },
+ {
+ "package": "isaacsim-rl",
+ "license": null
+ },
+ {
+ "package": "isaacsim-robot",
+ "license": null
+ },
+ {
+ "package": "isaacsim-robot-motion",
+ "license": null
+ },
+ {
+ "package": "isaacsim-robot-setup",
+ "license": null
+ },
+ {
+ "package": "isaacsim-ros1",
+ "license": null
+ },
+ {
+ "package": "isaacsim-ros2",
+ "license": null
+ },
+ {
+ "package": "isaacsim-sensor",
+ "license": null
+ },
+ {
+ "package": "isaacsim-storage",
+ "license": null
+ },
+ {
+ "package": "isaacsim-template",
+ "license": null
+ },
+ {
+ "package": "isaacsim-test",
+ "license": null
+ },
+ {
+ "package": "isaacsim-utils",
+ "license": null
+ },
+ {
+ "package": "nvidia-cublas-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cuda-cupti-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cuda-nvrtc-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cuda-runtime-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cudnn-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cufft-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cufile-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-curand-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cusolver-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cusparse-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-cusparselt-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-nccl-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-nvjitlink-cu12",
+ "license": null
+ },
+ {
+ "package": "nvidia-nvtx-cu12",
+ "license": null
+ },
+ {
+ "package": "omniverse-kit",
+ "license": null
+ },
+ {
+ "package": "warp-lang",
+ "license": null
+ },
+ {
+ "package": "cmeel",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "cmeel-assimp",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "cmeel-boost",
+ "license": "BSL-1.0",
+ "comment": "BSL"
+ },
+ {
+ "package": "cmeel-console-bridge",
+ "license": "Zlib",
+ "comment": "ZLIBL"
+ },
+ {
+ "package": "cmeel-octomap",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "cmeel-qhull",
+ "license": "UNKNOWN",
+ "comment": "custom / OSRB"
+ },
+ {
+ "package": "cmeel-tinyxml",
+ "license": "Zlib",
+ "comment": "ZLIBL"
+ },
+ {
+ "package": "cmeel-urdfdom",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "cmeel-zlib",
+ "license": "Zlib",
+ "comment": "ZLIBL"
+ },
+ {
+ "package": "matplotlib",
+ "license": "Python Software Foundation License"
+ },
+ {
+ "package": "certifi",
+ "license": "Mozilla Public License 2.0 (MPL 2.0)"
+ },
+ {
+ "package": "rl_games",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "robomimic",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "hpp-fcl",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "pin",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "eigenpy",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "qpsolvers",
+ "license": "GNU Lesser General Public License v3 (LGPLv3)",
+ "comment": "OSRB"
+ },
+ {
+ "package": "quadprog",
+ "license": "GNU General Public License v2 or later (GPLv2+)",
+ "comment": "OSRB"
+ },
+ {
+ "package": "Markdown",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "anytree",
+ "license": "UNKNOWN",
+ "comment": "Apache"
+ },
+ {
+ "package": "click",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "egl_probe",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "filelock",
+ "license": "Unlicense",
+ "comment": "no condition"
+ },
+ {
+ "package": "proglog",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "termcolor",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "typing_extensions",
+ "license": "Python Software Foundation License",
+ "comment": "PSFL / OSRB"
+ },
+ {
+ "package": "urllib3",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "h5py",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "pillow",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "pygame",
+ "license": "GNU Library or Lesser General Public License (LGPL)",
+ "comment": "OSRB"
+ },
+ {
+ "package": "scikit-learn",
+ "license": "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "tensorboardX",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "attrs",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "jsonschema",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "jsonschema-specifications",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "referencing",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "regex",
+ "license": "UNKNOWN",
+ "comment": "Apache 2.0"
+ },
+ {
+ "package": "anyio",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package" : "hf-xet",
+ "license" : "UNKNOWN",
+ "comment": "Apache 2.0"
+ },
+ {
+ "package": "rpds-py",
+ "license" : "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "typing-inspection",
+ "license" : "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "ml_dtypes",
+ "license" : "UNKNOWN",
+ "comment": "Apache 2.0"
+ },
+ {
+ "package": "zipp",
+ "license" : "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "fsspec",
+ "license" : "UNKNOWN",
+ "comment": "BSD"
+ },
+ {
+ "package": "numpy-quaternion",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "aiohappyeyeballs",
+ "license": "Other/Proprietary License; Python Software Foundation License",
+ "comment": "PSFL / OSRB"
+ },
+ {
+ "package": "cffi",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "trio",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "pipdeptree",
+ "license": "UNKNOWN",
+ "comment": "MIT"
+ },
+ {
+ "package": "msgpack",
+ "license": "UNKNOWN",
+ "comment": "Apache 2.0"
+ },
+ {
+ "package": "onnx-ir",
+ "license": "UNKNOWN",
+ "comment": "Apache 2.0"
+ },
+ {
+ "package": "matplotlib-inline",
+ "license": "UNKNOWN",
+ "comment": "BSD-3"
+ }
+]
diff --git a/.github/workflows/postmerge-ci.yml b/.github/workflows/postmerge-ci.yml
new file mode 100644
index 000000000000..4a1f34d38a16
--- /dev/null
+++ b/.github/workflows/postmerge-ci.yml
@@ -0,0 +1,170 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+name: Post-Merge CI
+
+on:
+ push:
+ branches:
+ - main
+ - devel
+ - release/**
+
+# Concurrency control to prevent parallel runs
+concurrency:
+ group: postmerge-ci-${{ github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+env:
+ NGC_API_KEY: ${{ secrets.NGC_API_KEY }}
+ ISAACSIM_BASE_IMAGE: ${{ vars.ISAACSIM_BASE_IMAGE || 'nvcr.io/nvidia/isaac-sim' }}
+ ISAACSIM_BASE_VERSIONS_STRING: ${{ vars.ISAACSIM_BASE_VERSIONS_STRING || '5.1.0' }}
+ ISAACLAB_IMAGE_NAME: ${{ vars.ISAACLAB_IMAGE_NAME || 'isaac-lab-base' }}
+
+jobs:
+ build-and-push-images:
+ runs-on: [self-hosted, gpu]
+ timeout-minutes: 180
+ environment:
+ name: postmerge-production
+ url: https://github.com/${{ github.repository }}
+ env:
+ DOCKER_HOST: unix:///var/run/docker.sock
+ DOCKER_TLS_CERTDIR: ""
+
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ lfs: true
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+ with:
+ platforms: linux/arm64
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ with:
+ platforms: linux/amd64,linux/arm64
+ driver-opts: |
+ image=moby/buildkit:buildx-stable-1
+
+ - name: Login to NGC
+ run: |
+ # Only attempt NGC login if API key is available
+ if [ -n "${{ env.NGC_API_KEY }}" ]; then
+ echo "Logging into NGC registry..."
+ docker login -u \$oauthtoken -p ${{ env.NGC_API_KEY }} nvcr.io
+ echo "โ Successfully logged into NGC registry"
+ else
+ echo "โ ๏ธ NGC_API_KEY not available - skipping NGC login"
+ echo "This is normal when secrets are not configured"
+ fi
+
+ - name: Build and Push Docker Images
+ run: |
+ # Determine branch name
+ BRANCH_NAME="${{ github.ref_name }}"
+
+ # Replace '/' with '-' and remove any invalid characters for Docker tag
+ SAFE_BRANCH_NAME=$(echo $BRANCH_NAME | sed 's/[^a-zA-Z0-9._-]/-/g')
+
+ # Use "latest" if branch name is empty or only contains invalid characters
+ if [ -z "$SAFE_BRANCH_NAME" ]; then
+ SAFE_BRANCH_NAME="latest"
+ fi
+
+ # Get the git repository short name
+ REPO_SHORT_NAME="${{ github.event.repository.name }}"
+ if [ -z "$REPO_SHORT_NAME" ]; then
+ REPO_SHORT_NAME="verification"
+ fi
+
+ echo "Building images for branch: $BRANCH_NAME"
+ echo "Safe branch name: $SAFE_BRANCH_NAME"
+ echo "Repository name: $REPO_SHORT_NAME"
+ echo "IsaacSim versions: ${{ env.ISAACSIM_BASE_VERSIONS_STRING }}"
+
+ # Parse the env variable string into an array
+ IMAGE_BASE_VERSIONS_STRING="${{ env.ISAACSIM_BASE_VERSIONS_STRING }}"
+ # Use set to split the string into positional parameters, then convert to array
+ set -- $IMAGE_BASE_VERSIONS_STRING
+ IMAGE_BASE_VERSIONS=("$@")
+
+ for IMAGE_BASE_VERSION in "${IMAGE_BASE_VERSIONS[@]}"; do
+ IMAGE_BASE_VERSION=$(echo "$IMAGE_BASE_VERSION" | tr -d '[:space:]')
+
+ # Skip empty versions
+ if [ -z "$IMAGE_BASE_VERSION" ]; then
+ continue
+ fi
+
+ # Combine repo short name and branch name for the tag
+ COMBINED_TAG="${REPO_SHORT_NAME}-${SAFE_BRANCH_NAME}-${IMAGE_BASE_VERSION}"
+ BUILD_TAG="${COMBINED_TAG}-b${{ github.run_number }}"
+
+ # Determine if multiarch is supported by inspecting the base image manifest
+ echo "Checking if base image supports multiarch..."
+ BASE_IMAGE_FULL="${{ env.ISAACSIM_BASE_IMAGE }}:${IMAGE_BASE_VERSION}"
+
+ # Get architectures from the base image manifest
+ ARCHITECTURES=$(docker manifest inspect "$BASE_IMAGE_FULL" 2>/dev/null | grep -o '"architecture": "[^"]*"' | cut -d'"' -f4 | sort -u)
+
+ if [ -z "$ARCHITECTURES" ]; then
+ echo "Could not inspect base image manifest: $BASE_IMAGE_FULL"
+ echo "Defaulting to AMD64 only for safety"
+ BUILD_PLATFORMS="linux/amd64"
+ else
+ echo "Base image architectures found:"
+ echo "$ARCHITECTURES" | sed 's/^/ - /'
+
+ # Check if both amd64 and arm64 are present
+ HAS_AMD64=$(echo "$ARCHITECTURES" | grep -c "amd64" || true)
+ HAS_ARM64=$(echo "$ARCHITECTURES" | grep -c "arm64" || true)
+
+ if [ "$HAS_AMD64" -gt 0 ] && [ "$HAS_ARM64" -gt 0 ]; then
+ echo "Base image supports multiarch (amd64 + arm64)"
+ BUILD_PLATFORMS="linux/amd64,linux/arm64"
+ elif [ "$HAS_AMD64" -gt 0 ]; then
+ echo "Base image only supports amd64"
+ BUILD_PLATFORMS="linux/amd64"
+ elif [ "$HAS_ARM64" -gt 0 ]; then
+ echo "Base image only supports arm64"
+ BUILD_PLATFORMS="linux/arm64"
+ else
+ echo "Unknown architecture support, defaulting to amd64"
+ BUILD_PLATFORMS="linux/amd64"
+ fi
+ fi
+
+ echo "Building image: ${{ env.ISAACLAB_IMAGE_NAME }}:$COMBINED_TAG"
+ echo "IsaacSim version: $IMAGE_BASE_VERSION"
+ echo "Base image: $BASE_IMAGE_FULL"
+ echo "Target platforms: $BUILD_PLATFORMS"
+
+ # Build Docker image once with both tags for multiple architectures
+ docker buildx build \
+ --platform $BUILD_PLATFORMS \
+ --progress=plain \
+ -t ${{ env.ISAACLAB_IMAGE_NAME }}:$COMBINED_TAG \
+ -t ${{ env.ISAACLAB_IMAGE_NAME }}:$BUILD_TAG \
+ --build-arg ISAACSIM_BASE_IMAGE_ARG=${{ env.ISAACSIM_BASE_IMAGE }} \
+ --build-arg ISAACSIM_VERSION_ARG=$IMAGE_BASE_VERSION \
+ --build-arg ISAACSIM_ROOT_PATH_ARG=/isaac-sim \
+ --build-arg ISAACLAB_PATH_ARG=/workspace/isaaclab \
+ --build-arg DOCKER_USER_HOME_ARG=/root \
+ --cache-from type=gha \
+ --cache-to type=gha,mode=max \
+ -f docker/Dockerfile.base \
+ --push .
+
+ echo "โ Successfully built and pushed: ${{ env.ISAACLAB_IMAGE_NAME }}:$COMBINED_TAG (platforms: $BUILD_PLATFORMS)"
+ echo "โ Successfully built and pushed: ${{ env.ISAACLAB_IMAGE_NAME }}:$BUILD_TAG (platforms: $BUILD_PLATFORMS)"
+ done
diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml
index d34fcde4466d..f71f1f373899 100644
--- a/.github/workflows/pre-commit.yaml
+++ b/.github/workflows/pre-commit.yaml
@@ -1,9 +1,13 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
name: Run linters using pre-commit
on:
pull_request:
- push:
- branches: [main]
+ types: [opened, synchronize, reopened]
jobs:
pre-commit:
@@ -11,4 +15,6 @@ jobs:
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
+ with:
+ python-version: "3.12"
- uses: pre-commit/action@v3.0.0
diff --git a/.gitignore b/.gitignore
index ea62f833b86b..7afb58e9ee00 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,3 +60,16 @@ _build
# Pre-Trained Checkpoints
/.pretrained_checkpoints/
+
+# Teleop Recorded Dataset
+/datasets/
+
+# Tests
+tests/
+
+# Docker history
+.isaac-lab-docker-history
+
+# TacSL sensor
+**/tactile_record/*
+**/gelsight_r15_data/*
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index f3a785beb667..426a84b59b79 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,16 +1,19 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
repos:
- - repo: https://github.com/python/black
- rev: 24.3.0
+ - repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.14.10
hooks:
- - id: black
- args: ["--line-length", "120", "--unstable"]
- - repo: https://github.com/pycqa/flake8
- rev: 7.0.0
- hooks:
- - id: flake8
- additional_dependencies: [flake8-simplify, flake8-return]
+ # Run the linter
+ - id: ruff
+ args: ["--fix"]
+ # Run the formatter
+ - id: ruff-format
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.5.0
+ rev: v6.0.0
hooks:
- id: trailing-whitespace
- id: check-symlinks
@@ -26,36 +29,23 @@ repos:
- id: check-shebang-scripts-are-executable
- id: detect-private-key
- id: debug-statements
- - repo: https://github.com/pycqa/isort
- rev: 5.13.2
- hooks:
- - id: isort
- name: isort (python)
- args: ["--profile", "black", "--filter-files"]
- - repo: https://github.com/asottile/pyupgrade
- rev: v3.15.1
- hooks:
- - id: pyupgrade
- args: ["--py310-plus"]
- # FIXME: This is a hack because Pytorch does not like: torch.Tensor | dict aliasing
- exclude: "source/isaaclab/isaaclab/envs/common.py|source/isaaclab/isaaclab/ui/widgets/image_plot.py|source/isaaclab_tasks/isaaclab_tasks/direct/humanoid_amp/motions/motion_loader.py"
- repo: https://github.com/codespell-project/codespell
- rev: v2.2.6
+ rev: v2.4.1
hooks:
- id: codespell
additional_dependencies:
- tomli
- exclude: "CONTRIBUTORS.md"
+ exclude: "CONTRIBUTORS.md|docs/source/setup/walkthrough/concepts_env_design.rst"
# FIXME: Figure out why this is getting stuck under VPN.
# - repo: https://github.com/RobertCraigie/pyright-python
# rev: v1.1.315
# hooks:
# - id: pyright
- repo: https://github.com/Lucas-C/pre-commit-hooks
- rev: v1.5.1
+ rev: v1.5.5
hooks:
- id: insert-license
- files: \.py$
+ files: \.(py|ya?ml)$
args:
# - --remove-header # Remove existing license headers. Useful when updating license.
- --license-filepath
@@ -64,7 +54,7 @@ repos:
exclude: "source/isaaclab_mimic/|scripts/imitation_learning/isaaclab_mimic/"
# Apache 2.0 license for mimic files
- repo: https://github.com/Lucas-C/pre-commit-hooks
- rev: v1.5.1
+ rev: v1.5.5
hooks:
- id: insert-license
files: ^(source/isaaclab_mimic|scripts/imitation_learning/isaaclab_mimic)/.*\.py$
diff --git a/.vscode/tools/launch.template.json b/.vscode/tools/launch.template.json
index c7d6471a1790..a44f114c822b 100644
--- a/.vscode/tools/launch.template.json
+++ b/.vscode/tools/launch.template.json
@@ -33,6 +33,25 @@
"args" : ["--task", "Isaac-Reach-Franka-v0", "--num_envs", "32"],
"program": "${workspaceFolder}/scripts/reinforcement_learning/rsl_rl/play.py",
"console": "integratedTerminal"
+ },
+ {
+ "name": "Python: SinglePytest",
+ "type": "python",
+ "request": "launch",
+ "module": "pytest",
+ "args": [
+ "${file}"
+ ],
+ "console": "integratedTerminal"
+ },
+ {
+ "name": "Python: ALL Pytest",
+ "type": "python",
+ "request": "launch",
+ "module": "pytest",
+ "args": ["source/isaaclab/test"],
+ "console": "integratedTerminal",
+ "justMyCode": false
}
]
}
diff --git a/.vscode/tools/settings.template.json b/.vscode/tools/settings.template.json
index fa0f1c823169..4b07a6a8f9ad 100644
--- a/.vscode/tools/settings.template.json
+++ b/.vscode/tools/settings.template.json
@@ -61,15 +61,8 @@
],
// This enables python language server. Seems to work slightly better than jedi:
"python.languageServer": "Pylance",
- // We use "black" as a formatter:
- "python.formatting.provider": "black",
- "python.formatting.blackArgs": ["--line-length", "120"],
- // Use flake8 for linting
- "python.linting.pylintEnabled": false,
- "python.linting.flake8Enabled": true,
- "python.linting.flake8Args": [
- "--max-line-length=120"
- ],
+ // Use ruff as a formatter and linter
+ "ruff.configuration": "${workspaceFolder}/pyproject.toml",
// Use docstring generator
"autoDocstring.docstringFormat": "google",
"autoDocstring.guessTypes": true,
diff --git a/.vscode/tools/setup_vscode.py b/.vscode/tools/setup_vscode.py
index e905767a75e6..9e2c6375ab75 100644
--- a/.vscode/tools/setup_vscode.py
+++ b/.vscode/tools/setup_vscode.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 000000000000..70d123b55242
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,227 @@
+cff-version: 1.2.0
+message: "If you use this software, please cite the technical report of Isaac Lab."
+title: Isaac Lab
+version: 2.3.2
+repository-code: https://github.com/isaac-sim/IsaacLab
+type: software
+authors:
+ - name: Isaac Lab Project Developers
+identifiers:
+ - type: url
+ value: https://github.com/isaac-sim/IsaacLab
+ - type: doi
+ value: 10.48550/arXiv.2511.04831
+url: https://isaac-sim.github.io/IsaacLab
+license: BSD-3-Clause
+preferred-citation:
+ type: article
+ title: Isaac Lab - A GPU-Accelerated Simulation Framework for Multi-Modal Robot Learning
+ authors:
+ - family-names: Mittal
+ given-names: Mayank
+ - family-names: Roth
+ given-names: Pascal
+ - family-names: Tigue
+ given-names: James
+ - family-names: Richard
+ given-names: Antoine
+ - family-names: Zhang
+ given-names: Octi
+ - family-names: Du
+ given-names: Peter
+ - family-names: Serrano-Muรฑoz
+ given-names: Antonio
+ - family-names: Yao
+ given-names: Xinjie
+ - family-names: Zurbrรผgg
+ given-names: Renรฉ
+ - family-names: Rudin
+ given-names: Nikita
+ - family-names: Wawrzyniak
+ given-names: Lukasz
+ - family-names: Rakhsha
+ given-names: Milad
+ - family-names: Denzler
+ given-names: Alain
+ - family-names: Heiden
+ given-names: Eric
+ - family-names: Borovicka
+ given-names: Ales
+ - family-names: Ahmed
+ given-names: Ossama
+ - family-names: Akinola
+ given-names: Iretiayo
+ - family-names: Anwar
+ given-names: Abrar
+ - family-names: Carlson
+ given-names: Mark T.
+ - family-names: Feng
+ given-names: Ji Yuan
+ - family-names: Garg
+ given-names: Animesh
+ - family-names: Gasoto
+ given-names: Renato
+ - family-names: Gulich
+ given-names: Lionel
+ - family-names: Guo
+ given-names: Yijie
+ - family-names: Gussert
+ given-names: M.
+ - family-names: Hansen
+ given-names: Alex
+ - family-names: Kulkarni
+ given-names: Mihir
+ - family-names: Li
+ given-names: Chenran
+ - family-names: Liu
+ given-names: Wei
+ - family-names: Makoviychuk
+ given-names: Viktor
+ - family-names: Malczyk
+ given-names: Grzegorz
+ - family-names: Mazhar
+ given-names: Hammad
+ - family-names: Moghani
+ given-names: Masoud
+ - family-names: Murali
+ given-names: Adithyavairavan
+ - family-names: Noseworthy
+ given-names: Michael
+ - family-names: Poddubny
+ given-names: Alexander
+ - family-names: Ratliff
+ given-names: Nathan
+ - family-names: Rehberg
+ given-names: Welf
+ - family-names: Schwarke
+ given-names: Clemens
+ - family-names: Singh
+ given-names: Ritvik
+ - family-names: Smith
+ given-names: James Latham
+ - family-names: Tang
+ given-names: Bingjie
+ - family-names: Thaker
+ given-names: Ruchik
+ - family-names: Trepte
+ given-names: Matthew
+ - family-names: Van Wyk
+ given-names: Karl
+ - family-names: Yu
+ given-names: Fangzhou
+ - family-names: Millane
+ given-names: Alex
+ - family-names: Ramasamy
+ given-names: Vikram
+ - family-names: Steiner
+ given-names: Remo
+ - family-names: Subramanian
+ given-names: Sangeeta
+ - family-names: Volk
+ given-names: Clemens
+ - family-names: Chen
+ given-names: CY
+ - family-names: Jawale
+ given-names: Neel
+ - family-names: Kuruttukulam
+ given-names: Ashwin Varghese
+ - family-names: Lin
+ given-names: Michael A.
+ - family-names: Mandlekar
+ given-names: Ajay
+ - family-names: Patzwaldt
+ given-names: Karsten
+ - family-names: Welsh
+ given-names: John
+ - family-names: Lafleche
+ given-names: Jean-Francois
+ - family-names: Moรซnne-Loccoz
+ given-names: Nicolas
+ - family-names: Park
+ given-names: Soowan
+ - family-names: Stepinski
+ given-names: Rob
+ - family-names: Van Gelder
+ given-names: Dirk
+ - family-names: Amevor
+ given-names: Chris
+ - family-names: Carius
+ given-names: Jan
+ - family-names: Chang
+ given-names: Jumyung
+ - family-names: He Chen
+ given-names: Anka
+ - family-names: Ciechomski
+ given-names: Pablo de Heras
+ - family-names: Daviet
+ given-names: Gilles
+ - family-names: Mohajerani
+ given-names: Mohammad
+ - family-names: von Muralt
+ given-names: Julia
+ - family-names: Reutskyy
+ given-names: Viktor
+ - family-names: Sauter
+ given-names: Michael
+ - family-names: Schirm
+ given-names: Simon
+ - family-names: Shi
+ given-names: Eric L.
+ - family-names: Terdiman
+ given-names: Pierre
+ - family-names: Vilella
+ given-names: Kenny
+ - family-names: Widmer
+ given-names: Tobias
+ - family-names: Yeoman
+ given-names: Gordon
+ - family-names: Chen
+ given-names: Tiffany
+ - family-names: Grizan
+ given-names: Sergey
+ - family-names: Li
+ given-names: Cathy
+ - family-names: Li
+ given-names: Lotus
+ - family-names: Smith
+ given-names: Connor
+ - family-names: Wiltz
+ given-names: Rafael
+ - family-names: Alexis
+ given-names: Kostas
+ - family-names: Chang
+ given-names: Yan
+ - family-names: Fan
+ given-names: Linxi "Jim"
+ - family-names: Farshidian
+ given-names: Farbod
+ - family-names: Handa
+ given-names: Ankur
+ - family-names: Huang
+ given-names: Spencer
+ - family-names: Hutter
+ given-names: Marco
+ - family-names: Narang
+ given-names: Yashraj
+ - family-names: Pouya
+ given-names: Soha
+ - family-names: Sheng
+ given-names: Shiwei
+ - family-names: Zhu
+ given-names: Yuke
+ - family-names: Macklin
+ given-names: Miles
+ - family-names: Moravanszky
+ given-names: Adam
+ - family-names: Reist
+ given-names: Philipp
+ - family-names: Guo
+ given-names: Yunrong
+ - family-names: Hoeller
+ given-names: David
+ - family-names: State
+ given-names: Gavriel
+ journal: arXiv preprint arXiv:2511.04831
+ year: 2025
+ url: https://arxiv.org/abs/2511.04831
+ doi: 10.48550/arXiv.2511.04831
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b837c0df9241..d627fa2e27b6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,3 +6,40 @@ design proposals and more.
For general information on how to contribute see
.
+
+---
+
+Developer Certificate of Origin
+Version 1.1
+
+Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+
+Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+(a) The contribution was created in whole or in part by me and I
+ have the right to submit it under the open source license
+ indicated in the file; or
+
+(b) The contribution is based upon previous work that, to the best
+ of my knowledge, is covered under an appropriate open source
+ license and I have the right under that license to submit that
+ work with modifications, whether created in whole or in part
+ by me, under the same open source license (unless I am
+ permitted to submit under a different license), as indicated
+ in the file; or
+
+(c) The contribution was provided directly to me by some other
+ person who certified (a), (b) or (c) and I have not modified
+ it.
+
+(d) I understand and agree that this project and the contribution
+ are public and that a record of the contribution (including all
+ personal information I submit with it, including my sign-off) is
+ maintained indefinitely and may be redistributed consistent with
+ this project or the open source license(s) involved.
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index d84ad8963c36..9fbfe7f1bf30 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -20,6 +20,9 @@ Guidelines for modifications:
---
* Antonio Serrano-Muรฑoz
+* Ben Johnston
+* Brian McCann
+* Clemens Schwarke
* David Hoeller
* Farbod Farshidian
* Hunter Hansen
@@ -29,74 +32,149 @@ Guidelines for modifications:
* Matthew Trepte
* Mayank Mittal
* Nikita Rudin
+* Octi (Zhengyu) Zhang
* Pascal Roth
* Sheikh Dawood
* Ossama Ahmed
+* Greg Attra
## Contributors
+* Alessandro Assirelli
+* Alex Omar
* Alice Zhou
* Amr Mousa
* Andrej Orsula
* Anton Bjรธrndahl Mortensen
+* Antonin Raffin
* Arjun Bhardwaj
* Ashwin Varghese Kuruttukulam
+* Bikram Pandit
+* Bingjie Tang
* Brayden Zhang
+* Brian Bingham
+* Brian McCann
* Cameron Upright
* Calvin Yu
+* Cathy Y. Li
* Cheng-Rong Lai
* Chenyu Yang
+* Connor Smith
* CY (Chien-Ying) Chen
* David Yang
+* Dhananjay Shendre
+* Dongxuan Fan
* Dorsa Rohani
+* Emily Sturman
+* Emmanuel Ferdman
+* Fabian Jenelten
+* Felipe Mohr
* Felix Yu
* Gary Lvov
* Giulio Romualdi
+* Grzegorz Malczyk
* Haoran Zhou
+* Harsh Patel
* HoJin Jeon
* Hongwei Xiong
* Hongyu Li
+* Hougant Chen
+* Huihua Zhao
* Iretiayo Akinola
* Jack Zeng
* Jan Kerner
* Jean Tampon
+* Jeonghwan Kim
* Jia Lin Yuan
+* Jiakai Zhang
* Jinghuan Shang
* Jingzhou Liu
* Jinqi Wei
+* Jinyeob Kim
* Johnson Sun
+* Juana Du
* Kaixi Bao
+* Kris Wilson
+* Krishna Lakhi
* Kourosh Darvish
+* Kousheek Chakraborty
* Lionel Gulich
+* Lotus Li
* Louis Le Lay
* Lorenz Wellhausen
+* Lukas Frรถhlich
* Manuel Schweiger
* Masoud Moghani
+* Mateo Guaman Castro
+* Maurice Rahme
* Michael Gussert
* Michael Noseworthy
+* Michael Lin
+* Miguel Alonso Jr
+* Mihir Kulkarni
+* Mingxue Gu
+* Mingyu Lee
* Muhong Guo
+* Narendra Dahile
+* Neel Anand Jawale
* Nicola Loi
+* Norbert Cygiert
+* Nuoyan Chen (Alvin)
* Nuralem Abizov
* Ori Gadot
* Oyindamola Omotuyi
* รzhan รzen
+* Patrick Yin
* Peter Du
+* Philipp Reist
+* Pulkit Goyal
* Qian Wan
+* Qingyang Jiang
* Qinxi Yu
+* Rafael Wiltz
+* Renaud Poncelet
* Renรฉ Zurbrรผgg
* Ritvik Singh
* Rosario Scalise
+* Ryan Gresia
* Ryley McCarroll
+* Sahara Yuta
+* Sergey Grizan
* Shafeef Omar
+* Shane Reetz
+* Shaoshu Su
+* Shaurya Dewan
+* Sixiang Chen
* Shundo Kishi
+* Stefan Van de Mosselaer
* Stephan Pleines
+* Tiffany Chen
+* Trushant Adeshara
+* Tyler Lum
+* Victor Khaustov
+* Virgilio Gรณmez Lambo
* Vladimir Fokow
* Wei Yang
+* Welf Rehberg
* Xavier Nal
+* Xiaodi Yuan
+* Xinjie Yao
+* Xinpeng Liu
* Yang Jin
+* Yanzi Zhu
+* Yijie Guo
+* Yohan Choi
* Yujian Zhang
-* Zhengyu Zhang
+* Yun Liu
+* Zehao Wang
+* Zijian Li
* Ziqi Fan
+* Zoe McCarthy
+* David Leon
+* Song Yi
+* Weihua Zhang
+* Tsz Ki GAO
+* Anke Zhao
## Acknowledgements
@@ -106,4 +184,5 @@ Guidelines for modifications:
* Gavriel State
* Hammad Mazhar
* Marco Hutter
+* Yan Chang
* Yashraj Narang
diff --git a/LICENSE b/LICENSE
index b0f7751b6cef..dee9ba551f42 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
All rights reserved.
diff --git a/README.md b/README.md
index 936823f98067..05c79619d667 100644
--- a/README.md
+++ b/README.md
@@ -4,9 +4,9 @@
# Isaac Lab
-[](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html)
-[](https://docs.python.org/3/whatsnew/3.10.html)
-[](https://releases.ubuntu.com/20.04/)
+[](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html)
+[](https://docs.python.org/3/whatsnew/3.11.html)
+[](https://releases.ubuntu.com/22.04/)
[](https://www.microsoft.com/en-us/)
[](https://github.com/isaac-sim/IsaacLab/actions/workflows/pre-commit.yaml)
[](https://github.com/isaac-sim/IsaacLab/actions/workflows/docs.yaml)
@@ -14,14 +14,23 @@
[](https://opensource.org/license/apache-2-0)
-**Isaac Lab** is a GPU-accelerated, open-source framework designed to unify and simplify robotics research workflows, such as reinforcement learning, imitation learning, and motion planning. Built on [NVIDIA Isaac Sim](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html), it combines fast and accurate physics and sensor simulation, making it an ideal choice for sim-to-real transfer in robotics.
+**Isaac Lab** is a GPU-accelerated, open-source framework designed to unify and simplify robotics research workflows,
+such as reinforcement learning, imitation learning, and motion planning. Built on [NVIDIA Isaac Sim](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html),
+it combines fast and accurate physics and sensor simulation, making it an ideal choice for sim-to-real
+transfer in robotics.
-Isaac Lab provides developers with a range of essential features for accurate sensor simulation, such as RTX-based cameras, LIDAR, or contact sensors. The framework's GPU acceleration enables users to run complex simulations and computations faster, which is key for iterative processes like reinforcement learning and data-intensive tasks. Moreover, Isaac Lab can run locally or be distributed across the cloud, offering flexibility for large-scale deployments.
+Isaac Lab provides developers with a range of essential features for accurate sensor simulation, such as RTX-based
+cameras, LIDAR, or contact sensors. The framework's GPU acceleration enables users to run complex simulations and
+computations faster, which is key for iterative processes like reinforcement learning and data-intensive tasks.
+Moreover, Isaac Lab can run locally or be distributed across the cloud, offering flexibility for large-scale deployments.
+
+A detailed description of Isaac Lab can be found in our [arXiv paper](https://arxiv.org/abs/2511.04831).
## Key Features
Isaac Lab offers a comprehensive set of tools and environments designed to facilitate robot learning:
-- **Robots**: A diverse collection of robots, from manipulators, quadrupeds, to humanoids, with 16 commonly available models.
+
+- **Robots**: A diverse collection of robots, from manipulators, quadrupeds, to humanoids, with more than 16 commonly available models.
- **Environments**: Ready-to-train implementations of more than 30 environments, which can be trained with popular reinforcement learning frameworks such as RSL RL, SKRL, RL Games, or Stable Baselines. We also support multi-agent reinforcement learning.
- **Physics**: Rigid bodies, articulated systems, deformable objects
- **Sensors**: RGB/depth/segmentation cameras, camera annotations, IMU, contact sensors, ray casters.
@@ -29,7 +38,59 @@ Isaac Lab offers a comprehensive set of tools and environments designed to facil
## Getting Started
-Our [documentation page](https://isaac-sim.github.io/IsaacLab) provides everything you need to get started, including detailed tutorials and step-by-step guides. Follow these links to learn more about:
+### WatCloud + TurboVNC
+
+For WatCloud / Slurm usage, the simplest interactive workflow is:
+
+1. Install TurboVNC Viewer on your local machine.
+2. Start your Slurm dev session so `asd-dev-session` lands on the active compute node.
+3. Forward local port `5900` to the Slurm node through `asd-dev-session`: `ssh -L 5900:localhost:5901 asd-dev-session`
+4. Connect TurboVNC Viewer to `localhost:5900`.
+
+Minimal commands on the Slurm node:
+
+```bash
+cd ~/IsaacLab
+./docker/container.py build
+./docker/container.py start
+./docker/container.py enter base
+```
+
+Inside the container, run Isaac Lab as usual:
+
+```bash
+./isaaclab.sh -s
+```
+
+or run a script:
+
+```bash
+./isaaclab.sh -p
+```
+
+On your local machine, open the SSH tunnel:
+
+```bash
+ssh -L 5900:localhost:5900 asd-dev-session
+```
+
+Then open TurboVNC Viewer and connect to:
+
+```text
+localhost:5900
+```
+
+Notes:
+
+- The container now starts TurboVNC automatically.
+- The default remote desktop resolution is `1280x720`.
+- If the viewer connects but Isaac is not visible yet, enter the container and start Isaac using `./isaaclab.sh -s`.
+- If you change Docker or VNC startup files, rebuild the image before restarting the container.
+
+### Documentation
+
+Our [documentation page](https://isaac-sim.github.io/IsaacLab) provides everything you need to get started, including
+detailed tutorials and step-by-step guides. Follow these links to learn more about:
- [Installation steps](https://isaac-sim.github.io/IsaacLab/main/source/setup/installation/index.html#local-installation)
- [Reinforcement learning](https://isaac-sim.github.io/IsaacLab/main/source/overview/reinforcement-learning/rl_existing_scripts.html)
@@ -37,6 +98,21 @@ Our [documentation page](https://isaac-sim.github.io/IsaacLab) provides everythi
- [Available environments](https://isaac-sim.github.io/IsaacLab/main/source/overview/environments.html)
+## Isaac Sim Version Dependency
+
+Isaac Lab is built on top of Isaac Sim and requires specific versions of Isaac Sim that are compatible with each
+release of Isaac Lab. Below, we outline the recent Isaac Lab releases and GitHub branches and their corresponding
+dependency versions for Isaac Sim.
+
+| Isaac Lab Version | Isaac Sim Version |
+| ----------------------------- | ------------------------- |
+| `main` branch | Isaac Sim 4.5 / 5.0 / 5.1 |
+| `v2.3.X` | Isaac Sim 4.5 / 5.0 / 5.1 |
+| `v2.2.X` | Isaac Sim 4.5 / 5.0 |
+| `v2.1.X` | Isaac Sim 4.5 |
+| `v2.0.X` | Isaac Sim 4.5 |
+
+
## Contributing to Isaac Lab
We wholeheartedly welcome contributions from the community to make this framework mature and useful for everyone.
@@ -45,8 +121,8 @@ These may happen as bug reports, feature requests, or code contributions. For de
## Show & Tell: Share Your Inspiration
-We encourage you to utilize our [Show & Tell](https://github.com/isaac-sim/IsaacLab/discussions/categories/show-and-tell) area in the
-`Discussions` section of this repository. This space is designed for you to:
+We encourage you to utilize our [Show & Tell](https://github.com/isaac-sim/IsaacLab/discussions/categories/show-and-tell)
+area in the `Discussions` section of this repository. This space is designed for you to:
* Share the tutorials you've created
* Showcase your learning content
@@ -61,40 +137,54 @@ innovation in robotics and simulation.
Please see the [troubleshooting](https://isaac-sim.github.io/IsaacLab/main/source/refs/troubleshooting.html) section for
common fixes or [submit an issue](https://github.com/isaac-sim/IsaacLab/issues).
-For issues related to Isaac Sim, we recommend checking its [documentation](https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/overview.html)
+For issues related to Isaac Sim, we recommend checking its [documentation](https://docs.isaacsim.omniverse.nvidia.com/latest/index.html)
or opening a question on its [forums](https://forums.developer.nvidia.com/c/agx-autonomous-machines/isaac/67).
## Support
-* Please use GitHub [Discussions](https://github.com/isaac-sim/IsaacLab/discussions) for discussing ideas, asking questions, and requests for new features.
-* Github [Issues](https://github.com/isaac-sim/IsaacLab/issues) should only be used to track executable pieces of work with a definite scope and a clear deliverable. These can be fixing bugs, documentation issues, new features, or general updates.
+* Please use GitHub [Discussions](https://github.com/isaac-sim/IsaacLab/discussions) for discussing ideas,
+ asking questions, and requests for new features.
+* Github [Issues](https://github.com/isaac-sim/IsaacLab/issues) should only be used to track executable pieces of
+ work with a definite scope and a clear deliverable. These can be fixing bugs, documentation issues, new features,
+ or general updates.
## Connect with the NVIDIA Omniverse Community
-Have a project or resource you'd like to share more widely? We'd love to hear from you! Reach out to the
-NVIDIA Omniverse Community team at OmniverseCommunity@nvidia.com to discuss potential opportunities
-for broader dissemination of your work.
+Do you have a project or resource you'd like to share more widely? We'd love to hear from you!
+Reach out to the NVIDIA Omniverse Community team at OmniverseCommunity@nvidia.com to explore opportunities
+to spotlight your work.
-Join us in building a vibrant, collaborative ecosystem where creativity and technology intersect. Your
-contributions can make a significant impact on the Isaac Lab community and beyond!
+You can also join the conversation on the [Omniverse Discord](https://discord.com/invite/nvidiaomniverse) to
+connect with other developers, share your projects, and help grow a vibrant, collaborative ecosystem
+where creativity and technology intersect. Your contributions can make a meaningful impact on the Isaac Lab
+community and beyond!
## License
-The Isaac Lab framework is released under [BSD-3 License](LICENSE). The `isaaclab_mimic` extension and its corresponding standalone scripts are released under [Apache 2.0](LICENSE-mimic). The license files of its dependencies and assets are present in the [`docs/licenses`](docs/licenses) directory.
+The Isaac Lab framework is released under [BSD-3 License](LICENSE). The `isaaclab_mimic` extension and its
+corresponding standalone scripts are released under [Apache 2.0](LICENSE-mimic). The license files of its
+dependencies and assets are present in the [`docs/licenses`](docs/licenses) directory.
+
+Note that Isaac Lab requires Isaac Sim, which includes components under proprietary licensing terms. Please see the [Isaac Sim license](docs/licenses/dependencies/isaacsim-license.txt) for information on Isaac Sim licensing.
+
+Note that the `isaaclab_mimic` extension requires cuRobo, which has proprietary licensing terms that can be found in [`docs/licenses/dependencies/cuRobo-license.txt`](docs/licenses/dependencies/cuRobo-license.txt).
-## Acknowledgement
-Isaac Lab development initiated from the [Orbit](https://isaac-orbit.github.io/) framework. We would appreciate if you would cite it in academic publications as well:
+## Citation
+
+If you use Isaac Lab in your research, please cite the technical report:
```
-@article{mittal2023orbit,
- author={Mittal, Mayank and Yu, Calvin and Yu, Qinxi and Liu, Jingzhou and Rudin, Nikita and Hoeller, David and Yuan, Jia Lin and Singh, Ritvik and Guo, Yunrong and Mazhar, Hammad and Mandlekar, Ajay and Babich, Buck and State, Gavriel and Hutter, Marco and Garg, Animesh},
- journal={IEEE Robotics and Automation Letters},
- title={Orbit: A Unified Simulation Framework for Interactive Robot Learning Environments},
- year={2023},
- volume={8},
- number={6},
- pages={3740-3747},
- doi={10.1109/LRA.2023.3270034}
+@article{mittal2025isaaclab,
+ title={Isaac Lab: A GPU-Accelerated Simulation Framework for Multi-Modal Robot Learning},
+ author={Mayank Mittal and Pascal Roth and James Tigue and Antoine Richard and Octi Zhang and Peter Du and Antonio Serrano-Muรฑoz and Xinjie Yao and Renรฉ Zurbrรผgg and Nikita Rudin and Lukasz Wawrzyniak and Milad Rakhsha and Alain Denzler and Eric Heiden and Ales Borovicka and Ossama Ahmed and Iretiayo Akinola and Abrar Anwar and Mark T. Carlson and Ji Yuan Feng and Animesh Garg and Renato Gasoto and Lionel Gulich and Yijie Guo and M. Gussert and Alex Hansen and Mihir Kulkarni and Chenran Li and Wei Liu and Viktor Makoviychuk and Grzegorz Malczyk and Hammad Mazhar and Masoud Moghani and Adithyavairavan Murali and Michael Noseworthy and Alexander Poddubny and Nathan Ratliff and Welf Rehberg and Clemens Schwarke and Ritvik Singh and James Latham Smith and Bingjie Tang and Ruchik Thaker and Matthew Trepte and Karl Van Wyk and Fangzhou Yu and Alex Millane and Vikram Ramasamy and Remo Steiner and Sangeeta Subramanian and Clemens Volk and CY Chen and Neel Jawale and Ashwin Varghese Kuruttukulam and Michael A. Lin and Ajay Mandlekar and Karsten Patzwaldt and John Welsh and Huihua Zhao and Fatima Anes and Jean-Francois Lafleche and Nicolas Moรซnne-Loccoz and Soowan Park and Rob Stepinski and Dirk Van Gelder and Chris Amevor and Jan Carius and Jumyung Chang and Anka He Chen and Pablo de Heras Ciechomski and Gilles Daviet and Mohammad Mohajerani and Julia von Muralt and Viktor Reutskyy and Michael Sauter and Simon Schirm and Eric L. Shi and Pierre Terdiman and Kenny Vilella and Tobias Widmer and Gordon Yeoman and Tiffany Chen and Sergey Grizan and Cathy Li and Lotus Li and Connor Smith and Rafael Wiltz and Kostas Alexis and Yan Chang and David Chu and Linxi "Jim" Fan and Farbod Farshidian and Ankur Handa and Spencer Huang and Marco Hutter and Yashraj Narang and Soha Pouya and Shiwei Sheng and Yuke Zhu and Miles Macklin and Adam Moravanszky and Philipp Reist and Yunrong Guo and David Hoeller and Gavriel State},
+ journal={arXiv preprint arXiv:2511.04831},
+ year={2025},
+ url={https://arxiv.org/abs/2511.04831}
}
```
+
+## Acknowledgement
+
+Isaac Lab development initiated from the [Orbit](https://isaac-orbit.github.io/) framework.
+We gratefully acknowledge the authors of Orbit for their foundational contributions.
diff --git a/VERSION b/VERSION
index e9307ca5751b..f90b1afc082f 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.0.2
+2.3.2
diff --git a/apps/isaaclab.python.headless.kit b/apps/isaaclab.python.headless.kit
index 9470e97c15d6..03a6bf196d01 100644
--- a/apps/isaaclab.python.headless.kit
+++ b/apps/isaaclab.python.headless.kit
@@ -5,7 +5,7 @@
[package]
title = "Isaac Lab Python Headless"
description = "An app for running Isaac Lab headlessly"
-version = "2.0.2"
+version = "2.3.2"
# That makes it browsable in UI with "experience" filter
keywords = ["experience", "app", "isaaclab", "python", "headless"]
@@ -15,7 +15,7 @@ keywords = ["experience", "app", "isaaclab", "python", "headless"]
app.versionFile = "${exe-path}/VERSION"
app.folder = "${exe-path}/"
app.name = "Isaac-Sim"
-app.version = "4.5.0"
+app.version = "5.1.0"
##################################
# Omniverse related dependencies #
@@ -28,6 +28,10 @@ app.version = "4.5.0"
"usdrt.scenegraph" = {}
"omni.kit.telemetry" = {}
"omni.kit.loop" = {}
+# this is needed to create physics material through CreatePreviewSurfaceMaterialPrim
+"omni.kit.usd.mdl" = {}
+# this is used for converting assets that have the wrong units
+"omni.usd.metrics.assembler.ui" = {}
[settings]
app.content.emptyStageOnStart = false
@@ -69,6 +73,12 @@ app.hydraEngine.waitIdle = false
# app.hydra.aperture.conform = 4 # in 105.1 pixels are square by default
omni.replicator.asyncRendering = false
+### FSD
+# this .kit file is used for headless, no-rendering cases. There won't be a scene delegate
+# created, but setting useFSD to false here is done to not do full fabric population, but
+# instead to minimal population
+app.useFabricSceneDelegate = false
+
# Enable Iray and pxr by setting this to "rtx,iray,pxr"
renderer.enabled = "rtx"
@@ -78,6 +88,12 @@ app.audio.enabled = false
# Enable Vulkan - avoids torch+cu12 error on windows
app.vulkan = true
+# Set profiler backend to NVTX by default
+app.profilerBackend = "nvtx"
+
+# Disables rate limit in runloop
+app.runLoops.main.rateLimitEnabled=false
+
# hide NonToggleable Exts
exts."omni.kit.window.extensions".hideNonToggleableExts = true
exts."omni.kit.window.extensions".showFeatureOnly = false
@@ -85,11 +101,14 @@ exts."omni.kit.window.extensions".showFeatureOnly = false
# set the default ros bridge to disable on startup
isaac.startup.ros_bridge_extension = ""
+# disable the metrics assembler change listener, we don't want to do any runtime changes
+metricsAssembler.changeListenerEnabled = false
+
# Extensions
###############################
[settings.exts."omni.kit.registry.nucleus"]
registries = [
- { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/106/shared" },
+ { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/107/shared" },
{ name = "kit/sdk", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/sdk/${kit_version_short}/${kit_git_hash}" },
{ name = "kit/community", url = "https://dw290v42wisod.cloudfront.net/exts/kit/community" },
]
@@ -145,6 +164,8 @@ fabricUpdateTransformations = false
fabricUpdateVelocities = false
fabricUpdateForceSensors = false
fabricUpdateJointStates = false
+### When Direct GPU mode is enabled (suppressReadback=true) use direct interop between PhysX GPU and Fabric
+fabricUseGPUInterop = true
# Performance improvement
resourcemonitor.timeBetweenQueries = 100
@@ -194,6 +215,6 @@ enabled=true # Enable this for DLSS
# set the S3 directory manually to the latest published S3
# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
[settings]
-persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.default = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.cloud = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.nvidia = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
diff --git a/apps/isaaclab.python.headless.rendering.kit b/apps/isaaclab.python.headless.rendering.kit
index ddb7000b96c0..e11b89ec8367 100644
--- a/apps/isaaclab.python.headless.rendering.kit
+++ b/apps/isaaclab.python.headless.rendering.kit
@@ -9,7 +9,7 @@
[package]
title = "Isaac Lab Python Headless Camera"
description = "An app for running Isaac Lab headlessly with rendering enabled"
-version = "2.0.2"
+version = "2.3.2"
# That makes it browsable in UI with "experience" filter
keywords = ["experience", "app", "isaaclab", "python", "camera", "minimal"]
@@ -32,7 +32,12 @@ cameras_enabled = true
app.versionFile = "${exe-path}/VERSION"
app.folder = "${exe-path}/"
app.name = "Isaac-Sim"
-app.version = "4.5.0"
+app.version = "5.1.0"
+
+### FSD
+app.useFabricSceneDelegate = true
+# Temporary, should be enabled by default in Kit soon
+rtx.hydra.readTransformsFromFabricInRenderDelegate = true
# Disable print outs on extension startup information
# this only disables the app print_and_log function
@@ -45,12 +50,16 @@ isaac.startup.ros_bridge_extension = ""
# Disabling these settings reduces renderer VRAM usage and improves rendering performance, but at some quality cost
rtx.translucency.enabled = false
rtx.reflections.enabled = false
+rtx.reflections.denoiser.enabled = false
rtx.indirectDiffuse.enabled = false
+rtx.indirectDiffuse.denoiser.enabled = false
rtx-transient.dlssg.enabled = false
-rtx.directLighting.sampledLighting.enabled = true
-rtx.directLighting.sampledLighting.samplesPerPixel = 1
+rtx-transient.dldenoiser.enabled = false
+rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.directLighting.sampledLighting.enabled = false
+rtx.raytracing.subpixel.mode = 0
rtx.sceneDb.ambientLightIntensity = 1.0
-# rtx.shadows.enabled = false
+rtx.shadows.enabled = false
# Avoids replicator warning
rtx.pathtracing.maxSamplesPerLaunch = 1000000
@@ -78,17 +87,29 @@ app.updateOrder.checkForHydraRenderComplete = 1000
app.renderer.waitIdle=true
app.hydraEngine.waitIdle=true
+# Forces serial processing for omni graph to avoid NCCL timeout hangs in distributed training
+app.execution.debug.forceSerial = true
+
app.audio.enabled = false
# Enable Vulkan - avoids torch+cu12 error on windows
app.vulkan = true
+# Set profiler backend to NVTX by default
+app.profilerBackend = "nvtx"
+
+# Disables rate limit in runloop
+app.runLoops.main.rateLimitEnabled=false
+
# disable replicator orchestrator for better runtime perf
exts."omni.replicator.core".Orchestrator.enabled = false
+# disable the metrics assembler change listener, we don't want to do any runtime changes
+metricsAssembler.changeListenerEnabled = false
+
[settings.exts."omni.kit.registry.nucleus"]
registries = [
- { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/106/shared" },
+ { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/107/shared" },
{ name = "kit/sdk", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/sdk/${kit_version_short}/${kit_git_hash}" },
{ name = "kit/community", url = "https://dw290v42wisod.cloudfront.net/exts/kit/community" },
]
@@ -99,6 +120,8 @@ interceptSysStdOutput = false
logSysStdOutput = false
[settings.app.renderer]
+resolution.height = 720
+resolution.width = 1280
skipWhileMinimized = false
sleepMsOnFocus = 0
sleepMsOutOfFocus = 0
@@ -115,6 +138,8 @@ fabricUpdateTransformations = false
fabricUpdateVelocities = false
fabricUpdateForceSensors = false
fabricUpdateJointStates = false
+### When Direct GPU mode is enabled (suppressReadback=true) use direct interop between PhysX GPU and Fabric
+fabricUseGPUInterop = true
# Register extension folder from this repo in kit
[settings.app.exts]
@@ -137,6 +162,6 @@ folders = [
# set the S3 directory manually to the latest published S3
# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
[settings]
-persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.default = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.cloud = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.nvidia = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
diff --git a/apps/isaaclab.python.kit b/apps/isaaclab.python.kit
index f677c9f72d8a..5ab46465657f 100644
--- a/apps/isaaclab.python.kit
+++ b/apps/isaaclab.python.kit
@@ -5,7 +5,7 @@
[package]
title = "Isaac Lab Python"
description = "An app for running Isaac Lab"
-version = "2.0.2"
+version = "2.3.2"
# That makes it browsable in UI with "experience" filter
keywords = ["experience", "app", "usd"]
@@ -24,12 +24,9 @@ keywords = ["experience", "app", "usd"]
"isaacsim.gui.menu" = {}
"isaacsim.gui.property" = {}
"isaacsim.replicator.behavior" = {}
-"isaacsim.robot_motion.lula" = {}
-"isaacsim.robot_motion.motion_generation" = {}
"isaacsim.robot.manipulators" = {}
"isaacsim.robot.policy.examples" = {}
"isaacsim.robot.schema" = {}
-"isaacsim.robot.surface_gripper" = {}
"isaacsim.robot.wheeled_robots" = {}
"isaacsim.sensors.camera" = {}
"isaacsim.sensors.physics" = {}
@@ -41,7 +38,7 @@ keywords = ["experience", "app", "usd"]
# Isaac Sim Extra
"isaacsim.asset.importer.mjcf" = {}
-"isaacsim.asset.importer.urdf" = {}
+"isaacsim.asset.importer.urdf" = {version = "2.4.31", exact = true}
"omni.physx.bundle" = {}
"omni.physx.tensors" = {}
"omni.replicator.core" = {}
@@ -59,7 +56,6 @@ keywords = ["experience", "app", "usd"]
"omni.graph.ui_nodes" = {}
"omni.hydra.engine.stats" = {}
"omni.hydra.rtx" = {}
-"omni.kit.loop" = {}
"omni.kit.mainwindow" = {}
"omni.kit.manipulator.camera" = {}
"omni.kit.manipulator.prim" = {}
@@ -67,15 +63,13 @@ keywords = ["experience", "app", "usd"]
"omni.kit.material.library" = {}
"omni.kit.menu.common" = { order = 1000 }
"omni.kit.menu.create" = {}
-"omni.kit.menu.edit" = {}
-"omni.kit.menu.file" = {}
"omni.kit.menu.stage" = {}
"omni.kit.menu.utils" = {}
"omni.kit.primitive.mesh" = {}
"omni.kit.property.bundle" = {}
"omni.kit.raycast.query" = {}
-"omni.kit.stage_template.core" = {}
"omni.kit.stagerecorder.bundle" = {}
+"omni.kit.stage_template.core" = {}
"omni.kit.telemetry" = {}
"omni.kit.tool.asset_importer" = {}
"omni.kit.tool.collect" = {}
@@ -90,10 +84,11 @@ keywords = ["experience", "app", "usd"]
"omni.kit.window.console" = {}
"omni.kit.window.content_browser" = {}
"omni.kit.window.property" = {}
+"omni.kit.window.script_editor" = {}
"omni.kit.window.stage" = {}
"omni.kit.window.status_bar" = {}
"omni.kit.window.toolbar" = {}
-"omni.physx.stageupdate" = {}
+"omni.physics.stageupdate" = {}
"omni.rtx.settings.core" = {}
"omni.uiaudio" = {}
"omni.usd.metrics.assembler.ui" = {}
@@ -119,7 +114,7 @@ exts."omni.kit.material.library".ui_show_list = [
"USD Preview Surface",
]
exts."omni.kit.renderer.core".present.enabled = false # Fixes MGPU stability issue
-exts."omni.kit.viewport.window".windowMenu.entryCount = 2 # Allow user to create two viewports by default
+exts."omni.kit.viewport.window".windowMenu.entryCount = 1 # Keep a single viewport for lighter interactive sessions
exts."omni.kit.viewport.window".windowMenu.label = "" # Put Viewport menuitem under Window menu
exts."omni.rtx.window.settings".window_menu = "Window" # Where to put the render settings menuitem
exts."omni.usd".locking.onClose = false # reduce time it takes to close/create stage
@@ -127,11 +122,29 @@ renderer.asyncInit = true # Don't block while renderer inits
renderer.gpuEnumeration.glInterop.enabled = false # Improves startup speed.
rendergraph.mgpu.backend = "copyQueue" # In MGPU configurations, This setting can be removed if IOMMU is disabled for better performance, copyQueue improves stability and performance when IOMMU is enabled
rtx-transient.dlssg.enabled = false # DLSSG frame generation is not compatible with synthetic data generation
-rtx.hydra.mdlMaterialWarmup = true # start loading the MDL shaders needed before any delegate is actually created.
+rtx-transient.dldenoiser.enabled = false
+rtx.hydra.mdlMaterialWarmup = false # avoid front-loading shader warmup for remote interactive sessions
+rtx.translucency.enabled = false
+rtx.reflections.enabled = false
+rtx.reflections.denoiser.enabled = false
+rtx.indirectDiffuse.enabled = false
+rtx.indirectDiffuse.denoiser.enabled = false
+rtx.ambientOcclusion.enabled = false
+rtx.ambientOcclusion.denoiserMode = 1
+rtx.directLighting.sampledLighting.enabled = false
+rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.raytracing.subpixel.mode = 0
+rtx.raytracing.cached.enabled = false
+rtx.post.dlss.execMode = 0 # performance
+rtx.shadows.enabled = false
+renderer.multiGpu.maxGpuCount = 1
omni.replicator.asyncRendering = false # Async rendering must be disabled for SDG
exts."omni.kit.test".includeTests = ["*isaac*"] # Add isaac tests to test runner
foundation.verifyOsVersion.enabled = false
+# disable the metrics assembler change listener, we don't want to do any runtime changes
+metricsAssembler.changeListenerEnabled = false
+
# set the default ros bridge to disable on startup
isaac.startup.ros_bridge_extension = ""
@@ -163,14 +176,14 @@ show_menu_titles = true
[settings.app]
name = "Isaac-Sim"
-version = "4.5.0"
+version = "5.1.0"
versionFile = "${exe-path}/VERSION"
content.emptyStageOnStart = true
fastShutdown = true
file.ignoreUnsavedOnExit = true
font.file = "${fonts}/OpenSans-SemiBold.ttf"
font.size = 16
-gatherRenderResults = true # True to prevent artifacts in multiple viewport configurations, can be set to false for better performance in some cases
+gatherRenderResults = false # prefer lower latency over multi-viewport correctness for remote use
hangDetector.enabled = true
hangDetector.timeout = 120
player.useFixedTimeStepping = true
@@ -203,8 +216,8 @@ defaultCamPos.x = 5
defaultCamPos.y = 5
defaultCamPos.z = 5
defaults.fillViewport = false # default to not fill viewport
-grid.enabled = true
-outline.enabled = true
+grid.enabled = false
+outline.enabled = false
boundingBoxes.enabled = false
show.camera=false
show.lights=false
@@ -243,6 +256,10 @@ omni.replicator.asyncRendering = false
app.asyncRendering = false
app.asyncRenderingLowLatency = false
+### FSD
+app.useFabricSceneDelegate = true
+rtx.hydra.readTransformsFromFabricInRenderDelegate = true
+
# disable replicator orchestrator for better runtime perf
exts."omni.replicator.core".Orchestrator.enabled = false
@@ -253,7 +270,7 @@ outDirectory = "${data}"
###############################
[settings.exts."omni.kit.registry.nucleus"]
registries = [
- { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/106/shared" },
+ { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/107/shared" },
{ name = "kit/sdk", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/sdk/${kit_version_short}/${kit_git_hash}" },
{ name = "kit/community", url = "https://dw290v42wisod.cloudfront.net/exts/kit/community" },
]
@@ -293,11 +310,13 @@ fabricUpdateTransformations = false
fabricUpdateVelocities = false
fabricUpdateForceSensors = false
fabricUpdateJointStates = false
+### When Direct GPU mode is enabled (suppressReadback=true) use direct interop between PhysX GPU and Fabric
+fabricUseGPUInterop = true
# Asset path
# set the S3 directory manually to the latest published S3
# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
[settings]
-persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.default = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.cloud = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.nvidia = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
diff --git a/apps/isaaclab.python.rendering.kit b/apps/isaaclab.python.rendering.kit
index 1c52b38fd780..de7a559a3895 100644
--- a/apps/isaaclab.python.rendering.kit
+++ b/apps/isaaclab.python.rendering.kit
@@ -9,7 +9,7 @@
[package]
title = "Isaac Lab Python Camera"
description = "An app for running Isaac Lab with rendering enabled"
-version = "2.0.2"
+version = "2.3.2"
# That makes it browsable in UI with "experience" filter
keywords = ["experience", "app", "isaaclab", "python", "camera", "minimal"]
@@ -33,7 +33,12 @@ cameras_enabled = true
app.versionFile = "${exe-path}/VERSION"
app.folder = "${exe-path}/"
app.name = "Isaac-Sim"
-app.version = "4.5.0"
+app.version = "5.1.0"
+
+### FSD
+app.useFabricSceneDelegate = true
+# Temporary, should be enabled by default in Kit soon
+rtx.hydra.readTransformsFromFabricInRenderDelegate = true
# Disable print outs on extension startup information
# this only disables the app print_and_log function
@@ -46,12 +51,16 @@ isaac.startup.ros_bridge_extension = ""
# Disabling these settings reduces renderer VRAM usage and improves rendering performance, but at some quality cost
rtx.translucency.enabled = false
rtx.reflections.enabled = false
+rtx.reflections.denoiser.enabled = false
rtx.indirectDiffuse.enabled = false
+rtx.indirectDiffuse.denoiser.enabled = false
rtx-transient.dlssg.enabled = false
-rtx.directLighting.sampledLighting.enabled = true
-rtx.directLighting.sampledLighting.samplesPerPixel = 1
+rtx-transient.dldenoiser.enabled = false
+rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.directLighting.sampledLighting.enabled = false
+rtx.raytracing.subpixel.mode = 0
rtx.sceneDb.ambientLightIntensity = 1.0
-# rtx.shadows.enabled = false
+rtx.shadows.enabled = false
# Avoids replicator warning
rtx.pathtracing.maxSamplesPerLaunch = 1000000
@@ -84,6 +93,9 @@ app.audio.enabled = false
# disable replicator orchestrator for better runtime perf
exts."omni.replicator.core".Orchestrator.enabled = false
+# disable the metrics assembler change listener, we don't want to do any runtime changes
+metricsAssembler.changeListenerEnabled = false
+
[settings.physics]
updateToUsd = false
updateParticlesToUsd = false
@@ -96,10 +108,12 @@ fabricUpdateTransformations = false
fabricUpdateVelocities = false
fabricUpdateForceSensors = false
fabricUpdateJointStates = false
+### When Direct GPU mode is enabled (suppressReadback=true) use direct interop between PhysX GPU and Fabric
+fabricUseGPUInterop = true
[settings.exts."omni.kit.registry.nucleus"]
registries = [
- { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/106/shared" },
+ { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/107/shared" },
{ name = "kit/sdk", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/sdk/${kit_version_short}/${kit_git_hash}" },
{ name = "kit/community", url = "https://dw290v42wisod.cloudfront.net/exts/kit/community" },
]
@@ -110,6 +124,8 @@ interceptSysStdOutput = false
logSysStdOutput = false
[settings.app.renderer]
+resolution.height = 720
+resolution.width = 1280
skipWhileMinimized = false
sleepMsOnFocus = 0
sleepMsOutOfFocus = 0
@@ -135,6 +151,6 @@ folders = [
# set the S3 directory manually to the latest published S3
# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
[settings]
-persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.default = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.cloud = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.nvidia = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
diff --git a/apps/isaaclab.python.xr.openxr.headless.kit b/apps/isaaclab.python.xr.openxr.headless.kit
new file mode 100644
index 000000000000..57b78c1b2907
--- /dev/null
+++ b/apps/isaaclab.python.xr.openxr.headless.kit
@@ -0,0 +1,64 @@
+##
+# Adapted from: apps/isaaclab.python.xr.openxr.kit
+##
+
+[package]
+title = "Isaac Lab Python OpenXR Headless"
+description = "An app for running Isaac Lab with OpenXR in headless mode"
+version = "2.3.2"
+
+# That makes it browsable in UI with "experience" filter
+keywords = ["experience", "app", "usd", "headless"]
+
+[settings]
+# Note: This path was adapted to be respective to the kit-exe file location
+app.versionFile = "${exe-path}/VERSION"
+app.folder = "${exe-path}/"
+app.name = "Isaac-Sim"
+app.version = "5.1.0"
+
+### FSD
+app.useFabricSceneDelegate = true
+# Temporary, should be enabled by default in Kit soon
+rtx.hydra.readTransformsFromFabricInRenderDelegate = true
+
+# xr optimizations
+xr.skipInputDeviceUSDWrites = true
+'rtx-transient'.resourcemanager.enableTextureStreaming = false
+
+[settings.isaaclab]
+# This is used to check that this experience file is loaded when using cameras
+cameras_enabled = true
+
+[dependencies]
+"isaaclab.python.xr.openxr" = {}
+
+[settings]
+xr.profile.ar.enabled = true
+
+[settings.app.python]
+# These disable the kit app from also printing out python output, which gets confusing
+interceptSysStdOutput = false
+logSysStdOutput = false
+
+# Register extension folder from this repo in kit
+[settings.app.exts]
+folders = [
+ "${exe-path}/exts", # kit extensions
+ "${exe-path}/extscore", # kit core extensions
+ "${exe-path}/../exts", # isaac extensions
+ "${exe-path}/../extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../extscache", # isaac cache extensions
+ "${exe-path}/../extsPhysics", # isaac physics extensions
+ "${exe-path}/../isaacsim/exts", # isaac extensions for pip
+ "${exe-path}/../isaacsim/extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../isaacsim/extscache", # isaac cache extensions for pip
+ "${exe-path}/../isaacsim/extsPhysics", # isaac physics extensions for pip
+ "${app}", # needed to find other app files
+ "${app}/../source", # needed to find extensions in Isaac Lab
+]
+
+[settings]
+persistent.isaac.asset_root.default = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.cloud = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.nvidia = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
diff --git a/apps/isaaclab.python.xr.openxr.kit b/apps/isaaclab.python.xr.openxr.kit
index f9b7cad8005f..8fe9980e50b6 100644
--- a/apps/isaaclab.python.xr.openxr.kit
+++ b/apps/isaaclab.python.xr.openxr.kit
@@ -5,7 +5,7 @@
[package]
title = "Isaac Lab Python OpenXR"
description = "An app for running Isaac Lab with OpenXR"
-version = "2.0.2"
+version = "2.3.2"
# That makes it browsable in UI with "experience" filter
keywords = ["experience", "app", "usd"]
@@ -15,30 +15,57 @@ keywords = ["experience", "app", "usd"]
app.versionFile = "${exe-path}/VERSION"
app.folder = "${exe-path}/"
app.name = "Isaac-Sim"
-app.version = "4.5.0"
+app.version = "5.1.0"
### async rendering settings
-omni.replicator.asyncRendering = true
+# omni.replicator.asyncRendering needs to be false for external camera rendering
+omni.replicator.asyncRendering = false
app.asyncRendering = true
app.asyncRenderingLowLatency = true
# For XR, set this back to default "#define OMNI_MAX_DEVICE_GROUP_DEVICE_COUNT 16"
renderer.multiGpu.maxGpuCount = 16
+renderer.gpuEnumeration.glInterop.enabled = true # Allow Kit XR OpenXR to render headless
+
+### FSD
+app.useFabricSceneDelegate = true
+# Temporary, should be enabled by default in Kit soon
+rtx.hydra.readTransformsFromFabricInRenderDelegate = true
+
+# xr optimizations
+xr.skipInputDeviceUSDWrites = true
+'rtx-transient'.resourcemanager.enableTextureStreaming = false
[dependencies]
-"isaaclab.python.rendering" = {}
-"isaacsim.xr.openxr" = {}
+"isaaclab.python" = {}
# Kit extensions
"omni.kit.xr.system.openxr" = {}
"omni.kit.xr.profile.ar" = {}
+[settings.isaaclab]
+# This is used to check that this experience file is loaded when using cameras
+cameras_enabled = true
+
[settings]
+app.xr.enabled = true
+# Set profiler backend to NVTX by default
+app.profilerBackend = "nvtx"
+
# xr settings
xr.ui.enabled = false
-xrstage.profile.ar.anchorMode = "active camera"
xr.depth.aov = "GBufferDepth"
-defaults.xr.profile.ar.renderQuality = "off"
+defaults.xr.profile.ar.anchorMode = "custom anchor"
+rtx.rendermode = "RaytracedLighting"
+persistent.xr.profile.ar.renderQuality = "performance"
+persistent.xr.profile.ar.render.nearPlane = 0.15
+xr.openxr.components."omni.kit.xr.openxr.ext.hand_tracking".enabled = true
+xr.openxr.components."isaacsim.xr.openxr.hand_tracking".enabled = true
+
+[settings.app.python]
+# These disable the kit app from also printing out python output, which gets confusing
+interceptSysStdOutput = false
+logSysStdOutput = false
# Register extension folder from this repo in kit
[settings.app.exts]
@@ -61,6 +88,6 @@ folders = [
# set the S3 directory manually to the latest published S3
# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
[settings]
-persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
-persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.default = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.cloud = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
+persistent.isaac.asset_root.nvidia = "https://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/5.1"
diff --git a/apps/isaacsim_4_5/extension.toml b/apps/isaacsim_4_5/extension.toml
new file mode 100644
index 000000000000..f0668b9184d1
--- /dev/null
+++ b/apps/isaacsim_4_5/extension.toml
@@ -0,0 +1 @@
+# This is not an extension
diff --git a/apps/isaacsim_4_5/isaaclab.python.headless.kit b/apps/isaacsim_4_5/isaaclab.python.headless.kit
new file mode 100644
index 000000000000..0fb9eaeffff3
--- /dev/null
+++ b/apps/isaacsim_4_5/isaaclab.python.headless.kit
@@ -0,0 +1,202 @@
+##
+# Adapted from: _isaac_sim/apps/omni.isaac.sim.python.gym.headless.kit
+##
+
+[package]
+title = "Isaac Lab Python Headless"
+description = "An app for running Isaac Lab headlessly"
+version = "2.3.2"
+
+# That makes it browsable in UI with "experience" filter
+keywords = ["experience", "app", "isaaclab", "python", "headless"]
+
+[settings]
+# Note: This path was adapted to be respective to the kit-exe file location
+app.versionFile = "${exe-path}/VERSION"
+app.folder = "${exe-path}/"
+app.name = "Isaac-Sim"
+app.version = "4.5.0"
+
+##################################
+# Omniverse related dependencies #
+##################################
+[dependencies]
+"omni.physx" = {}
+"omni.physx.tensors" = {}
+"omni.physx.fabric" = {}
+"omni.warp.core" = {}
+"usdrt.scenegraph" = {}
+"omni.kit.telemetry" = {}
+"omni.kit.loop" = {}
+
+[settings]
+app.content.emptyStageOnStart = false
+
+# Disable print outs on extension startup information
+# this only disables the app print_and_log function
+app.enableStdoutOutput = false
+
+# default viewport is fill
+app.runLoops.rendering_0.fillResolution = false
+exts."omni.kit.window.viewport".blockingGetViewportDrawable = false
+
+# Fix PlayButtonGroup error
+exts."omni.kit.widget.toolbar".PlayButton.enabled = false
+
+# disable replicator orchestrator for better runtime perf
+exts."omni.replicator.core".Orchestrator.enabled = false
+
+[settings.app.settings]
+persistent = true
+dev_build = false
+fabricDefaultStageFrameHistoryCount = 3 # needed for omni.syntheticdata TODO105 still true?
+
+[settings.app.python]
+# These disable the kit app from also printing out python output, which gets confusing
+interceptSysStdOutput = false
+logSysStdOutput = false
+
+[settings]
+# MGPU is always on, you can turn it from the settings, and force this off to save even more resource if you
+# only want to use a single GPU on your MGPU system
+# False for Isaac Sim
+renderer.multiGpu.enabled = true
+renderer.multiGpu.autoEnable = true
+'rtx-transient'.resourcemanager.enableTextureStreaming = true
+app.asyncRendering = false
+app.asyncRenderingLowLatency = false
+app.hydraEngine.waitIdle = false
+# app.hydra.aperture.conform = 4 # in 105.1 pixels are square by default
+omni.replicator.asyncRendering = false
+
+# Enable Iray and pxr by setting this to "rtx,iray,pxr"
+renderer.enabled = "rtx"
+
+# Avoid warning on shutdown from audio context
+app.audio.enabled = false
+
+# Enable Vulkan - avoids torch+cu12 error on windows
+app.vulkan = true
+
+# Set profiler backend to NVTX by default
+app.profilerBackend = "nvtx"
+
+# hide NonToggleable Exts
+exts."omni.kit.window.extensions".hideNonToggleableExts = true
+exts."omni.kit.window.extensions".showFeatureOnly = false
+
+# set the default ros bridge to disable on startup
+isaac.startup.ros_bridge_extension = ""
+
+# Extensions
+###############################
+[settings.exts."omni.kit.registry.nucleus"]
+registries = [
+ { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/106/shared" },
+ { name = "kit/sdk", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/sdk/${kit_version_short}/${kit_git_hash}" },
+ { name = "kit/community", url = "https://dw290v42wisod.cloudfront.net/exts/kit/community" },
+]
+
+[settings.app.extensions]
+skipPublishVerification = false
+registryEnabled = true
+
+[settings.crashreporter.data]
+experience = "Isaac Sim"
+
+[settings.persistent]
+app.file.recentFiles = []
+app.stage.upAxis = "Z"
+app.stage.movePrimInPlace = false
+app.stage.instanceableOnCreatingReference = false
+app.stage.materialStrength = "weakerThanDescendants"
+
+app.transform.gizmoUseSRT = true
+app.viewport.grid.scale = 1.0
+app.viewport.pickingMode = "kind:model.ALL"
+app.viewport.camMoveVelocity = 0.05 # 5 m/s
+app.viewport.gizmo.scale = 0.01 # scaled to meters
+app.viewport.previewOnPeek = false
+app.viewport.snapToSurface = false
+app.viewport.displayOptions = 31951 # Disable Frame Rate and Resolution by default
+app.window.uiStyle = "NvidiaDark"
+app.primCreation.DefaultXformOpType = "Scale, Orient, Translate"
+app.primCreation.DefaultXformOpOrder="xformOp:translate, xformOp:orient, xformOp:scale"
+app.primCreation.typedDefaults.camera.clippingRange = [0.01, 10000000.0]
+simulation.minFrameRate = 15
+simulation.defaultMetersPerUnit = 1.0
+omnigraph.updateToUsd = false
+omnigraph.useSchemaPrims = true
+omnigraph.disablePrimNodes = true
+omni.replicator.captureOnPlay = true
+omnihydra.useSceneGraphInstancing = true
+renderer.startupMessageDisplayed = true # hides the IOMMU popup window
+
+# Make Detail panel visible by default
+app.omniverse.content_browser.options_menu.show_details = true
+app.omniverse.filepicker.options_menu.show_details = true
+
+[settings.physics]
+updateToUsd = false
+updateParticlesToUsd = false
+updateVelocitiesToUsd = false
+updateForceSensorsToUsd = false
+outputVelocitiesLocalSpace = false
+useFastCache = false
+visualizationDisplayJoints = false
+fabricUpdateTransformations = false
+fabricUpdateVelocities = false
+fabricUpdateForceSensors = false
+fabricUpdateJointStates = false
+
+# Performance improvement
+resourcemonitor.timeBetweenQueries = 100
+
+# Register extension folder from this repo in kit
+[settings.app.exts]
+folders = [
+ "${exe-path}/exts", # kit extensions
+ "${exe-path}/extscore", # kit core extensions
+ "${exe-path}/../exts", # isaac extensions
+ "${exe-path}/../extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../extscache", # isaac cache extensions
+ "${exe-path}/../extsPhysics", # isaac physics extensions
+ "${exe-path}/../isaacsim/exts", # isaac extensions for pip
+ "${exe-path}/../isaacsim/extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../isaacsim/extscache", # isaac cache extensions for pip
+ "${exe-path}/../isaacsim/extsPhysics", # isaac physics extensions for pip
+ "${app}", # needed to find other app files
+ "${app}/../../source", # needed to find extensions in Isaac Lab
+]
+
+[settings.ngx]
+enabled=true # Enable this for DLSS
+
+########################
+# Isaac Sim Extensions #
+########################
+[dependencies]
+"isaacsim.simulation_app" = {}
+"isaacsim.core.api" = {}
+"isaacsim.core.cloner" = {}
+"isaacsim.core.utils" = {}
+"isaacsim.core.version" = {}
+
+########################
+# Isaac Lab Extensions #
+########################
+
+# Load Isaac Lab extensions last
+"isaaclab" = {order = 1000}
+"isaaclab_assets" = {order = 1000}
+"isaaclab_tasks" = {order = 1000}
+"isaaclab_mimic" = {order = 1000}
+"isaaclab_rl" = {order = 1000}
+
+# Asset path
+# set the S3 directory manually to the latest published S3
+# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
+[settings]
+persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
diff --git a/apps/isaacsim_4_5/isaaclab.python.headless.rendering.kit b/apps/isaacsim_4_5/isaaclab.python.headless.rendering.kit
new file mode 100644
index 000000000000..10b3efc84bfc
--- /dev/null
+++ b/apps/isaacsim_4_5/isaaclab.python.headless.rendering.kit
@@ -0,0 +1,145 @@
+##
+# Adapted from: https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs/blob/main/apps/omni.isaac.sim.python.gym.camera.kit
+#
+# This app file designed specifically towards vision-based RL tasks. It provides necessary settings to enable
+# multiple cameras to be rendered each frame. Additional settings are also applied to increase performance when
+# rendering cameras across multiple environments.
+##
+
+[package]
+title = "Isaac Lab Python Headless Camera"
+description = "An app for running Isaac Lab headlessly with rendering enabled"
+version = "2.3.2"
+
+# That makes it browsable in UI with "experience" filter
+keywords = ["experience", "app", "isaaclab", "python", "camera", "minimal"]
+
+[dependencies]
+# Isaac Lab minimal app
+"isaaclab.python.headless" = {}
+"omni.replicator.core" = {}
+
+# Rendering
+"omni.kit.material.library" = {}
+"omni.kit.viewport.rtx" = {}
+
+[settings.isaaclab]
+# This is used to check that this experience file is loaded when using cameras
+cameras_enabled = true
+
+[settings]
+# Note: This path was adapted to be respective to the kit-exe file location
+app.versionFile = "${exe-path}/VERSION"
+app.folder = "${exe-path}/"
+app.name = "Isaac-Sim"
+app.version = "4.5.0"
+
+# Disable print outs on extension startup information
+# this only disables the app print_and_log function
+app.enableStdoutOutput = false
+
+# set the default ros bridge to disable on startup
+isaac.startup.ros_bridge_extension = ""
+
+# Flags for better rendering performance
+# Disabling these settings reduces renderer VRAM usage and improves rendering performance, but at some quality cost
+rtx.translucency.enabled = false
+rtx.reflections.enabled = false
+rtx.indirectDiffuse.enabled = false
+rtx-transient.dlssg.enabled = false
+rtx.directLighting.sampledLighting.enabled = true
+rtx.directLighting.sampledLighting.samplesPerPixel = 1
+rtx.sceneDb.ambientLightIntensity = 1.0
+# rtx.shadows.enabled = false
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
+
+# Disable present thread to improve performance
+exts."omni.renderer.core".present.enabled=false
+
+# Disabling these settings reduces renderer VRAM usage and improves rendering performance, but at some quality cost
+rtx.raytracing.cached.enabled = false
+rtx.ambientOcclusion.enabled = false
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 0 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids unnecessary GPU context initialization
+renderer.multiGpu.maxGpuCount=1
+
+# Force synchronous rendering to improve training results
+omni.replicator.asyncRendering = false
+
+# Avoids frame offset issue
+app.updateOrder.checkForHydraRenderComplete = 1000
+app.renderer.waitIdle=true
+app.hydraEngine.waitIdle=true
+
+app.audio.enabled = false
+
+# Enable Vulkan - avoids torch+cu12 error on windows
+app.vulkan = true
+
+# Set profiler backend to NVTX by default
+app.profilerBackend = "nvtx"
+
+# disable replicator orchestrator for better runtime perf
+exts."omni.replicator.core".Orchestrator.enabled = false
+
+[settings.exts."omni.kit.registry.nucleus"]
+registries = [
+ { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/106/shared" },
+ { name = "kit/sdk", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/sdk/${kit_version_short}/${kit_git_hash}" },
+ { name = "kit/community", url = "https://dw290v42wisod.cloudfront.net/exts/kit/community" },
+]
+
+[settings.app.python]
+# These disable the kit app from also printing out python output, which gets confusing
+interceptSysStdOutput = false
+logSysStdOutput = false
+
+[settings.app.renderer]
+skipWhileMinimized = false
+sleepMsOnFocus = 0
+sleepMsOutOfFocus = 0
+
+[settings.physics]
+updateToUsd = false
+updateParticlesToUsd = false
+updateVelocitiesToUsd = false
+updateForceSensorsToUsd = false
+outputVelocitiesLocalSpace = false
+useFastCache = false
+visualizationDisplayJoints = false
+fabricUpdateTransformations = false
+fabricUpdateVelocities = false
+fabricUpdateForceSensors = false
+fabricUpdateJointStates = false
+
+# Register extension folder from this repo in kit
+[settings.app.exts]
+folders = [
+ "${exe-path}/exts", # kit extensions
+ "${exe-path}/extscore", # kit core extensions
+ "${exe-path}/../exts", # isaac extensions
+ "${exe-path}/../extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../extscache", # isaac cache extensions
+ "${exe-path}/../extsPhysics", # isaac physics extensions
+ "${exe-path}/../isaacsim/exts", # isaac extensions for pip
+ "${exe-path}/../isaacsim/extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../isaacsim/extscache", # isaac cache extensions for pip
+ "${exe-path}/../isaacsim/extsPhysics", # isaac physics extensions for pip
+ "${app}", # needed to find other app files
+ "${app}/../../source", # needed to find extensions in Isaac Lab
+]
+
+# Asset path
+# set the S3 directory manually to the latest published S3
+# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
+[settings]
+persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
diff --git a/apps/isaacsim_4_5/isaaclab.python.kit b/apps/isaacsim_4_5/isaaclab.python.kit
new file mode 100644
index 000000000000..5fc9b1effd9d
--- /dev/null
+++ b/apps/isaacsim_4_5/isaaclab.python.kit
@@ -0,0 +1,301 @@
+##
+# Adapted from: _isaac_sim/apps/isaacsim.exp.base.kit
+##
+
+[package]
+title = "Isaac Lab Python"
+description = "An app for running Isaac Lab"
+version = "2.3.2"
+
+# That makes it browsable in UI with "experience" filter
+keywords = ["experience", "app", "usd"]
+
+[dependencies]
+# Isaac Sim extensions
+"isaacsim.app.about" = {}
+"isaacsim.asset.browser" = {}
+"isaacsim.core.api" = {}
+"isaacsim.core.cloner" = {}
+"isaacsim.core.nodes" = {}
+"isaacsim.core.simulation_manager" = {}
+"isaacsim.core.throttling" = {}
+"isaacsim.core.utils" = {}
+"isaacsim.core.version" = {}
+"isaacsim.gui.menu" = {}
+"isaacsim.gui.property" = {}
+"isaacsim.replicator.behavior" = {}
+"isaacsim.robot.manipulators" = {}
+"isaacsim.robot.policy.examples" = {}
+"isaacsim.robot.schema" = {}
+"isaacsim.robot.surface_gripper" = {}
+"isaacsim.robot.wheeled_robots" = {}
+"isaacsim.sensors.camera" = {}
+"isaacsim.sensors.physics" = {}
+"isaacsim.sensors.physx" = {}
+"isaacsim.sensors.rtx" = {}
+"isaacsim.simulation_app" = {}
+"isaacsim.storage.native" = {}
+"isaacsim.util.debug_draw" = {}
+
+# Isaac Sim Extra
+"isaacsim.asset.importer.mjcf" = {}
+"isaacsim.asset.importer.urdf" = {}
+"omni.physx.bundle" = {}
+"omni.physx.tensors" = {}
+"omni.replicator.core" = {}
+"omni.replicator.replicator_yaml" = {}
+"omni.syntheticdata" = {}
+"semantics.schema.editor" = {}
+"semantics.schema.property" = {}
+
+# Kit based editor extensions
+"omni.anim.curve.core" = {}
+"omni.graph.action" = {}
+"omni.graph.core" = {}
+"omni.graph.nodes" = {}
+"omni.graph.scriptnode" = {}
+"omni.graph.ui_nodes" = {}
+"omni.hydra.engine.stats" = {}
+"omni.hydra.rtx" = {}
+"omni.kit.loop" = {}
+"omni.kit.mainwindow" = {}
+"omni.kit.manipulator.camera" = {}
+"omni.kit.manipulator.prim" = {}
+"omni.kit.manipulator.selection" = {}
+"omni.kit.material.library" = {}
+"omni.kit.menu.common" = { order = 1000 }
+"omni.kit.menu.create" = {}
+"omni.kit.menu.edit" = {}
+"omni.kit.menu.file" = {}
+"omni.kit.menu.stage" = {}
+"omni.kit.menu.utils" = {}
+"omni.kit.primitive.mesh" = {}
+"omni.kit.property.bundle" = {}
+"omni.kit.raycast.query" = {}
+"omni.kit.stage_template.core" = {}
+"omni.kit.stagerecorder.bundle" = {}
+"omni.kit.telemetry" = {}
+"omni.kit.tool.asset_importer" = {}
+"omni.kit.tool.collect" = {}
+"omni.kit.viewport.legacy_gizmos" = {}
+"omni.kit.viewport.menubar.camera" = {}
+"omni.kit.viewport.menubar.display" = {}
+"omni.kit.viewport.menubar.lighting" = {}
+"omni.kit.viewport.menubar.render" = {}
+"omni.kit.viewport.menubar.settings" = {}
+"omni.kit.viewport.scene_camera_model" = {}
+"omni.kit.viewport.window" = {}
+"omni.kit.window.console" = {}
+"omni.kit.window.content_browser" = {}
+"omni.kit.window.property" = {}
+"omni.kit.window.stage" = {}
+"omni.kit.window.status_bar" = {}
+"omni.kit.window.toolbar" = {}
+"omni.physx.stageupdate" = {}
+"omni.rtx.settings.core" = {}
+"omni.uiaudio" = {}
+"omni.usd.metrics.assembler.ui" = {}
+"omni.usd.schema.metrics.assembler" = {}
+"omni.warp.core" = {}
+
+########################
+# Isaac Lab Extensions #
+########################
+
+# Load Isaac Lab extensions last
+"isaaclab" = {order = 1000}
+"isaaclab_assets" = {order = 1000}
+"isaaclab_tasks" = {order = 1000}
+"isaaclab_mimic" = {order = 1000}
+"isaaclab_rl" = {order = 1000}
+
+[settings]
+exts."omni.kit.material.library".ui_show_list = [
+ "OmniPBR",
+ "OmniGlass",
+ "OmniSurface",
+ "USD Preview Surface",
+]
+exts."omni.kit.renderer.core".present.enabled = false # Fixes MGPU stability issue
+exts."omni.kit.viewport.window".windowMenu.entryCount = 2 # Allow user to create two viewports by default
+exts."omni.kit.viewport.window".windowMenu.label = "" # Put Viewport menuitem under Window menu
+exts."omni.rtx.window.settings".window_menu = "Window" # Where to put the render settings menuitem
+exts."omni.usd".locking.onClose = false # reduce time it takes to close/create stage
+renderer.asyncInit = true # Don't block while renderer inits
+renderer.gpuEnumeration.glInterop.enabled = false # Improves startup speed.
+rendergraph.mgpu.backend = "copyQueue" # In MGPU configurations, This setting can be removed if IOMMU is disabled for better performance, copyQueue improves stability and performance when IOMMU is enabled
+rtx-transient.dlssg.enabled = false # DLSSG frame generation is not compatible with synthetic data generation
+rtx.hydra.mdlMaterialWarmup = true # start loading the MDL shaders needed before any delegate is actually created.
+omni.replicator.asyncRendering = false # Async rendering must be disabled for SDG
+exts."omni.kit.test".includeTests = ["*isaac*"] # Add isaac tests to test runner
+foundation.verifyOsVersion.enabled = false
+
+# set the default ros bridge to disable on startup
+isaac.startup.ros_bridge_extension = ""
+
+# Disable for base application
+[settings."filter:platform"."windows-x86_64"]
+isaac.startup.ros_bridge_extension = ""
+[settings."filter:platform"."linux-x86_64"]
+isaac.startup.ros_bridge_extension = ""
+
+# menu styling
+[settings.exts."omni.kit.menu.utils"]
+logDeprecated = false
+margin_size = [18, 3]
+tick_spacing = [10, 6]
+margin_size_posttick = [0, 3]
+separator_size = [14, 10]
+root_spacing = 3
+post_label_spaces = 6
+color_tick_enabled = 0xFFFAC434
+color_separator = 0xFF7E7E7E
+color_label_enabled = 0xFFEEEEEE
+menu_title_color = 0xFF202020
+menu_title_line_color = 0xFF5E5E5E
+menu_title_text_color = 0xFF8F8F8F
+menu_title_text_height = 24
+menu_title_close_color = 0xFFC6C6C6
+indent_all_ticks = false
+show_menu_titles = true
+
+[settings.app]
+name = "Isaac-Sim"
+version = "4.5.0"
+versionFile = "${exe-path}/VERSION"
+content.emptyStageOnStart = true
+fastShutdown = true
+file.ignoreUnsavedOnExit = true
+font.file = "${fonts}/OpenSans-SemiBold.ttf"
+font.size = 16
+gatherRenderResults = true # True to prevent artifacts in multiple viewport configurations, can be set to false for better performance in some cases
+hangDetector.enabled = true
+hangDetector.timeout = 120
+player.useFixedTimeStepping = true
+settings.fabricDefaultStageFrameHistoryCount = 3 # needed for omni.syntheticdata TODO105 still true?
+settings.persistent = true # settings are persistent for this app
+
+vulkan = true # Explicitly enable Vulkan (on by default on Linux, off by default on Windows)
+### async rendering settings
+asyncRendering = false
+asyncRenderingLowLatency = false
+
+[settings.app.window]
+iconPath = "${isaacsim.simulation_app}/data/omni.isaac.sim.png"
+title = "Isaac Sim"
+
+[settings.app.python]
+# These disable the kit app from also printing out python output, which gets confusing
+interceptSysStdOutput = false
+logSysStdOutput = false
+
+[settings.app.renderer]
+resolution.height = 720
+resolution.width = 1280
+skipWhileMinimized = false # python app does not throttle
+sleepMsOnFocus = 0 # python app does not throttle
+sleepMsOutOfFocus = 0 # python app does not throttle
+
+[settings.app.viewport]
+defaultCamPos.x = 5
+defaultCamPos.y = 5
+defaultCamPos.z = 5
+defaults.fillViewport = false # default to not fill viewport
+grid.enabled = true
+outline.enabled = true
+boundingBoxes.enabled = false
+show.camera=false
+show.lights=false
+
+[settings.telemetry]
+enableAnonymousAppName = true # Anonymous Kit application usage telemetry
+enableAnonymousData = true # Anonymous Kit application usage telemetry
+
+[settings.persistent]
+app.primCreation.DefaultXformOpOrder = "xformOp:translate, xformOp:orient, xformOp:scale"
+app.primCreation.DefaultXformOpType = "Scale, Orient, Translate"
+app.primCreation.typedDefaults.camera.clippingRange = [0.01, 10000000.0] # Meters default
+app.primCreation.DefaultXformOpPrecision = "Double"
+app.primCreation.DefaultRotationOrder = "ZYX"
+app.primCreation.PrimCreationWithDefaultXformOps = true
+app.stage.timeCodeRange = [0, 1000000]
+app.stage.upAxis = "Z" # Isaac Sim default Z up
+app.viewport.camMoveVelocity = 0.05 # Meters default
+app.viewport.gizmo.scale = 0.01 # Meters default
+app.viewport.grid.scale = 1.0 # Meters default
+app.viewport.camShowSpeedOnStart = false # Hide camera speed on startup
+app.omniverse.gamepadCameraControl = false # Disable gamepad control for camera by default
+exts."omni.anim.navigation.core".navMesh.config.autoRebakeOnChanges = false
+exts."omni.anim.navigation.core".navMesh.viewNavMesh = false
+physics.visualizationDisplayJoints = false # improves performance
+physics.visualizationSimulationOutput = false # improves performance
+physics.resetOnStop = true # Physics state is reset on stop
+renderer.startupMessageDisplayed = true # hides the IOMMU popup window
+resourcemonitor.timeBetweenQueries = 100 # improves performance
+simulation.defaultMetersPerUnit = 1.0 # Meters default
+omni.replicator.captureOnPlay = true
+
+[settings]
+### async rendering settings
+omni.replicator.asyncRendering = false
+app.asyncRendering = false
+app.asyncRenderingLowLatency = false
+
+# disable replicator orchestrator for better runtime perf
+exts."omni.replicator.core".Orchestrator.enabled = false
+
+[settings.app.livestream]
+outDirectory = "${data}"
+
+# Extensions
+###############################
+[settings.exts."omni.kit.registry.nucleus"]
+registries = [
+ { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/106/shared" },
+ { name = "kit/sdk", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/sdk/${kit_version_short}/${kit_git_hash}" },
+ { name = "kit/community", url = "https://dw290v42wisod.cloudfront.net/exts/kit/community" },
+]
+
+[settings.app.extensions]
+skipPublishVerification = false
+registryEnabled = true
+
+# Register extension folder from this repo in kit
+[settings.app.exts]
+folders = [
+ "${exe-path}/exts", # kit extensions
+ "${exe-path}/extscore", # kit core extensions
+ "${exe-path}/../exts", # isaac extensions
+ "${exe-path}/../extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../extscache", # isaac cache extensions
+ "${exe-path}/../extsPhysics", # isaac physics extensions
+ "${exe-path}/../isaacsim/exts", # isaac extensions for pip
+ "${exe-path}/../isaacsim/extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../isaacsim/extscache", # isaac cache extensions for pip
+ "${exe-path}/../isaacsim/extsPhysics", # isaac physics extensions for pip
+ "${app}", # needed to find other app files
+ "${app}/../../source", # needed to find extensions in Isaac Lab
+]
+
+[settings.physics]
+autoPopupSimulationOutputWindow = false
+updateToUsd = false
+updateVelocitiesToUsd = false
+updateParticlesToUsd = false
+updateVelocitiesToUsd = false
+updateForceSensorsToUsd = false
+outputVelocitiesLocalSpace = false
+useFastCache = false
+visualizationDisplayJoints = false
+fabricUpdateTransformations = false
+fabricUpdateVelocities = false
+fabricUpdateForceSensors = false
+fabricUpdateJointStates = false
+
+# Asset path
+# set the S3 directory manually to the latest published S3
+# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
+[settings]
+persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
diff --git a/apps/isaacsim_4_5/isaaclab.python.rendering.kit b/apps/isaacsim_4_5/isaaclab.python.rendering.kit
new file mode 100644
index 000000000000..ad234141fd9b
--- /dev/null
+++ b/apps/isaacsim_4_5/isaaclab.python.rendering.kit
@@ -0,0 +1,140 @@
+##
+# Adapted from: https://github.com/NVIDIA-Omniverse/OmniIsaacGymEnvs/blob/main/apps/omni.isaac.sim.python.gym.camera.kit
+#
+# This app file designed specifically towards vision-based RL tasks. It provides necessary settings to enable
+# multiple cameras to be rendered each frame. Additional settings are also applied to increase performance when
+# rendering cameras across multiple environments.
+##
+
+[package]
+title = "Isaac Lab Python Camera"
+description = "An app for running Isaac Lab with rendering enabled"
+version = "2.3.2"
+
+# That makes it browsable in UI with "experience" filter
+keywords = ["experience", "app", "isaaclab", "python", "camera", "minimal"]
+
+[dependencies]
+# Isaac Lab minimal app
+"isaaclab.python" = {}
+
+# PhysX
+"omni.kit.property.physx" = {}
+
+# Rendering
+"omni.kit.material.library" = {}
+
+[settings.isaaclab]
+# This is used to check that this experience file is loaded when using cameras
+cameras_enabled = true
+
+[settings]
+# Note: This path was adapted to be respective to the kit-exe file location
+app.versionFile = "${exe-path}/VERSION"
+app.folder = "${exe-path}/"
+app.name = "Isaac-Sim"
+app.version = "4.5.0"
+
+# Disable print outs on extension startup information
+# this only disables the app print_and_log function
+app.enableStdoutOutput = false
+
+# set the default ros bridge to disable on startup
+isaac.startup.ros_bridge_extension = ""
+
+# Flags for better rendering performance
+# Disabling these settings reduces renderer VRAM usage and improves rendering performance, but at some quality cost
+rtx.translucency.enabled = false
+rtx.reflections.enabled = false
+rtx.indirectDiffuse.enabled = false
+rtx-transient.dlssg.enabled = false
+rtx.directLighting.sampledLighting.enabled = true
+rtx.directLighting.sampledLighting.samplesPerPixel = 1
+rtx.sceneDb.ambientLightIntensity = 1.0
+# rtx.shadows.enabled = false
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
+
+# Disable present thread to improve performance
+exts."omni.renderer.core".present.enabled=false
+
+# Disabling these settings reduces renderer VRAM usage and improves rendering performance, but at some quality cost
+rtx.raytracing.cached.enabled = false
+rtx.ambientOcclusion.enabled = false
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 0 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids unnecessary GPU context initialization
+renderer.multiGpu.maxGpuCount=1
+
+# Force synchronous rendering to improve training results
+omni.replicator.asyncRendering = false
+
+# Avoids frame offset issue
+app.updateOrder.checkForHydraRenderComplete = 1000
+app.renderer.waitIdle=true
+app.hydraEngine.waitIdle=true
+
+app.audio.enabled = false
+
+# disable replicator orchestrator for better runtime perf
+exts."omni.replicator.core".Orchestrator.enabled = false
+
+[settings.physics]
+updateToUsd = false
+updateParticlesToUsd = false
+updateVelocitiesToUsd = false
+updateForceSensorsToUsd = false
+outputVelocitiesLocalSpace = false
+useFastCache = false
+visualizationDisplayJoints = false
+fabricUpdateTransformations = false
+fabricUpdateVelocities = false
+fabricUpdateForceSensors = false
+fabricUpdateJointStates = false
+
+[settings.exts."omni.kit.registry.nucleus"]
+registries = [
+ { name = "kit/default", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/106/shared" },
+ { name = "kit/sdk", url = "https://ovextensionsprod.blob.core.windows.net/exts/kit/prod/sdk/${kit_version_short}/${kit_git_hash}" },
+ { name = "kit/community", url = "https://dw290v42wisod.cloudfront.net/exts/kit/community" },
+]
+
+[settings.app.python]
+# These disable the kit app from also printing out python output, which gets confusing
+interceptSysStdOutput = false
+logSysStdOutput = false
+
+[settings.app.renderer]
+skipWhileMinimized = false
+sleepMsOnFocus = 0
+sleepMsOutOfFocus = 0
+
+# Register extension folder from this repo in kit
+[settings.app.exts]
+folders = [
+ "${exe-path}/exts", # kit extensions
+ "${exe-path}/extscore", # kit core extensions
+ "${exe-path}/../exts", # isaac extensions
+ "${exe-path}/../extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../extscache", # isaac cache extensions
+ "${exe-path}/../extsPhysics", # isaac physics extensions
+ "${exe-path}/../isaacsim/exts", # isaac extensions for pip
+ "${exe-path}/../isaacsim/extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../isaacsim/extscache", # isaac cache extensions for pip
+ "${exe-path}/../isaacsim/extsPhysics", # isaac physics extensions for pip
+ "${app}", # needed to find other app files
+ "${app}/../../source", # needed to find extensions in Isaac Lab
+]
+
+# Asset path
+# set the S3 directory manually to the latest published S3
+# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
+[settings]
+persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
diff --git a/apps/isaacsim_4_5/isaaclab.python.xr.openxr.headless.kit b/apps/isaacsim_4_5/isaaclab.python.xr.openxr.headless.kit
new file mode 100644
index 000000000000..82f7e5cd62ab
--- /dev/null
+++ b/apps/isaacsim_4_5/isaaclab.python.xr.openxr.headless.kit
@@ -0,0 +1,41 @@
+##
+# Adapted from: apps/isaaclab.python.xr.openxr.kit
+##
+
+[package]
+title = "Isaac Lab Python OpenXR Headless"
+description = "An app for running Isaac Lab with OpenXR in headless mode"
+version = "2.3.2"
+
+# That makes it browsable in UI with "experience" filter
+keywords = ["experience", "app", "usd", "headless"]
+
+[settings]
+# Note: This path was adapted to be respective to the kit-exe file location
+app.versionFile = "${exe-path}/VERSION"
+app.folder = "${exe-path}/"
+app.name = "Isaac-Sim"
+app.version = "4.5.0"
+
+[dependencies]
+"isaaclab.python.xr.openxr" = {}
+
+[settings]
+xr.profile.ar.enabled = true
+
+# Register extension folder from this repo in kit
+[settings.app.exts]
+folders = [
+ "${exe-path}/exts", # kit extensions
+ "${exe-path}/extscore", # kit core extensions
+ "${exe-path}/../exts", # isaac extensions
+ "${exe-path}/../extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../extscache", # isaac cache extensions
+ "${exe-path}/../extsPhysics", # isaac physics extensions
+ "${exe-path}/../isaacsim/exts", # isaac extensions for pip
+ "${exe-path}/../isaacsim/extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../isaacsim/extscache", # isaac cache extensions for pip
+ "${exe-path}/../isaacsim/extsPhysics", # isaac physics extensions for pip
+ "${app}", # needed to find other app files
+ "${app}/../../source", # needed to find extensions in Isaac Lab
+]
diff --git a/apps/isaacsim_4_5/isaaclab.python.xr.openxr.kit b/apps/isaacsim_4_5/isaaclab.python.xr.openxr.kit
new file mode 100644
index 000000000000..d27e5c444c21
--- /dev/null
+++ b/apps/isaacsim_4_5/isaaclab.python.xr.openxr.kit
@@ -0,0 +1,71 @@
+##
+# Adapted from: _isaac_sim/apps/isaacsim.exp.xr.openxr.kit
+##
+
+[package]
+title = "Isaac Lab Python OpenXR"
+description = "An app for running Isaac Lab with OpenXR"
+version = "2.3.2"
+
+# That makes it browsable in UI with "experience" filter
+keywords = ["experience", "app", "usd"]
+
+[settings]
+# Note: This path was adapted to be respective to the kit-exe file location
+app.versionFile = "${exe-path}/VERSION"
+app.folder = "${exe-path}/"
+app.name = "Isaac-Sim"
+app.version = "4.5.0"
+
+### async rendering settings
+omni.replicator.asyncRendering = true
+app.asyncRendering = true
+app.asyncRenderingLowLatency = true
+
+# For XR, set this back to default "#define OMNI_MAX_DEVICE_GROUP_DEVICE_COUNT 16"
+renderer.multiGpu.maxGpuCount = 16
+renderer.gpuEnumeration.glInterop.enabled = true # Allow Kit XR OpenXR to render headless
+
+[dependencies]
+"isaaclab.python" = {}
+"isaacsim.xr.openxr" = {}
+
+# Kit extensions
+"omni.kit.xr.system.openxr" = {}
+"omni.kit.xr.profile.ar" = {}
+
+[settings]
+app.xr.enabled = true
+
+# xr settings
+xr.ui.enabled = false
+xr.depth.aov = "GBufferDepth"
+defaults.xr.profile.ar.renderQuality = "off"
+defaults.xr.profile.ar.anchorMode = "custom anchor"
+rtx.rendermode = "RaytracedLighting"
+persistent.xr.profile.ar.render.nearPlane = 0.15
+
+# Register extension folder from this repo in kit
+[settings.app.exts]
+folders = [
+ "${exe-path}/exts", # kit extensions
+ "${exe-path}/extscore", # kit core extensions
+ "${exe-path}/../exts", # isaac extensions
+ "${exe-path}/../extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../extscache", # isaac cache extensions
+ "${exe-path}/../extsPhysics", # isaac physics extensions
+ "${exe-path}/../isaacsim/exts", # isaac extensions for pip
+ "${exe-path}/../isaacsim/extsDeprecated", # deprecated isaac extensions
+ "${exe-path}/../isaacsim/extscache", # isaac cache extensions for pip
+ "${exe-path}/../isaacsim/extsPhysics", # isaac physics extensions for pip
+ "${app}", # needed to find other app files
+ "${app}/../../source", # needed to find extensions in Isaac Lab
+]
+
+# Asset path
+# set the S3 directory manually to the latest published S3
+# note: this is done to ensure prior versions of Isaac Sim still use the latest assets
+[settings]
+persistent.isaac.asset_root.default = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.cloud = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
+persistent.isaac.asset_root.nvidia = "http://omniverse-content-production.s3-us-west-2.amazonaws.com/Assets/Isaac/4.5"
diff --git a/apps/isaacsim_4_5/rendering_modes/balanced.kit b/apps/isaacsim_4_5/rendering_modes/balanced.kit
new file mode 100644
index 000000000000..ee92625fd7e7
--- /dev/null
+++ b/apps/isaacsim_4_5/rendering_modes/balanced.kit
@@ -0,0 +1,36 @@
+rtx.translucency.enabled = false
+
+rtx.reflections.enabled = false
+rtx.reflections.denoiser.enabled = true
+
+# this will be ignored when RR (dldenoiser) is enabled
+# rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.directLighting.sampledLighting.enabled = true
+
+rtx.sceneDb.ambientLightIntensity = 1.0
+
+rtx.shadows.enabled = true
+
+rtx.indirectDiffuse.enabled = false
+rtx.indirectDiffuse.denoiser.enabled = true
+
+# rtx.domeLight.upperLowerStrategy = 3
+
+rtx.ambientOcclusion.enabled = false
+rtx.ambientOcclusion.denoiserMode = 1
+
+rtx.raytracing.subpixel.mode = 0
+rtx.raytracing.cached.enabled = true
+
+# DLSS frame gen does not yet support tiled camera well
+rtx-transient.dlssg.enabled = false
+rtx-transient.dldenoiser.enabled = true
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 1 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
diff --git a/apps/isaacsim_4_5/rendering_modes/performance.kit b/apps/isaacsim_4_5/rendering_modes/performance.kit
new file mode 100644
index 000000000000..3cfe6e8c0e2c
--- /dev/null
+++ b/apps/isaacsim_4_5/rendering_modes/performance.kit
@@ -0,0 +1,35 @@
+rtx.translucency.enabled = false
+
+rtx.reflections.enabled = false
+rtx.reflections.denoiser.enabled = false
+
+rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.directLighting.sampledLighting.enabled = false
+
+rtx.sceneDb.ambientLightIntensity = 1.0
+
+rtx.shadows.enabled = true
+
+rtx.indirectDiffuse.enabled = false
+rtx.indirectDiffuse.denoiser.enabled = false
+
+rtx.domeLight.upperLowerStrategy = 3
+
+rtx.ambientOcclusion.enabled = false
+rtx.ambientOcclusion.denoiserMode = 1
+
+rtx.raytracing.subpixel.mode = 0
+rtx.raytracing.cached.enabled = false
+
+# DLSS frame gen does not yet support tiled camera well
+rtx-transient.dlssg.enabled = false
+rtx-transient.dldenoiser.enabled = false
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 0 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
diff --git a/apps/isaacsim_4_5/rendering_modes/quality.kit b/apps/isaacsim_4_5/rendering_modes/quality.kit
new file mode 100644
index 000000000000..8e966ddfd3b7
--- /dev/null
+++ b/apps/isaacsim_4_5/rendering_modes/quality.kit
@@ -0,0 +1,36 @@
+rtx.translucency.enabled = true
+
+rtx.reflections.enabled = true
+rtx.reflections.denoiser.enabled = true
+
+# this will be ignored when RR (dldenoiser) is enabled
+# rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.directLighting.sampledLighting.enabled = true
+
+rtx.sceneDb.ambientLightIntensity = 1.0
+
+rtx.shadows.enabled = true
+
+rtx.indirectDiffuse.enabled = true
+rtx.indirectDiffuse.denoiser.enabled = true
+
+# rtx.domeLight.upperLowerStrategy = 4
+
+rtx.ambientOcclusion.enabled = true
+rtx.ambientOcclusion.denoiserMode = 0
+
+rtx.raytracing.subpixel.mode = 1
+rtx.raytracing.cached.enabled = true
+
+# DLSS frame gen does not yet support tiled camera well
+rtx-transient.dlssg.enabled = false
+rtx-transient.dldenoiser.enabled = true
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 2 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
diff --git a/apps/isaacsim_4_5/rendering_modes/xr.kit b/apps/isaacsim_4_5/rendering_modes/xr.kit
new file mode 100644
index 000000000000..8cfc2c988d78
--- /dev/null
+++ b/apps/isaacsim_4_5/rendering_modes/xr.kit
@@ -0,0 +1,35 @@
+rtx.translucency.enabled = true
+
+rtx.reflections.enabled = true
+rtx.reflections.denoiser.enabled = true
+
+rtx.directLighting.sampledLighting.denoisingTechnique = 5
+rtx.directLighting.sampledLighting.enabled = true
+
+rtx.sceneDb.ambientLightIntensity = 1.0
+
+rtx.shadows.enabled = true
+
+rtx.indirectDiffuse.enabled = true
+rtx.indirectDiffuse.denoiser.enabled = true
+
+rtx.domeLight.upperLowerStrategy = 4
+
+rtx.ambientOcclusion.enabled = true
+rtx.ambientOcclusion.denoiserMode = 0
+
+rtx.raytracing.subpixel.mode = 1
+rtx.raytracing.cached.enabled = true
+
+# DLSS frame gen does not yet support tiled camera well
+rtx-transient.dlssg.enabled = false
+rtx-transient.dldenoiser.enabled = true
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 2 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
diff --git a/apps/rendering_modes/balanced.kit b/apps/rendering_modes/balanced.kit
new file mode 100644
index 000000000000..ee92625fd7e7
--- /dev/null
+++ b/apps/rendering_modes/balanced.kit
@@ -0,0 +1,36 @@
+rtx.translucency.enabled = false
+
+rtx.reflections.enabled = false
+rtx.reflections.denoiser.enabled = true
+
+# this will be ignored when RR (dldenoiser) is enabled
+# rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.directLighting.sampledLighting.enabled = true
+
+rtx.sceneDb.ambientLightIntensity = 1.0
+
+rtx.shadows.enabled = true
+
+rtx.indirectDiffuse.enabled = false
+rtx.indirectDiffuse.denoiser.enabled = true
+
+# rtx.domeLight.upperLowerStrategy = 3
+
+rtx.ambientOcclusion.enabled = false
+rtx.ambientOcclusion.denoiserMode = 1
+
+rtx.raytracing.subpixel.mode = 0
+rtx.raytracing.cached.enabled = true
+
+# DLSS frame gen does not yet support tiled camera well
+rtx-transient.dlssg.enabled = false
+rtx-transient.dldenoiser.enabled = true
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 1 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
diff --git a/apps/rendering_modes/extension.toml b/apps/rendering_modes/extension.toml
new file mode 100644
index 000000000000..f0668b9184d1
--- /dev/null
+++ b/apps/rendering_modes/extension.toml
@@ -0,0 +1 @@
+# This is not an extension
diff --git a/apps/rendering_modes/performance.kit b/apps/rendering_modes/performance.kit
new file mode 100644
index 000000000000..3cfe6e8c0e2c
--- /dev/null
+++ b/apps/rendering_modes/performance.kit
@@ -0,0 +1,35 @@
+rtx.translucency.enabled = false
+
+rtx.reflections.enabled = false
+rtx.reflections.denoiser.enabled = false
+
+rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.directLighting.sampledLighting.enabled = false
+
+rtx.sceneDb.ambientLightIntensity = 1.0
+
+rtx.shadows.enabled = true
+
+rtx.indirectDiffuse.enabled = false
+rtx.indirectDiffuse.denoiser.enabled = false
+
+rtx.domeLight.upperLowerStrategy = 3
+
+rtx.ambientOcclusion.enabled = false
+rtx.ambientOcclusion.denoiserMode = 1
+
+rtx.raytracing.subpixel.mode = 0
+rtx.raytracing.cached.enabled = false
+
+# DLSS frame gen does not yet support tiled camera well
+rtx-transient.dlssg.enabled = false
+rtx-transient.dldenoiser.enabled = false
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 0 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
diff --git a/apps/rendering_modes/quality.kit b/apps/rendering_modes/quality.kit
new file mode 100644
index 000000000000..8e966ddfd3b7
--- /dev/null
+++ b/apps/rendering_modes/quality.kit
@@ -0,0 +1,36 @@
+rtx.translucency.enabled = true
+
+rtx.reflections.enabled = true
+rtx.reflections.denoiser.enabled = true
+
+# this will be ignored when RR (dldenoiser) is enabled
+# rtx.directLighting.sampledLighting.denoisingTechnique = 0
+rtx.directLighting.sampledLighting.enabled = true
+
+rtx.sceneDb.ambientLightIntensity = 1.0
+
+rtx.shadows.enabled = true
+
+rtx.indirectDiffuse.enabled = true
+rtx.indirectDiffuse.denoiser.enabled = true
+
+# rtx.domeLight.upperLowerStrategy = 4
+
+rtx.ambientOcclusion.enabled = true
+rtx.ambientOcclusion.denoiserMode = 0
+
+rtx.raytracing.subpixel.mode = 1
+rtx.raytracing.cached.enabled = true
+
+# DLSS frame gen does not yet support tiled camera well
+rtx-transient.dlssg.enabled = false
+rtx-transient.dldenoiser.enabled = true
+
+# Set the DLSS model
+rtx.post.dlss.execMode = 2 # can be 0 (Performance), 1 (Balanced), 2 (Quality), or 3 (Auto)
+
+# Avoids replicator warning
+rtx.pathtracing.maxSamplesPerLaunch = 1000000
+
+# Avoids silent trimming of tiles
+rtx.viewTile.limit = 1000000
diff --git a/docker/.env.base b/docker/.env.base
index 8cf575758ab5..b1871cf6d84c 100644
--- a/docker/.env.base
+++ b/docker/.env.base
@@ -6,11 +6,21 @@
ACCEPT_EULA=Y
# NVIDIA Isaac Sim base image
ISAACSIM_BASE_IMAGE=nvcr.io/nvidia/isaac-sim
-# NVIDIA Isaac Sim version to use (e.g. 4.5.0)
-ISAACSIM_VERSION=4.5.0
+# NVIDIA Isaac Sim version to use (e.g. 5.1.0)
+ISAACSIM_VERSION=5.1.0
# Derived from the default path in the NVIDIA provided Isaac Sim container
DOCKER_ISAACSIM_ROOT_PATH=/isaac-sim
# The Isaac Lab path in the container
DOCKER_ISAACLAB_PATH=/workspace/isaaclab
# Docker user directory - by default this is the root user's home directory
DOCKER_USER_HOME=/root
+# Docker image and container name suffix (default "", set by the container_interface.py script)
+# Example: "-custom"
+DOCKER_NAME_SUFFIX=""
+
+# Display configuration for remote desktop sessions.
+DISPLAY_WIDTH=1280
+DISPLAY_HEIGHT=720
+DISPLAY_DEPTH=24
+VNC_DISPLAY=1
+VNC_PORT=5900
diff --git a/docker/.env.cloudxr-runtime b/docker/.env.cloudxr-runtime
new file mode 100644
index 000000000000..65b6d1373ac3
--- /dev/null
+++ b/docker/.env.cloudxr-runtime
@@ -0,0 +1,8 @@
+###
+# General settings
+###
+
+# NVIDIA CloudXR Runtime base image
+CLOUDXR_RUNTIME_BASE_IMAGE_ARG=nvcr.io/nvidia/cloudxr-runtime
+# NVIDIA CloudXR Runtime version to use
+CLOUDXR_RUNTIME_VERSION_ARG=5.0.1
diff --git a/docker/.env.ros2 b/docker/.env.ros2
index b7b255dc4f2c..609704f45674 100644
--- a/docker/.env.ros2
+++ b/docker/.env.ros2
@@ -9,3 +9,6 @@ RMW_IMPLEMENTATION=rmw_fastrtps_cpp
FASTRTPS_DEFAULT_PROFILES_FILE=${DOCKER_USER_HOME}/.ros/fastdds.xml
# Path to cyclonedds.xml file to use (only needed when using cyclonedds)
CYCLONEDDS_URI=${DOCKER_USER_HOME}/.ros/cyclonedds.xml
+# Docker image and container name suffix (default "", set by the container_interface.py script)
+# Example: "-custom"
+DOCKER_NAME_SUFFIX=""
diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base
index ea211b1e1ef1..dbc474e6f2b4 100644
--- a/docker/Dockerfile.base
+++ b/docker/Dockerfile.base
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
@@ -16,7 +16,7 @@ ENV ISAACSIM_VERSION=${ISAACSIM_VERSION_ARG}
SHELL ["/bin/bash", "-c"]
# Adds labels to the Dockerfile
-LABEL version="1.1"
+LABEL version="2.1.1"
LABEL description="Dockerfile for building and running the Isaac Lab framework inside Isaac Sim container image."
# Arguments
@@ -42,14 +42,40 @@ RUN --mount=type=cache,target=/var/cache/apt \
build-essential \
cmake \
git \
+ gpg \
libglib2.0-0 \
- ncurses-term && \
+ ncurses-term \
+ wget && \
+ apt -y autoremove && apt clean autoclean && \
+ rm -rf /var/lib/apt/lists/*
+
+# Install TurboVNC and a lightweight desktop for remote visualization.
+RUN --mount=type=cache,target=/var/cache/apt \
+ set -eux && \
+ wget -q -O- https://packagecloud.io/dcommander/turbovnc/gpgkey | \
+ gpg --dearmor > /etc/apt/trusted.gpg.d/TurboVNC.gpg && \
+ wget -q -O /etc/apt/sources.list.d/TurboVNC.list \
+ https://raw.githubusercontent.com/TurboVNC/repo/main/TurboVNC.list && \
+ apt-get update && apt-get install -y --no-install-recommends \
+ dbus-x11 \
+ openbox \
+ pcmanfm \
+ turbovnc \
+ xauth \
+ xterm && \
apt -y autoremove && apt clean autoclean && \
rm -rf /var/lib/apt/lists/*
# Copy the Isaac Lab directory (files to exclude are defined in .dockerignore)
COPY ../ ${ISAACLAB_PATH}
+# Ensure isaaclab.sh has execute permissions
+RUN chmod +x ${ISAACLAB_PATH}/isaaclab.sh
+
+# Install container-side helpers for the TurboVNC session.
+RUN chmod +x ${ISAACLAB_PATH}/docker/start-turbovnc.sh && \
+ chmod +x ${ISAACLAB_PATH}/docker/turbovnc-xstartup.sh
+
# Set up a symbolic link between the installed Isaac Sim root folder and _isaac_sim in the Isaac Lab directory
RUN ln -sf ${ISAACSIM_ROOT_PATH} ${ISAACLAB_PATH}/_isaac_sim
@@ -87,6 +113,9 @@ RUN touch /bin/nvidia-smi && \
RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \
${ISAACLAB_PATH}/isaaclab.sh --install
+# HACK: Remove install of quadprog dependency
+RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip uninstall -y quadprog
+
# aliasing isaaclab.sh and python for convenience
RUN echo "export ISAACLAB_PATH=${ISAACLAB_PATH}" >> ${HOME}/.bashrc && \
echo "alias isaaclab=${ISAACLAB_PATH}/isaaclab.sh" >> ${HOME}/.bashrc && \
@@ -95,7 +124,9 @@ RUN echo "export ISAACLAB_PATH=${ISAACLAB_PATH}" >> ${HOME}/.bashrc && \
echo "alias pip='${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip'" >> ${HOME}/.bashrc && \
echo "alias pip3='${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip'" >> ${HOME}/.bashrc && \
echo "alias tensorboard='${ISAACLAB_PATH}/_isaac_sim/python.sh ${ISAACLAB_PATH}/_isaac_sim/tensorboard'" >> ${HOME}/.bashrc && \
- echo "export TZ=$(date +%Z)" >> ${HOME}/.bashrc
+ echo "export TZ=$(date +%Z)" >> ${HOME}/.bashrc && \
+ echo "shopt -s histappend" >> /root/.bashrc && \
+ echo "PROMPT_COMMAND='history -a'" >> /root/.bashrc
# make working directory as the Isaac Lab directory
# this is the default directory when the container is run
diff --git a/docker/Dockerfile.curobo b/docker/Dockerfile.curobo
new file mode 100644
index 000000000000..0830adebf18b
--- /dev/null
+++ b/docker/Dockerfile.curobo
@@ -0,0 +1,155 @@
+# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Nvidia Dockerfiles: https://github.com/NVIDIA-Omniverse/IsaacSim-dockerfiles
+# Please check above link for license information.
+
+# Base image
+ARG ISAACSIM_BASE_IMAGE_ARG
+ARG ISAACSIM_VERSION_ARG
+FROM ${ISAACSIM_BASE_IMAGE_ARG}:${ISAACSIM_VERSION_ARG} AS base
+ENV ISAACSIM_VERSION=${ISAACSIM_VERSION_ARG}
+
+# Set default RUN shell to bash
+SHELL ["/bin/bash", "-c"]
+
+# Adds labels to the Dockerfile
+LABEL version="2.1.1"
+LABEL description="Dockerfile for building and running the Isaac Lab framework inside Isaac Sim container image."
+
+# Arguments
+# Path to Isaac Sim root folder
+ARG ISAACSIM_ROOT_PATH_ARG
+ENV ISAACSIM_ROOT_PATH=${ISAACSIM_ROOT_PATH_ARG}
+# Path to the Isaac Lab directory
+ARG ISAACLAB_PATH_ARG
+ENV ISAACLAB_PATH=${ISAACLAB_PATH_ARG}
+# Home dir of docker user, typically '/root'
+ARG DOCKER_USER_HOME_ARG
+ENV DOCKER_USER_HOME=${DOCKER_USER_HOME_ARG}
+
+# Set environment variables
+ENV LANG=C.UTF-8
+ENV DEBIAN_FRONTEND=noninteractive
+
+USER root
+
+# Install dependencies and remove cache
+RUN --mount=type=cache,target=/var/cache/apt \
+ apt-get update && apt-get install -y --no-install-recommends \
+ build-essential \
+ cmake \
+ git \
+ libglib2.0-0 \
+ ncurses-term \
+ wget && \
+ apt -y autoremove && apt clean autoclean && \
+ rm -rf /var/lib/apt/lists/*
+
+# Detect Ubuntu version and install CUDA 12.8 via NVIDIA network repo (cuda-keyring)
+RUN set -euo pipefail && \
+ . /etc/os-release && \
+ case "$ID" in \
+ ubuntu) \
+ case "$VERSION_ID" in \
+ "20.04") cuda_repo="ubuntu2004";; \
+ "22.04") cuda_repo="ubuntu2204";; \
+ "24.04") cuda_repo="ubuntu2404";; \
+ *) echo "Unsupported Ubuntu $VERSION_ID"; exit 1;; \
+ esac ;; \
+ *) echo "Unsupported base OS: $ID"; exit 1 ;; \
+ esac && \
+ apt-get update && apt-get install -y --no-install-recommends wget gnupg ca-certificates && \
+ wget -q https://developer.download.nvidia.com/compute/cuda/repos/${cuda_repo}/x86_64/cuda-keyring_1.1-1_all.deb && \
+ dpkg -i cuda-keyring_1.1-1_all.deb && \
+ rm -f cuda-keyring_1.1-1_all.deb && \
+ wget -q https://developer.download.nvidia.com/compute/cuda/repos/${cuda_repo}/x86_64/cuda-${cuda_repo}.pin && \
+ mv cuda-${cuda_repo}.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \
+ apt-get update && \
+ apt-get install -y --no-install-recommends \
+ cuda-toolkit-12-8 \
+ libcudnn9-cuda-12 \
+ libcusparselt0 \
+ libnccl2 \
+ libnccl-dev \
+ libnvjitlink-12-8 && \
+ apt-get -y autoremove && apt-get clean && rm -rf /var/lib/apt/lists/*
+
+
+ENV CUDA_HOME=/usr/local/cuda-12.8
+ENV PATH=${CUDA_HOME}/bin:${PATH}
+ENV LD_LIBRARY_PATH=${CUDA_HOME}/lib64:${LD_LIBRARY_PATH}
+ENV TORCH_CUDA_ARCH_LIST=8.0+PTX
+
+# Copy the Isaac Lab directory (files to exclude are defined in .dockerignore)
+COPY ../ ${ISAACLAB_PATH}
+
+# Ensure isaaclab.sh has execute permissions
+RUN chmod +x ${ISAACLAB_PATH}/isaaclab.sh
+
+# Set up a symbolic link between the installed Isaac Sim root folder and _isaac_sim in the Isaac Lab directory
+RUN ln -sf ${ISAACSIM_ROOT_PATH} ${ISAACLAB_PATH}/_isaac_sim
+
+# Install toml dependency
+RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install toml
+
+# Install apt dependencies for extensions that declare them in their extension.toml
+RUN --mount=type=cache,target=/var/cache/apt \
+ ${ISAACLAB_PATH}/isaaclab.sh -p ${ISAACLAB_PATH}/tools/install_deps.py apt ${ISAACLAB_PATH}/source && \
+ apt -y autoremove && apt clean autoclean && \
+ rm -rf /var/lib/apt/lists/*
+
+# for singularity usage, have to create the directories that will binded
+RUN mkdir -p ${ISAACSIM_ROOT_PATH}/kit/cache && \
+ mkdir -p ${DOCKER_USER_HOME}/.cache/ov && \
+ mkdir -p ${DOCKER_USER_HOME}/.cache/pip && \
+ mkdir -p ${DOCKER_USER_HOME}/.cache/nvidia/GLCache && \
+ mkdir -p ${DOCKER_USER_HOME}/.nv/ComputeCache && \
+ mkdir -p ${DOCKER_USER_HOME}/.nvidia-omniverse/logs && \
+ mkdir -p ${DOCKER_USER_HOME}/.local/share/ov/data && \
+ mkdir -p ${DOCKER_USER_HOME}/Documents
+
+# for singularity usage, create NVIDIA binary placeholders
+RUN touch /bin/nvidia-smi && \
+ touch /bin/nvidia-debugdump && \
+ touch /bin/nvidia-persistenced && \
+ touch /bin/nvidia-cuda-mps-control && \
+ touch /bin/nvidia-cuda-mps-server && \
+ touch /etc/localtime && \
+ mkdir -p /var/run/nvidia-persistenced && \
+ touch /var/run/nvidia-persistenced/socket
+
+# HACK: Remove pre-bundled torch BEFORE installing Isaac Lab dependencies.
+# This forces isaaclab.sh --install to install torch fresh to site-packages,
+# rather than skipping because it detects the pre-bundled version.
+RUN rm -rf ${ISAACSIM_ROOT_PATH}/exts/omni.isaac.ml_archive/pip_prebundle/torch*
+
+# installing Isaac Lab dependencies
+# use pip caching to avoid reinstalling large packages
+RUN --mount=type=cache,target=${DOCKER_USER_HOME}/.cache/pip \
+ ${ISAACLAB_PATH}/isaaclab.sh --install
+
+# HACK: Uninstall quadprog as it causes issues with some reinforcement learning frameworks
+RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip uninstall -y quadprog
+
+# Install cuRobo from source (pinned commit); needs CUDA env and Torch
+RUN ${ISAACLAB_PATH}/isaaclab.sh -p -m pip install --no-build-isolation \
+ "nvidia-curobo @ git+https://github.com/NVlabs/curobo.git@ebb71702f3f70e767f40fd8e050674af0288abe8"
+
+# aliasing isaaclab.sh and python for convenience
+RUN echo "export ISAACLAB_PATH=${ISAACLAB_PATH}" >> ${HOME}/.bashrc && \
+ echo "alias isaaclab=${ISAACLAB_PATH}/isaaclab.sh" >> ${HOME}/.bashrc && \
+ echo "alias python=${ISAACLAB_PATH}/_isaac_sim/python.sh" >> ${HOME}/.bashrc && \
+ echo "alias python3=${ISAACLAB_PATH}/_isaac_sim/python.sh" >> ${HOME}/.bashrc && \
+ echo "alias pip='${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip'" >> ${HOME}/.bashrc && \
+ echo "alias pip3='${ISAACLAB_PATH}/_isaac_sim/python.sh -m pip'" >> ${HOME}/.bashrc && \
+ echo "alias tensorboard='${ISAACLAB_PATH}/_isaac_sim/python.sh ${ISAACLAB_PATH}/_isaac_sim/tensorboard'" >> ${HOME}/.bashrc && \
+ echo "export TZ=$(date +%Z)" >> ${HOME}/.bashrc && \
+ echo "shopt -s histappend" >> /root/.bashrc && \
+ echo "PROMPT_COMMAND='history -a'" >> /root/.bashrc
+
+# make working directory as the Isaac Lab directory
+# this is the default directory when the container is run
+WORKDIR ${ISAACLAB_PATH}
diff --git a/docker/Dockerfile.ros2 b/docker/Dockerfile.ros2
index 8c35bffe4ece..2e00fc7ec396 100644
--- a/docker/Dockerfile.ros2
+++ b/docker/Dockerfile.ros2
@@ -1,6 +1,10 @@
# Everything past this stage is to install
# ROS2 Humble
-FROM isaac-lab-base AS ros2
+
+# What is the docker name suffix for the base image to load? (defaults to empty string)
+ARG DOCKER_NAME_SUFFIX=""
+
+FROM isaac-lab-base${DOCKER_NAME_SUFFIX} AS ros2
# Which ROS2 apt package to install
ARG ROS2_APT_PACKAGE
diff --git a/docker/container.py b/docker/container.py
index 766a40faee98..ab92d816ffac 100755
--- a/docker/container.py
+++ b/docker/container.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
@@ -46,9 +46,30 @@ def parse_cli_args() -> argparse.Namespace:
" '.env.base' in their provided order."
),
)
+ parent_parser.add_argument(
+ "--suffix",
+ nargs="?",
+ default=None,
+ help=(
+ "Optional docker image and container name suffix. Defaults to None, in which case, the docker name"
+ " suffix is set to the empty string. A hyphen is inserted in between the profile and the suffix if"
+ ' the suffix is a nonempty string. For example, if "base" is passed to profile, and "custom" is'
+ " passed to suffix, then the produced docker image and container will be named ``isaac-lab-base-custom``."
+ ),
+ )
+ parent_parser.add_argument(
+ "--info",
+ action="store_true",
+ help="Print the container interface information. This is useful for debugging purposes.",
+ )
# Actual command definition begins here
subparsers = parser.add_subparsers(dest="command", required=True)
+ subparsers.add_parser(
+ "build",
+ help="Build the docker image without creating the container.",
+ parents=[parent_parser],
+ )
subparsers.add_parser(
"start",
help="Build the docker image and create the container in detached mode.",
@@ -90,11 +111,29 @@ def main(args: argparse.Namespace):
# creating container interface
ci = ContainerInterface(
- context_dir=Path(__file__).resolve().parent, profile=args.profile, yamls=args.files, envs=args.env_files
+ context_dir=Path(__file__).resolve().parent,
+ profile=args.profile,
+ yamls=args.files,
+ envs=args.env_files,
+ suffix=args.suffix,
)
+ if args.info:
+ print("[INFO] Printing container interface information...\n")
+ ci.print_info()
+ return
print(f"[INFO] Using container profile: {ci.profile}")
- if args.command == "start":
+ if args.command == "build":
+ # check if x11 forwarding is enabled
+ x11_outputs = x11_utils.x11_check(ci.statefile)
+ # if x11 forwarding is enabled, add the x11 yaml and environment variables
+ if x11_outputs is not None:
+ (x11_yaml, x11_envar) = x11_outputs
+ ci.add_yamls += x11_yaml
+ ci.environ.update(x11_envar)
+ # build the image
+ ci.build()
+ elif args.command == "start":
# check if x11 forwarding is enabled
x11_outputs = x11_utils.x11_check(ci.statefile)
# if x11 forwarding is enabled, add the x11 yaml and environment variables
diff --git a/docker/container.sh b/docker/container.sh
index c4dc31cb8be5..f6fc2af49d61 100755
--- a/docker/container.sh
+++ b/docker/container.sh
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2025, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
diff --git a/docker/docker-compose.cloudxr-runtime.patch.yaml b/docker/docker-compose.cloudxr-runtime.patch.yaml
new file mode 100644
index 000000000000..5615aed29ac7
--- /dev/null
+++ b/docker/docker-compose.cloudxr-runtime.patch.yaml
@@ -0,0 +1,52 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+services:
+ cloudxr-runtime:
+ image: ${CLOUDXR_RUNTIME_BASE_IMAGE_ARG}:${CLOUDXR_RUNTIME_VERSION_ARG}
+ ports:
+ - "48010:48010/tcp" # signaling
+ - "47998:47998/udp" # media
+ - "47999:47999/udp" # media
+ - "48000:48000/udp" # media
+ - "48005:48005/udp" # media
+ - "48008:48008/udp" # media
+ - "48012:48012/udp" # media
+ healthcheck:
+ test: ["CMD", "test", "-S", "/openxr/run/ipc_cloudxr"]
+ interval: 1s
+ timeout: 1s
+ retries: 10
+ start_period: 5s
+ environment:
+ - ACCEPT_EULA=${ACCEPT_EULA}
+ volumes:
+ - openxr-volume:/openxr:rw
+ deploy:
+ resources:
+ reservations:
+ devices:
+ - driver: nvidia
+ count: all
+ capabilities: [ gpu ]
+
+ isaac-lab-base:
+ environment:
+ - XDG_RUNTIME_DIR=/openxr/run
+ - XR_RUNTIME_JSON=/openxr/share/openxr/1/openxr_cloudxr.json
+ volumes:
+ - openxr-volume:/openxr:rw
+ depends_on:
+ - cloudxr-runtime
+ deploy:
+ resources:
+ reservations:
+ devices:
+ - driver: nvidia
+ count: all
+ capabilities: [ gpu ]
+
+volumes:
+ openxr-volume:
diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml
index 26c924ec42f3..8889ced22df2 100644
--- a/docker/docker-compose.yaml
+++ b/docker/docker-compose.yaml
@@ -1,5 +1,10 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
# Here we set the parts that would
-# be re-used between services to an
+# be reused between services to an
# extension field
# https://docs.docker.com/compose/compose-file/compose-file-v3/#extension-fields
x-default-isaac-lab-volumes: &default-isaac-lab-volumes
@@ -32,6 +37,9 @@ x-default-isaac-lab-volumes: &default-isaac-lab-volumes
- type: volume
source: isaac-docs
target: ${DOCKER_USER_HOME}/Documents
+ - type: bind
+ source: ../../humanoid
+ target: /workspace/humanoid
# This overlay allows changes on the local files to
# be reflected within the container immediately
- type: bind
@@ -60,10 +68,15 @@ x-default-isaac-lab-volumes: &default-isaac-lab-volumes
- type: volume
source: isaac-lab-data
target: ${DOCKER_ISAACLAB_PATH}/data_storage
+ # This volume is used to store the history of the bash shell
+ - type: bind
+ source: .isaac-lab-docker-history
+ target: ${DOCKER_USER_HOME}/.bash_history
x-default-isaac-lab-environment: &default-isaac-lab-environment
- ISAACSIM_PATH=${DOCKER_ISAACLAB_PATH}/_isaac_sim
- OMNI_KIT_ALLOW_ROOT=1
+ - DISPLAY=:${VNC_DISPLAY}.0
x-default-isaac-lab-deploy: &default-isaac-lab-deploy
resources:
@@ -87,14 +100,15 @@ services:
- ISAACSIM_ROOT_PATH_ARG=${DOCKER_ISAACSIM_ROOT_PATH}
- ISAACLAB_PATH_ARG=${DOCKER_ISAACLAB_PATH}
- DOCKER_USER_HOME_ARG=${DOCKER_USER_HOME}
- image: isaac-lab-base
- container_name: isaac-lab-base
+ image: isaac-lab-base${DOCKER_NAME_SUFFIX-}
+ container_name: isaac-lab-base${DOCKER_NAME_SUFFIX-}
environment: *default-isaac-lab-environment
volumes: *default-isaac-lab-volumes
- network_mode: host
deploy: *default-isaac-lab-deploy
+ ports:
+ - "5900:5900"
# This is the entrypoint for the container
- entrypoint: bash
+ entrypoint: /workspace/isaaclab/docker/start-turbovnc.sh
stdin_open: true
tty: true
@@ -113,14 +127,18 @@ services:
# avoid a warning message when building only the base profile
# with the .env.base file
- ROS2_APT_PACKAGE=${ROS2_APT_PACKAGE:-NONE}
- image: isaac-lab-ros2
- container_name: isaac-lab-ros2
+ # Make sure that the correct Docker Name Suffix is being passed to the dockerfile, to know which base image to
+ # start from.
+ - DOCKER_NAME_SUFFIX=${DOCKER_NAME_SUFFIX-}
+ image: isaac-lab-ros2${DOCKER_NAME_SUFFIX-}
+ container_name: isaac-lab-ros2${DOCKER_NAME_SUFFIX-}
environment: *default-isaac-lab-environment
volumes: *default-isaac-lab-volumes
- network_mode: host
deploy: *default-isaac-lab-deploy
+ ports:
+ - "5900:5900"
# This is the entrypoint for the container
- entrypoint: bash
+ entrypoint: /workspace/isaaclab/docker/start-turbovnc.sh
stdin_open: true
tty: true
diff --git a/docker/start-turbovnc.sh b/docker/start-turbovnc.sh
new file mode 100644
index 000000000000..c22cf09951d8
--- /dev/null
+++ b/docker/start-turbovnc.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+VNC_DISPLAY="${VNC_DISPLAY:-1}"
+DISPLAY_NUM=":${VNC_DISPLAY}"
+DISPLAY_WIDTH="${DISPLAY_WIDTH:-1280}"
+DISPLAY_HEIGHT="${DISPLAY_HEIGHT:-720}"
+DISPLAY_DEPTH="${DISPLAY_DEPTH:-24}"
+VNC_PORT="${VNC_PORT:-5900}"
+VNC_GEOMETRY="${DISPLAY_WIDTH}x${DISPLAY_HEIGHT}"
+VNC_XSTARTUP="${ISAACLAB_PATH}/docker/turbovnc-xstartup.sh"
+VNC_PASSWD_DIR="${DOCKER_USER_HOME}/.vnc"
+VNC_LOG_FILE="${VNC_PASSWD_DIR}/$(hostname)${DISPLAY_NUM}.log"
+
+mkdir -p "${VNC_PASSWD_DIR}"
+chmod 700 "${VNC_PASSWD_DIR}"
+
+# TurboVNC refuses to start if stale lock files exist from a previous run.
+vncserver -kill "${DISPLAY_NUM}" >/dev/null 2>&1 || true
+rm -rf "/tmp/.X${VNC_DISPLAY}-lock" "/tmp/.X11-unix/X${VNC_DISPLAY}"
+
+/opt/TurboVNC/bin/vncserver "${DISPLAY_NUM}" \
+ -SecurityTypes None \
+ -rfbport "${VNC_PORT}" \
+ -geometry "${VNC_GEOMETRY}" \
+ -depth "${DISPLAY_DEPTH}" \
+ -xstartup "${VNC_XSTARTUP}"
+
+# Keep the container alive while still surfacing VNC session logs.
+touch "${VNC_LOG_FILE}"
+exec tail -F "${VNC_LOG_FILE}"
diff --git a/docker/test/test_docker.py b/docker/test/test_docker.py
new file mode 100644
index 000000000000..85fd66348f85
--- /dev/null
+++ b/docker/test/test_docker.py
@@ -0,0 +1,64 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+import os
+import subprocess
+from pathlib import Path
+
+import pytest
+
+
+def start_stop_docker(profile, suffix):
+ """Test starting and stopping docker profile with suffix."""
+ environ = os.environ
+ context_dir = Path(__file__).resolve().parent.parent
+
+ # generate parameters for the arguments
+ if suffix != "":
+ container_name = f"isaac-lab-{profile}-{suffix}"
+ suffix_args = ["--suffix", suffix]
+ else:
+ container_name = f"isaac-lab-{profile}"
+ suffix_args = []
+
+ run_kwargs = {
+ "check": False,
+ "capture_output": True,
+ "text": True,
+ "cwd": context_dir,
+ "env": environ,
+ }
+
+ # start the container
+ docker_start = subprocess.run(["python", "container.py", "start", profile] + suffix_args, **run_kwargs)
+ assert docker_start.returncode == 0
+
+ # verify that the container is running
+ docker_running_true = subprocess.run(["docker", "ps"], **run_kwargs)
+ assert docker_running_true.returncode == 0
+ assert container_name in docker_running_true.stdout
+
+ # stop the container
+ docker_stop = subprocess.run(["python", "container.py", "stop", profile] + suffix_args, **run_kwargs)
+ assert docker_stop.returncode == 0
+
+ # verify that the container has stopped
+ docker_running_false = subprocess.run(["docker", "ps"], **run_kwargs)
+ assert docker_running_false.returncode == 0
+ assert container_name not in docker_running_false.stdout
+
+
+@pytest.mark.parametrize(
+ "profile,suffix",
+ [
+ ("base", ""),
+ ("base", "test"),
+ ("ros2", ""),
+ ("ros2", "test"),
+ ],
+)
+def test_docker_profiles(profile, suffix):
+ """Test starting and stopping docker profiles with and without suffixes."""
+ start_stop_docker(profile, suffix)
diff --git a/docker/turbovnc-xstartup.sh b/docker/turbovnc-xstartup.sh
new file mode 100644
index 000000000000..8d016936a234
--- /dev/null
+++ b/docker/turbovnc-xstartup.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+
+unset SESSION_MANAGER
+unset DBUS_SESSION_BUS_ADDRESS
+
+export XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/tmp/runtime-root}"
+mkdir -p "${XDG_RUNTIME_DIR}"
+chmod 700 "${XDG_RUNTIME_DIR}"
+
+# Keep the desktop minimal to reduce remote rendering overhead.
+pcmanfm --desktop >/tmp/pcmanfm.log 2>&1 &
+xterm >/tmp/xterm.log 2>&1 &
+exec openbox-session >/tmp/openbox-session.log 2>&1
diff --git a/docker/utils/__init__.py b/docker/utils/__init__.py
index d6f44a2dcb6e..4d29d62425fa 100644
--- a/docker/utils/__init__.py
+++ b/docker/utils/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
diff --git a/docker/utils/container_interface.py b/docker/utils/container_interface.py
index 83d8c4128460..f8b3eb07ee22 100644
--- a/docker/utils/container_interface.py
+++ b/docker/utils/container_interface.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
@@ -24,19 +24,30 @@ def __init__(
yamls: list[str] | None = None,
envs: list[str] | None = None,
statefile: StateFile | None = None,
+ suffix: str | None = None,
):
"""Initialize the container interface with the given parameters.
Args:
- context_dir: The context directory for Docker operations.
- profile: The profile name for the container. Defaults to "base".
- yamls: A list of yaml files to extend ``docker-compose.yaml`` settings. These are extended in the order
- they are provided.
- envs: A list of environment variable files to extend the ``.env.base`` file. These are extended in the order
- they are provided.
- statefile: An instance of the :class:`Statefile` class to manage state variables. Defaults to None, in
+ context_dir:
+ The context directory for Docker operations.
+ profile:
+ The profile name for the container. Defaults to "base".
+ yamls:
+ A list of yaml files to extend ``docker-compose.yaml`` settings. These are extended in the order
+ they are provided. Defaults to None, in which case no additional yaml files are added.
+ envs:
+ A list of environment variable files to extend the ``.env.base`` file. These are extended in the order
+ they are provided. Defaults to None, in which case no additional environment variable files are added.
+ statefile:
+ An instance of the :class:`Statefile` class to manage state variables. Defaults to None, in
which case a new configuration object is created by reading the configuration file at the path
``context_dir/.container.cfg``.
+ suffix:
+ Optional docker image and container name suffix. Defaults to None, in which case, the docker name
+ suffix is set to the empty string. A hyphen is inserted in between the profile and the suffix if
+ the suffix is a nonempty string. For example, if "base" is passed to profile, and "custom" is
+ passed to suffix, then the produced docker image and container will be named ``isaac-lab-base-custom``.
"""
# set the context directory
self.context_dir = context_dir
@@ -55,17 +66,50 @@ def __init__(
# but not a real profile
self.profile = "base"
- self.container_name = f"isaac-lab-{self.profile}"
- self.image_name = f"isaac-lab-{self.profile}:latest"
+ # set the docker image and container name suffix
+ if suffix is None or suffix == "":
+ # if no name suffix is given, default to the empty string as the name suffix
+ self.suffix = ""
+ else:
+ # insert a hyphen before the suffix if a suffix is given
+ self.suffix = f"-{suffix}"
+
+ # set names for easier reference
+ self.base_service_name = "isaac-lab-base"
+ self.service_name = f"isaac-lab-{self.profile}"
+ self.container_name = f"{self.service_name}{self.suffix}"
+ self.image_name = f"{self.service_name}{self.suffix}:latest"
- # keep the environment variables from the current environment
- self.environ = os.environ
+ # keep the environment variables from the current environment,
+ # except make sure that the docker name suffix is set from the script
+ self.environ = os.environ.copy()
+ self.environ["DOCKER_NAME_SUFFIX"] = self.suffix
# resolve the image extension through the passed yamls and envs
self._resolve_image_extension(yamls, envs)
# load the environment variables from the .env files
self._parse_dot_vars()
+ def print_info(self):
+ """Print the container interface information."""
+ print("=" * 60)
+ print(f"{'DOCKER CONTAINER INFO':^60}") # Centered title
+ print("=" * 60)
+
+ print(f"{'Profile:':25} {self.profile}")
+ print(f"{'Suffix:':25} {self.suffix}")
+ print(f"{'Service Name:':25} {self.service_name}")
+ print(f"{'Image Name:':25} {self.image_name}")
+ print(f"{'Container Name:':25} {self.container_name}")
+
+ print("-" * 60)
+ print(f"{'Docker Compose Arguments':^60}")
+ print("-" * 60)
+ print(f"{'YAMLs:':25} {' '.join(self.add_yamls)}")
+ print(f"{'Profiles:':25} {' '.join(self.add_profiles)}")
+ print(f"{'Env Files:':25} {' '.join(self.add_env_files)}")
+ print("=" * 60)
+
"""
Operations.
"""
@@ -93,41 +137,65 @@ def does_image_exist(self) -> bool:
result = subprocess.run(["docker", "image", "inspect", self.image_name], capture_output=True, text=True)
return result.returncode == 0
+ def build(self):
+ """Build the Docker image."""
+ print("[INFO] Building the docker image for the profile 'base'...\n")
+ # build the image for the base profile
+ cmd = (
+ ["docker", "compose"]
+ + ["--file", "docker-compose.yaml"]
+ + ["--profile", "base"]
+ + ["--env-file", ".env.base"]
+ + ["build", self.base_service_name]
+ )
+ subprocess.run(cmd, check=False, cwd=self.context_dir, env=self.environ)
+ print("[INFO] Finished building the docker image for the profile 'base'.\n")
+
+ # build the image for the profile
+ if self.profile != "base":
+ print(f"[INFO] Building the docker image for the profile '{self.profile}'...\n")
+ cmd = (
+ ["docker", "compose"]
+ + self.add_yamls
+ + self.add_profiles
+ + self.add_env_files
+ + ["build", self.service_name]
+ )
+ subprocess.run(cmd, check=False, cwd=self.context_dir, env=self.environ)
+ print(f"[INFO] Finished building the docker image for the profile '{self.profile}'.\n")
+
def start(self):
"""Build and start the Docker container using the Docker compose command."""
print(
f"[INFO] Building the docker image and starting the container '{self.container_name}' in the"
" background...\n"
)
+ # Check if the container history file exists
+ container_history_file = self.context_dir / ".isaac-lab-docker-history"
+ if not container_history_file.exists():
+ # Create the file with sticky bit on the group
+ container_history_file.touch(mode=0o2644, exist_ok=True)
- # build the image for the base profile
- subprocess.run(
- [
- "docker",
- "compose",
- "--file",
- "docker-compose.yaml",
- "--env-file",
- ".env.base",
- "build",
- "isaac-lab-base",
- ],
- check=False,
- cwd=self.context_dir,
- env=self.environ,
- )
+ # build the image for the base profile if not running base (up will build base already if profile is base)
+ if self.profile != "base":
+ cmd = (
+ ["docker", "compose"]
+ + ["--file", "docker-compose.yaml"]
+ + ["--profile", "base"]
+ + ["--env-file", ".env.base"]
+ + ["build", self.base_service_name]
+ )
+ subprocess.run(cmd, check=False, cwd=self.context_dir, env=self.environ)
- # build the image for the profile
- subprocess.run(
+ # start the container and build the image if not available
+ cmd = (
["docker", "compose"]
+ self.add_yamls
+ self.add_profiles
+ self.add_env_files
- + ["up", "--detach", "--build", "--remove-orphans"],
- check=False,
- cwd=self.context_dir,
- env=self.environ,
+ + ["up", "--detach", "--build", "--remove-orphans"]
)
+ subprocess.run(cmd, check=False, cwd=self.context_dir, env=self.environ)
def enter(self):
"""Enter the running container by executing a bash shell.
@@ -137,34 +205,29 @@ def enter(self):
"""
if self.is_container_running():
print(f"[INFO] Entering the existing '{self.container_name}' container in a bash session...\n")
- subprocess.run([
- "docker",
- "exec",
- "--interactive",
- "--tty",
- *(["-e", f"DISPLAY={os.environ['DISPLAY']}"] if "DISPLAY" in os.environ else []),
- f"{self.container_name}",
- "bash",
- ])
+ cmd = (
+ ["docker", "exec", "--interactive", "--tty"]
+ + (["-e", f"DISPLAY={os.environ['DISPLAY']}"] if "DISPLAY" in os.environ else [])
+ + [self.container_name, "bash"]
+ )
+ subprocess.run(cmd)
else:
raise RuntimeError(f"The container '{self.container_name}' is not running.")
def stop(self):
- """Stop the running container using the Docker compose command.
-
- Raises:
- RuntimeError: If the container is not running.
- """
+ """Stop the running container using the Docker compose command."""
if self.is_container_running():
print(f"[INFO] Stopping the launched docker container '{self.container_name}'...\n")
- subprocess.run(
- ["docker", "compose"] + self.add_yamls + self.add_profiles + self.add_env_files + ["down"],
- check=False,
- cwd=self.context_dir,
- env=self.environ,
+ # stop running services
+ cmd = (
+ ["docker", "compose"] + self.add_yamls + self.add_profiles + self.add_env_files + ["down", "--volumes"]
)
+ subprocess.run(cmd, check=False, cwd=self.context_dir, env=self.environ)
else:
- raise RuntimeError(f"Can't stop container '{self.container_name}' as it is not running.")
+ print(
+ f"[INFO] Can't stop container '{self.container_name}' as it is not running."
+ " To check if the container is running, run 'docker ps' or 'docker container ls'.\n"
+ )
def copy(self, output_dir: Path | None = None):
"""Copy artifacts from the running container to the host machine.
@@ -202,15 +265,8 @@ def copy(self, output_dir: Path | None = None):
# copy the artifacts
for container_path, host_path in artifacts.items():
- subprocess.run(
- [
- "docker",
- "cp",
- f"isaac-lab-{self.profile}:{container_path}/",
- f"{host_path}",
- ],
- check=False,
- )
+ cmd = ["docker", "cp", f"{self.container_name}:{container_path}/", host_path]
+ subprocess.run(cmd, check=False, cwd=self.context_dir, env=self.environ)
print("\n[INFO] Finished copying the artifacts from the container.")
else:
raise RuntimeError(f"The container '{self.container_name}' is not running.")
@@ -234,20 +290,16 @@ def config(self, output_yaml: Path | None = None):
output = []
# run the docker compose config command to generate the configuration
- subprocess.run(
- ["docker", "compose"] + self.add_yamls + self.add_profiles + self.add_env_files + ["config"] + output,
- check=False,
- cwd=self.context_dir,
- env=self.environ,
- )
+ cmd = ["docker", "compose"] + self.add_yamls + self.add_profiles + self.add_env_files + ["config"] + output
+ subprocess.run(cmd, check=False, cwd=self.context_dir, env=self.environ)
"""
Helper functions.
"""
def _resolve_image_extension(self, yamls: list[str] | None = None, envs: list[str] | None = None):
- """
- Resolve the image extension by setting up YAML files, profiles, and environment files for the Docker compose command.
+ """Resolve the image extension by setting up YAML files, profiles, and environment files for the
+ Docker compose command.
Args:
yamls: A list of yaml files to extend ``docker-compose.yaml`` settings. These are extended in the order
diff --git a/docker/utils/state_file.py b/docker/utils/state_file.py
index d3bab18b80f9..505f272f4101 100644
--- a/docker/utils/state_file.py
+++ b/docker/utils/state_file.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
diff --git a/docker/utils/x11_utils.py b/docker/utils/x11_utils.py
index c9e5fc259423..4d7d0e3639f3 100644
--- a/docker/utils/x11_utils.py
+++ b/docker/utils/x11_utils.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
diff --git a/docker/x11.yaml b/docker/x11.yaml
index 73840f31de39..bd9b22f16b70 100644
--- a/docker/x11.yaml
+++ b/docker/x11.yaml
@@ -1,3 +1,8 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
services:
isaac-lab-base:
environment:
diff --git a/docs/Makefile b/docs/Makefile
index ce33dad50335..0bff236671c8 100644
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -15,4 +15,5 @@ multi-docs:
.PHONY: current-docs
current-docs:
- @$(SPHINXBUILD) "$(SOURCEDIR)" "$(BUILDDIR)/current" $(SPHINXOPTS)
+ @rm -rf "$(BUILDDIR)/current"
+ @$(SPHINXBUILD) -W --keep-going "$(SOURCEDIR)" "$(BUILDDIR)/current" $(SPHINXOPTS)
diff --git a/docs/conf.py b/docs/conf.py
index bd564df8e2f4..248e14c3f89c 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2022-2025, The Isaac Lab Project Developers.
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
@@ -20,14 +20,16 @@
sys.path.insert(0, os.path.abspath("../source/isaaclab"))
sys.path.insert(0, os.path.abspath("../source/isaaclab/isaaclab"))
+sys.path.insert(0, os.path.abspath("../source/isaaclab_assets"))
+sys.path.insert(0, os.path.abspath("../source/isaaclab_assets/isaaclab_assets"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_tasks"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_tasks/isaaclab_tasks"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_rl"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_rl/isaaclab_rl"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_mimic"))
sys.path.insert(0, os.path.abspath("../source/isaaclab_mimic/isaaclab_mimic"))
-sys.path.insert(0, os.path.abspath("../source/isaaclab_assets"))
-sys.path.insert(0, os.path.abspath("../source/isaaclab_assets/isaaclab_assets"))
+sys.path.insert(0, os.path.abspath("../source/isaaclab_contrib"))
+sys.path.insert(0, os.path.abspath("../source/isaaclab_contrib/isaaclab_contrib"))
# -- Project information -----------------------------------------------------
@@ -87,6 +89,17 @@
# TODO: Enable this by default once we have fixed all the warnings
# nitpicky = True
+nitpick_ignore = [
+ ("py:obj", "slice(None)"),
+]
+
+nitpick_ignore_regex = [
+ (r"py:.*", r"pxr.*"), # we don't have intersphinx mapping for pxr
+ (r"py:.*", r"trimesh.*"), # we don't have intersphinx mapping for trimesh
+]
+
+# emoji style
+sphinxemoji_style = "twemoji" # options: "twemoji" or "unicode"
# put type hints inside the signature instead of the description (easier to maintain)
autodoc_typehints = "signature"
# autodoc_typehints_format = "fully-qualified"
@@ -112,10 +125,12 @@
intersphinx_mapping = {
"python": ("https://docs.python.org/3", None),
"numpy": ("https://numpy.org/doc/stable/", None),
- "torch": ("https://pytorch.org/docs/stable/", None),
- "isaac": ("https://docs.omniverse.nvidia.com/py/isaacsim", None),
+ "trimesh": ("https://trimesh.org/", None),
+ "torch": ("https://docs.pytorch.org/docs/stable/", None),
+ "isaacsim": ("https://docs.isaacsim.omniverse.nvidia.com/5.1.0/py/", None),
"gymnasium": ("https://gymnasium.farama.org/", None),
"warp": ("https://nvidia.github.io/warp/", None),
+ "omniverse": ("https://docs.omniverse.nvidia.com/dev-guide/latest", None),
}
# Add any paths that contain templates here, relative to this directory.
@@ -144,20 +159,15 @@
"omni.client",
"omni.physx",
"omni.physics",
+ "usdrt",
"pxr.PhysxSchema",
"pxr.PhysicsSchemaTools",
"omni.replicator",
- "omni.isaac.core",
- "omni.isaac.kit",
- "omni.isaac.cloner",
- "omni.isaac.urdf",
- "omni.isaac.version",
- "omni.isaac.motion_generation",
- "omni.isaac.ui",
"isaacsim",
"isaacsim.core.api",
"isaacsim.core.cloner",
"isaacsim.core.version",
+ "isaacsim.core.utils",
"isaacsim.robot_motion.motion_generation",
"isaacsim.gui.components",
"isaacsim.asset.importer.urdf",
@@ -178,6 +188,15 @@
"tensordict",
"trimesh",
"toml",
+ "pink",
+ "pinocchio",
+ "nvidia.srl",
+ "flatdict",
+ "IPython",
+ "cv2",
+ "imageio",
+ "ipywidgets",
+ "mpl_toolkits",
]
# List of zero or more Sphinx-specific warning categories to be squelched (i.e.,
@@ -225,6 +244,7 @@
html_css_files = ["custom.css"]
html_theme_options = {
+ "path_to_docs": "docs/",
"collapse_navigation": True,
"repository_url": "https://github.com/isaac-sim/IsaacLab",
"use_repository_button": True,
@@ -247,7 +267,7 @@
{
"name": "Isaac Sim",
"url": "https://developer.nvidia.com/isaac-sim",
- "icon": "https://img.shields.io/badge/IsaacSim-4.5.0-silver.svg",
+ "icon": "https://img.shields.io/badge/IsaacSim-5.1.0-silver.svg",
"type": "url",
},
{
@@ -267,7 +287,7 @@
# Whitelist pattern for remotes
smv_remote_whitelist = r"^.*$"
# Whitelist pattern for branches (set to None to ignore all branches)
-smv_branch_whitelist = os.getenv("SMV_BRANCH_WHITELIST", r"^(main|devel)$")
+smv_branch_whitelist = os.getenv("SMV_BRANCH_WHITELIST", r"^(main|devel|release/.*)$")
# Whitelist pattern for tags (set to None to ignore all tags)
smv_tag_whitelist = os.getenv("SMV_TAG_WHITELIST", r"^v[1-9]\d*\.\d+\.\d+$")
html_sidebars = {
diff --git a/docs/index.rst b/docs/index.rst
index f46590df20ee..97b5f851e082 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -33,11 +33,11 @@ Isaac lab is developed with specific robot assets that are now **Batteries-inclu
- **Humanoids**: Unitree H1, Unitree G1
- **Quadcopter**: Crazyflie
-The platform is also designed so that you can add your own robots! please refer to the
+The platform is also designed so that you can add your own robots! Please refer to the
:ref:`how-to` section for details.
-For more information about the framework, please refer to the `paper `_
-:cite:`mittal2023orbit`. For clarifications on NVIDIA Isaac ecosystem, please check out the
+For more information about the framework, please refer to the `technical report `_
+:cite:`mittal2025isaaclab`. For clarifications on NVIDIA Isaac ecosystem, please check out the
:ref:`isaac-lab-ecosystem` section.
.. figure:: source/_static/tasks.jpg
@@ -48,69 +48,99 @@ For more information about the framework, please refer to the `paper `_ framework. We would appreciate if you would cite it in academic publications as well:
+Citation
+========
+
+If you use Isaac Lab in your research, please cite our technical report:
.. code:: bibtex
- @article{mittal2023orbit,
- author={Mittal, Mayank and Yu, Calvin and Yu, Qinxi and Liu, Jingzhou and Rudin, Nikita and Hoeller, David and Yuan, Jia Lin and Singh, Ritvik and Guo, Yunrong and Mazhar, Hammad and Mandlekar, Ajay and Babich, Buck and State, Gavriel and Hutter, Marco and Garg, Animesh},
- journal={IEEE Robotics and Automation Letters},
- title={Orbit: A Unified Simulation Framework for Interactive Robot Learning Environments},
- year={2023},
- volume={8},
- number={6},
- pages={3740-3747},
- doi={10.1109/LRA.2023.3270034}
+ @article{mittal2025isaaclab,
+ title={Isaac Lab: A GPU-Accelerated Simulation Framework for Multi-Modal Robot Learning},
+ author={Mayank Mittal and Pascal Roth and James Tigue and Antoine Richard and Octi Zhang and Peter Du and Antonio Serrano-Muรฑoz and Xinjie Yao and Renรฉ Zurbrรผgg and Nikita Rudin and Lukasz Wawrzyniak and Milad Rakhsha and Alain Denzler and Eric Heiden and Ales Borovicka and Ossama Ahmed and Iretiayo Akinola and Abrar Anwar and Mark T. Carlson and Ji Yuan Feng and Animesh Garg and Renato Gasoto and Lionel Gulich and Yijie Guo and M. Gussert and Alex Hansen and Mihir Kulkarni and Chenran Li and Wei Liu and Viktor Makoviychuk and Grzegorz Malczyk and Hammad Mazhar and Masoud Moghani and Adithyavairavan Murali and Michael Noseworthy and Alexander Poddubny and Nathan Ratliff and Welf Rehberg and Clemens Schwarke and Ritvik Singh and James Latham Smith and Bingjie Tang and Ruchik Thaker and Matthew Trepte and Karl Van Wyk and Fangzhou Yu and Alex Millane and Vikram Ramasamy and Remo Steiner and Sangeeta Subramanian and Clemens Volk and CY Chen and Neel Jawale and Ashwin Varghese Kuruttukulam and Michael A. Lin and Ajay Mandlekar and Karsten Patzwaldt and John Welsh and Huihua Zhao and Fatima Anes and Jean-Francois Lafleche and Nicolas Moรซnne-Loccoz and Soowan Park and Rob Stepinski and Dirk Van Gelder and Chris Amevor and Jan Carius and Jumyung Chang and Anka He Chen and Pablo de Heras Ciechomski and Gilles Daviet and Mohammad Mohajerani and Julia von Muralt and Viktor Reutskyy and Michael Sauter and Simon Schirm and Eric L. Shi and Pierre Terdiman and Kenny Vilella and Tobias Widmer and Gordon Yeoman and Tiffany Chen and Sergey Grizan and Cathy Li and Lotus Li and Connor Smith and Rafael Wiltz and Kostas Alexis and Yan Chang and David Chu and Linxi "Jim" Fan and Farbod Farshidian and Ankur Handa and Spencer Huang and Marco Hutter and Yashraj Narang and Soha Pouya and Shiwei Sheng and Yuke Zhu and Miles Macklin and Adam Moravanszky and Philipp Reist and Yunrong Guo and David Hoeller and Gavriel State},
+ journal={arXiv preprint arXiv:2511.04831},
+ year={2025},
+ url={https://arxiv.org/abs/2511.04831}
}
+Acknowledgement
+===============
+
+Isaac Lab development initiated from the `Orbit `_ framework.
+We gratefully acknowledge the authors of Orbit for their foundational contributions.
+
+
Table of Contents
=================
.. toctree::
- :maxdepth: 2
- :caption: Getting Started
+ :maxdepth: 1
+ :caption: Isaac Lab
source/setup/ecosystem
source/setup/installation/index
+ source/deployment/index
source/setup/installation/cloud_installation
+ source/refs/reference_architecture/index
+
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Getting Started
+ :titlesonly:
+
+ source/setup/quickstart
+ source/overview/own-project/index
+ source/setup/walkthrough/index
+ source/tutorials/index
+ source/how-to/index
+ source/overview/developer-guide/index
+
.. toctree::
:maxdepth: 3
:caption: Overview
:titlesonly:
- source/overview/developer-guide/index
+
source/overview/core-concepts/index
source/overview/environments
source/overview/reinforcement-learning/index
- source/overview/teleop_imitation
+ source/overview/imitation-learning/index
source/overview/showroom
source/overview/simple_agents
+
.. toctree::
:maxdepth: 2
:caption: Features
source/features/hydra
source/features/multi_gpu
+ source/features/population_based_training
Tiled Rendering
source/features/ray
source/features/reproducibility
+
+.. toctree::
+ :maxdepth: 3
+ :caption: Experimental Features
+
+ source/experimental-features/bleeding-edge
+ source/experimental-features/newton-physics-integration/index
+
.. toctree::
:maxdepth: 1
:caption: Resources
:titlesonly:
- source/tutorials/index
- source/how-to/index
- source/deployment/index
+ source/setup/installation/cloud_installation
+ source/policy_deployment/index
.. toctree::
:maxdepth: 1
@@ -131,7 +161,7 @@ Table of Contents
:maxdepth: 1
:caption: References
- source/refs/reference_architecture/index
+
source/refs/additional_resources
source/refs/contributing
source/refs/troubleshooting
diff --git a/docs/licenses/assets/valkyrie-license b/docs/licenses/assets/valkyrie-license
new file mode 100644
index 000000000000..8421ac1013df
--- /dev/null
+++ b/docs/licenses/assets/valkyrie-license
@@ -0,0 +1,249 @@
+NASA OPEN SOURCE AGREEMENT VERSION 1.3
+
+THIS OPEN SOURCE AGREEMENT ("AGREEMENT") DEFINES THE RIGHTS OF USE,
+REPRODUCTION, DISTRIBUTION, MODIFICATION AND REDISTRIBUTION OF CERTAIN
+COMPUTER SOFTWARE ORIGINALLY RELEASED BY THE UNITED STATES GOVERNMENT
+AS REPRESENTED BY THE GOVERNMENT AGENCY LISTED BELOW ("GOVERNMENT
+AGENCY"). THE UNITED STATES GOVERNMENT, AS REPRESENTED BY GOVERNMENT
+AGENCY, IS AN INTENDED THIRD-PARTY BENEFICIARY OF ALL SUBSEQUENT
+DISTRIBUTIONS OR REDISTRIBUTIONS OF THE SUBJECT SOFTWARE. ANYONE WHO
+USES, REPRODUCES, DISTRIBUTES, MODIFIES OR REDISTRIBUTES THE SUBJECT
+SOFTWARE, AS DEFINED HEREIN, OR ANY PART THEREOF, IS, BY THAT ACTION,
+ACCEPTING IN FULL THE RESPONSIBILITIES AND OBLIGATIONS CONTAINED IN
+THIS AGREEMENT.
+
+Government Agency: National Aeronautics and Space Administration (NASA)
+Government Agency Original Software Designation: GSC-16256-1
+Government Agency Original Software Title: "ISTP CDF Skeleton Editor"
+User Registration Requested. Please Visit https://spdf.gsfc.nasa.gov/
+Government Agency Point of Contact for Original Software:
+ NASA-SPDF-Support@nasa.onmicrosoft.com
+
+
+1. DEFINITIONS
+
+A. "Contributor" means Government Agency, as the developer of the
+Original Software, and any entity that makes a Modification.
+B. "Covered Patents" mean patent claims licensable by a Contributor
+that are necessarily infringed by the use or sale of its Modification
+alone or when combined with the Subject Software.
+C. "Display" means the showing of a copy of the Subject Software,
+either directly or by means of an image, or any other device.
+D. "Distribution" means conveyance or transfer of the Subject
+Software, regardless of means, to another.
+E. "Larger Work" means computer software that combines Subject
+Software, or portions thereof, with software separate from the Subject
+Software that is not governed by the terms of this Agreement.
+F. "Modification" means any alteration of, including addition to or
+deletion from, the substance or structure of either the Original
+Software or Subject Software, and includes derivative works, as that
+term is defined in the Copyright Statute, 17 USC 101. However, the
+act of including Subject Software as part of a Larger Work does not in
+and of itself constitute a Modification.
+G. "Original Software" means the computer software first released
+under this Agreement by Government Agency with Government Agency
+designation "GSC-16256-1"" and entitled
+"ISTP CDF Skeleton Editor", including source code,
+object code and accompanying documentation, if any.
+H. "Recipient" means anyone who acquires the Subject Software under
+this Agreement, including all Contributors.
+I. "Redistribution" means Distribution of the Subject Software after a
+Modification has been made.
+J. "Reproduction" means the making of a counterpart, image or copy of
+the Subject Software.
+K. "Sale" means the exchange of the Subject Software for money or
+equivalent value.
+L. "Subject Software" means the Original Software, Modifications, or
+any respective parts thereof.
+M. "Use" means the application or employment of the Subject Software
+for any purpose.
+
+2. GRANT OF RIGHTS
+
+A. Under Non-Patent Rights: Subject to the terms and conditions of
+this Agreement, each Contributor, with respect to its own contribution
+to the Subject Software, hereby grants to each Recipient a
+non-exclusive, world-wide, royalty-free license to engage in the
+following activities pertaining to the Subject Software:
+
+1. Use
+2. Distribution
+3. Reproduction
+4. Modification
+5. Redistribution
+6. Display
+
+B. Under Patent Rights: Subject to the terms and conditions of this
+Agreement, each Contributor, with respect to its own contribution to
+the Subject Software, hereby grants to each Recipient under Covered
+Patents a non-exclusive, world-wide, royalty-free license to engage in
+the following activities pertaining to the Subject Software:
+
+1. Use
+2. Distribution
+3. Reproduction
+4. Sale
+5. Offer for Sale
+
+C. The rights granted under Paragraph B. also apply to the combination
+of a Contributor's Modification and the Subject Software if, at the
+time the Modification is added by the Contributor, the addition of
+such Modification causes the combination to be covered by the Covered
+Patents. It does not apply to any other combinations that include a
+Modification.
+
+D. The rights granted in Paragraphs A. and B. allow the Recipient to
+sublicense those same rights. Such sublicense must be under the same
+terms and conditions of this Agreement.
+
+3. OBLIGATIONS OF RECIPIENT
+
+A. Distribution or Redistribution of the Subject Software must be made
+under this Agreement except for additions covered under paragraph 3H.
+
+1. Whenever a Recipient distributes or redistributes the Subject
+ Software, a copy of this Agreement must be included with each copy
+ of the Subject Software; and
+2. If Recipient distributes or redistributes the Subject Software in
+ any form other than source code, Recipient must also make the
+ source code freely available, and must provide with each copy of
+ the Subject Software information on how to obtain the source code
+ in a reasonable manner on or through a medium customarily used for
+ software exchange.
+
+B. Each Recipient must ensure that the following copyright notice
+appears prominently in the Subject Software:
+
+Copyright (c) 2006 United States Government as represented by the
+National Aeronautics and Space Administration. No copyright is claimed
+in the United States under Title 17, U.S.Code. All Other Rights Reserved.
+
+C. Each Contributor must characterize its alteration of the Subject
+Software as a Modification and must identify itself as the originator
+of its Modification in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Modification. In
+fulfillment of these requirements, Contributor must include a file
+(e.g., a change log file) that describes the alterations made and the
+date of the alterations, identifies Contributor as originator of the
+alterations, and consents to characterization of the alterations as a
+Modification, for example, by including a statement that the
+Modification is derived, directly or indirectly, from Original
+Software provided by Government Agency. Once consent is granted, it
+may not thereafter be revoked.
+
+D. A Contributor may add its own copyright notice to the Subject
+Software. Once a copyright notice has been added to the Subject
+Software, a Recipient may not remove it without the express permission
+of the Contributor who added the notice.
+
+E. A Recipient may not make any representation in the Subject Software
+or in any promotional, advertising or other material that may be
+construed as an endorsement by Government Agency or by any prior
+Recipient of any product or service provided by Recipient, or that may
+seek to obtain commercial advantage by the fact of Government Agency's
+or a prior Recipient's participation in this Agreement.
+
+F. In an effort to track usage and maintain accurate records of the
+Subject Software, each Recipient, upon receipt of the Subject
+Software, is requested to register with Government Agency by visiting
+the following website: https://opensource.gsfc.nasa.gov/. Recipient's
+name and personal information shall be used for statistical purposes
+only. Once a Recipient makes a Modification available, it is requested
+that the Recipient inform Government Agency at the web site provided
+above how to access the Modification.
+
+G. Each Contributor represents that that its Modification is believed
+to be Contributor's original creation and does not violate any
+existing agreements, regulations, statutes or rules, and further that
+Contributor has sufficient rights to grant the rights conveyed by this
+Agreement.
+
+H. A Recipient may choose to offer, and to charge a fee for, warranty,
+support, indemnity and/or liability obligations to one or more other
+Recipients of the Subject Software. A Recipient may do so, however,
+only on its own behalf and not on behalf of Government Agency or any
+other Recipient. Such a Recipient must make it absolutely clear that
+any such warranty, support, indemnity and/or liability obligation is
+offered by that Recipient alone. Further, such Recipient agrees to
+indemnify Government Agency and every other Recipient for any
+liability incurred by them as a result of warranty, support, indemnity
+and/or liability offered by such Recipient.
+
+I. A Recipient may create a Larger Work by combining Subject Software
+with separate software not governed by the terms of this agreement and
+distribute the Larger Work as a single product. In such case, the
+Recipient must make sure Subject Software, or portions thereof,
+included in the Larger Work is subject to this Agreement.
+
+J. Notwithstanding any provisions contained herein, Recipient is
+hereby put on notice that export of any goods or technical data from
+the United States may require some form of export license from the
+U.S. Government. Failure to obtain necessary export licenses may
+result in criminal liability under U.S. laws. Government Agency
+neither represents that a license shall not be required nor that, if
+required, it shall be issued. Nothing granted herein provides any
+such export license.
+
+4. DISCLAIMER OF WARRANTIES AND LIABILITIES; WAIVER AND INDEMNIFICATION
+
+A. No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY
+WARRANTY OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY,
+INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE
+WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR FREEDOM FROM
+INFRINGEMENT, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL BE ERROR
+FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF PROVIDED, WILL CONFORM TO
+THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN ANY MANNER,
+CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR RECIPIENT
+OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR ANY
+OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE.
+FURTHER, GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES
+REGARDING THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE,
+AND DISTRIBUTES IT "AS IS."
+
+B. Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS
+AGAINST THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND
+SUBCONTRACTORS, AS WELL AS ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF
+THE SUBJECT SOFTWARE RESULTS IN ANY LIABILITIES, DEMANDS, DAMAGES,
+EXPENSES OR LOSSES ARISING FROM SUCH USE, INCLUDING ANY DAMAGES FROM
+PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S USE OF THE SUBJECT
+SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE UNITED
+STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY
+PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE
+REMEDY FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL
+TERMINATION OF THIS AGREEMENT.
+
+
+5. GENERAL TERMS
+
+A. Termination: This Agreement and the rights granted hereunder will
+terminate automatically if a Recipient fails to comply with these
+terms and conditions, and fails to cure such noncompliance within
+thirty (30) days of becoming aware of such noncompliance. Upon
+termination, a Recipient agrees to immediately cease use and
+distribution of the Subject Software. All sublicenses to the Subject
+Software properly granted by the breaching Recipient shall survive any
+such termination of this Agreement.
+
+B. Severability: If any provision of this Agreement is invalid or
+unenforceable under applicable law, it shall not affect the validity
+or enforceability of the remainder of the terms of this Agreement.
+
+C. Applicable Law: This Agreement shall be subject to United States
+federal law only for all purposes, including, but not limited to,
+determining the validity of this Agreement, the meaning of its
+provisions and the rights, obligations and remedies of the parties.
+
+D. Entire Understanding: This Agreement constitutes the entire
+understanding and agreement of the parties relating to release of the
+Subject Software and may not be superseded, modified or amended except
+by further written agreement duly executed by the parties.
+
+E. Binding Authority: By accepting and using the Subject Software
+under this Agreement, a Recipient affirms its authority to bind the
+Recipient to all terms and conditions of this Agreement and that that
+Recipient hereby agrees to all terms and conditions herein.
+
+F. Point of Contact: Any Recipient contact with Government Agency is
+to be directed to the designated representative as follows:
+NASA-SPDF-Support@nasa.onmicrosoft.com.
diff --git a/docs/licenses/dependencies/Farama-Notifications-license.txt b/docs/licenses/dependencies/Farama-Notifications-license.txt
new file mode 100644
index 000000000000..44a6bbb5b5c2
--- /dev/null
+++ b/docs/licenses/dependencies/Farama-Notifications-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Farama Foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/GitPython-license.txt b/docs/licenses/dependencies/GitPython-license.txt
new file mode 100644
index 000000000000..ba8a219fe1f2
--- /dev/null
+++ b/docs/licenses/dependencies/GitPython-license.txt
@@ -0,0 +1,29 @@
+Copyright (C) 2008, 2009 Michael Trier and contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+* Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+* Neither the name of the GitPython project nor the names of
+its contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/InquirerPy-license.txt b/docs/licenses/dependencies/InquirerPy-license.txt
new file mode 100644
index 000000000000..7f22fe2c5cf4
--- /dev/null
+++ b/docs/licenses/dependencies/InquirerPy-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 Kevin Zhuang
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/absl-py-license.txt b/docs/licenses/dependencies/absl-py-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/absl-py-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/accessible-pygments-license.txt b/docs/licenses/dependencies/accessible-pygments-license.txt
new file mode 100644
index 000000000000..6779ad46534b
--- /dev/null
+++ b/docs/licenses/dependencies/accessible-pygments-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2022, Quansight Labs
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/alabaster-license.txt b/docs/licenses/dependencies/alabaster-license.txt
new file mode 100644
index 000000000000..8f1c1979d3d8
--- /dev/null
+++ b/docs/licenses/dependencies/alabaster-license.txt
@@ -0,0 +1,12 @@
+Copyright (c) 2020 Jeff Forcier.
+
+Based on original work copyright (c) 2011 Kenneth Reitz and copyright (c) 2010 Armin Ronacher.
+
+Some rights reserved.
+
+Redistribution and use in source and binary forms of the theme, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+The names of the contributors may not be used to endorse or promote products derived from this software without specific prior written permission.
+THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/antlr4_python3_runtime-license.txt b/docs/licenses/dependencies/antlr4_python3_runtime-license.txt
new file mode 100644
index 000000000000..5d276941558a
--- /dev/null
+++ b/docs/licenses/dependencies/antlr4_python3_runtime-license.txt
@@ -0,0 +1,28 @@
+Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+3. Neither name of copyright holders nor the names of its contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/anyio-license.txt b/docs/licenses/dependencies/anyio-license.txt
new file mode 100644
index 000000000000..104eebf5a300
--- /dev/null
+++ b/docs/licenses/dependencies/anyio-license.txt
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 Alex Grรถnholm
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/anytree-license.txt b/docs/licenses/dependencies/anytree-license.txt
new file mode 100644
index 000000000000..8dada3edaf50
--- /dev/null
+++ b/docs/licenses/dependencies/anytree-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/assimp-license.txt b/docs/licenses/dependencies/assimp-license.txt
new file mode 100644
index 000000000000..c66fa94f441e
--- /dev/null
+++ b/docs/licenses/dependencies/assimp-license.txt
@@ -0,0 +1,78 @@
+Open Asset Import Library (assimp)
+
+Copyright (c) 2006-2021, assimp team
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior
+ written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+
+******************************************************************************
+
+AN EXCEPTION applies to all files in the ./test/models-nonbsd folder.
+These are 3d models for testing purposes, from various free sources
+on the internet. They are - unless otherwise stated - copyright of
+their respective creators, which may impose additional requirements
+on the use of their work. For any of these models, see
+.source.txt for more legal information. Contact us if you
+are a copyright holder and believe that we credited you improperly or
+if you don't want your files to appear in the repository.
+
+
+******************************************************************************
+
+Poly2Tri Copyright (c) 2009-2010, Poly2Tri Contributors
+http://code.google.com/p/poly2tri/
+
+All rights reserved.
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Poly2Tri nor the names of its contributors may be
+ used to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/asttokens-license.txt b/docs/licenses/dependencies/asttokens-license.txt
new file mode 100644
index 000000000000..8dada3edaf50
--- /dev/null
+++ b/docs/licenses/dependencies/asttokens-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/attrs-license b/docs/licenses/dependencies/attrs-license
new file mode 100644
index 000000000000..2bd6453d255e
--- /dev/null
+++ b/docs/licenses/dependencies/attrs-license
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Hynek Schlawack and the attrs contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/babel-license.txt b/docs/licenses/dependencies/babel-license.txt
new file mode 100644
index 000000000000..f31575ec773b
--- /dev/null
+++ b/docs/licenses/dependencies/babel-license.txt
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2014-present Sebastian McKenzie and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/beautifulsoup4-license.txt b/docs/licenses/dependencies/beautifulsoup4-license.txt
new file mode 100644
index 000000000000..d668d13f041e
--- /dev/null
+++ b/docs/licenses/dependencies/beautifulsoup4-license.txt
@@ -0,0 +1,26 @@
+Beautiful Soup is made available under the MIT license:
+
+ Copyright (c) 2004-2012 Leonard Richardson
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE, DAMMIT.
+
+Beautiful Soup incorporates code from the html5lib library, which is
+also made available under the MIT license.
diff --git a/docs/licenses/dependencies/boost-license.txt b/docs/licenses/dependencies/boost-license.txt
new file mode 100644
index 000000000000..36b7cd93cdfb
--- /dev/null
+++ b/docs/licenses/dependencies/boost-license.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/botocore-license.txt b/docs/licenses/dependencies/botocore-license.txt
new file mode 100644
index 000000000000..d9a10c0d8e86
--- /dev/null
+++ b/docs/licenses/dependencies/botocore-license.txt
@@ -0,0 +1,176 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/docs/licenses/dependencies/certifi-license.txt b/docs/licenses/dependencies/certifi-license.txt
new file mode 100644
index 000000000000..62b076cdee58
--- /dev/null
+++ b/docs/licenses/dependencies/certifi-license.txt
@@ -0,0 +1,20 @@
+This package contains a modified version of ca-bundle.crt:
+
+ca-bundle.crt -- Bundle of CA Root Certificates
+
+This is a bundle of X.509 certificates of public Certificate Authorities
+(CA). These were automatically extracted from Mozilla's root certificates
+file (certdata.txt). This file can be found in the mozilla source tree:
+https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt
+It contains the certificates in PEM format and therefore
+can be directly used with curl / libcurl / php_curl, or with
+an Apache+mod_ssl webserver for SSL client authentication.
+Just configure this file as the SSLCACertificateFile.#
+
+***** BEGIN LICENSE BLOCK *****
+This Source Code Form is subject to the terms of the Mozilla Public License,
+v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
+one at http://mozilla.org/MPL/2.0/.
+
+***** END LICENSE BLOCK *****
+@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
diff --git a/docs/licenses/dependencies/charset-normalizer-license.txt b/docs/licenses/dependencies/charset-normalizer-license.txt
new file mode 100644
index 000000000000..9725772c7967
--- /dev/null
+++ b/docs/licenses/dependencies/charset-normalizer-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 TAHRI Ahmed R.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/click-license.txt b/docs/licenses/dependencies/click-license.txt
new file mode 100644
index 000000000000..d12a84918698
--- /dev/null
+++ b/docs/licenses/dependencies/click-license.txt
@@ -0,0 +1,28 @@
+Copyright 2014 Pallets
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/cloudpickle-license.txt b/docs/licenses/dependencies/cloudpickle-license.txt
new file mode 100644
index 000000000000..d112c4806aa9
--- /dev/null
+++ b/docs/licenses/dependencies/cloudpickle-license.txt
@@ -0,0 +1,32 @@
+This module was extracted from the `cloud` package, developed by
+PiCloud, Inc.
+
+Copyright (c) 2015, Cloudpickle contributors.
+Copyright (c) 2012, Regents of the University of California.
+Copyright (c) 2009 PiCloud, Inc. http://www.picloud.com.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the University of California, Berkeley nor the
+ names of its contributors may be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/cmeel-license.txt b/docs/licenses/dependencies/cmeel-license.txt
new file mode 100644
index 000000000000..664756eae98c
--- /dev/null
+++ b/docs/licenses/dependencies/cmeel-license.txt
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2022, Guilhem Saurel
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/colorama-license.txt b/docs/licenses/dependencies/colorama-license.txt
new file mode 100644
index 000000000000..3105888ec149
--- /dev/null
+++ b/docs/licenses/dependencies/colorama-license.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2010 Jonathan Hartley
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holders, nor those of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/comm-license.txt b/docs/licenses/dependencies/comm-license.txt
new file mode 100644
index 000000000000..eee1b58d9ed0
--- /dev/null
+++ b/docs/licenses/dependencies/comm-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2022, Jupyter
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/console-bridge-license.txt b/docs/licenses/dependencies/console-bridge-license.txt
new file mode 100644
index 000000000000..574ef0790290
--- /dev/null
+++ b/docs/licenses/dependencies/console-bridge-license.txt
@@ -0,0 +1,25 @@
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/contourpy-license.txt b/docs/licenses/dependencies/contourpy-license.txt
new file mode 100644
index 000000000000..93e41fb6965a
--- /dev/null
+++ b/docs/licenses/dependencies/contourpy-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2021-2025, ContourPy Developers.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/cuRobo-license.txt b/docs/licenses/dependencies/cuRobo-license.txt
new file mode 100644
index 000000000000..2b76a56cbf86
--- /dev/null
+++ b/docs/licenses/dependencies/cuRobo-license.txt
@@ -0,0 +1,93 @@
+NVIDIA ISAAC LAB ADDITIONAL SOFTWARE AND MATERIALS LICENSE
+
+IMPORTANT NOTICE โ PLEASE READ AND AGREE BEFORE USING THE SOFTWARE
+
+This software license agreement ("Agreement") is a legal agreement between you, whether an individual or entity, ("you") and NVIDIA Corporation ("NVIDIA") and governs the use of the NVIDIA cuRobo and related software and materials that NVIDIA delivers to you under this Agreement ("Software"). NVIDIA and you are each a "party" and collectively the "parties."
+
+By using the Software, you are affirming that you have read and agree to this Agreement.
+
+If you don't accept all the terms and conditions below, do not use the Software.
+
+1. License Grant. The Software made available by NVIDIA to you is licensed, not sold. Subject to the terms of this Agreement, NVIDIA grants you a limited, non-exclusive, revocable, non-transferable, and non-sublicensable (except as expressly granted in this Agreement), license to install and use copies of the Software together with NVIDIA Isaac Lab in systems with NVIDIA GPUs ("Purpose").
+
+2. License Restrictions. Your license to use the Software is restricted as stated in this Section 2 ("License Restrictions"). You will cooperate with NVIDIA and, upon NVIDIA's written request, you will confirm in writing and provide reasonably requested information to verify your compliance with the terms of this Agreement. You may not:
+
+2.1 Use the Software for any purpose other than the Purpose, and for clarity use of NVIDIA cuRobo apart from use with Isaac Lab is outside of the Purpose;
+
+2.2 Sell, rent, sublicense, transfer, distribute or otherwise make available to others (except authorized users as stated in Section 3 ("Authorized Users")) any portion of the Software, except as expressly granted in Section 1 ("License Grant");
+
+2.3 Reverse engineer, decompile, or disassemble the Software components provided in binary form, nor attempt in any other manner to obtain source code of such Software;
+
+2.4 Modify or create derivative works of the Software;
+
+2.5 Change or remove copyright or other proprietary notices in the Software;
+
+2.6 Bypass, disable, or circumvent any technical limitation, encryption, security, digital rights management or authentication mechanism in the Software;
+
+2.7 Use the Software in any manner that would cause them to become subject to an open source software license, subject to the terms in Section 7 ("Components Under Other Licenses"); or
+
+2.8 Use the Software in violation of any applicable law or regulation in relevant jurisdictions.
+
+3. Authorized Users. You may allow employees and contractors of your entity or of your subsidiary(ies), and for educational institutions also enrolled students, to internally access and use the Software as authorized by this Agreement from your secure network to perform the work authorized by this Agreement on your behalf. You are responsible for the compliance with the terms of this Agreement by your authorized users. Any act or omission that if committed by you would constitute a breach of this Agreement will be deemed to constitute a breach of this Agreement if committed by your authorized users.
+
+4. Pre-Release. Software versions identified as alpha, beta, preview, early access or otherwise as pre-release ("Pre-Release") may not be fully functional, may contain errors or design flaws, and may have reduced or different security, privacy, availability and reliability standards relative to NVIDIA commercial offerings. You use Pre-Release Software at your own risk. NVIDIA did not design or test the Software for use in production or business-critical systems. NVIDIA may choose not to make available a commercial version of Pre-Release Software. NVIDIA may also choose to abandon development and terminate the availability of Pre-Release Software at any time without liability.
+
+5. Updates. NVIDIA may at any time and at its option, change, discontinue, or deprecate any part, or all, of the Software, or change or remove features or functionality, or make available patches, workarounds or other updates to the Software. Unless the updates are provided with their separate governing terms, they are deemed part of the Software licensed to you under this Agreement, and your continued use of the Software is deemed acceptance of such changes.
+
+6. Components Under Other Licenses. The Software may include or be distributed with components provided with separate legal notices or terms that accompany the components, such as open source software licenses and other license terms ("Other Licenses"). The components are subject to the applicable Other Licenses, including any proprietary notices, disclaimers, requirements and extended use rights; except that this Agreement will prevail regarding the use of third-party open source software, unless a third-party open source software license requires its license terms to prevail. Open source software license means any software, data or documentation subject to any license identified as an open source license by the Open Source Initiative (http://opensource.org), Free Software Foundation (http://www.fsf.org) or other similar open source organization or listed by the Software Package Data Exchange (SPDX) Workgroup under the Linux Foundation (http://www.spdx.org).
+
+7. Ownership. The Software, including all intellectual property rights, is and will remain the sole and exclusive property of NVIDIA or its licensors. Except as expressly granted in this Agreement, (a) NVIDIA reserves all rights, interests and remedies in connection with the Software, and (b) no other license or right is granted to you by implication, estoppel or otherwise.
+
+8. Feedback. You may, but you are not obligated to, provide suggestions, requests, fixes, modifications, enhancements, or other feedback regarding the Software (collectively, "Feedback"). Feedback, even if designated as confidential by you, will not create any confidentiality obligation for NVIDIA or its affiliates. If you provide Feedback, you grant NVIDIA, its affiliates and its designees a non-exclusive, perpetual, irrevocable, sublicensable, worldwide, royalty-free, fully paid-up and transferable license, under your intellectual property rights, to publicly perform, publicly display, reproduce, use, make, have made, sell, offer for sale, distribute (through multiple tiers of distribution), import, create derivative works of and otherwise commercialize and exploit the Feedback at NVIDIA's discretion.
+
+9. Term and Termination.
+
+9.1 Term and Termination for Convenience. This license ends by July 31, 2026 or earlier at your choice if you finished using the Software for the Purpose. Either party may terminate this Agreement at any time with thirty (30) days' advance written notice to the other party.
+
+9.2 Termination for Cause. If you commence or participate in any legal proceeding against NVIDIA with respect to the Software, this Agreement will terminate immediately without notice. Either party may terminate this Agreement for cause if:
+
+(a) The other party fails to cure a material breach of this Agreement within ten (10) days of the non-breaching party's written notice of the breach; or
+
+(b) the other party breaches its confidentiality obligations or license rights under this Agreement, which termination will be effective immediately upon written notice.
+
+9.3 Effect of Termination. Upon any expiration or termination of this Agreement, you will promptly stop using and return, delete or destroy NVIDIA confidential information and all Software received under this Agreement. Upon written request, you will certify in writing that you have complied with your obligations under this Section 9.3 ("Effect of Termination").
+
+9.4 Survival. Section 5 ("Updates"), Section 6 ("Components Under Other Licenses"), Section 7 ("Ownership"), Section 8 ("Feedback"), Section 9.3 ("Effect of Termination"), Section 9.4 ("Survival"), Section 10 ("Disclaimer of Warranties"), Section 11 ("Limitation of Liability"), Section 12 ("Use in Mission Critical Applications"), Section 13 ("Governing Law and Jurisdiction") and Section 14 ("General") will survive any expiration or termination of this Agreement.
+
+10. Disclaimer of Warranties. THE SOFTWARE IS PROVIDED BY NVIDIA AS-IS AND WITH ALL FAULTS. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, NVIDIA DISCLAIMS ALL WARRANTIES AND REPRESENTATIONS OF ANY KIND, WHETHER EXPRESS, IMPLIED OR STATUTORY, RELATING TO OR ARISING UNDER THIS AGREEMENT, INCLUDING, WITHOUT LIMITATION, THE WARRANTIES OF TITLE, NONINFRINGEMENT, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, USAGE OF TRADE AND COURSE OF DEALING. NVIDIA DOES NOT WARRANT OR ASSUME RESPONSIBILITY FOR THE ACCURACY OR COMPLETENESS OF ANY THIRD-PARTY INFORMATION, TEXT, GRAPHICS, LINKS CONTAINED IN THE SOFTWARE. WITHOUT LIMITING THE FOREGOING, NVIDIA DOES NOT WARRANT THAT THE SOFTWARE WILL MEET YOUR REQUIREMENTS, ANY DEFECTS OR ERRORS WILL BE CORRECTED, ANY CERTAIN CONTENT WILL BE AVAILABLE; OR THAT THE SOFTWARE IS FREE OF VIRUSES OR OTHER HARMFUL COMPONENTS. NO INFORMATION OR ADVICE GIVEN BY NVIDIA WILL IN ANY WAY INCREASE THE SCOPE OF ANY WARRANTY EXPRESSLY PROVIDED IN THIS AGREEMENT.
+
+11. Limitations of Liability.
+
+11.1 EXCLUSIONS. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL NVIDIA BE LIABLE FOR ANY (I) INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES, OR (II) DAMAGES FOR (A) THE COST OF PROCURING SUBSTITUTE GOODS, OR (B) LOSS OF PROFITS, REVENUES, USE, DATA OR GOODWILL ARISING OUT OF OR RELATED TO THIS AGREEMENT, WHETHER BASED ON BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY, OR OTHERWISE, AND EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND EVEN IF A PARTY'S REMEDIES FAIL THEIR ESSENTIAL PURPOSE.
+
+11.2 DAMAGES CAP. ADDITIONALLY, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, NVIDIA'S TOTAL CUMULATIVE AGGREGATE LIABILITY FOR ANY AND ALL LIABILITIES, OBLIGATIONS OR CLAIMS ARISING OUT OF OR RELATED TO THIS AGREEMENT WILL NOT EXCEED FIVE U.S. DOLLARS (US$5).
+
+12. Use in Mission Critical Applications. You acknowledge that the Software provided under this Agreement is not designed or tested by NVIDIA for use in any system or application where the use or failure of such system or application developed with NVIDIA's Software could result in injury, death or catastrophic damage (each, a "Mission Critical Application"). Examples of Mission Critical Applications include use in avionics, navigation, autonomous vehicle applications, AI solutions for automotive products, military, medical, life support or other mission-critical or life-critical applications. NVIDIA will not be liable to you or any third party, in whole or in part, for any claims or damages arising from these uses. You are solely responsible for ensuring that systems and applications developed with the Software include sufficient safety and redundancy features and comply with all applicable legal and regulatory standards and requirements.
+
+13. Governing Law and Jurisdiction. This Agreement will be governed in all respects by the laws of the United States and the laws of the State of Delaware, without regard to conflict of laws principles or the United Nations Convention on Contracts for the International Sale of Goods. The state and federal courts residing in Santa Clara County, California will have exclusive jurisdiction over any dispute or claim arising out of or related to this Agreement, and the parties irrevocably consent to personal jurisdiction and venue in those courts; except that either party may apply for injunctive remedies or an equivalent type of urgent legal relief in any jurisdiction.
+
+14. General.
+
+14.1 Indemnity. By using the Software you agree to defend, indemnify and hold harmless NVIDIA and its affiliates and their respective officers, directors, employees and agents from and against any claims, disputes, demands, liabilities, damages, losses, costs and expenses arising out of or in any way connected with (i) products or services that have been developed or deployed with or use the Software, or claims that they violate laws, or infringe, violate, or misappropriate any third party right; or (ii) your use of the Software in breach of the terms of this Agreement.
+
+14.2 Independent Contractors. The parties are independent contractors, and this Agreement does not create a joint venture, partnership, agency, or other form of business association between the parties. Neither party will have the power to bind the other party or incur any obligation on its behalf without the other party's prior written consent. Nothing in this Agreement prevents either party from participating in similar arrangements with third parties.
+
+14.3 No Assignment. NVIDIA may assign, delegate or transfer its rights or obligations under this Agreement by any means or operation of law. You may not, without NVIDIA's prior written consent, assign, delegate or transfer any of your rights or obligations under this Agreement by any means or operation of law, and any attempt to do so is null and void.
+
+14.4 No Waiver. No failure or delay by a party to enforce any term or obligation of this Agreement will operate as a waiver by that party, or prevent the enforcement of such term or obligation later.
+
+14.5 Trade Compliance. You agree to comply with all applicable export, import, trade and economic sanctions laws and regulations, as amended, including without limitation U.S. Export Administration Regulations and Office of Foreign Assets Control regulations. You confirm (a) your understanding that export or reexport of certain NVIDIA products or technologies may require a license or other approval from appropriate authorities and (b) that you will not export or reexport any products or technology, directly or indirectly, without first obtaining any required license or other approval from appropriate authorities, (i) to any countries that are subject to any U.S. or local export restrictions (currently including, but not necessarily limited to, Belarus, Cuba, Iran, North Korea, Russia, Syria, the Region of Crimea, Donetsk People's Republic Region and Luhansk People's Republic Region); (ii) to any end-user who you know or have reason to know will utilize them in the design, development or production of nuclear, chemical or biological weapons, missiles, rocket systems, unmanned air vehicles capable of a maximum range of at least 300 kilometers, regardless of payload, or intended for military end-use, or any weapons of mass destruction; (iii) to any end-user who has been prohibited from participating in the U.S. or local export transactions by any governing authority; or (iv) to any known military or military-intelligence end-user or for any known military or military-intelligence end-use in accordance with U.S. trade compliance laws and regulations.
+
+14.6 Government Rights. The Software, documentation and technology ("Protected Items") are "Commercial products" as this term is defined at 48 C.F.R. 2.101, consisting of "commercial computer software" and "commercial computer software documentation" as such terms are used in, respectively, 48 C.F.R. 12.212 and 48 C.F.R. 227.7202 & 252.227-7014(a)(1). Before any Protected Items are supplied to the U.S. Government, you will (i) inform the U.S. Government in writing that the Protected Items are and must be treated as commercial computer software and commercial computer software documentation developed at private expense; (ii) inform the U.S. Government that the Protected Items are provided subject to the terms of the Agreement; and (iii) mark the Protected Items as commercial computer software and commercial computer software documentation developed at private expense. In no event will you permit the U.S. Government to acquire rights in Protected Items beyond those specified in 48 C.F.R. 52.227-19(b)(1)-(2) or 252.227-7013(c) except as expressly approved by NVIDIA in writing.
+
+14.7 Notices. Please direct your legal notices or other correspondence to legalnotices@nvidia.com with a copy mailed to NVIDIA Corporation, 2788 San Tomas Expressway, Santa Clara, California 95051, United States of America, Attention: Legal Department. If NVIDIA needs to contact you, you consent to receive the notices by email and agree that such notices will satisfy any legal communication requirements.
+
+14.8 Severability. If a court of competent jurisdiction rules that a provision of this Agreement is unenforceable, that provision will be deemed modified to the extent necessary to make it enforceable and the remainder of this Agreement will continue in full force and effect.
+
+14.9 Construction. The headings in the Agreement are included solely for convenience and are not intended to affect the meaning or interpretation of the Agreement. As required by the context of the Agreement, the singular of a term includes the plural and vice versa.
+
+14.10 Amendment. Any amendment to this Agreement must be in writing and signed by authorized representatives of both parties.
+
+14.11 Entire Agreement. Regarding the subject matter of this Agreement, the parties agree that (a) this Agreement constitutes the entire and exclusive agreement between the parties and supersedes all prior and contemporaneous communications and (b) any additional or different terms or conditions, whether contained in purchase orders, order acknowledgments, invoices or otherwise, will not be binding and are null and void.
+
+(v. August 15, 2025)
diff --git a/docs/licenses/dependencies/cycler-license.txt b/docs/licenses/dependencies/cycler-license.txt
new file mode 100644
index 000000000000..539c7c1f9c7c
--- /dev/null
+++ b/docs/licenses/dependencies/cycler-license.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2015, matplotlib project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the matplotlib project nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/decorator-license.txt b/docs/licenses/dependencies/decorator-license.txt
new file mode 100644
index 000000000000..3e01d05b189d
--- /dev/null
+++ b/docs/licenses/dependencies/decorator-license.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2005-2025, Michele Simionato
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
diff --git a/docs/licenses/dependencies/dex-retargeting-license.txt b/docs/licenses/dependencies/dex-retargeting-license.txt
new file mode 100644
index 000000000000..673ea4b65ddf
--- /dev/null
+++ b/docs/licenses/dependencies/dex-retargeting-license.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2023 Yuzhe Qin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/docker-pycreds-license.txt b/docs/licenses/dependencies/docker-pycreds-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/docker-pycreds-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/egl_probe-license.txt b/docs/licenses/dependencies/egl_probe-license.txt
new file mode 100644
index 000000000000..934eaa87bb98
--- /dev/null
+++ b/docs/licenses/dependencies/egl_probe-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Stanford Vision and Learning Lab
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/eigenpy-license.txt b/docs/licenses/dependencies/eigenpy-license.txt
new file mode 100644
index 000000000000..c9a52bd35e1c
--- /dev/null
+++ b/docs/licenses/dependencies/eigenpy-license.txt
@@ -0,0 +1,26 @@
+BSD 2-Clause License
+
+Copyright (c) 2014-2020, CNRS
+Copyright (c) 2018-2025, INRIA
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/executing-license.txt b/docs/licenses/dependencies/executing-license.txt
new file mode 100644
index 000000000000..473e36e246ed
--- /dev/null
+++ b/docs/licenses/dependencies/executing-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Alex Hall
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/filelock-license.txt b/docs/licenses/dependencies/filelock-license.txt
new file mode 100644
index 000000000000..cf1ab25da034
--- /dev/null
+++ b/docs/licenses/dependencies/filelock-license.txt
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to
diff --git a/docs/licenses/dependencies/flaky-license.txt b/docs/licenses/dependencies/flaky-license.txt
new file mode 100644
index 000000000000..167ec4d66df8
--- /dev/null
+++ b/docs/licenses/dependencies/flaky-license.txt
@@ -0,0 +1,166 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
diff --git a/docs/licenses/dependencies/flatdict-license.txt b/docs/licenses/dependencies/flatdict-license.txt
new file mode 100644
index 000000000000..b0e19d425848
--- /dev/null
+++ b/docs/licenses/dependencies/flatdict-license.txt
@@ -0,0 +1,25 @@
+Copyright (c) 2013-2020 Gavin M. Roy
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of the copyright holder nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/fonttools-license.txt b/docs/licenses/dependencies/fonttools-license.txt
new file mode 100644
index 000000000000..cc633905d333
--- /dev/null
+++ b/docs/licenses/dependencies/fonttools-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Just van Rossum
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/fsspec-license.txt b/docs/licenses/dependencies/fsspec-license.txt
new file mode 100644
index 000000000000..67590a5e5be5
--- /dev/null
+++ b/docs/licenses/dependencies/fsspec-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2018, Martin Durant
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/gitdb-license.txt b/docs/licenses/dependencies/gitdb-license.txt
new file mode 100644
index 000000000000..c4986edc27e0
--- /dev/null
+++ b/docs/licenses/dependencies/gitdb-license.txt
@@ -0,0 +1,42 @@
+Copyright (C) 2010, 2011 Sebastian Thiel and contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+* Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+* Neither the name of the GitDB project nor the names of
+its contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Additional Licenses
+-------------------
+The files at
+gitdb/test/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.idx
+and
+gitdb/test/fixtures/packs/pack-11fdfa9e156ab73caae3b6da867192221f2089c2.pack
+are licensed under GNU GPL as part of the git source repository,
+see http://en.wikipedia.org/wiki/Git_%28software%29 for more information.
+
+They are not required for the actual operation, which is why they are not found
+in the distribution package.
diff --git a/docs/licenses/dependencies/grpcio-license.txt b/docs/licenses/dependencies/grpcio-license.txt
new file mode 100644
index 000000000000..b44484922db1
--- /dev/null
+++ b/docs/licenses/dependencies/grpcio-license.txt
@@ -0,0 +1,609 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-----------------------------------------------------------
+
+BSD 3-Clause License
+
+Copyright 2016, Google Inc.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation
+and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+-----------------------------------------------------------
+
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/docs/licenses/dependencies/gym-notices-license.txt b/docs/licenses/dependencies/gym-notices-license.txt
new file mode 100644
index 000000000000..96f1555dfe57
--- /dev/null
+++ b/docs/licenses/dependencies/gym-notices-license.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2018 The Python Packaging Authority
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/hf-xet-license.txt b/docs/licenses/dependencies/hf-xet-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/hf-xet-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/hpp-fcl-license.txt b/docs/licenses/dependencies/hpp-fcl-license.txt
new file mode 100644
index 000000000000..c548a9f23e1c
--- /dev/null
+++ b/docs/licenses/dependencies/hpp-fcl-license.txt
@@ -0,0 +1,34 @@
+Software License Agreement (BSD License)
+
+ Copyright (c) 2008-2014, Willow Garage, Inc.
+ Copyright (c) 2014-2015, Open Source Robotics Foundation
+ Copyright (c) 2014-2023, CNRS
+ Copyright (c) 2018-2025, INRIA
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Open Source Robotics Foundation nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/huggingface-hub-license.txt b/docs/licenses/dependencies/huggingface-hub-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/huggingface-hub-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/idna-license.txt b/docs/licenses/dependencies/idna-license.txt
new file mode 100644
index 000000000000..47e7567ab2e7
--- /dev/null
+++ b/docs/licenses/dependencies/idna-license.txt
@@ -0,0 +1,13 @@
+BSD 3-Clause License
+
+Copyright (c) 2013-2025, Kim Davies and contributors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/imageio-license.txt b/docs/licenses/dependencies/imageio-license.txt
new file mode 100644
index 000000000000..471943242b42
--- /dev/null
+++ b/docs/licenses/dependencies/imageio-license.txt
@@ -0,0 +1,23 @@
+Copyright (c) 2014-2022, imageio developers
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/imageio_ffmpeg-license.txt b/docs/licenses/dependencies/imageio_ffmpeg-license.txt
new file mode 100644
index 000000000000..6d27cf66867f
--- /dev/null
+++ b/docs/licenses/dependencies/imageio_ffmpeg-license.txt
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2019-2025, imageio
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/imagesize-license.txt b/docs/licenses/dependencies/imagesize-license.txt
new file mode 100644
index 000000000000..b0df45f8a5ae
--- /dev/null
+++ b/docs/licenses/dependencies/imagesize-license.txt
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright ยฉ 2016 Yoshiki Shibukawa
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the โSoftwareโ), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED โAS ISโ, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/iniconfig-license.txt b/docs/licenses/dependencies/iniconfig-license.txt
new file mode 100644
index 000000000000..46f4b2846fd7
--- /dev/null
+++ b/docs/licenses/dependencies/iniconfig-license.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2010 - 2023 Holger Krekel and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/ipython-license.txt b/docs/licenses/dependencies/ipython-license.txt
new file mode 100644
index 000000000000..d4bb8d39dfe4
--- /dev/null
+++ b/docs/licenses/dependencies/ipython-license.txt
@@ -0,0 +1,33 @@
+BSD 3-Clause License
+
+- Copyright (c) 2008-Present, IPython Development Team
+- Copyright (c) 2001-2007, Fernando Perez
+- Copyright (c) 2001, Janko Hauser
+- Copyright (c) 2001, Nathaniel Gray
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/ipywidgets-license.txt b/docs/licenses/dependencies/ipywidgets-license.txt
new file mode 100644
index 000000000000..deb2c38c8ecf
--- /dev/null
+++ b/docs/licenses/dependencies/ipywidgets-license.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2015 Project Jupyter Contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/isaacsim-license.txt b/docs/licenses/dependencies/isaacsim-license.txt
index 80cff4a45145..0454ece1bed6 100644
--- a/docs/licenses/dependencies/isaacsim-license.txt
+++ b/docs/licenses/dependencies/isaacsim-license.txt
@@ -1,13 +1,188 @@
-Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved.
+The Isaac Sim software in this repository is covered under the Apache 2.0
+License terms below.
-NVIDIA CORPORATION and its licensors retain all intellectual property
-and proprietary rights in and to this software, related documentation
-and any modifications thereto. Any use, reproduction, disclosure or
-distribution of this software and related documentation without an express
-license agreement from NVIDIA CORPORATION is strictly prohibited.
+Building or using the software requires additional components licenced
+under other terms. These additional components include dependencies such
+as the Omniverse Kit SDK, as well as 3D models and textures.
-Note: Licenses for assets such as Robots and Props used within these environments can be found inside their respective folders on the Nucleus server where they are hosted.
+License terms for these additional NVIDIA owned and licensed components
+can be found here:
+ https://docs.nvidia.com/NVIDIA-IsaacSim-Additional-Software-and-Materials-License.pdf
-For more information: https://docs.omniverse.nvidia.com/app_isaacsim/common/NVIDIA_Omniverse_License_Agreement.html
+Any open source dependencies downloaded during the build process are owned
+by their respective owners and licensed under their respective terms.
-For sub-dependencies of Isaac Sim: https://docs.omniverse.nvidia.com/app_isaacsim/common/licenses.html
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
diff --git a/docs/licenses/dependencies/jinja2-license.txt b/docs/licenses/dependencies/jinja2-license.txt
new file mode 100644
index 000000000000..c37cae49ec77
--- /dev/null
+++ b/docs/licenses/dependencies/jinja2-license.txt
@@ -0,0 +1,28 @@
+Copyright 2007 Pallets
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/jmespath-license.txt b/docs/licenses/dependencies/jmespath-license.txt
new file mode 100644
index 000000000000..9c520c6bbff8
--- /dev/null
+++ b/docs/licenses/dependencies/jmespath-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2013 Amazon.com, Inc. or its affiliates. All Rights Reserved
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/joblib-license.txt b/docs/licenses/dependencies/joblib-license.txt
new file mode 100644
index 000000000000..910537bd3341
--- /dev/null
+++ b/docs/licenses/dependencies/joblib-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2008-2021, The joblib developers.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/jsonschema-license.txt b/docs/licenses/dependencies/jsonschema-license.txt
new file mode 100644
index 000000000000..af9cfbdb134f
--- /dev/null
+++ b/docs/licenses/dependencies/jsonschema-license.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2013 Julian Berman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/docs/licenses/dependencies/jsonschema-specifications-license.txt b/docs/licenses/dependencies/jsonschema-specifications-license.txt
new file mode 100644
index 000000000000..a9f853e43069
--- /dev/null
+++ b/docs/licenses/dependencies/jsonschema-specifications-license.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2022 Julian Berman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/docs/licenses/dependencies/junitparser-license.txt b/docs/licenses/dependencies/junitparser-license.txt
new file mode 100644
index 000000000000..a4325a4a80d4
--- /dev/null
+++ b/docs/licenses/dependencies/junitparser-license.txt
@@ -0,0 +1,13 @@
+Copyright 2020 Joel Wang
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/jupyterlab_widgets-license.txt b/docs/licenses/dependencies/jupyterlab_widgets-license.txt
new file mode 100644
index 000000000000..deb2c38c8ecf
--- /dev/null
+++ b/docs/licenses/dependencies/jupyterlab_widgets-license.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2015 Project Jupyter Contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/kiwisolver-license.txt b/docs/licenses/dependencies/kiwisolver-license.txt
new file mode 100644
index 000000000000..206ae79273ed
--- /dev/null
+++ b/docs/licenses/dependencies/kiwisolver-license.txt
@@ -0,0 +1,71 @@
+=========================
+ The Kiwi licensing terms
+=========================
+Kiwi is licensed under the terms of the Modified BSD License (also known as
+New or Revised BSD), as follows:
+
+Copyright (c) 2013-2024, Nucleic Development Team
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+Neither the name of the Nucleic Development Team nor the names of its
+contributors may be used to endorse or promote products derived from this
+software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+About Kiwi
+----------
+Chris Colbert began the Kiwi project in December 2013 in an effort to
+create a blisteringly fast UI constraint solver. Chris is still the
+project lead.
+
+The Nucleic Development Team is the set of all contributors to the Nucleic
+project and its subprojects.
+
+The core team that coordinates development on GitHub can be found here:
+http://github.com/nucleic. The current team consists of:
+
+* Chris Colbert
+
+Our Copyright Policy
+--------------------
+Nucleic uses a shared copyright model. Each contributor maintains copyright
+over their contributions to Nucleic. But, it is important to note that these
+contributions are typically only changes to the repositories. Thus, the Nucleic
+source code, in its entirety is not the copyright of any single person or
+institution. Instead, it is the collective copyright of the entire Nucleic
+Development Team. If individual contributors want to maintain a record of what
+changes/contributions they have specific copyright on, they should indicate
+their copyright in the commit message of the change, when they commit the
+change to one of the Nucleic repositories.
+
+With this in mind, the following banner should be used in any source code file
+to indicate the copyright and license terms:
+
+#------------------------------------------------------------------------------
+# Copyright (c) 2013-2024, Nucleic Development Team.
+#
+# Distributed under the terms of the Modified BSD License.
+#
+# The full license is in the file LICENSE, distributed with this software.
+#------------------------------------------------------------------------------
diff --git a/docs/licenses/dependencies/labeler-license.txt b/docs/licenses/dependencies/labeler-license.txt
new file mode 100644
index 000000000000..cfbc8bb6dda5
--- /dev/null
+++ b/docs/licenses/dependencies/labeler-license.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 GitHub, Inc. and contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/docs/licenses/dependencies/latexcodec-license.txt b/docs/licenses/dependencies/latexcodec-license.txt
new file mode 100644
index 000000000000..e9511f21fb9a
--- /dev/null
+++ b/docs/licenses/dependencies/latexcodec-license.txt
@@ -0,0 +1,7 @@
+latexcodec is a lexer and codec to work with LaTeX code in Python
+Copyright (c) 2011-2020 by Matthias C. M. Troffaes
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/loop-rate-limiters-license.txt b/docs/licenses/dependencies/loop-rate-limiters-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/loop-rate-limiters-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/markdown-it-py-license.txt b/docs/licenses/dependencies/markdown-it-py-license.txt
new file mode 100644
index 000000000000..582ddf59e082
--- /dev/null
+++ b/docs/licenses/dependencies/markdown-it-py-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 ExecutableBookProject
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/markdown-license.txt b/docs/licenses/dependencies/markdown-license.txt
new file mode 100644
index 000000000000..ff993de4a45a
--- /dev/null
+++ b/docs/licenses/dependencies/markdown-license.txt
@@ -0,0 +1,15 @@
+BSD 3-Clause License
+
+Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later)
+Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
+Copyright 2004 Manfred Stienstra (the original version)
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/markupsafe-license.txt b/docs/licenses/dependencies/markupsafe-license.txt
new file mode 100644
index 000000000000..9d227a0cc43c
--- /dev/null
+++ b/docs/licenses/dependencies/markupsafe-license.txt
@@ -0,0 +1,28 @@
+Copyright 2010 Pallets
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/matplotlib-inline-license.txt b/docs/licenses/dependencies/matplotlib-inline-license.txt
new file mode 100644
index 000000000000..b8350378e810
--- /dev/null
+++ b/docs/licenses/dependencies/matplotlib-inline-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2019-2022, IPython Development Team.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/mdit-py-plugins-license.txt b/docs/licenses/dependencies/mdit-py-plugins-license.txt
new file mode 100644
index 000000000000..582ddf59e082
--- /dev/null
+++ b/docs/licenses/dependencies/mdit-py-plugins-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 ExecutableBookProject
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/mdurl-license.txt b/docs/licenses/dependencies/mdurl-license.txt
new file mode 100644
index 000000000000..2a920c59d8ab
--- /dev/null
+++ b/docs/licenses/dependencies/mdurl-license.txt
@@ -0,0 +1,46 @@
+Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin.
+Copyright (c) 2021 Taneli Hukkinen
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+--------------------------------------------------------------------------------
+
+.parse() is based on Joyent's node.js `url` code:
+
+Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/mpmath-license.txt b/docs/licenses/dependencies/mpmath-license.txt
new file mode 100644
index 000000000000..6aa2fc91d7a1
--- /dev/null
+++ b/docs/licenses/dependencies/mpmath-license.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2005-2025 Fredrik Johansson and mpmath contributors
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ a. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ b. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ c. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
diff --git a/docs/licenses/dependencies/networkx-license.txt b/docs/licenses/dependencies/networkx-license.txt
new file mode 100644
index 000000000000..0bf9a8f3f492
--- /dev/null
+++ b/docs/licenses/dependencies/networkx-license.txt
@@ -0,0 +1,37 @@
+NetworkX is distributed with the 3-clause BSD license.
+
+::
+
+ Copyright (c) 2004-2025, NetworkX Developers
+ Aric Hagberg
+ Dan Schult
+ Pieter Swart
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of the NetworkX Developers nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/newton-license.txt b/docs/licenses/dependencies/newton-license.txt
new file mode 100644
index 000000000000..d9a10c0d8e86
--- /dev/null
+++ b/docs/licenses/dependencies/newton-license.txt
@@ -0,0 +1,176 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/docs/licenses/dependencies/nlopt-license.txt b/docs/licenses/dependencies/nlopt-license.txt
new file mode 100644
index 000000000000..884683dfcf26
--- /dev/null
+++ b/docs/licenses/dependencies/nlopt-license.txt
@@ -0,0 +1,39 @@
+NLopt combines several free/open-source nonlinear optimization
+libraries by various authors. See the COPYING, COPYRIGHT, and README
+files in the subdirectories for the original copyright and licensing
+information of these packages.
+
+The compiled NLopt library, i.e. the combined work of all of the
+included optimization routines, is licensed under the conjunction of
+all of these licensing terms. By default, the most restrictive terms
+are for the code in the "luksan" directory, which is licensed under
+the GNU Lesser General Public License (GNU LGPL), version 2.1 or
+later (see luksan/COPYRIGHT). That means that, by default, the compiled
+NLopt library is governed by the terms of the LGPL.
+
+---------------------------------------------------------------------------
+
+However, NLopt also offers the option to be built without the code in
+the "luksan" directory. In this case, NLopt, including any modifications
+to the abovementioned packages, are licensed under the standard "MIT License:"
+
+Copyright (c) 2007-2024 Massachusetts Institute of Technology
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/octomap-license.txt b/docs/licenses/dependencies/octomap-license.txt
new file mode 100644
index 000000000000..a3c73b020480
--- /dev/null
+++ b/docs/licenses/dependencies/octomap-license.txt
@@ -0,0 +1,31 @@
+
+OctoMap - An Efficient Probabilistic 3D Mapping Framework Based on Octrees
+
+License for the "octomap" library: New BSD License.
+
+Copyright (c) 2009-2013, K.M. Wurm and A. Hornung, University of Freiburg
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the University of Freiburg nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/omegaconf-license.txt b/docs/licenses/dependencies/omegaconf-license.txt
new file mode 100644
index 000000000000..eb208dada03b
--- /dev/null
+++ b/docs/licenses/dependencies/omegaconf-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2018, Omry Yadan
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/opencv-python-license.txt b/docs/licenses/dependencies/opencv-python-license.txt
new file mode 100644
index 000000000000..09ad12ac89f5
--- /dev/null
+++ b/docs/licenses/dependencies/opencv-python-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Olli-Pekka Heinisuo
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/packaging-license.txt b/docs/licenses/dependencies/packaging-license.txt
new file mode 100644
index 000000000000..d9a10c0d8e86
--- /dev/null
+++ b/docs/licenses/dependencies/packaging-license.txt
@@ -0,0 +1,176 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/docs/licenses/dependencies/pandas-license.txt b/docs/licenses/dependencies/pandas-license.txt
new file mode 100644
index 000000000000..c343da2ebe87
--- /dev/null
+++ b/docs/licenses/dependencies/pandas-license.txt
@@ -0,0 +1,31 @@
+BSD 3-Clause License
+
+Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
+All rights reserved.
+
+Copyright (c) 2011-2025, Open source contributors.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/pathtools-license.txt b/docs/licenses/dependencies/pathtools-license.txt
new file mode 100644
index 000000000000..5e6adc9dadd8
--- /dev/null
+++ b/docs/licenses/dependencies/pathtools-license.txt
@@ -0,0 +1,21 @@
+Copyright (C) 2010 by Yesudeep Mangalapilly
+
+MIT License
+-----------
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/docs/licenses/dependencies/pexpect-license.txt b/docs/licenses/dependencies/pexpect-license.txt
new file mode 100644
index 000000000000..6ee60f42b44e
--- /dev/null
+++ b/docs/licenses/dependencies/pexpect-license.txt
@@ -0,0 +1,19 @@
+ISC LICENSE
+
+ This license is approved by the OSI and FSF as GPL-compatible.
+ http://opensource.org/licenses/isc-license.txt
+
+ Copyright (c) 2013-2014, Pexpect development team
+ Copyright (c) 2012, Noah Spurrier
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/docs/licenses/dependencies/pin-license.txt b/docs/licenses/dependencies/pin-license.txt
new file mode 100644
index 000000000000..dfacb6731484
--- /dev/null
+++ b/docs/licenses/dependencies/pin-license.txt
@@ -0,0 +1,26 @@
+BSD 2-Clause License
+
+Copyright (c) 2014-2023, CNRS
+Copyright (c) 2018-2025, INRIA
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/pin-pink-license.txt b/docs/licenses/dependencies/pin-pink-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/pin-pink-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/pinocchio-license.txt b/docs/licenses/dependencies/pinocchio-license.txt
new file mode 100644
index 000000000000..dfacb6731484
--- /dev/null
+++ b/docs/licenses/dependencies/pinocchio-license.txt
@@ -0,0 +1,26 @@
+BSD 2-Clause License
+
+Copyright (c) 2014-2023, CNRS
+Copyright (c) 2018-2025, INRIA
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/pluggy-license.txt b/docs/licenses/dependencies/pluggy-license.txt
new file mode 100644
index 000000000000..85f4dd63d2da
--- /dev/null
+++ b/docs/licenses/dependencies/pluggy-license.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 holger krekel (rather uses bitbucket/hpk42)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/proglog-license.txt b/docs/licenses/dependencies/proglog-license.txt
new file mode 100644
index 000000000000..a68d0a5fdd95
--- /dev/null
+++ b/docs/licenses/dependencies/proglog-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Edinburgh Genome Foundry, University of Edinburgh
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/psutil-license.txt b/docs/licenses/dependencies/psutil-license.txt
new file mode 100644
index 000000000000..cff5eb74e1ba
--- /dev/null
+++ b/docs/licenses/dependencies/psutil-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of the psutil authors nor the names of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/ptyprocess-license.txt b/docs/licenses/dependencies/ptyprocess-license.txt
new file mode 100644
index 000000000000..6ee60f42b44e
--- /dev/null
+++ b/docs/licenses/dependencies/ptyprocess-license.txt
@@ -0,0 +1,19 @@
+ISC LICENSE
+
+ This license is approved by the OSI and FSF as GPL-compatible.
+ http://opensource.org/licenses/isc-license.txt
+
+ Copyright (c) 2013-2014, Pexpect development team
+ Copyright (c) 2012, Noah Spurrier
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/docs/licenses/dependencies/pure_eval-license.txt b/docs/licenses/dependencies/pure_eval-license.txt
new file mode 100644
index 000000000000..473e36e246ed
--- /dev/null
+++ b/docs/licenses/dependencies/pure_eval-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Alex Hall
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/pybtex-docutils-license.txt b/docs/licenses/dependencies/pybtex-docutils-license.txt
new file mode 100644
index 000000000000..810a5a8536c1
--- /dev/null
+++ b/docs/licenses/dependencies/pybtex-docutils-license.txt
@@ -0,0 +1,7 @@
+pybtex-docutils is a docutils backend for pybtex
+Copyright (c) 2013-2023 by Matthias C. M. Troffaes
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/pydata-sphinx-theme-license.txt b/docs/licenses/dependencies/pydata-sphinx-theme-license.txt
new file mode 100644
index 000000000000..464d11719d21
--- /dev/null
+++ b/docs/licenses/dependencies/pydata-sphinx-theme-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2018, pandas
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/pygame-license.txt b/docs/licenses/dependencies/pygame-license.txt
new file mode 100644
index 000000000000..56de5de6e152
--- /dev/null
+++ b/docs/licenses/dependencies/pygame-license.txt
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/docs/licenses/dependencies/pyparsing-license.txt b/docs/licenses/dependencies/pyparsing-license.txt
new file mode 100644
index 000000000000..1bf98523e331
--- /dev/null
+++ b/docs/licenses/dependencies/pyparsing-license.txt
@@ -0,0 +1,18 @@
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/pyperclip-license.txt b/docs/licenses/dependencies/pyperclip-license.txt
new file mode 100644
index 000000000000..799b74c5bf39
--- /dev/null
+++ b/docs/licenses/dependencies/pyperclip-license.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2014, Al Sweigart
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the {organization} nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/pytest-license.txt b/docs/licenses/dependencies/pytest-license.txt
new file mode 100644
index 000000000000..c3f1657fce94
--- /dev/null
+++ b/docs/licenses/dependencies/pytest-license.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2004 Holger Krekel and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/pytest-mock-license.txt b/docs/licenses/dependencies/pytest-mock-license.txt
new file mode 100644
index 000000000000..6e1ee5d5b8ae
--- /dev/null
+++ b/docs/licenses/dependencies/pytest-mock-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) [2016] [Bruno Oliveira]
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/python-dateutil-license.txt b/docs/licenses/dependencies/python-dateutil-license.txt
new file mode 100644
index 000000000000..6053d35cfc60
--- /dev/null
+++ b/docs/licenses/dependencies/python-dateutil-license.txt
@@ -0,0 +1,54 @@
+Copyright 2017- Paul Ganssle
+Copyright 2017- dateutil contributors (see AUTHORS file)
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+The above license applies to all contributions after 2017-12-01, as well as
+all contributions that have been re-licensed (see AUTHORS file for the list of
+contributors who have re-licensed their code).
+--------------------------------------------------------------------------------
+dateutil - Extensions to the standard Python datetime module.
+
+Copyright (c) 2003-2011 - Gustavo Niemeyer
+Copyright (c) 2012-2014 - Tomi Pievilรคinen
+Copyright (c) 2014-2016 - Yaron de Leeuw
+Copyright (c) 2015- - Paul Ganssle
+Copyright (c) 2015- - dateutil contributors (see AUTHORS file)
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The above BSD License Applies to all code, even that also covered by Apache 2.0.
diff --git a/docs/licenses/dependencies/python-dotenv-license.txt b/docs/licenses/dependencies/python-dotenv-license.txt
new file mode 100644
index 000000000000..3a97119010ac
--- /dev/null
+++ b/docs/licenses/dependencies/python-dotenv-license.txt
@@ -0,0 +1,27 @@
+Copyright (c) 2014, Saurabh Kumar (python-dotenv), 2013, Ted Tieken (django-dotenv-rw), 2013, Jacob Kaplan-Moss (django-dotenv)
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+- Neither the name of django-dotenv nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/pytransform3d-license.txt b/docs/licenses/dependencies/pytransform3d-license.txt
new file mode 100644
index 000000000000..061bfc4a75b8
--- /dev/null
+++ b/docs/licenses/dependencies/pytransform3d-license.txt
@@ -0,0 +1,30 @@
+BSD 3-Clause License
+
+Copyright 2014-2017 Alexander Fabisch (Robotics Research Group, University of Bremen),
+2017-2025 Alexander Fabisch (DFKI GmbH, Robotics Innovation Center),
+and pytransform3d contributors
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/pytz-license.txt b/docs/licenses/dependencies/pytz-license.txt
new file mode 100644
index 000000000000..5f1c11289f6a
--- /dev/null
+++ b/docs/licenses/dependencies/pytz-license.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2003-2019 Stuart Bishop
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/pyyaml-license.txt b/docs/licenses/dependencies/pyyaml-license.txt
new file mode 100644
index 000000000000..2f1b8e15e562
--- /dev/null
+++ b/docs/licenses/dependencies/pyyaml-license.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2017-2021 Ingy dรถt Net
+Copyright (c) 2006-2016 Kirill Simonov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/qhull-license.txt b/docs/licenses/dependencies/qhull-license.txt
new file mode 100644
index 000000000000..9c802c06494d
--- /dev/null
+++ b/docs/licenses/dependencies/qhull-license.txt
@@ -0,0 +1,39 @@
+ Qhull, Copyright (c) 1993-2020
+
+ C.B. Barber
+ Arlington, MA
+
+ and
+
+ The National Science and Technology Research Center for
+ Computation and Visualization of Geometric Structures
+ (The Geometry Center)
+ University of Minnesota
+
+ email: qhull@qhull.org
+
+This software includes Qhull from C.B. Barber and The Geometry Center.
+Files derived from Qhull 1.0 are copyrighted by the Geometry Center. The
+remaining files are copyrighted by C.B. Barber. Qhull is free software
+and may be obtained via http from www.qhull.org. It may be freely copied,
+modified, and redistributed under the following conditions:
+
+1. All copyright notices must remain intact in all files.
+
+2. A copy of this text file must be distributed along with any copies
+ of Qhull that you redistribute; this includes copies that you have
+ modified, or copies of programs or other software products that
+ include Qhull.
+
+3. If you modify Qhull, you must include a notice giving the
+ name of the person performing the modification, the date of
+ modification, and the reason for such modification.
+
+4. When distributing modified versions of Qhull, or other software
+ products that include Qhull, you must provide notice that the original
+ source code may be obtained as noted above.
+
+5. There is no warranty or other guarantee of fitness for Qhull, it is
+ provided solely "as is". Bug reports or fixes may be sent to
+ qhull_bug@qhull.org; the authors may or may not act on them as
+ they desire.
diff --git a/docs/licenses/dependencies/qpsolvers-license.txt b/docs/licenses/dependencies/qpsolvers-license.txt
new file mode 100644
index 000000000000..0a041280bd00
--- /dev/null
+++ b/docs/licenses/dependencies/qpsolvers-license.txt
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/docs/licenses/dependencies/quadprog-license.txt b/docs/licenses/dependencies/quadprog-license.txt
new file mode 100644
index 000000000000..23cb790338e1
--- /dev/null
+++ b/docs/licenses/dependencies/quadprog-license.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {description}
+ Copyright (C) {year} {fullname}
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ {signature of Ty Coon}, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/docs/licenses/dependencies/referencing-license.txt b/docs/licenses/dependencies/referencing-license.txt
new file mode 100644
index 000000000000..a9f853e43069
--- /dev/null
+++ b/docs/licenses/dependencies/referencing-license.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2022 Julian Berman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/docs/licenses/dependencies/regex-license.txt b/docs/licenses/dependencies/regex-license.txt
new file mode 100644
index 000000000000..99c19cf84414
--- /dev/null
+++ b/docs/licenses/dependencies/regex-license.txt
@@ -0,0 +1,208 @@
+This work was derived from the 're' module of CPython 2.6 and CPython 3.1,
+copyright (c) 1998-2001 by Secret Labs AB and licensed under CNRI's Python 1.6
+license.
+
+All additions and alterations are licensed under the Apache 2.0 License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2020 Matthew Barnett
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/requests-license.txt b/docs/licenses/dependencies/requests-license.txt
new file mode 100644
index 000000000000..dd5b3a58aa18
--- /dev/null
+++ b/docs/licenses/dependencies/requests-license.txt
@@ -0,0 +1,174 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
diff --git a/docs/licenses/dependencies/rich-license.txt b/docs/licenses/dependencies/rich-license.txt
new file mode 100644
index 000000000000..4415505566f2
--- /dev/null
+++ b/docs/licenses/dependencies/rich-license.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2020 Will McGugan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/ruff-license.txt b/docs/licenses/dependencies/ruff-license.txt
new file mode 100644
index 000000000000..655a0c76fc55
--- /dev/null
+++ b/docs/licenses/dependencies/ruff-license.txt
@@ -0,0 +1,430 @@
+MIT License
+
+Copyright (c) 2022 Charles Marsh
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+end of terms and conditions
+
+The externally maintained libraries from which parts of the Software is derived
+are:
+
+- autoflake, licensed as follows:
+ """
+ Copyright (C) 2012-2018 Steven Myint
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- autotyping, licensed as follows:
+ """
+ MIT License
+
+ Copyright (c) 2023 Jelle Zijlstra
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- Flake8, licensed as follows:
+ """
+ == Flake8 License (MIT) ==
+
+ Copyright (C) 2011-2013 Tarek Ziade
+ Copyright (C) 2012-2016 Ian Cordasco
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- flake8-eradicate, licensed as follows:
+ """
+ MIT License
+
+ Copyright (c) 2018 Nikita Sobolev
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- flake8-pyi, licensed as follows:
+ """
+ The MIT License (MIT)
+
+ Copyright (c) 2016 ลukasz Langa
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- flake8-simplify, licensed as follows:
+ """
+ MIT License
+
+ Copyright (c) 2020 Martin Thoma
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- isort, licensed as follows:
+ """
+ The MIT License (MIT)
+
+ Copyright (c) 2013 Timothy Edmund Crosley
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ """
+
+- pygrep-hooks, licensed as follows:
+ """
+ Copyright (c) 2018 Anthony Sottile
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ """
+
+- pycodestyle, licensed as follows:
+ """
+ Copyright ยฉ 2006-2009 Johann C. Rocholl
+ Copyright ยฉ 2009-2014 Florent Xicluna
+ Copyright ยฉ 2014-2020 Ian Lee
+
+ Licensed under the terms of the Expat License
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- pydocstyle, licensed as follows:
+ """
+ Copyright (c) 2012 GreenSteam,
+
+ Copyright (c) 2014-2020 Amir Rachum,
+
+ Copyright (c) 2020 Sambhav Kothari,
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
+ this software and associated documentation files (the "Software"), to deal in
+ the Software without restriction, including without limitation the rights to
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ of the Software, and to permit persons to whom the Software is furnished to do
+ so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- Pyflakes, licensed as follows:
+ """
+ Copyright 2005-2011 Divmod, Inc.
+ Copyright 2013-2014 Florent Xicluna
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ """
+
+- Pyright, licensed as follows:
+ """
+ MIT License
+
+ Pyright - A static type checker for the Python language
+ Copyright (c) Microsoft Corporation. All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE
+ """
+
+- pyupgrade, licensed as follows:
+ """
+ Copyright (c) 2017 Anthony Sottile
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ """
+
+- rome/tools, licensed under the MIT license:
+ """
+ MIT License
+
+ Copyright (c) Rome Tools, Inc. and its affiliates.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- RustPython, licensed as follows:
+ """
+ MIT License
+
+ Copyright (c) 2020 RustPython Team
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ """
+
+- rust-analyzer/text-size, licensed under the MIT license:
+ """
+ Permission is hereby granted, free of charge, to any
+ person obtaining a copy of this software and associated
+ documentation files (the "Software"), to deal in the
+ Software without restriction, including without
+ limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of
+ the Software, and to permit persons to whom the Software
+ is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice
+ shall be included in all copies or substantial portions
+ of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+ TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+ SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ DEALINGS IN THE SOFTWARE.
+ """
diff --git a/docs/licenses/dependencies/ruff-pre-commit-license.txt b/docs/licenses/dependencies/ruff-pre-commit-license.txt
new file mode 100644
index 000000000000..c16d8bb1db26
--- /dev/null
+++ b/docs/licenses/dependencies/ruff-pre-commit-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Astral Software Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/safetensors-license.txt b/docs/licenses/dependencies/safetensors-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/safetensors-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/scikit-learn-license.txt b/docs/licenses/dependencies/scikit-learn-license.txt
new file mode 100644
index 000000000000..e1cd01d58457
--- /dev/null
+++ b/docs/licenses/dependencies/scikit-learn-license.txt
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2007-2024 The scikit-learn developers.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/sentry-sdk-license.txt b/docs/licenses/dependencies/sentry-sdk-license.txt
new file mode 100644
index 000000000000..016323bd8da8
--- /dev/null
+++ b/docs/licenses/dependencies/sentry-sdk-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 Functional Software, Inc. dba Sentry
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/setproctitle-license.txt b/docs/licenses/dependencies/setproctitle-license.txt
new file mode 100644
index 000000000000..1f632fa116aa
--- /dev/null
+++ b/docs/licenses/dependencies/setproctitle-license.txt
@@ -0,0 +1,28 @@
+BSD 3-Clause License
+
+Copyright (c) 2009, Daniele Varrazzo
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/shortuuid-license.txt b/docs/licenses/dependencies/shortuuid-license.txt
new file mode 100644
index 000000000000..c14f01beb96a
--- /dev/null
+++ b/docs/licenses/dependencies/shortuuid-license.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2011, Stavros Korokithakis
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+Neither the name of Stochastic Technologies nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/six-license.txt b/docs/licenses/dependencies/six-license.txt
new file mode 100644
index 000000000000..1cc22a5aa767
--- /dev/null
+++ b/docs/licenses/dependencies/six-license.txt
@@ -0,0 +1,18 @@
+Copyright (c) 2010-2024 Benjamin Peterson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/smmap-license.txt b/docs/licenses/dependencies/smmap-license.txt
new file mode 100644
index 000000000000..8ef91f979049
--- /dev/null
+++ b/docs/licenses/dependencies/smmap-license.txt
@@ -0,0 +1,29 @@
+Copyright (C) 2010, 2011 Sebastian Thiel and contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+* Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+* Neither the name of the async project nor the names of
+its contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/sniffio-license.txt b/docs/licenses/dependencies/sniffio-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/sniffio-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/snowballstemmer-license.txt b/docs/licenses/dependencies/snowballstemmer-license.txt
new file mode 100644
index 000000000000..f36607f9e93f
--- /dev/null
+++ b/docs/licenses/dependencies/snowballstemmer-license.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2001, Dr Martin Porter
+Copyright (c) 2004,2005, Richard Boulton
+Copyright (c) 2013, Yoshiki Shibukawa
+Copyright (c) 2006,2007,2009,2010,2011,2014-2019, Olly Betts
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ 3. Neither the name of the Snowball project nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/soupsieve-license.txt b/docs/licenses/dependencies/soupsieve-license.txt
new file mode 100644
index 000000000000..a34ec87ec69a
--- /dev/null
+++ b/docs/licenses/dependencies/soupsieve-license.txt
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) 2018 - 2025 Isaac Muse isaacmuse@gmail.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/sphinxcontrib-applehelp-license.txt b/docs/licenses/dependencies/sphinxcontrib-applehelp-license.txt
new file mode 100644
index 000000000000..8391fd1a2335
--- /dev/null
+++ b/docs/licenses/dependencies/sphinxcontrib-applehelp-license.txt
@@ -0,0 +1,8 @@
+License for sphinxcontrib-applehelp
+Copyright (c) 2007-2019 by the Sphinx team (see https://github.com/sphinx-doc/sphinx/blob/master/AUTHORS). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/sphinxcontrib-devhelp-license.txt b/docs/licenses/dependencies/sphinxcontrib-devhelp-license.txt
new file mode 100644
index 000000000000..e15238ffc3b5
--- /dev/null
+++ b/docs/licenses/dependencies/sphinxcontrib-devhelp-license.txt
@@ -0,0 +1,8 @@
+License for sphinxcontrib-devhelp
+Copyright (c) 2007-2019 by the Sphinx team (see https://github.com/sphinx-doc/sphinx/blob/master/AUTHORS). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/sphinxcontrib-htmlhelp-license.txt b/docs/licenses/dependencies/sphinxcontrib-htmlhelp-license.txt
new file mode 100644
index 000000000000..0339165c9d48
--- /dev/null
+++ b/docs/licenses/dependencies/sphinxcontrib-htmlhelp-license.txt
@@ -0,0 +1,8 @@
+License for sphinxcontrib-htmlhelp
+Copyright (c) 2007-2019 by the Sphinx team (see https://github.com/sphinx-doc/sphinx/blob/master/AUTHORS). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/sphinxcontrib-jsmath-license.txt b/docs/licenses/dependencies/sphinxcontrib-jsmath-license.txt
new file mode 100644
index 000000000000..e28495c913ce
--- /dev/null
+++ b/docs/licenses/dependencies/sphinxcontrib-jsmath-license.txt
@@ -0,0 +1,8 @@
+License for sphinxcontrib-jsmath
+Copyright (c) 2007-2019 by the Sphinx team (see https://github.com/sphinx-doc/sphinx/blob/master/AUTHORS). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/sphinxcontrib-qthelp-license.txt b/docs/licenses/dependencies/sphinxcontrib-qthelp-license.txt
new file mode 100644
index 000000000000..dd8f49eb65b3
--- /dev/null
+++ b/docs/licenses/dependencies/sphinxcontrib-qthelp-license.txt
@@ -0,0 +1,8 @@
+License for sphinxcontrib-qthelp
+Copyright (c) 2007-2019 by the Sphinx team (see https://github.com/sphinx-doc/sphinx/blob/master/AUTHORS). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/sphinxcontrib-serializinghtml-license.txt b/docs/licenses/dependencies/sphinxcontrib-serializinghtml-license.txt
new file mode 100644
index 000000000000..b396b73ecd72
--- /dev/null
+++ b/docs/licenses/dependencies/sphinxcontrib-serializinghtml-license.txt
@@ -0,0 +1,8 @@
+License for sphinxcontrib-serializinghtml
+Copyright (c) 2007-2019 by the Sphinx team (see https://github.com/sphinx-doc/sphinx/blob/master/AUTHORS). All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/stack-data-license.txt b/docs/licenses/dependencies/stack-data-license.txt
new file mode 100644
index 000000000000..473e36e246ed
--- /dev/null
+++ b/docs/licenses/dependencies/stack-data-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Alex Hall
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/sympy-license.txt b/docs/licenses/dependencies/sympy-license.txt
new file mode 100644
index 000000000000..bff6f8ff065e
--- /dev/null
+++ b/docs/licenses/dependencies/sympy-license.txt
@@ -0,0 +1,153 @@
+Copyright (c) 2006-2023 SymPy Development Team
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ a. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ b. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ c. Neither the name of SymPy nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+--------------------------------------------------------------------------------
+
+Patches that were taken from the Diofant project (https://github.com/diofant/diofant)
+are licensed as:
+
+Copyright (c) 2006-2018 SymPy Development Team,
+ 2013-2023 Sergey B Kirpichev
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ a. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ b. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ c. Neither the name of Diofant or SymPy nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+--------------------------------------------------------------------------------
+
+Submodules taken from the multipledispatch project (https://github.com/mrocklin/multipledispatch)
+are licensed as:
+
+Copyright (c) 2014 Matthew Rocklin
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ a. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ b. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ c. Neither the name of multipledispatch nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+--------------------------------------------------------------------------------
+
+The files under the directory sympy/parsing/autolev/tests/pydy-example-repo
+are directly copied from PyDy project and are licensed as:
+
+Copyright (c) 2009-2023, PyDy Authors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+* Neither the name of this project nor the names of its contributors may be
+ used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL PYDY AUTHORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------------------
+
+The files under the directory sympy/parsing/latex
+are directly copied from latex2sympy project and are licensed as:
+
+Copyright 2016, latex2sympy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/tensorboardx-license.txt b/docs/licenses/dependencies/tensorboardx-license.txt
new file mode 100644
index 000000000000..bed02cde0be5
--- /dev/null
+++ b/docs/licenses/dependencies/tensorboardx-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Tzu-Wei Huang
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/termcolor-license.txt b/docs/licenses/dependencies/termcolor-license.txt
new file mode 100644
index 000000000000..d0b79705c354
--- /dev/null
+++ b/docs/licenses/dependencies/termcolor-license.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2008-2011 Volvox Development Team
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/docs/licenses/dependencies/threadpoolctl-license.txt b/docs/licenses/dependencies/threadpoolctl-license.txt
new file mode 100644
index 000000000000..1d7302bf83b0
--- /dev/null
+++ b/docs/licenses/dependencies/threadpoolctl-license.txt
@@ -0,0 +1,24 @@
+Copyright (c) 2019, threadpoolctl contributors
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of copyright holder nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/tinyxml-license.txt b/docs/licenses/dependencies/tinyxml-license.txt
new file mode 100644
index 000000000000..85a6a36f0ddf
--- /dev/null
+++ b/docs/licenses/dependencies/tinyxml-license.txt
@@ -0,0 +1,18 @@
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
diff --git a/docs/licenses/dependencies/tokenizers-license.txt b/docs/licenses/dependencies/tokenizers-license.txt
new file mode 100644
index 000000000000..261eeb9e9f8b
--- /dev/null
+++ b/docs/licenses/dependencies/tokenizers-license.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/docs/licenses/dependencies/tqdm-license.txt b/docs/licenses/dependencies/tqdm-license.txt
new file mode 100644
index 000000000000..1899a730fb42
--- /dev/null
+++ b/docs/licenses/dependencies/tqdm-license.txt
@@ -0,0 +1,49 @@
+`tqdm` is a product of collaborative work.
+Unless otherwise stated, all authors (see commit logs) retain copyright
+for their respective work, and release the work under the MIT licence
+(text below).
+
+Exceptions or notable authors are listed below
+in reverse chronological order:
+
+* files: *
+ MPL-2.0 2015-2024 (c) Casper da Costa-Luis
+ [casperdcl](https://github.com/casperdcl).
+* files: tqdm/_tqdm.py
+ MIT 2016 (c) [PR #96] on behalf of Google Inc.
+* files: tqdm/_tqdm.py README.rst .gitignore
+ MIT 2013 (c) Noam Yorav-Raphael, original author.
+
+[PR #96]: #96
+
+
+Mozilla Public Licence (MPL) v. 2.0 - Exhibit A
+-----------------------------------------------
+
+This Source Code Form is subject to the terms of the
+Mozilla Public License, v. 2.0.
+If a copy of the MPL was not distributed with this project,
+You can obtain one at https://mozilla.org/MPL/2.0/.
+
+
+MIT License (MIT)
+-----------------
+
+Copyright (c) 2013 noamraph
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/docs/licenses/dependencies/traitlets-license.txt b/docs/licenses/dependencies/traitlets-license.txt
new file mode 100644
index 000000000000..76910b096a63
--- /dev/null
+++ b/docs/licenses/dependencies/traitlets-license.txt
@@ -0,0 +1,30 @@
+BSD 3-Clause License
+
+- Copyright (c) 2001-, IPython Development Team
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/triton-license.txt b/docs/licenses/dependencies/triton-license.txt
new file mode 100644
index 000000000000..1d0238e86b1b
--- /dev/null
+++ b/docs/licenses/dependencies/triton-license.txt
@@ -0,0 +1,23 @@
+/*
+* Copyright 2018-2020 Philippe Tillet
+* Copyright 2020-2022 OpenAI
+*
+* Permission is hereby granted, free of charge, to any person obtaining
+* a copy of this software and associated documentation files
+* (the "Software"), to deal in the Software without restriction,
+* including without limitation the rights to use, copy, modify, merge,
+* publish, distribute, sublicense, and/or sell copies of the Software,
+* and to permit persons to whom the Software is furnished to do so,
+* subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be
+* included in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
diff --git a/docs/licenses/dependencies/typing-extensions-license.txt b/docs/licenses/dependencies/typing-extensions-license.txt
new file mode 100644
index 000000000000..f26bcf4d2de6
--- /dev/null
+++ b/docs/licenses/dependencies/typing-extensions-license.txt
@@ -0,0 +1,279 @@
+A. HISTORY OF THE SOFTWARE
+==========================
+
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands
+as a successor of a language called ABC. Guido remains Python's
+principal author, although it includes many contributions from others.
+
+In 1995, Guido continued his work on Python at the Corporation for
+National Research Initiatives (CNRI, see https://www.cnri.reston.va.us)
+in Reston, Virginia where he released several versions of the
+software.
+
+In May 2000, Guido and the Python core development team moved to
+BeOpen.com to form the BeOpen PythonLabs team. In October of the same
+year, the PythonLabs team moved to Digital Creations, which became
+Zope Corporation. In 2001, the Python Software Foundation (PSF, see
+https://www.python.org/psf/) was formed, a non-profit organization
+created specifically to own Python-related Intellectual Property.
+Zope Corporation was a sponsoring member of the PSF.
+
+All Python releases are Open Source (see https://opensource.org for
+the Open Source Definition). Historically, most, but not all, Python
+releases have also been GPL-compatible; the table below summarizes
+the various releases.
+
+ Release Derived Year Owner GPL-
+ from compatible? (1)
+
+ 0.9.0 thru 1.2 1991-1995 CWI yes
+ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
+ 1.6 1.5.2 2000 CNRI no
+ 2.0 1.6 2000 BeOpen.com no
+ 1.6.1 1.6 2001 CNRI yes (2)
+ 2.1 2.0+1.6.1 2001 PSF no
+ 2.0.1 2.0+1.6.1 2001 PSF yes
+ 2.1.1 2.1+2.0.1 2001 PSF yes
+ 2.1.2 2.1.1 2002 PSF yes
+ 2.1.3 2.1.2 2002 PSF yes
+ 2.2 and above 2.1.1 2001-now PSF yes
+
+Footnotes:
+
+(1) GPL-compatible doesn't mean that we're distributing Python under
+ the GPL. All Python licenses, unlike the GPL, let you distribute
+ a modified version without making your changes open source. The
+ GPL-compatible licenses make it possible to combine Python with
+ other software that is released under the GPL; the others don't.
+
+(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+ because its license has a choice of law clause. According to
+ CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+ is "not incompatible" with the GPL.
+
+Thanks to the many outside volunteers who have worked under Guido's
+direction to make these releases possible.
+
+
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+Python software and documentation are licensed under the
+Python Software Foundation License Version 2.
+
+Starting with Python 3.8.6, examples, recipes, and other code in
+the documentation are dual licensed under the PSF License Version 2
+and the Zero-Clause BSD license.
+
+Some software incorporated into Python is under different licenses.
+The licenses are listed with code falling under that license.
+
+
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+--------------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using this software ("Python") in source or binary form and
+its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF hereby
+grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+analyze, test, perform and/or display publicly, prepare derivative works,
+distribute, and otherwise use Python alone or in any derivative version,
+provided, however, that PSF's License Agreement and PSF's notice of copyright,
+i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Python Software Foundation;
+All Rights Reserved" are retained in Python alone or in any derivative version
+prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python.
+
+4. PSF is making Python available to Licensee on an "AS IS"
+basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee. This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions. Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee. This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party. As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee. Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement. This Agreement together with
+Python 1.6.1 may be located on the internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013. This
+Agreement may also be obtained from a proxy server on the internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee. This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
+
+ ACCEPT
+
+
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands. All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION
+----------------------------------------------------------------------
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/docs/licenses/dependencies/typing-inspection-license.txt b/docs/licenses/dependencies/typing-inspection-license.txt
new file mode 100644
index 000000000000..e825ad51621c
--- /dev/null
+++ b/docs/licenses/dependencies/typing-inspection-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) Pydantic Services Inc. 2025 to present
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/tzdata-license.txt b/docs/licenses/dependencies/tzdata-license.txt
new file mode 100644
index 000000000000..c2f84aeb06f7
--- /dev/null
+++ b/docs/licenses/dependencies/tzdata-license.txt
@@ -0,0 +1,15 @@
+Apache Software License 2.0
+
+Copyright (c) 2020, Paul Ganssle (Google)
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/docs/licenses/dependencies/urdfdom-license.txt b/docs/licenses/dependencies/urdfdom-license.txt
new file mode 100644
index 000000000000..4c328b81145a
--- /dev/null
+++ b/docs/licenses/dependencies/urdfdom-license.txt
@@ -0,0 +1,33 @@
+/*********************************************************************
+* Software License Agreement (BSD License)
+*
+* Copyright (c) 2008, Willow Garage, Inc.
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above
+* copyright notice, this list of conditions and the following
+* disclaimer in the documentation and/or other materials provided
+* with the distribution.
+* * Neither the name of the Willow Garage nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*********************************************************************/
diff --git a/docs/licenses/dependencies/urllib3-license.txt b/docs/licenses/dependencies/urllib3-license.txt
new file mode 100644
index 000000000000..e6183d0276b2
--- /dev/null
+++ b/docs/licenses/dependencies/urllib3-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2008-2020 Andrey Petrov and contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/uv-license.txt b/docs/licenses/dependencies/uv-license.txt
new file mode 100644
index 000000000000..014835144877
--- /dev/null
+++ b/docs/licenses/dependencies/uv-license.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2025 Astral Software Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/docs/licenses/dependencies/warp-license.txt b/docs/licenses/dependencies/warp-license.txt
index 9fd8e1dc408d..d9a10c0d8e86 100644
--- a/docs/licenses/dependencies/warp-license.txt
+++ b/docs/licenses/dependencies/warp-license.txt
@@ -1,36 +1,176 @@
-# NVIDIA Source Code License for Warp
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
-## 1. Definitions
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-โLicensorโ means any person or entity that distributes its Work.
-โSoftwareโ means the original work of authorship made available under this License.
-โWorkโ means the Software and any additions to or derivative works of the Software that are made available under this License.
-The terms โreproduce,โ โreproduction,โ โderivative works,โ and โdistributionโ have the meaning as provided under U.S. copyright law; provided, however, that for the purposes of this License, derivative works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work.
-Works, including the Software, are โmade availableโ under this License by including in or with the Work either (a) a copyright notice referencing the applicability of this License to the Work, or (b) a copy of this License.
+ 1. Definitions.
-## 2. License Grant
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
-2.1 Copyright Grant. Subject to the terms and conditions of this License, each Licensor grants to you a perpetual, worldwide, non-exclusive, royalty-free, copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense and distribute its Work and any resulting derivative works in any form.
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
-## 3. Limitations
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
-3.1 Redistribution. You may reproduce or distribute the Work only if (a) you do so under this License, (b) you include a complete copy of this License with your distribution, and (c) you retain without modification any copyright, patent, trademark, or attribution notices that are present in the Work.
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
-3.2 Derivative Works. You may specify that additional or different terms apply to the use, reproduction, and distribution of your derivative works of the Work (โYour Termsโ) only if (a) Your Terms provide that the use limitation in Section 3.3 applies to your derivative works, and (b) you identify the specific derivative works that are subject to Your Terms. Notwithstanding Your Terms, this License (including the redistribution requirements in Section 3.1) will continue to apply to the Work itself.
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
-3.3 Use Limitation. The Work and any derivative works thereof only may be used or intended for use non-commercially. Notwithstanding the foregoing, NVIDIA and its affiliates may use the Work and any derivative works commercially. As used herein, โnon-commerciallyโ means for research or evaluation purposes only.
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
-3.4 Patent Claims. If you bring or threaten to bring a patent claim against any Licensor (including any claim, cross-claim or counterclaim in a lawsuit) to enforce any patents that you allege are infringed by any Work, then your rights under this License from such Licensor (including the grant in Section 2.1) will terminate immediately.
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
-3.5 Trademarks. This License does not grant any rights to use any Licensorโs or its affiliatesโ names, logos, or trademarks, except as necessary to reproduce the notices described in this License.
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
-3.6 Termination. If you violate any term of this License, then your rights under this License (including the grant in Section 2.1) will terminate immediately.
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
-## 4. Disclaimer of Warranty.
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
-THE WORK IS PROVIDED โAS ISโ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WARRANTIES OR CONDITIONS OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT. YOU BEAR THE RISK OF UNDERTAKING ANY ACTIVITIES UNDER THIS LICENSE.
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
-## 5. Limitation of Liability.
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
-EXCEPT AS PROHIBITED BY APPLICABLE LAW, IN NO EVENT AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE SHALL ANY LICENSOR BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATED TO THIS LICENSE, THE USE OR INABILITY TO USE THE WORK (INCLUDING BUT NOT LIMITED TO LOSS OF GOODWILL, BUSINESS INTERRUPTION, LOST PROFITS OR DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY OTHER COMM ERCIAL DAMAGES OR LOSSES), EVEN IF THE LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/docs/licenses/dependencies/werkzeug-license.txt b/docs/licenses/dependencies/werkzeug-license.txt
new file mode 100644
index 000000000000..c37cae49ec77
--- /dev/null
+++ b/docs/licenses/dependencies/werkzeug-license.txt
@@ -0,0 +1,28 @@
+Copyright 2007 Pallets
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/docs/licenses/dependencies/widgetsnbextension-license.txt b/docs/licenses/dependencies/widgetsnbextension-license.txt
new file mode 100644
index 000000000000..2ec51d75f362
--- /dev/null
+++ b/docs/licenses/dependencies/widgetsnbextension-license.txt
@@ -0,0 +1,27 @@
+BSD-3-Clause license
+Copyright (c) 2015-2022, conda-forge contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
diff --git a/docs/licenses/dependencies/zipp-license.txt b/docs/licenses/dependencies/zipp-license.txt
new file mode 100644
index 000000000000..b5b7b529ffc2
--- /dev/null
+++ b/docs/licenses/dependencies/zipp-license.txt
@@ -0,0 +1 @@
+license = "MIT" as indicated in pyproject.toml
diff --git a/docs/licenses/dependencies/zlib-license.txt b/docs/licenses/dependencies/zlib-license.txt
new file mode 100644
index 000000000000..038d398538e9
--- /dev/null
+++ b/docs/licenses/dependencies/zlib-license.txt
@@ -0,0 +1,25 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.3.1, January 22nd, 2024
+
+ Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+*/
diff --git a/docs/make.bat b/docs/make.bat
index cdaf22f257cb..676a3abc67d6 100644
--- a/docs/make.bat
+++ b/docs/make.bat
@@ -1,64 +1,65 @@
-@ECHO OFF
-
-pushd %~dp0
-
-REM Command file to build Sphinx documentation
-
-set SOURCEDIR=.
-set BUILDDIR=_build
-
-REM Check if a specific target was passed
-if "%1" == "multi-docs" (
- REM Check if SPHINXBUILD is set, if not default to sphinx-multiversion
- if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-multiversion
- )
- %SPHINXBUILD% >NUL 2>NUL
- if errorlevel 9009 (
- echo.
- echo.The 'sphinx-multiversion' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-multiversion' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.http://sphinx-doc.org/
- exit /b 1
- )
- %SPHINXBUILD% %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
-
- REM Copy the redirect index.html to the build directory
- copy _redirect\index.html %BUILDDIR%\index.html
- goto end
-)
-
-if "%1" == "current-docs" (
- REM Check if SPHINXBUILD is set, if not default to sphinx-build
- if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
- )
- %SPHINXBUILD% >NUL 2>NUL
- if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.http://sphinx-doc.org/
- exit /b 1
- )
- %SPHINXBUILD% %SOURCEDIR% %BUILDDIR%\current %SPHINXOPTS% %O%
- goto end
-)
-
-REM If no valid target is passed, show usage instructions
-echo.
-echo.Usage:
-echo. make.bat multi-docs - To build the multi-version documentation.
-echo. make.bat current-docs - To build the current documentation.
-echo.
-
-:end
-popd
+@ECHO OFF
+
+pushd %~dp0
+
+REM Command file to build Sphinx documentation
+
+set SOURCEDIR=.
+set BUILDDIR=_build
+
+REM Check if a specific target was passed
+if "%1" == "multi-docs" (
+ REM Check if SPHINXBUILD is set, if not default to sphinx-multiversion
+ if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-multiversion
+ )
+ where %SPHINXBUILD% >NUL 2>NUL
+ if errorlevel 1 (
+ echo.
+ echo.The 'sphinx-multiversion' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-multiversion' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+ )
+ %SPHINXBUILD% %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
+
+ REM Copy the redirect index.html to the build directory
+ copy _redirect\index.html %BUILDDIR%\index.html
+ goto end
+)
+
+if "%1" == "current-docs" (
+ REM Check if SPHINXBUILD is set, if not default to sphinx-build
+ if "%SPHINXBUILD%" == "" (
+ set SPHINXBUILD=sphinx-build
+ )
+ where %SPHINXBUILD% >NUL 2>NUL
+ if errorlevel 1 (
+ echo.
+ echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
+ echo.installed, then set the SPHINXBUILD environment variable to point
+ echo.to the full path of the 'sphinx-build' executable. Alternatively you
+ echo.may add the Sphinx directory to PATH.
+ echo.
+ echo.If you don't have Sphinx installed, grab it from
+ echo.http://sphinx-doc.org/
+ exit /b 1
+ )
+ if exist "%BUILDDIR%\current" rmdir /s /q "%BUILDDIR%\current"
+ %SPHINXBUILD% -W "%SOURCEDIR%" "%BUILDDIR%\current" %SPHINXOPTS%
+ goto end
+)
+
+REM If no valid target is passed, show usage instructions
+echo.
+echo.Usage:
+echo. make.bat multi-docs - To build the multi-version documentation.
+echo. make.bat current-docs - To build the current documentation.
+echo.
+
+:end
+popd
diff --git a/docs/source/_static/actuator-group/dc_motor_clipping.jpg b/docs/source/_static/actuator-group/dc_motor_clipping.jpg
new file mode 100644
index 000000000000..83a865f538e8
Binary files /dev/null and b/docs/source/_static/actuator-group/dc_motor_clipping.jpg differ
diff --git a/docs/source/_static/demos/bin_packing.jpg b/docs/source/_static/demos/bin_packing.jpg
new file mode 100644
index 000000000000..52d242d6cc4e
Binary files /dev/null and b/docs/source/_static/demos/bin_packing.jpg differ
diff --git a/docs/source/_static/demos/bipeds.jpg b/docs/source/_static/demos/bipeds.jpg
new file mode 100644
index 000000000000..d486dcb05fbb
Binary files /dev/null and b/docs/source/_static/demos/bipeds.jpg differ
diff --git a/docs/source/_static/demos/haply_teleop_franka.jpg b/docs/source/_static/demos/haply_teleop_franka.jpg
new file mode 100644
index 000000000000..14461095c719
Binary files /dev/null and b/docs/source/_static/demos/haply_teleop_franka.jpg differ
diff --git a/docs/source/_static/demos/multi-mesh-raycast.jpg b/docs/source/_static/demos/multi-mesh-raycast.jpg
new file mode 100644
index 000000000000..b9d20d7150a1
Binary files /dev/null and b/docs/source/_static/demos/multi-mesh-raycast.jpg differ
diff --git a/docs/source/_static/demos/pick_and_place.jpg b/docs/source/_static/demos/pick_and_place.jpg
new file mode 100644
index 000000000000..76e2faa10cb7
Binary files /dev/null and b/docs/source/_static/demos/pick_and_place.jpg differ
diff --git a/docs/source/_static/demos/quadcopter.jpg b/docs/source/_static/demos/quadcopter.jpg
new file mode 100644
index 000000000000..541b8de7c9e1
Binary files /dev/null and b/docs/source/_static/demos/quadcopter.jpg differ
diff --git a/docs/source/_static/how-to/howto_rendering_example_balanced.jpg b/docs/source/_static/how-to/howto_rendering_example_balanced.jpg
new file mode 100644
index 000000000000..5ec36af1c0e6
Binary files /dev/null and b/docs/source/_static/how-to/howto_rendering_example_balanced.jpg differ
diff --git a/docs/source/_static/how-to/howto_rendering_example_performance.jpg b/docs/source/_static/how-to/howto_rendering_example_performance.jpg
new file mode 100644
index 000000000000..f9f5b826942b
Binary files /dev/null and b/docs/source/_static/how-to/howto_rendering_example_performance.jpg differ
diff --git a/docs/source/_static/how-to/howto_rendering_example_quality.jpg b/docs/source/_static/how-to/howto_rendering_example_quality.jpg
new file mode 100644
index 000000000000..95d5c2845a06
Binary files /dev/null and b/docs/source/_static/how-to/howto_rendering_example_quality.jpg differ
diff --git a/docs/source/_static/migration/ovd_pvd_comparison.jpg b/docs/source/_static/migration/ovd_pvd_comparison.jpg
new file mode 100644
index 000000000000..f2d8fb31462f
Binary files /dev/null and b/docs/source/_static/migration/ovd_pvd_comparison.jpg differ
diff --git a/docs/source/_static/overview/sensors/contact_visualization.jpg b/docs/source/_static/overview/sensors/contact_visualization.jpg
new file mode 100644
index 000000000000..79d61261ff6f
Binary files /dev/null and b/docs/source/_static/overview/sensors/contact_visualization.jpg differ
diff --git a/docs/source/_static/overview/sensors/tacsl_demo.jpg b/docs/source/_static/overview/sensors/tacsl_demo.jpg
new file mode 100644
index 000000000000..a723d5ea8cb6
Binary files /dev/null and b/docs/source/_static/overview/sensors/tacsl_demo.jpg differ
diff --git a/docs/source/_static/overview/sensors/tacsl_diagram.jpg b/docs/source/_static/overview/sensors/tacsl_diagram.jpg
new file mode 100644
index 000000000000..323c9a77e8d8
Binary files /dev/null and b/docs/source/_static/overview/sensors/tacsl_diagram.jpg differ
diff --git a/docs/source/_static/overview/sensors/tacsl_force_field_example.jpg b/docs/source/_static/overview/sensors/tacsl_force_field_example.jpg
new file mode 100644
index 000000000000..eeca0295a2f0
Binary files /dev/null and b/docs/source/_static/overview/sensors/tacsl_force_field_example.jpg differ
diff --git a/docs/source/_static/overview/sensors/tacsl_taxim_example.jpg b/docs/source/_static/overview/sensors/tacsl_taxim_example.jpg
new file mode 100644
index 000000000000..37e8dab491b6
Binary files /dev/null and b/docs/source/_static/overview/sensors/tacsl_taxim_example.jpg differ
diff --git a/docs/source/_static/policy_deployment/00_hover/hover_stable_wave.png b/docs/source/_static/policy_deployment/00_hover/hover_stable_wave.png
new file mode 100644
index 000000000000..9604312be8b8
Binary files /dev/null and b/docs/source/_static/policy_deployment/00_hover/hover_stable_wave.png differ
diff --git a/docs/source/_static/policy_deployment/00_hover/hover_training_robots.png b/docs/source/_static/policy_deployment/00_hover/hover_training_robots.png
new file mode 100644
index 000000000000..6d8b254fc2ed
Binary files /dev/null and b/docs/source/_static/policy_deployment/00_hover/hover_training_robots.png differ
diff --git a/docs/source/_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_anymal_d_v0_IO_descriptors.yaml b/docs/source/_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_anymal_d_v0_IO_descriptors.yaml
new file mode 100644
index 000000000000..f44840c0f908
--- /dev/null
+++ b/docs/source/_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_anymal_d_v0_IO_descriptors.yaml
@@ -0,0 +1,349 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+actions:
+- action_type: JointAction
+ clip: null
+ dtype: torch.float32
+ extras:
+ description: Joint action term that applies the processed actions to the articulation's
+ joints as position commands.
+ full_path: isaaclab.envs.mdp.actions.joint_actions.JointPositionAction
+ joint_names:
+ - LF_HAA
+ - LH_HAA
+ - RF_HAA
+ - RH_HAA
+ - LF_HFE
+ - LH_HFE
+ - RF_HFE
+ - RH_HFE
+ - LF_KFE
+ - LH_KFE
+ - RF_KFE
+ - RH_KFE
+ mdp_type: Action
+ name: joint_position_action
+ offset:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.4000000059604645
+ - -0.4000000059604645
+ - 0.4000000059604645
+ - -0.4000000059604645
+ - -0.800000011920929
+ - 0.800000011920929
+ - -0.800000011920929
+ - 0.800000011920929
+ scale: 0.5
+ shape:
+ - 12
+articulations:
+ robot:
+ default_joint_armature:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ default_joint_damping:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ default_joint_friction:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ default_joint_pos:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.4000000059604645
+ - -0.4000000059604645
+ - 0.4000000059604645
+ - -0.4000000059604645
+ - -0.800000011920929
+ - 0.800000011920929
+ - -0.800000011920929
+ - 0.800000011920929
+ default_joint_pos_limits:
+ - - -0.7853984236717224
+ - 0.6108654141426086
+ - - -0.7853984236717224
+ - 0.6108654141426086
+ - - -0.6108654141426086
+ - 0.7853984236717224
+ - - -0.6108654141426086
+ - 0.7853984236717224
+ - - -9.42477798461914
+ - 9.42477798461914
+ - - -9.42477798461914
+ - 9.42477798461914
+ - - -9.42477798461914
+ - 9.42477798461914
+ - - -9.42477798461914
+ - 9.42477798461914
+ - - -9.42477798461914
+ - 9.42477798461914
+ - - -9.42477798461914
+ - 9.42477798461914
+ - - -9.42477798461914
+ - 9.42477798461914
+ - - -9.42477798461914
+ - 9.42477798461914
+ default_joint_stiffness:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ default_joint_vel:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ joint_names:
+ - LF_HAA
+ - LH_HAA
+ - RF_HAA
+ - RH_HAA
+ - LF_HFE
+ - LH_HFE
+ - RF_HFE
+ - RH_HFE
+ - LF_KFE
+ - LH_KFE
+ - RF_KFE
+ - RH_KFE
+observations:
+ policy:
+ - dtype: torch.float32
+ extras:
+ axes:
+ - X
+ - Y
+ - Z
+ description: Root linear velocity in the asset's root frame.
+ modifiers: null
+ units: m/s
+ full_path: isaaclab.envs.mdp.observations.base_lin_vel
+ mdp_type: Observation
+ name: base_lin_vel
+ observation_type: RootState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 3
+ - dtype: torch.float32
+ extras:
+ axes:
+ - X
+ - Y
+ - Z
+ description: Root angular velocity in the asset's root frame.
+ modifiers: null
+ units: rad/s
+ full_path: isaaclab.envs.mdp.observations.base_ang_vel
+ mdp_type: Observation
+ name: base_ang_vel
+ observation_type: RootState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 3
+ - dtype: torch.float32
+ extras:
+ axes:
+ - X
+ - Y
+ - Z
+ description: Gravity projection on the asset's root frame.
+ modifiers: null
+ units: m/s^2
+ full_path: isaaclab.envs.mdp.observations.projected_gravity
+ mdp_type: Observation
+ name: projected_gravity
+ observation_type: RootState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 3
+ - dtype: torch.float32
+ extras:
+ description: The generated command from command term in the command manager
+ with the given name.
+ modifiers: null
+ full_path: isaaclab.envs.mdp.observations.generated_commands
+ mdp_type: Observation
+ name: generated_commands
+ observation_type: Command
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 3
+ - dtype: torch.float32
+ extras:
+ description: 'The joint positions of the asset w.r.t. the default joint positions.
+ Note: Only the joints configured in :attr:`asset_cfg.joint_ids` will have
+ their positions returned.'
+ modifiers: null
+ units: rad
+ full_path: isaaclab.envs.mdp.observations.joint_pos_rel
+ joint_names:
+ - LF_HAA
+ - LH_HAA
+ - RF_HAA
+ - RH_HAA
+ - LF_HFE
+ - LH_HFE
+ - RF_HFE
+ - RH_HFE
+ - LF_KFE
+ - LH_KFE
+ - RF_KFE
+ - RH_KFE
+ joint_pos_offsets:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.4000000059604645
+ - -0.4000000059604645
+ - 0.4000000059604645
+ - -0.4000000059604645
+ - -0.800000011920929
+ - 0.800000011920929
+ - -0.800000011920929
+ - 0.800000011920929
+ mdp_type: Observation
+ name: joint_pos_rel
+ observation_type: JointState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 12
+ - dtype: torch.float32
+ extras:
+ description: 'The joint velocities of the asset w.r.t. the default joint velocities.
+ Note: Only the joints configured in :attr:`asset_cfg.joint_ids` will have
+ their velocities returned.'
+ modifiers: null
+ units: rad/s
+ full_path: isaaclab.envs.mdp.observations.joint_vel_rel
+ joint_names:
+ - LF_HAA
+ - LH_HAA
+ - RF_HAA
+ - RH_HAA
+ - LF_HFE
+ - LH_HFE
+ - RF_HFE
+ - RH_HFE
+ - LF_KFE
+ - LH_KFE
+ - RF_KFE
+ - RH_KFE
+ joint_vel_offsets:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ mdp_type: Observation
+ name: joint_vel_rel
+ observation_type: JointState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 12
+ - dtype: torch.float32
+ extras:
+ description: The last input action to the environment. The name of the action
+ term for which the action is required. If None, the entire action tensor is
+ returned.
+ modifiers: null
+ full_path: isaaclab.envs.mdp.observations.last_action
+ mdp_type: Observation
+ name: last_action
+ observation_type: Action
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 12
+scene:
+ decimation: 4
+ dt: 0.02
+ physics_dt: 0.005
diff --git a/docs/source/_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_g1_v0_IO_descriptors.yaml b/docs/source/_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_g1_v0_IO_descriptors.yaml
new file mode 100644
index 000000000000..d932800eaf6e
--- /dev/null
+++ b/docs/source/_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_g1_v0_IO_descriptors.yaml
@@ -0,0 +1,724 @@
+# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+
+actions:
+- action_type: JointAction
+ clip: null
+ dtype: torch.float32
+ extras:
+ description: Joint action term that applies the processed actions to the articulation's
+ joints as position commands.
+ full_path: isaaclab.envs.mdp.actions.joint_actions.JointPositionAction
+ joint_names:
+ - left_hip_pitch_joint
+ - right_hip_pitch_joint
+ - torso_joint
+ - left_hip_roll_joint
+ - right_hip_roll_joint
+ - left_shoulder_pitch_joint
+ - right_shoulder_pitch_joint
+ - left_hip_yaw_joint
+ - right_hip_yaw_joint
+ - left_shoulder_roll_joint
+ - right_shoulder_roll_joint
+ - left_knee_joint
+ - right_knee_joint
+ - left_shoulder_yaw_joint
+ - right_shoulder_yaw_joint
+ - left_ankle_pitch_joint
+ - right_ankle_pitch_joint
+ - left_elbow_pitch_joint
+ - right_elbow_pitch_joint
+ - left_ankle_roll_joint
+ - right_ankle_roll_joint
+ - left_elbow_roll_joint
+ - right_elbow_roll_joint
+ - left_five_joint
+ - left_three_joint
+ - left_zero_joint
+ - right_five_joint
+ - right_three_joint
+ - right_zero_joint
+ - left_six_joint
+ - left_four_joint
+ - left_one_joint
+ - right_six_joint
+ - right_four_joint
+ - right_one_joint
+ - left_two_joint
+ - right_two_joint
+ mdp_type: Action
+ name: joint_position_action
+ offset:
+ - -0.20000000298023224
+ - -0.20000000298023224
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.3499999940395355
+ - 0.3499999940395355
+ - 0.0
+ - 0.0
+ - 0.1599999964237213
+ - -0.1599999964237213
+ - 0.41999998688697815
+ - 0.41999998688697815
+ - 0.0
+ - 0.0
+ - -0.23000000417232513
+ - -0.23000000417232513
+ - 0.8700000047683716
+ - 0.8700000047683716
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 1.0
+ - 0.0
+ - 0.0
+ - -1.0
+ - 0.5199999809265137
+ - -0.5199999809265137
+ scale: 0.5
+ shape:
+ - 37
+articulations:
+ robot:
+ default_joint_armature:
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.009999999776482582
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ - 0.0010000000474974513
+ default_joint_damping:
+ - 5.0
+ - 5.0
+ - 5.0
+ - 5.0
+ - 5.0
+ - 10.0
+ - 10.0
+ - 5.0
+ - 5.0
+ - 10.0
+ - 10.0
+ - 5.0
+ - 5.0
+ - 10.0
+ - 10.0
+ - 2.0
+ - 2.0
+ - 10.0
+ - 10.0
+ - 2.0
+ - 2.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ - 10.0
+ default_joint_friction:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ default_joint_pos:
+ - -0.20000000298023224
+ - -0.20000000298023224
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.3499999940395355
+ - 0.3499999940395355
+ - 0.0
+ - 0.0
+ - 0.1599999964237213
+ - -0.1599999964237213
+ - 0.41999998688697815
+ - 0.41999998688697815
+ - 0.0
+ - 0.0
+ - -0.23000000417232513
+ - -0.23000000417232513
+ - 0.8700000047683716
+ - 0.8700000047683716
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 1.0
+ - 0.0
+ - 0.0
+ - -1.0
+ - 0.5199999809265137
+ - -0.5199999809265137
+ default_joint_pos_limits:
+ - - -2.3499996662139893
+ - 3.049999952316284
+ - - -2.3499996662139893
+ - 3.049999952316284
+ - - -2.618000030517578
+ - 2.618000030517578
+ - - -0.25999996066093445
+ - 2.5299997329711914
+ - - -2.5299997329711914
+ - 0.25999996066093445
+ - - -2.967099666595459
+ - 2.7924997806549072
+ - - -2.967099666595459
+ - 2.7924997806549072
+ - - -2.749999761581421
+ - 2.749999761581421
+ - - -2.749999761581421
+ - 2.749999761581421
+ - - -1.5881999731063843
+ - 2.251499652862549
+ - - -2.251499652862549
+ - 1.5881999731063843
+ - - -0.3348899781703949
+ - 2.5448997020721436
+ - - -0.3348899781703949
+ - 2.5448997020721436
+ - - -2.618000030517578
+ - 2.618000030517578
+ - - -2.618000030517578
+ - 2.618000030517578
+ - - -0.6799999475479126
+ - 0.7299999594688416
+ - - -0.6799999475479126
+ - 0.7299999594688416
+ - - -0.22679997980594635
+ - 3.420799732208252
+ - - -0.22679997980594635
+ - 3.420799732208252
+ - - -0.26179996132850647
+ - 0.26179996132850647
+ - - -0.26179996132850647
+ - 0.26179996132850647
+ - - -2.094299793243408
+ - 2.094299793243408
+ - - -2.094299793243408
+ - 2.094299793243408
+ - - -1.8399999141693115
+ - 0.30000001192092896
+ - - -1.8399999141693115
+ - 0.30000001192092896
+ - - -0.5235979557037354
+ - 0.5235979557037354
+ - - -0.30000001192092896
+ - 1.8399999141693115
+ - - -0.30000001192092896
+ - 1.8399999141693115
+ - - -0.5235979557037354
+ - 0.5235979557037354
+ - - -1.8399999141693115
+ - 0.0
+ - - -1.8399999141693115
+ - 0.0
+ - - -0.9999999403953552
+ - 1.2000000476837158
+ - - 0.0
+ - 1.8399999141693115
+ - - 0.0
+ - 1.8399999141693115
+ - - -1.2000000476837158
+ - 0.9999999403953552
+ - - 0.0
+ - 1.8399999141693115
+ - - -1.8399999141693115
+ - 0.0
+ default_joint_stiffness:
+ - 200.0
+ - 200.0
+ - 200.0
+ - 150.0
+ - 150.0
+ - 40.0
+ - 40.0
+ - 150.0
+ - 150.0
+ - 40.0
+ - 40.0
+ - 200.0
+ - 200.0
+ - 40.0
+ - 40.0
+ - 20.0
+ - 20.0
+ - 40.0
+ - 40.0
+ - 20.0
+ - 20.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ - 40.0
+ default_joint_vel:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ joint_names:
+ - left_hip_pitch_joint
+ - right_hip_pitch_joint
+ - torso_joint
+ - left_hip_roll_joint
+ - right_hip_roll_joint
+ - left_shoulder_pitch_joint
+ - right_shoulder_pitch_joint
+ - left_hip_yaw_joint
+ - right_hip_yaw_joint
+ - left_shoulder_roll_joint
+ - right_shoulder_roll_joint
+ - left_knee_joint
+ - right_knee_joint
+ - left_shoulder_yaw_joint
+ - right_shoulder_yaw_joint
+ - left_ankle_pitch_joint
+ - right_ankle_pitch_joint
+ - left_elbow_pitch_joint
+ - right_elbow_pitch_joint
+ - left_ankle_roll_joint
+ - right_ankle_roll_joint
+ - left_elbow_roll_joint
+ - right_elbow_roll_joint
+ - left_five_joint
+ - left_three_joint
+ - left_zero_joint
+ - right_five_joint
+ - right_three_joint
+ - right_zero_joint
+ - left_six_joint
+ - left_four_joint
+ - left_one_joint
+ - right_six_joint
+ - right_four_joint
+ - right_one_joint
+ - left_two_joint
+ - right_two_joint
+observations:
+ policy:
+ - dtype: torch.float32
+ extras:
+ axes:
+ - X
+ - Y
+ - Z
+ description: Root linear velocity in the asset's root frame.
+ modifiers: null
+ units: m/s
+ full_path: isaaclab.envs.mdp.observations.base_lin_vel
+ mdp_type: Observation
+ name: base_lin_vel
+ observation_type: RootState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 3
+ - dtype: torch.float32
+ extras:
+ axes:
+ - X
+ - Y
+ - Z
+ description: Root angular velocity in the asset's root frame.
+ modifiers: null
+ units: rad/s
+ full_path: isaaclab.envs.mdp.observations.base_ang_vel
+ mdp_type: Observation
+ name: base_ang_vel
+ observation_type: RootState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 3
+ - dtype: torch.float32
+ extras:
+ axes:
+ - X
+ - Y
+ - Z
+ description: Gravity projection on the asset's root frame.
+ modifiers: null
+ units: m/s^2
+ full_path: isaaclab.envs.mdp.observations.projected_gravity
+ mdp_type: Observation
+ name: projected_gravity
+ observation_type: RootState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 3
+ - dtype: torch.float32
+ extras:
+ description: The generated command from command term in the command manager
+ with the given name.
+ modifiers: null
+ full_path: isaaclab.envs.mdp.observations.generated_commands
+ mdp_type: Observation
+ name: generated_commands
+ observation_type: Command
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 3
+ - dtype: torch.float32
+ extras:
+ description: 'The joint positions of the asset w.r.t. the default joint positions.
+ Note: Only the joints configured in :attr:`asset_cfg.joint_ids` will have
+ their positions returned.'
+ modifiers: null
+ units: rad
+ full_path: isaaclab.envs.mdp.observations.joint_pos_rel
+ joint_names:
+ - left_hip_pitch_joint
+ - right_hip_pitch_joint
+ - torso_joint
+ - left_hip_roll_joint
+ - right_hip_roll_joint
+ - left_shoulder_pitch_joint
+ - right_shoulder_pitch_joint
+ - left_hip_yaw_joint
+ - right_hip_yaw_joint
+ - left_shoulder_roll_joint
+ - right_shoulder_roll_joint
+ - left_knee_joint
+ - right_knee_joint
+ - left_shoulder_yaw_joint
+ - right_shoulder_yaw_joint
+ - left_ankle_pitch_joint
+ - right_ankle_pitch_joint
+ - left_elbow_pitch_joint
+ - right_elbow_pitch_joint
+ - left_ankle_roll_joint
+ - right_ankle_roll_joint
+ - left_elbow_roll_joint
+ - right_elbow_roll_joint
+ - left_five_joint
+ - left_three_joint
+ - left_zero_joint
+ - right_five_joint
+ - right_three_joint
+ - right_zero_joint
+ - left_six_joint
+ - left_four_joint
+ - left_one_joint
+ - right_six_joint
+ - right_four_joint
+ - right_one_joint
+ - left_two_joint
+ - right_two_joint
+ joint_pos_offsets:
+ - -0.20000000298023224
+ - -0.20000000298023224
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.3499999940395355
+ - 0.3499999940395355
+ - 0.0
+ - 0.0
+ - 0.1599999964237213
+ - -0.1599999964237213
+ - 0.41999998688697815
+ - 0.41999998688697815
+ - 0.0
+ - 0.0
+ - -0.23000000417232513
+ - -0.23000000417232513
+ - 0.8700000047683716
+ - 0.8700000047683716
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 1.0
+ - 0.0
+ - 0.0
+ - -1.0
+ - 0.5199999809265137
+ - -0.5199999809265137
+ mdp_type: Observation
+ name: joint_pos_rel
+ observation_type: JointState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 37
+ - dtype: torch.float32
+ extras:
+ description: 'The joint velocities of the asset w.r.t. the default joint velocities.
+ Note: Only the joints configured in :attr:`asset_cfg.joint_ids` will have
+ their velocities returned.'
+ modifiers: null
+ units: rad/s
+ full_path: isaaclab.envs.mdp.observations.joint_vel_rel
+ joint_names:
+ - left_hip_pitch_joint
+ - right_hip_pitch_joint
+ - torso_joint
+ - left_hip_roll_joint
+ - right_hip_roll_joint
+ - left_shoulder_pitch_joint
+ - right_shoulder_pitch_joint
+ - left_hip_yaw_joint
+ - right_hip_yaw_joint
+ - left_shoulder_roll_joint
+ - right_shoulder_roll_joint
+ - left_knee_joint
+ - right_knee_joint
+ - left_shoulder_yaw_joint
+ - right_shoulder_yaw_joint
+ - left_ankle_pitch_joint
+ - right_ankle_pitch_joint
+ - left_elbow_pitch_joint
+ - right_elbow_pitch_joint
+ - left_ankle_roll_joint
+ - right_ankle_roll_joint
+ - left_elbow_roll_joint
+ - right_elbow_roll_joint
+ - left_five_joint
+ - left_three_joint
+ - left_zero_joint
+ - right_five_joint
+ - right_three_joint
+ - right_zero_joint
+ - left_six_joint
+ - left_four_joint
+ - left_one_joint
+ - right_six_joint
+ - right_four_joint
+ - right_one_joint
+ - left_two_joint
+ - right_two_joint
+ joint_vel_offsets:
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ - 0.0
+ mdp_type: Observation
+ name: joint_vel_rel
+ observation_type: JointState
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 37
+ - dtype: torch.float32
+ extras:
+ description: The last input action to the environment. The name of the action
+ term for which the action is required. If None, the entire action tensor is
+ returned.
+ modifiers: null
+ full_path: isaaclab.envs.mdp.observations.last_action
+ mdp_type: Observation
+ name: last_action
+ observation_type: Action
+ overloads:
+ clip: null
+ flatten_history_dim: true
+ history_length: 0
+ scale: null
+ shape:
+ - 37
+scene:
+ decimation: 4
+ dt: 0.02
+ physics_dt: 0.005
diff --git a/docs/source/_static/policy_deployment/02_gear_assembly/gear_assembly_sim_real.webm b/docs/source/_static/policy_deployment/02_gear_assembly/gear_assembly_sim_real.webm
new file mode 100644
index 000000000000..9a232dc0ceb2
Binary files /dev/null and b/docs/source/_static/policy_deployment/02_gear_assembly/gear_assembly_sim_real.webm differ
diff --git a/docs/source/_static/policy_deployment/02_gear_assembly/sim_real_gear_assembly_train.jpg b/docs/source/_static/policy_deployment/02_gear_assembly/sim_real_gear_assembly_train.jpg
new file mode 100644
index 000000000000..6bc1fc111043
Binary files /dev/null and b/docs/source/_static/policy_deployment/02_gear_assembly/sim_real_gear_assembly_train.jpg differ
diff --git a/docs/source/_static/refs.bib b/docs/source/_static/refs.bib
index c87c90c07696..8f696b6b36e1 100644
--- a/docs/source/_static/refs.bib
+++ b/docs/source/_static/refs.bib
@@ -100,7 +100,7 @@ @ARTICLE{frankhauser2018probabilistic
@article{makoviychuk2021isaac,
title={Isaac gym: High performance gpu-based physics simulation for robot learning},
- author={Makoviychuk, Viktor and Wawrzyniak, Lukasz and Guo, Yunrong and Lu, Michelle and Storey, Kier and Macklin, Miles and Hoeller, David and Rudin, Nikita and Allshire, Arthur and Handa, Ankur and others},
+ author={Makoviychuk, Viktor and Wawrzyniak, Lukasz and Guo, Yunrong and Lu, Michelle and Storey, Kier and Macklin, Miles and Hoeller, David and Rudin, Nikita and Allshire, Arthur and Handa, Ankur and State, Gavriel},
journal={arXiv preprint arXiv:2108.10470},
year={2021}
}
@@ -108,27 +108,35 @@ @article{makoviychuk2021isaac
@article{handa2022dextreme,
title={DeXtreme: Transfer of Agile In-hand Manipulation from Simulation to Reality},
- author={Handa, Ankur and Allshire, Arthur and Makoviychuk, Viktor and Petrenko, Aleksei and Singh, Ritvik and Liu, Jingzhou and Makoviichuk, Denys and Van Wyk, Karl and Zhurkevich, Alexander and Sundaralingam, Balakumar and others},
+ author={Handa, Ankur and Allshire, Arthur and Makoviychuk, Viktor and Petrenko, Aleksei and Singh, Ritvik and Liu, Jingzhou and Makoviichuk, Denys and Van Wyk, Karl and Zhurkevich, Alexander and Sundaralingam, Balakumar and Narang, Yashraj and Lafleche, Jean-Francois and Fox, Dieter and State, Gavriel},
journal={arXiv preprint arXiv:2210.13702},
year={2022}
}
@article{narang2022factory,
title={Factory: Fast contact for robotic assembly},
- author={Narang, Yashraj and Storey, Kier and Akinola, Iretiayo and Macklin, Miles and Reist, Philipp and Wawrzyniak, Lukasz and Guo, Yunrong and Moravanszky, Adam and State, Gavriel and Lu, Michelle and others},
+ author={Narang, Yashraj and Storey, Kier and Akinola, Iretiayo and Macklin, Miles and Reist, Philipp and Wawrzyniak, Lukasz and Guo, Yunrong and Moravanszky, Adam and State, Gavriel and Lu, Michelle and Handa, Ankur and Fox, Dieter},
journal={arXiv preprint arXiv:2205.03532},
year={2022}
}
@inproceedings{allshire2022transferring,
title={Transferring dexterous manipulation from gpu simulation to a remote real-world trifinger},
- author={Allshire, Arthur and MittaI, Mayank and Lodaya, Varun and Makoviychuk, Viktor and Makoviichuk, Denys and Widmaier, Felix and W{\"u}thrich, Manuel and Bauer, Stefan and Handa, Ankur and Garg, Animesh},
+ author={Allshire, Arthur and Mittal, Mayank and Lodaya, Varun and Makoviychuk, Viktor and Makoviichuk, Denys and Widmaier, Felix and W{\"u}thrich, Manuel and Bauer, Stefan and Handa, Ankur and Garg, Animesh},
booktitle={2022 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
pages={11802--11809},
year={2022},
organization={IEEE}
}
+@article{mittal2025isaaclab,
+ title={Isaac Lab: A GPU-Accelerated Simulation Framework for Multi-Modal Robot Learning},
+ author={Mayank Mittal and Pascal Roth and James Tigue and Antoine Richard and Octi Zhang and Peter Du and Antonio Serrano-Muรฑoz and Xinjie Yao and Renรฉ Zurbrรผgg and Nikita Rudin and Lukasz Wawrzyniak and Milad Rakhsha and Alain Denzler and Eric Heiden and Ales Borovicka and Ossama Ahmed and Iretiayo Akinola and Abrar Anwar and Mark T. Carlson and Ji Yuan Feng and Animesh Garg and Renato Gasoto and Lionel Gulich and Yijie Guo and M. Gussert and Alex Hansen and Mihir Kulkarni and Chenran Li and Wei Liu and Viktor Makoviychuk and Grzegorz Malczyk and Hammad Mazhar and Masoud Moghani and Adithyavairavan Murali and Michael Noseworthy and Alexander Poddubny and Nathan Ratliff and Welf Rehberg and Clemens Schwarke and Ritvik Singh and James Latham Smith and Bingjie Tang and Ruchik Thaker and Matthew Trepte and Karl Van Wyk and Fangzhou Yu and Alex Millane and Vikram Ramasamy and Remo Steiner and Sangeeta Subramanian and Clemens Volk and CY Chen and Neel Jawale and Ashwin Varghese Kuruttukulam and Michael A. Lin and Ajay Mandlekar and Karsten Patzwaldt and John Welsh and Huihua Zhao and Fatima Anes and Jean-Francois Lafleche and Nicolas Moรซnne-Loccoz and Soowan Park and Rob Stepinski and Dirk Van Gelder and Chris Amevor and Jan Carius and Jumyung Chang and Anka He Chen and Pablo de Heras Ciechomski and Gilles Daviet and Mohammad Mohajerani and Julia von Muralt and Viktor Reutskyy and Michael Sauter and Simon Schirm and Eric L. Shi and Pierre Terdiman and Kenny Vilella and Tobias Widmer and Gordon Yeoman and Tiffany Chen and Sergey Grizan and Cathy Li and Lotus Li and Connor Smith and Rafael Wiltz and Kostas Alexis and Yan Chang and David Chu and Linxi "Jim" Fan and Farbod Farshidian and Ankur Handa and Spencer Huang and Marco Hutter and Yashraj Narang and Soha Pouya and Shiwei Sheng and Yuke Zhu and Miles Macklin and Adam Moravanszky and Philipp Reist and Yunrong Guo and David Hoeller and Gavriel State},
+ journal={arXiv preprint arXiv:2511.04831},
+ year={2025},
+ url={https://arxiv.org/abs/2511.04831}
+}
+
@article{mittal2023orbit,
author={Mittal, Mayank and Yu, Calvin and Yu, Qinxi and Liu, Jingzhou and Rudin, Nikita and Hoeller, David and Yuan, Jia Lin and Singh, Ritvik and Guo, Yunrong and Mazhar, Hammad and Mandlekar, Ajay and Babich, Buck and State, Gavriel and Hutter, Marco and Garg, Animesh},
journal={IEEE Robotics and Automation Letters},
@@ -154,3 +162,46 @@ @inproceedings{he2016deep
pages={770--778},
year={2016}
}
+
+@InProceedings{schwarke2023curiosity,
+ title = {Curiosity-Driven Learning of Joint Locomotion and Manipulation Tasks},
+ author = {Schwarke, Clemens and Klemm, Victor and Boon, Matthijs van der and Bjelonic, Marko and Hutter, Marco},
+ booktitle = {Proceedings of The 7th Conference on Robot Learning},
+ pages = {2594--2610},
+ year = {2023},
+ volume = {229},
+ series = {Proceedings of Machine Learning Research},
+ publisher = {PMLR},
+ url = {https://proceedings.mlr.press/v229/schwarke23a.html},
+}
+
+@InProceedings{mittal2024symmetry,
+ author={Mittal, Mayank and Rudin, Nikita and Klemm, Victor and Allshire, Arthur and Hutter, Marco},
+ booktitle={2024 IEEE International Conference on Robotics and Automation (ICRA)},
+ title={Symmetry Considerations for Learning Task Symmetric Robot Policies},
+ year={2024},
+ pages={7433-7439},
+ doi={10.1109/ICRA57147.2024.10611493}
+}
+
+@article{kulkarni2025aerialgym,
+ author={Kulkarni, Mihir and Rehberg, Welf and Alexis, Kostas},
+ journal={IEEE Robotics and Automation Letters},
+ title={Aerial Gym Simulator: A Framework for Highly Parallelized Simulation of Aerial Robots},
+ year={2025},
+ volume={10},
+ number={4},
+ pages={4093-4100},
+ doi={10.1109/LRA.2025.3548507}
+}
+
+@article{si2022taxim,
+ title={Taxim: An example-based simulation model for gelsight tactile sensors},
+ author={Si, Zilin and Yuan, Wenzhen},
+ journal={IEEE Robotics and Automation Letters},
+ volume={7},
+ number={2},
+ pages={2361--2368},
+ year={2022},
+ publisher={IEEE}
+}
diff --git a/docs/source/_static/setup/cloudxr_ar_panel.jpg b/docs/source/_static/setup/cloudxr_ar_panel.jpg
new file mode 100644
index 000000000000..e92df07f4e22
Binary files /dev/null and b/docs/source/_static/setup/cloudxr_ar_panel.jpg differ
diff --git a/docs/source/_static/setup/cloudxr_avp_connect_ui.jpg b/docs/source/_static/setup/cloudxr_avp_connect_ui.jpg
new file mode 100644
index 000000000000..facd34bf8565
Binary files /dev/null and b/docs/source/_static/setup/cloudxr_avp_connect_ui.jpg differ
diff --git a/docs/source/_static/setup/cloudxr_avp_ik_error.jpg b/docs/source/_static/setup/cloudxr_avp_ik_error.jpg
new file mode 100644
index 000000000000..3f0d430182e7
Binary files /dev/null and b/docs/source/_static/setup/cloudxr_avp_ik_error.jpg differ
diff --git a/docs/source/_static/setup/cloudxr_avp_teleop_ui.jpg b/docs/source/_static/setup/cloudxr_avp_teleop_ui.jpg
new file mode 100644
index 000000000000..a072ec42df46
Binary files /dev/null and b/docs/source/_static/setup/cloudxr_avp_teleop_ui.jpg differ
diff --git a/docs/source/_static/setup/cloudxr_viewport.jpg b/docs/source/_static/setup/cloudxr_viewport.jpg
new file mode 100644
index 000000000000..8c412940fbbc
Binary files /dev/null and b/docs/source/_static/setup/cloudxr_viewport.jpg differ
diff --git a/docs/source/_static/setup/teleop_avp_voice_control.jpg b/docs/source/_static/setup/teleop_avp_voice_control.jpg
deleted file mode 100644
index e12a1b93c4ce..000000000000
Binary files a/docs/source/_static/setup/teleop_avp_voice_control.jpg and /dev/null differ
diff --git a/docs/source/_static/setup/teleop_avp_voice_item_name.jpg b/docs/source/_static/setup/teleop_avp_voice_item_name.jpg
deleted file mode 100644
index d2af55033527..000000000000
Binary files a/docs/source/_static/setup/teleop_avp_voice_item_name.jpg and /dev/null differ
diff --git a/docs/source/_static/setup/walkthrough_1_1_result.jpg b/docs/source/_static/setup/walkthrough_1_1_result.jpg
new file mode 100644
index 000000000000..0aa64f48d831
Binary files /dev/null and b/docs/source/_static/setup/walkthrough_1_1_result.jpg differ
diff --git a/docs/source/_static/setup/walkthrough_1_2_arrows.jpg b/docs/source/_static/setup/walkthrough_1_2_arrows.jpg
new file mode 100644
index 000000000000..81b98ac7b523
Binary files /dev/null and b/docs/source/_static/setup/walkthrough_1_2_arrows.jpg differ
diff --git a/docs/source/_static/setup/walkthrough_project_setup.svg b/docs/source/_static/setup/walkthrough_project_setup.svg
new file mode 100644
index 000000000000..f5accffbc680
--- /dev/null
+++ b/docs/source/_static/setup/walkthrough_project_setup.svg
@@ -0,0 +1 @@
+
diff --git a/docs/source/_static/setup/walkthrough_sim_stage_scene.svg b/docs/source/_static/setup/walkthrough_sim_stage_scene.svg
new file mode 100644
index 000000000000..17cd53aaf371
--- /dev/null
+++ b/docs/source/_static/setup/walkthrough_sim_stage_scene.svg
@@ -0,0 +1 @@
+
diff --git a/docs/source/_static/setup/walkthrough_stage_context.svg b/docs/source/_static/setup/walkthrough_stage_context.svg
new file mode 100644
index 000000000000..b98ccb2cedef
--- /dev/null
+++ b/docs/source/_static/setup/walkthrough_stage_context.svg
@@ -0,0 +1 @@
+
diff --git a/docs/source/_static/setup/walkthrough_training_vectors.svg b/docs/source/_static/setup/walkthrough_training_vectors.svg
new file mode 100644
index 000000000000..a285d2cb90f8
--- /dev/null
+++ b/docs/source/_static/setup/walkthrough_training_vectors.svg
@@ -0,0 +1 @@
+
diff --git a/docs/source/_static/tasks/automate/00004.jpg b/docs/source/_static/tasks/automate/00004.jpg
new file mode 100644
index 000000000000..bf2b3bedd874
Binary files /dev/null and b/docs/source/_static/tasks/automate/00004.jpg differ
diff --git a/docs/source/_static/tasks/automate/01053_disassembly.jpg b/docs/source/_static/tasks/automate/01053_disassembly.jpg
new file mode 100644
index 000000000000..a4ff086578ca
Binary files /dev/null and b/docs/source/_static/tasks/automate/01053_disassembly.jpg differ
diff --git a/docs/source/_static/tasks/drone_arl/arl_robot_1_track_position_state_based.jpg b/docs/source/_static/tasks/drone_arl/arl_robot_1_track_position_state_based.jpg
new file mode 100644
index 000000000000..61c8ecb2d5e5
Binary files /dev/null and b/docs/source/_static/tasks/drone_arl/arl_robot_1_track_position_state_based.jpg differ
diff --git a/docs/source/_static/tasks/locomotion/agility_digit_flat.jpg b/docs/source/_static/tasks/locomotion/agility_digit_flat.jpg
new file mode 100644
index 000000000000..f98c15e014ae
Binary files /dev/null and b/docs/source/_static/tasks/locomotion/agility_digit_flat.jpg differ
diff --git a/docs/source/_static/tasks/locomotion/agility_digit_loco_manip.jpg b/docs/source/_static/tasks/locomotion/agility_digit_loco_manip.jpg
new file mode 100644
index 000000000000..5d6abe598657
Binary files /dev/null and b/docs/source/_static/tasks/locomotion/agility_digit_loco_manip.jpg differ
diff --git a/docs/source/_static/tasks/locomotion/agility_digit_rough.jpg b/docs/source/_static/tasks/locomotion/agility_digit_rough.jpg
new file mode 100644
index 000000000000..85b9d8fe24ba
Binary files /dev/null and b/docs/source/_static/tasks/locomotion/agility_digit_rough.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/agibot_place_mug.jpg b/docs/source/_static/tasks/manipulation/agibot_place_mug.jpg
new file mode 100644
index 000000000000..73a421714c23
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/agibot_place_mug.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/agibot_place_toy.jpg b/docs/source/_static/tasks/manipulation/agibot_place_toy.jpg
new file mode 100644
index 000000000000..15f41ba7fb42
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/agibot_place_toy.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/g1_pick_place.jpg b/docs/source/_static/tasks/manipulation/g1_pick_place.jpg
new file mode 100644
index 000000000000..86d2180c0580
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/g1_pick_place.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/g1_pick_place_fixed_base.jpg b/docs/source/_static/tasks/manipulation/g1_pick_place_fixed_base.jpg
new file mode 100644
index 000000000000..ce9d73c8dcdf
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/g1_pick_place_fixed_base.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/g1_pick_place_locomanipulation.jpg b/docs/source/_static/tasks/manipulation/g1_pick_place_locomanipulation.jpg
new file mode 100644
index 000000000000..45d712c2c740
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/g1_pick_place_locomanipulation.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/galbot_stack_cube.jpg b/docs/source/_static/tasks/manipulation/galbot_stack_cube.jpg
new file mode 100644
index 000000000000..72b7321a5d6e
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/galbot_stack_cube.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/gr-1_pick_place.jpg b/docs/source/_static/tasks/manipulation/gr-1_pick_place.jpg
new file mode 100644
index 000000000000..6cbcea112238
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/gr-1_pick_place.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/gr-1_pick_place_annotation.jpg b/docs/source/_static/tasks/manipulation/gr-1_pick_place_annotation.jpg
new file mode 100644
index 000000000000..04dd386ca9ff
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/gr-1_pick_place_annotation.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/gr-1_pick_place_waist.jpg b/docs/source/_static/tasks/manipulation/gr-1_pick_place_waist.jpg
new file mode 100644
index 000000000000..1f99cb727419
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/gr-1_pick_place_waist.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/kuka_allegro_lift.jpg b/docs/source/_static/tasks/manipulation/kuka_allegro_lift.jpg
new file mode 100644
index 000000000000..9d19b0e42366
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/kuka_allegro_lift.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/kuka_allegro_reorient.jpg b/docs/source/_static/tasks/manipulation/kuka_allegro_reorient.jpg
new file mode 100644
index 000000000000..384e7632e44b
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/kuka_allegro_reorient.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/openarm_bi_reach.jpg b/docs/source/_static/tasks/manipulation/openarm_bi_reach.jpg
new file mode 100644
index 000000000000..12e6620027d6
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/openarm_bi_reach.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/openarm_uni_lift.jpg b/docs/source/_static/tasks/manipulation/openarm_uni_lift.jpg
new file mode 100644
index 000000000000..b7bb7c3cecf9
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/openarm_uni_lift.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/openarm_uni_open_drawer.jpg b/docs/source/_static/tasks/manipulation/openarm_uni_open_drawer.jpg
new file mode 100644
index 000000000000..0bec48a40194
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/openarm_uni_open_drawer.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/openarm_uni_reach.jpg b/docs/source/_static/tasks/manipulation/openarm_uni_reach.jpg
new file mode 100644
index 000000000000..46128f7607be
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/openarm_uni_reach.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/ur10_stack_surface_gripper.jpg b/docs/source/_static/tasks/manipulation/ur10_stack_surface_gripper.jpg
new file mode 100644
index 000000000000..c92b4a32f8c9
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/ur10_stack_surface_gripper.jpg differ
diff --git a/docs/source/_static/tasks/manipulation/ur10e_reach.jpg b/docs/source/_static/tasks/manipulation/ur10e_reach.jpg
new file mode 100644
index 000000000000..740b33fde668
Binary files /dev/null and b/docs/source/_static/tasks/manipulation/ur10e_reach.jpg differ
diff --git a/docs/source/_static/teleop/hand_asset.jpg b/docs/source/_static/teleop/hand_asset.jpg
new file mode 100755
index 000000000000..240b784673bd
Binary files /dev/null and b/docs/source/_static/teleop/hand_asset.jpg differ
diff --git a/docs/source/_static/teleop/teleop_diagram.jpg b/docs/source/_static/teleop/teleop_diagram.jpg
new file mode 100755
index 000000000000..48d6c29e7d7d
Binary files /dev/null and b/docs/source/_static/teleop/teleop_diagram.jpg differ
diff --git a/docs/source/_static/tutorials/tutorial_add_new_robot_result.jpg b/docs/source/_static/tutorials/tutorial_add_new_robot_result.jpg
new file mode 100644
index 000000000000..9713aa0eba0e
Binary files /dev/null and b/docs/source/_static/tutorials/tutorial_add_new_robot_result.jpg differ
diff --git a/docs/source/_static/tutorials/tutorial_run_surface_gripper.jpg b/docs/source/_static/tutorials/tutorial_run_surface_gripper.jpg
new file mode 100644
index 000000000000..d86ab4ed4c4b
Binary files /dev/null and b/docs/source/_static/tutorials/tutorial_run_surface_gripper.jpg differ
diff --git a/docs/source/_static/visualizers/newton_viz.jpg b/docs/source/_static/visualizers/newton_viz.jpg
new file mode 100644
index 000000000000..9a37ad09fc37
Binary files /dev/null and b/docs/source/_static/visualizers/newton_viz.jpg differ
diff --git a/docs/source/_static/visualizers/ov_viz.jpg b/docs/source/_static/visualizers/ov_viz.jpg
new file mode 100644
index 000000000000..e172ae42ee9f
Binary files /dev/null and b/docs/source/_static/visualizers/ov_viz.jpg differ
diff --git a/docs/source/_static/visualizers/rerun_viz.jpg b/docs/source/_static/visualizers/rerun_viz.jpg
new file mode 100644
index 000000000000..2263cfbccfed
Binary files /dev/null and b/docs/source/_static/visualizers/rerun_viz.jpg differ
diff --git a/docs/source/api/index.rst b/docs/source/api/index.rst
index aef91e80df50..92eec5ed6f3f 100644
--- a/docs/source/api/index.rst
+++ b/docs/source/api/index.rst
@@ -36,6 +36,8 @@ The following modules are available in the ``isaaclab`` extension:
lab/isaaclab.sim.converters
lab/isaaclab.sim.schemas
lab/isaaclab.sim.spawners
+ lab/isaaclab.sim.views
+ lab/isaaclab.sim.utils
isaaclab_rl extension
@@ -64,6 +66,20 @@ The following modules are available in the ``isaaclab_mimic`` extension:
datagen
envs
+isaaclab_contrib extension
+-----------------------------
+
+The following modules are available in the ``isaaclab_contrib`` extension:
+
+.. currentmodule:: isaaclab_contrib
+
+.. autosummary::
+ :toctree: lab_contrib
+
+ actuators
+ assets
+ mdp
+ sensors
isaaclab_tasks extension
------------------------
diff --git a/docs/source/api/lab/isaaclab.app.rst b/docs/source/api/lab/isaaclab.app.rst
index 46eff80ab951..b170fa8fa8ff 100644
--- a/docs/source/api/lab/isaaclab.app.rst
+++ b/docs/source/api/lab/isaaclab.app.rst
@@ -23,10 +23,9 @@ The following details the behavior of the class based on the environment variabl
* **Livestreaming**: If the environment variable ``LIVESTREAM={1,2}`` , then `livestream`_ is enabled. Any
of the livestream modes being true forces the app to run in headless mode.
- * ``LIVESTREAM=1`` [DEPRECATED] enables streaming via the Isaac `Native Livestream`_ extension. This allows users to
- connect through the Omniverse Streaming Client. This method is deprecated from Isaac Sim 4.5. Please use the WebRTC
- livestreaming instead.
- * ``LIVESTREAM=2`` enables streaming via the `WebRTC Livestream`_ extension. This allows users to
+ * ``LIVESTREAM=1`` enables streaming via the `WebRTC Livestream`_ extension over **public networks**. This allows users to
+ connect through the WebRTC Client using the WebRTC protocol.
+ * ``LIVESTREAM=2`` enables streaming via the `WebRTC Livestream`_ extension over **private and local networks**. This allows users to
connect through the WebRTC Client using the WebRTC protocol.
.. note::
@@ -55,16 +54,16 @@ To set the environment variables, one can use the following command in the termi
.. code:: bash
- export REMOTE_DEPLOYMENT=3
+ export LIVESTREAM=2
export ENABLE_CAMERAS=1
# run the python script
- ./isaaclab.sh -p scripts/demo/play_quadrupeds.py
+ ./isaaclab.sh -p scripts/demos/quadrupeds.py
Alternatively, one can set the environment variables to the python script directly:
.. code:: bash
- REMOTE_DEPLOYMENT=3 ENABLE_CAMERAS=1 ./isaaclab.sh -p scripts/demo/play_quadrupeds.py
+ LIVESTREAM=2 ENABLE_CAMERAS=1 ./isaaclab.sh -p scripts/demos/quadrupeds.py
Overriding the environment variables
@@ -113,5 +112,4 @@ Simulation App Launcher
.. _livestream: https://docs.omniverse.nvidia.com/app_isaacsim/app_isaacsim/manual_livestream_clients.html
-.. _`Native Livestream`: https://docs.isaacsim.omniverse.nvidia.com/latest/installation/manual_livestream_clients.html#omniverse-streaming-client-deprecated
.. _`WebRTC Livestream`: https://docs.isaacsim.omniverse.nvidia.com/latest/installation/manual_livestream_clients.html#isaac-sim-short-webrtc-streaming-client
diff --git a/docs/source/api/lab/isaaclab.assets.rst b/docs/source/api/lab/isaaclab.assets.rst
index 338d729ddb6f..c91066966e80 100644
--- a/docs/source/api/lab/isaaclab.assets.rst
+++ b/docs/source/api/lab/isaaclab.assets.rst
@@ -32,7 +32,7 @@ Asset Base
.. autoclass:: AssetBaseCfg
:members:
- :exclude-members: __init__, class_type
+ :exclude-members: __init__, class_type, InitialStateCfg
Rigid Object
------------
diff --git a/docs/source/api/lab/isaaclab.controllers.rst b/docs/source/api/lab/isaaclab.controllers.rst
index 07adbfcc0cda..1ef31448ab86 100644
--- a/docs/source/api/lab/isaaclab.controllers.rst
+++ b/docs/source/api/lab/isaaclab.controllers.rst
@@ -11,6 +11,9 @@
DifferentialIKControllerCfg
OperationalSpaceController
OperationalSpaceControllerCfg
+ pink_ik.PinkIKController
+ pink_ik.PinkIKControllerCfg
+ pink_ik.NullSpacePostureTask
Differential Inverse Kinematics
-------------------------------
@@ -39,3 +42,25 @@ Operational Space controllers
:inherited-members:
:show-inheritance:
:exclude-members: __init__, class_type
+
+
+Pink IK Controller
+------------------
+
+.. automodule:: isaaclab.controllers.pink_ik
+
+.. autoclass:: PinkIKController
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+.. autoclass:: PinkIKControllerCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type
+
+Available Pink IK Tasks
+^^^^^^^^^^^^^^^^^^^^^^^
+
+.. autoclass:: NullSpacePostureTask
diff --git a/docs/source/api/lab/isaaclab.devices.rst b/docs/source/api/lab/isaaclab.devices.rst
index 7e02c76e5786..5f04c4733cf6 100644
--- a/docs/source/api/lab/isaaclab.devices.rst
+++ b/docs/source/api/lab/isaaclab.devices.rst
@@ -8,12 +8,26 @@
.. autosummary::
DeviceBase
+ RetargeterBase
Se2Gamepad
Se3Gamepad
Se2Keyboard
Se3Keyboard
+ Se2SpaceMouse
Se3SpaceMouse
- Se3SpaceMouse
+ HaplyDevice
+ OpenXRDevice
+ ManusVive
+ isaaclab.devices.openxr.retargeters.GripperRetargeter
+ isaaclab.devices.openxr.retargeters.Se3AbsRetargeter
+ isaaclab.devices.openxr.retargeters.Se3RelRetargeter
+ isaaclab.devices.openxr.retargeters.GR1T2Retargeter
+
+ .. rubric:: Modules
+
+ .. autosummary::
+
+ isaaclab.devices.openxr.retargeters
Device Base
-----------
@@ -21,6 +35,12 @@ Device Base
.. autoclass:: DeviceBase
:members:
+Retargeter Base
+---------------
+
+.. autoclass:: RetargeterBase
+ :members:
+
Game Pad
--------
@@ -28,11 +48,13 @@ Game Pad
:members:
:inherited-members:
:show-inheritance:
+ :noindex:
.. autoclass:: Se3Gamepad
:members:
:inherited-members:
:show-inheritance:
+ :noindex:
Keyboard
--------
@@ -41,11 +63,13 @@ Keyboard
:members:
:inherited-members:
:show-inheritance:
+ :noindex:
.. autoclass:: Se3Keyboard
:members:
:inherited-members:
:show-inheritance:
+ :noindex:
Space Mouse
-----------
@@ -54,8 +78,64 @@ Space Mouse
:members:
:inherited-members:
:show-inheritance:
+ :noindex:
.. autoclass:: Se3SpaceMouse
:members:
:inherited-members:
:show-inheritance:
+ :noindex:
+
+Haply
+-----
+
+.. autoclass:: HaplyDevice
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :noindex:
+
+OpenXR
+------
+
+.. autoclass:: OpenXRDevice
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :noindex:
+
+Manus + Vive
+------------
+
+.. autoclass:: ManusVive
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :noindex:
+
+Retargeters
+-----------
+
+.. autoclass:: isaaclab.devices.openxr.retargeters.GripperRetargeter
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :noindex:
+
+.. autoclass:: isaaclab.devices.openxr.retargeters.Se3AbsRetargeter
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :noindex:
+
+.. autoclass:: isaaclab.devices.openxr.retargeters.Se3RelRetargeter
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :noindex:
+
+.. autoclass:: isaaclab.devices.openxr.retargeters.GR1T2Retargeter
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :noindex:
diff --git a/docs/source/api/lab/isaaclab.envs.rst b/docs/source/api/lab/isaaclab.envs.rst
index e003fa4f175c..51b6e1866888 100644
--- a/docs/source/api/lab/isaaclab.envs.rst
+++ b/docs/source/api/lab/isaaclab.envs.rst
@@ -24,6 +24,8 @@
DirectMARLEnvCfg
ManagerBasedRLMimicEnv
MimicEnvCfg
+ SubTaskConfig
+ SubTaskConstraintConfig
ViewerCfg
Manager Based Environment
@@ -92,6 +94,18 @@ Mimic Environment
:show-inheritance:
:exclude-members: __init__, class_type
+.. autoclass:: SubTaskConfig
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type
+
+.. autoclass:: SubTaskConstraintConfig
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type
+
Common
------
diff --git a/docs/source/api/lab/isaaclab.sensors.rst b/docs/source/api/lab/isaaclab.sensors.rst
index 17ce71e38278..52dfd9bba5d1 100644
--- a/docs/source/api/lab/isaaclab.sensors.rst
+++ b/docs/source/api/lab/isaaclab.sensors.rst
@@ -31,6 +31,11 @@
RayCasterCfg
RayCasterCamera
RayCasterCameraCfg
+ MultiMeshRayCaster
+ MultiMeshRayCasterData
+ MultiMeshRayCasterCfg
+ MultiMeshRayCasterCamera
+ MultiMeshRayCasterCameraCfg
Imu
ImuCfg
@@ -61,7 +66,7 @@ USD Camera
:members:
:inherited-members:
:show-inheritance:
- :exclude-members: __init__, class_type
+ :exclude-members: __init__, class_type, OffsetCfg
Tile-Rendered USD Camera
------------------------
@@ -151,7 +156,40 @@ Ray-Cast Camera
:members:
:inherited-members:
:show-inheritance:
- :exclude-members: __init__, class_type
+ :exclude-members: __init__, class_type, OffsetCfg
+
+Multi-Mesh Ray-Cast Sensor
+--------------------------
+
+.. autoclass:: MultiMeshRayCaster
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+.. autoclass:: MultiMeshRayCasterData
+ :members:
+ :inherited-members:
+ :exclude-members: __init__
+
+.. autoclass:: MultiMeshRayCasterCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type, OffsetCfg
+
+Multi-Mesh Ray-Cast Camera
+--------------------------
+
+.. autoclass:: MultiMeshRayCasterCamera
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+.. autoclass:: MultiMeshRayCasterCameraCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type, OffsetCfg, RaycastTargetCfg
Inertia Measurement Unit
------------------------
diff --git a/docs/source/api/lab/isaaclab.sim.converters.rst b/docs/source/api/lab/isaaclab.sim.converters.rst
index da8dd49c427e..6fd5155c4e53 100644
--- a/docs/source/api/lab/isaaclab.sim.converters.rst
+++ b/docs/source/api/lab/isaaclab.sim.converters.rst
@@ -13,6 +13,8 @@
MeshConverterCfg
UrdfConverter
UrdfConverterCfg
+ MjcfConverter
+ MjcfConverterCfg
Asset Converter Base
--------------------
@@ -52,3 +54,17 @@ URDF Converter
:inherited-members:
:show-inheritance:
:exclude-members: __init__
+
+MJCF Converter
+--------------
+
+.. autoclass:: MjcfConverter
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+.. autoclass:: MjcfConverterCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__
diff --git a/docs/source/api/lab/isaaclab.sim.rst b/docs/source/api/lab/isaaclab.sim.rst
index 86aff36c175a..b6b5c372bc17 100644
--- a/docs/source/api/lab/isaaclab.sim.rst
+++ b/docs/source/api/lab/isaaclab.sim.rst
@@ -56,10 +56,3 @@ Simulation Context Builder
--------------------------
.. automethod:: simulation_context.build_simulation_context
-
-Utilities
----------
-
-.. automodule:: isaaclab.sim.utils
- :members:
- :show-inheritance:
diff --git a/docs/source/api/lab/isaaclab.sim.utils.rst b/docs/source/api/lab/isaaclab.sim.utils.rst
new file mode 100644
index 000000000000..f27e574efb9a
--- /dev/null
+++ b/docs/source/api/lab/isaaclab.sim.utils.rst
@@ -0,0 +1,57 @@
+๏ปฟisaaclab.sim.utils
+==================
+
+.. automodule:: isaaclab.sim.utils
+
+ .. rubric:: Submodules
+
+ .. autosummary::
+
+ stage
+ queries
+ prims
+ transforms
+ semantics
+ legacy
+
+Stage
+-----
+
+.. automodule:: isaaclab.sim.utils.stage
+ :members:
+ :show-inheritance:
+
+Queries
+-------
+
+.. automodule:: isaaclab.sim.utils.queries
+ :members:
+ :show-inheritance:
+
+Prims
+-----
+
+.. automodule:: isaaclab.sim.utils.prims
+ :members:
+ :show-inheritance:
+
+Transforms
+----------
+
+.. automodule:: isaaclab.sim.utils.transforms
+ :members:
+ :show-inheritance:
+
+Semantics
+---------
+
+.. automodule:: isaaclab.sim.utils.semantics
+ :members:
+ :show-inheritance:
+
+Legacy
+------
+
+.. automodule:: isaaclab.sim.utils.legacy
+ :members:
+ :show-inheritance:
diff --git a/docs/source/api/lab/isaaclab.sim.views.rst b/docs/source/api/lab/isaaclab.sim.views.rst
new file mode 100644
index 000000000000..3a5f9bdecfe9
--- /dev/null
+++ b/docs/source/api/lab/isaaclab.sim.views.rst
@@ -0,0 +1,17 @@
+๏ปฟisaaclab.sim.views
+==================
+
+.. automodule:: isaaclab.sim.views
+
+ .. rubric:: Classes
+
+ .. autosummary::
+
+ XformPrimView
+
+XForm Prim View
+---------------
+
+.. autoclass:: XformPrimView
+ :members:
+ :show-inheritance:
diff --git a/docs/source/api/lab/isaaclab.utils.rst b/docs/source/api/lab/isaaclab.utils.rst
index 9ef89739f79b..5b352152e0b5 100644
--- a/docs/source/api/lab/isaaclab.utils.rst
+++ b/docs/source/api/lab/isaaclab.utils.rst
@@ -11,14 +11,20 @@
array
assets
buffers
+ datasets
dict
interpolation
+ logger
math
+ mesh
modifiers
noise
+ seed
+ sensors
string
timer
types
+ version
warp
.. Rubric:: Functions
@@ -65,6 +71,14 @@ Buffer operations
:inherited-members:
:show-inheritance:
+Datasets operations
+~~~~~~~~~~~~~~~~~~~
+
+.. automodule:: isaaclab.utils.datasets
+ :members:
+ :show-inheritance:
+ :exclude-members: __init__, func
+
Dictionary operations
~~~~~~~~~~~~~~~~~~~~~
@@ -81,6 +95,13 @@ Interpolation operations
:inherited-members:
:show-inheritance:
+Logger operations
+~~~~~~~~~~~~~~~~~
+
+.. automodule:: isaaclab.utils.logger
+ :members:
+ :show-inheritance:
+
Math operations
~~~~~~~~~~~~~~~
@@ -89,6 +110,14 @@ Math operations
:inherited-members:
:show-inheritance:
+Mesh operations
+~~~~~~~~~~~~~~~
+
+.. automodule:: isaaclab.utils.mesh
+ :members:
+ :imported-members:
+ :show-inheritance:
+
Modifier operations
~~~~~~~~~~~~~~~~~~~
@@ -110,6 +139,20 @@ Noise operations
:show-inheritance:
:exclude-members: __init__, func
+Seed operations
+~~~~~~~~~~~~~~~
+
+.. automodule:: isaaclab.utils.seed
+ :members:
+ :show-inheritance:
+
+Sensor operations
+~~~~~~~~~~~~~~~~~
+
+.. automodule:: isaaclab.utils.sensors
+ :members:
+ :show-inheritance:
+
String operations
~~~~~~~~~~~~~~~~~
@@ -131,6 +174,13 @@ Type operations
:members:
:show-inheritance:
+Version operations
+~~~~~~~~~~~~~~~~~~
+
+.. automodule:: isaaclab.utils.version
+ :members:
+ :show-inheritance:
+
Warp operations
~~~~~~~~~~~~~~~
diff --git a/docs/source/api/lab_contrib/isaaclab_contrib.actuators.rst b/docs/source/api/lab_contrib/isaaclab_contrib.actuators.rst
new file mode 100644
index 000000000000..1171c31e5eaf
--- /dev/null
+++ b/docs/source/api/lab_contrib/isaaclab_contrib.actuators.rst
@@ -0,0 +1,25 @@
+isaaclab_contrib.actuators
+=============================
+
+.. automodule:: isaaclab_contrib.actuators
+
+ .. rubric:: Classes
+
+ .. autosummary::
+
+ Thruster
+ ThrusterCfg
+
+Thruster Actuator
+-----------------
+
+.. autoclass:: Thruster
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+.. autoclass:: ThrusterCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type
diff --git a/docs/source/api/lab_contrib/isaaclab_contrib.assets.rst b/docs/source/api/lab_contrib/isaaclab_contrib.assets.rst
new file mode 100644
index 000000000000..24375f918c8f
--- /dev/null
+++ b/docs/source/api/lab_contrib/isaaclab_contrib.assets.rst
@@ -0,0 +1,31 @@
+isaaclab_contrib.assets
+==========================
+
+.. automodule:: isaaclab_contrib.assets
+
+ .. rubric:: Classes
+
+ .. autosummary::
+
+ Multirotor
+ MultirotorCfg
+ MultirotorData
+
+Multirotor Asset
+----------------
+
+.. autoclass:: Multirotor
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+.. autoclass:: MultirotorCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type
+
+.. autoclass:: MultirotorData
+ :members:
+ :inherited-members:
+ :show-inheritance:
diff --git a/docs/source/api/lab_contrib/isaaclab_contrib.mdp.rst b/docs/source/api/lab_contrib/isaaclab_contrib.mdp.rst
new file mode 100644
index 000000000000..32421ef9b1f8
--- /dev/null
+++ b/docs/source/api/lab_contrib/isaaclab_contrib.mdp.rst
@@ -0,0 +1,33 @@
+isaaclab_contrib.mdp
+=======================
+
+.. automodule:: isaaclab_contrib.mdp
+
+Actions
+-------
+
+.. automodule:: isaaclab_contrib.mdp.actions
+
+ .. rubric:: Classes
+
+ .. autosummary::
+
+ ThrustActionCfg
+ ThrustAction
+
+Thrust Action Configuration
+---------------------------
+
+.. autoclass:: isaaclab_contrib.mdp.actions.thrust_actions_cfg.ThrustActionCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type
+
+Thrust Action Implementation
+----------------------------
+
+.. autoclass:: isaaclab_contrib.mdp.actions.thrust_actions.ThrustAction
+ :members:
+ :inherited-members:
+ :show-inheritance:
diff --git a/docs/source/api/lab_contrib/isaaclab_contrib.sensors.rst b/docs/source/api/lab_contrib/isaaclab_contrib.sensors.rst
new file mode 100644
index 000000000000..efcdeffe239b
--- /dev/null
+++ b/docs/source/api/lab_contrib/isaaclab_contrib.sensors.rst
@@ -0,0 +1,39 @@
+isaaclab_contrib.sensors
+========================
+
+.. automodule:: isaaclab_contrib.sensors
+
+ .. rubric:: Classes
+
+ .. autosummary::
+
+ VisuoTactileSensor
+ VisuoTactileSensorCfg
+ VisuoTactileSensorData
+ GelSightRenderCfg
+
+
+Visuo-Tactile Sensor
+--------------------
+
+.. autoclass:: VisuoTactileSensor
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+.. autoclass:: VisuoTactileSensorData
+ :members:
+ :inherited-members:
+ :exclude-members: __init__
+
+.. autoclass:: VisuoTactileSensorCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__, class_type
+
+.. autoclass:: GelSightRenderCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+ :exclude-members: __init__
diff --git a/docs/source/api/lab_mimic/isaaclab_mimic.envs.rst b/docs/source/api/lab_mimic/isaaclab_mimic.envs.rst
index 7b4146f5b608..ea8dc82d1615 100644
--- a/docs/source/api/lab_mimic/isaaclab_mimic.envs.rst
+++ b/docs/source/api/lab_mimic/isaaclab_mimic.envs.rst
@@ -7,20 +7,138 @@
.. autosummary::
- FrankaCubeStackIKRelMimicEnv
- FrankaCubeStackIKRelMimicEnvCfg
+ isaaclab_mimic.envs.franka_stack_ik_rel_mimic_env.FrankaCubeStackIKRelMimicEnv
+ isaaclab_mimic.envs.franka_stack_ik_rel_mimic_env_cfg.FrankaCubeStackIKRelMimicEnvCfg
+ isaaclab_mimic.envs.franka_stack_ik_abs_mimic_env.FrankaCubeStackIKAbsMimicEnv
+ isaaclab_mimic.envs.franka_stack_ik_abs_mimic_env_cfg.FrankaCubeStackIKAbsMimicEnvCfg
+ isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env.RmpFlowGalbotCubeStackRelMimicEnv
+ isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env_cfg.RmpFlowGalbotLeftArmGripperCubeStackRelMimicEnvCfg
+ isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env_cfg.RmpFlowGalbotRightArmSuctionCubeStackRelMimicEnvCfg
+ isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env.RmpFlowGalbotCubeStackAbsMimicEnv
+ isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env_cfg.RmpFlowGalbotLeftArmGripperCubeStackAbsMimicEnvCfg
+ isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env_cfg.RmpFlowGalbotRightArmSuctionCubeStackAbsMimicEnvCfg
+ isaaclab_mimic.envs.pick_place_mimic_env.PickPlaceRelMimicEnv
+ isaaclab_mimic.envs.pick_place_mimic_env.PickPlaceAbsMimicEnv
+ isaaclab_mimic.envs.agibot_place_upright_mug_mimic_env_cfg.RmpFlowAgibotPlaceUprightMugMimicEnvCfg
+ isaaclab_mimic.envs.agibot_place_toy2box_mimic_env_cfg.RmpFlowAgibotPlaceToy2BoxMimicEnvCfg
+
+Franka Environments
+-------------------
Franka Cube Stack IK Rel Mimic Env
-----------------------------------
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. autoclass:: FrankaCubeStackIKRelMimicEnv
+.. autoclass:: isaaclab_mimic.envs.franka_stack_ik_rel_mimic_env.FrankaCubeStackIKRelMimicEnv
:members:
:inherited-members:
+ :show-inheritance:
Franka Cube Stack IK Rel Mimic Env Cfg
---------------------------------------
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.franka_stack_ik_rel_mimic_env_cfg.FrankaCubeStackIKRelMimicEnvCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Franka Cube Stack IK Abs Mimic Env
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.franka_stack_ik_abs_mimic_env.FrankaCubeStackIKAbsMimicEnv
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Franka Cube Stack IK Abs Mimic Env Cfg
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.franka_stack_ik_abs_mimic_env_cfg.FrankaCubeStackIKAbsMimicEnvCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Galbot Environments
+-------------------
+
+Galbot Cube Stack Rel Mimic Env (RmpFlow)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env.RmpFlowGalbotCubeStackRelMimicEnv
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Galbot Left Arm Gripper Cube Stack Rel Mimic Env Cfg
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env_cfg.RmpFlowGalbotLeftArmGripperCubeStackRelMimicEnvCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Galbot Right Arm Suction Cube Stack Rel Mimic Env Cfg
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.galbot_stack_rmp_rel_mimic_env_cfg.RmpFlowGalbotRightArmSuctionCubeStackRelMimicEnvCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Galbot Cube Stack Abs Mimic Env (RmpFlow)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env.RmpFlowGalbotCubeStackAbsMimicEnv
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Galbot Left Arm Gripper Cube Stack Abs Mimic Env Cfg
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env_cfg.RmpFlowGalbotLeftArmGripperCubeStackAbsMimicEnvCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Galbot Right Arm Suction Cube Stack Abs Mimic Env Cfg
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.galbot_stack_rmp_abs_mimic_env_cfg.RmpFlowGalbotRightArmSuctionCubeStackAbsMimicEnvCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Agibot Environments
+-------------------
+
+Pick Place Rel Mimic Env
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.pick_place_mimic_env.PickPlaceRelMimicEnv
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Pick Place Abs Mimic Env
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.pick_place_mimic_env.PickPlaceAbsMimicEnv
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Agibot Place Upright Mug Mimic Env Cfg
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: isaaclab_mimic.envs.agibot_place_upright_mug_mimic_env_cfg.RmpFlowAgibotPlaceUprightMugMimicEnvCfg
+ :members:
+ :inherited-members:
+ :show-inheritance:
+
+Agibot Place Toy2Box Mimic Env Cfg
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-.. autoclass:: FrankaCubeStackIKRelMimicEnvCfg
+.. autoclass:: isaaclab_mimic.envs.agibot_place_toy2box_mimic_env_cfg.RmpFlowAgibotPlaceToy2BoxMimicEnvCfg
:members:
:inherited-members:
:show-inheritance:
diff --git a/docs/source/api/lab_rl/isaaclab_rl.rst b/docs/source/api/lab_rl/isaaclab_rl.rst
index 77a4ca1bd96e..32b4b4c62468 100644
--- a/docs/source/api/lab_rl/isaaclab_rl.rst
+++ b/docs/source/api/lab_rl/isaaclab_rl.rst
@@ -1,4 +1,6 @@
-๏ปฟisaaclab_rl
+๏ปฟ.. _api-isaaclab-rl:
+
+isaaclab_rl
===========
.. automodule:: isaaclab_rl
diff --git a/docs/source/api/lab_tasks/isaaclab_tasks.utils.rst b/docs/source/api/lab_tasks/isaaclab_tasks.utils.rst
index b653c14e48ef..3ffd8f075bc5 100644
--- a/docs/source/api/lab_tasks/isaaclab_tasks.utils.rst
+++ b/docs/source/api/lab_tasks/isaaclab_tasks.utils.rst
@@ -4,5 +4,3 @@
.. automodule:: isaaclab_tasks.utils
:members:
:imported-members:
-
- .. rubric:: Submodules
diff --git a/docs/source/deployment/cloudxr_teleoperation_cluster.rst b/docs/source/deployment/cloudxr_teleoperation_cluster.rst
new file mode 100644
index 000000000000..2b374bcbe548
--- /dev/null
+++ b/docs/source/deployment/cloudxr_teleoperation_cluster.rst
@@ -0,0 +1,207 @@
+.. _cloudxr-teleoperation-cluster:
+
+Deploying CloudXR Teleoperation on Kubernetes
+=============================================
+
+.. currentmodule:: isaaclab
+
+This section explains how to deploy CloudXR Teleoperation for Isaac Lab on a Kubernetes (K8s) cluster.
+
+.. _k8s-system-requirements:
+
+System Requirements
+-------------------
+
+* **Minimum requirement**: Kubernetes cluster with a node that has at least 1 NVIDIA RTX PRO 6000 / L40 GPU or equivalent
+* **Recommended requirement**: Kubernetes cluster with a node that has at least 2 RTX PRO 6000 / L40 GPUs or equivalent
+
+.. note::
+ If you are using DGX Spark, check `DGX Spark Limitations `_ for compatibility.
+
+Software Dependencies
+---------------------
+
+* ``kubectl`` on your host computer
+
+ * If you use MicroK8s, you already have ``microk8s kubectl``
+ * Otherwise follow the `official kubectl installation guide `_
+
+* ``helm`` on your host computer
+
+ * If you use MicroK8s, you already have ``microk8s helm``
+ * Otherwise follow the `official Helm installation guide `_
+
+* Access to NGC public registry from your Kubernetes cluster, in particular these container images:
+
+ * ``https://catalog.ngc.nvidia.com/orgs/nvidia/containers/isaac-lab``
+ * ``https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cloudxr-runtime``
+
+* NVIDIA GPU Operator or equivalent installed in your Kubernetes cluster to expose NVIDIA GPUs
+* NVIDIA Container Toolkit installed on the nodes of your Kubernetes cluster
+
+Preparation
+-----------
+
+On your host computer, you should have already configured ``kubectl`` to access your Kubernetes cluster. To validate, run the following command and verify it returns your nodes correctly:
+
+.. code:: bash
+
+ kubectl get node
+
+If you are installing this to your own Kubernetes cluster instead of using the setup described in the :ref:`k8s-appendix`, your role in the K8s cluster should have at least the following RBAC permissions:
+
+.. code:: yaml
+
+ rules:
+ - apiGroups: [""]
+ resources: ["configmaps"]
+ verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
+ - apiGroups: ["apps"]
+ resources: ["deployments", "replicasets"]
+ verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
+ - apiGroups: [""]
+ resources: ["pods"]
+ verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
+ - apiGroups: [""]
+ resources: ["services"]
+ verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
+
+.. _k8s-installation:
+
+Installation
+------------
+
+.. note::
+
+ The following steps are verified on a MicroK8s cluster with GPU Operator installed (see configurations in the :ref:`k8s-appendix`). You can configure your own K8s cluster accordingly if you encounter issues.
+
+#. Download the Helm chart from NGC (get your NGC API key based on the `public guide `_):
+
+ .. code:: bash
+
+ helm fetch https://helm.ngc.nvidia.com/nvidia/charts/isaac-lab-teleop-2.3.0.tgz \
+ --username='$oauthtoken' \
+ --password=
+
+#. Install and run the CloudXR Teleoperation for Isaac Lab pod in the default namespace, consuming all host GPUs:
+
+ .. code:: bash
+
+ helm upgrade --install hello-isaac-teleop isaac-lab-teleop-2.3.0.tgz \
+ --set fullnameOverride=hello-isaac-teleop \
+ --set hostNetwork="true"
+
+ .. note::
+
+ You can remove the need for host network by creating an external LoadBalancer VIP (e.g., with MetalLB), and setting the environment variable ``NV_CXR_ENDPOINT_IP`` when deploying the Helm chart:
+
+ .. code:: yaml
+
+ # local_values.yml file example:
+ fullnameOverride: hello-isaac-teleop
+ streamer:
+ extraEnvs:
+ - name: NV_CXR_ENDPOINT_IP
+ value: ""
+ - name: ACCEPT_EULA
+ value: "Y"
+
+ .. code:: bash
+
+ # command
+ helm upgrade --install --values local_values.yml \
+ hello-isaac-teleop isaac-lab-teleop-2.3.0.tgz
+
+#. Verify the deployment is completed:
+
+ .. code:: bash
+
+ kubectl wait --for=condition=available --timeout=300s \
+ deployment/hello-isaac-teleop
+
+ After the pod is running, it might take approximately 5-8 minutes to complete loading assets and start streaming.
+
+Uninstallation
+--------------
+
+You can uninstall by simply running:
+
+.. code:: bash
+
+ helm uninstall hello-isaac-teleop
+
+.. _k8s-appendix:
+
+Appendix: Setting Up a Local K8s Cluster with MicroK8s
+------------------------------------------------------
+
+Your local workstation should have the NVIDIA Container Toolkit and its dependencies installed. Otherwise, the following setup will not work.
+
+Cleaning Up Existing Installations (Optional)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code:: bash
+
+ # Clean up the system to ensure we start fresh
+ sudo snap remove microk8s
+ sudo snap remove helm
+ sudo apt-get remove docker-ce docker-ce-cli containerd.io
+ # If you have snap docker installed, remove it as well
+ sudo snap remove docker
+
+Installing MicroK8s
+~~~~~~~~~~~~~~~~~~~
+
+.. code:: bash
+
+ sudo snap install microk8s --classic
+
+Installing NVIDIA GPU Operator
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. code:: bash
+
+ microk8s helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
+ microk8s helm repo update
+ microk8s helm install gpu-operator \
+ -n gpu-operator \
+ --create-namespace nvidia/gpu-operator \
+ --set toolkit.env[0].name=CONTAINERD_CONFIG \
+ --set toolkit.env[0].value=/var/snap/microk8s/current/args/containerd-template.toml \
+ --set toolkit.env[1].name=CONTAINERD_SOCKET \
+ --set toolkit.env[1].value=/var/snap/microk8s/common/run/containerd.sock \
+ --set toolkit.env[2].name=CONTAINERD_RUNTIME_CLASS \
+ --set toolkit.env[2].value=nvidia \
+ --set toolkit.env[3].name=CONTAINERD_SET_AS_DEFAULT \
+ --set-string toolkit.env[3].value=true
+
+.. note::
+
+ If you have configured the GPU operator to use volume mounts for ``DEVICE_LIST_STRATEGY`` on the device plugin and disabled ``ACCEPT_NVIDIA_VISIBLE_DEVICES_ENVVAR_WHEN_UNPRIVILEGED`` on the toolkit, this configuration is currently unsupported, as there is no method to ensure the assigned GPU resource is consistently shared between containers of the same pod.
+
+Verifying Installation
+~~~~~~~~~~~~~~~~~~~~~~
+
+Run the following command to verify that all pods are running correctly:
+
+.. code:: bash
+
+ microk8s kubectl get pods -n gpu-operator
+
+You should see output similar to:
+
+.. code:: text
+
+ NAMESPACE NAME READY STATUS RESTARTS AGE
+ gpu-operator gpu-operator-node-feature-discovery-gc-76dc6664b8-npkdg 1/1 Running 0 77m
+ gpu-operator gpu-operator-node-feature-discovery-master-7d6b448f6d-76fqj 1/1 Running 0 77m
+ gpu-operator gpu-operator-node-feature-discovery-worker-8wr4n 1/1 Running 0 77m
+ gpu-operator gpu-operator-86656466d6-wjqf4 1/1 Running 0 77m
+ gpu-operator nvidia-container-toolkit-daemonset-qffh6 1/1 Running 0 77m
+ gpu-operator nvidia-dcgm-exporter-vcxsf 1/1 Running 0 77m
+ gpu-operator nvidia-cuda-validator-x9qn4 0/1 Completed 0 76m
+ gpu-operator nvidia-device-plugin-daemonset-t4j4k 1/1 Running 0 77m
+ gpu-operator gpu-feature-discovery-8dms9 1/1 Running 0 77m
+ gpu-operator nvidia-operator-validator-gjs9m 1/1 Running 0 77m
+
+Once all pods are running, you can proceed to the :ref:`k8s-installation` section.
diff --git a/docs/source/deployment/cluster.rst b/docs/source/deployment/cluster.rst
index 467fda90f46d..ab9e03874e7a 100644
--- a/docs/source/deployment/cluster.rst
+++ b/docs/source/deployment/cluster.rst
@@ -204,7 +204,7 @@ ANYmal rough terrain locomotion training can be executed with the following comm
The above will, in addition, also render videos of the training progress and store them under ``isaaclab/logs`` directory.
.. _Singularity: https://docs.sylabs.io/guides/2.6/user-guide/index.html
-.. _ETH Zurich Euler: https://scicomp.ethz.ch/wiki/Euler
+.. _ETH Zurich Euler: https://www.gdc-docs.ethz.ch/EulerManual/site/overview/
.. _PBS Official Site: https://openpbs.org/
.. _apptainer: https://apptainer.org/
.. _documentation: https://www.apptainer.org/docs/admin/main/installation.html#install-ubuntu-packages
diff --git a/docs/source/deployment/docker.rst b/docs/source/deployment/docker.rst
index 2532b91439f8..9dad372c9c7d 100644
--- a/docs/source/deployment/docker.rst
+++ b/docs/source/deployment/docker.rst
@@ -47,9 +47,12 @@ needed to run Isaac Lab inside a Docker container. A subset of these are summari
Dockerfiles which end with something else, (i.e. ``Dockerfile.ros2``) build an `image extension <#isaac-lab-image-extensions>`_.
* **docker-compose.yaml**: Creates mounts to allow direct editing of Isaac Lab code from the host machine that runs
the container. It also creates several named volumes such as ``isaac-cache-kit`` to
- store frequently re-used resources compiled by Isaac Sim, such as shaders, and to retain logs, data, and documents.
+ store frequently reused resources compiled by Isaac Sim, such as shaders, and to retain logs, data, and documents.
* **.env.base**: Stores environment variables required for the ``base`` build process and the container itself. ``.env``
files which end with something else (i.e. ``.env.ros2``) define these for `image extension <#isaac-lab-image-extensions>`_.
+* **docker-compose.cloudxr-runtime.patch.yaml**: A patch file that is applied to enable CloudXR Runtime support for
+ streaming to compatible XR devices. It defines services and volumes for CloudXR Runtime and the base.
+* **.env.cloudxr-runtime**: Environment variables for the CloudXR Runtime support.
* **container.py**: A utility script that interfaces with tools in ``utils`` to configure and build the image,
and run and interact with the container.
@@ -73,6 +76,7 @@ Running the Container
The script ``container.py`` parallels basic ``docker compose`` commands. Each can accept an `image extension argument <#isaac-lab-image-extensions>`_,
or else they will default to the ``base`` image extension. These commands are:
+* **build**: This builds the image for the given profile. It does not bring up the container.
* **start**: This builds the image and brings up the container in detached mode (i.e. in the background).
* **enter**: This begins a new bash process in an existing Isaac Lab container, and which can be exited
without bringing down the container.
@@ -114,6 +118,23 @@ directories to the ``docker/artifacts`` directory. This is useful for copying th
./docker/container.py stop
+CloudXR Runtime Support
+~~~~~~~~~~~~~~~~~~~~~~~
+
+To enable CloudXR Runtime for streaming to compatible XR devices, you need to apply the patch file
+``docker-compose.cloudxr-runtime.patch.yaml`` to run CloudXR Runtime container. The patch file defines services and
+volumes for CloudXR Runtime and base. The environment variables required for CloudXR Runtime are specified in the
+``.env.cloudxr-runtime`` file. To start or stop the CloudXR runtime container with base, use the following command:
+
+.. code:: bash
+
+ # Start CloudXR Runtime container with base.
+ ./docker/container.py start --files docker-compose.cloudxr-runtime.patch.yaml --env-file .env.cloudxr-runtime
+
+ # Stop CloudXR Runtime container and base.
+ ./docker/container.py stop --files docker-compose.cloudxr-runtime.patch.yaml --env-file .env.cloudxr-runtime
+
+
X11 forwarding
~~~~~~~~~~~~~~
@@ -213,20 +234,35 @@ Isaac Lab Image Extensions
The produced image depends on the arguments passed to ``container.py start`` and ``container.py stop``. These
commands accept an image extension parameter as an additional argument. If no argument is passed, then this
parameter defaults to ``base``. Currently, the only valid values are (``base``, ``ros2``).
-Only one image extension can be passed at a time. The produced container will be named ``isaac-lab-${profile}``,
-where ``${profile}`` is the image extension name.
+Only one image extension can be passed at a time. The produced image and container will be named
+``isaac-lab-${profile}``, where ``${profile}`` is the image extension name.
+
+``suffix`` is an optional string argument to ``container.py`` that specifies a docker image and
+container name suffix, which can be useful for development purposes. By default ``${suffix}`` is the empty string.
+If ``${suffix}`` is a nonempty string, then the produced docker image and container will be named
+``isaac-lab-${profile}-${suffix}``, where a hyphen is inserted between ``${profile}`` and ``${suffix}`` in
+the name. ``suffix`` should not be used with cluster deployments.
.. code:: bash
- # start base by default
+ # start base by default, named isaac-lab-base
./docker/container.py start
- # stop base explicitly
+ # stop base explicitly, named isaac-lab-base
./docker/container.py stop base
- # start ros2 container
+ # start ros2 container named isaac-lab-ros2
./docker/container.py start ros2
- # stop ros2 container
+ # stop ros2 container named isaac-lab-ros2
./docker/container.py stop ros2
+ # start base container named isaac-lab-base-custom
+ ./docker/container.py start base --suffix custom
+ # stop base container named isaac-lab-base-custom
+ ./docker/container.py stop base --suffix custom
+ # start ros2 container named isaac-lab-ros2-custom
+ ./docker/container.py start ros2 --suffix custom
+ # stop ros2 container named isaac-lab-ros2-custom
+ ./docker/container.py stop ros2 --suffix custom
+
The passed image extension argument will build the image defined in ``Dockerfile.${image_extension}``,
with the corresponding `profile`_ in the ``docker-compose.yaml`` and the envars from ``.env.${image_extension}``
in addition to the ``.env.base``, if any.
@@ -256,17 +292,23 @@ Running Pre-Built Isaac Lab Container
In Isaac Lab 2.0 release, we introduced a minimal pre-built container that contains a very minimal set
of Isaac Sim and Omniverse dependencies, along with Isaac Lab 2.0 pre-built into the container.
This container allows users to pull the container directly from NGC without requiring a local build of
-the docker image. The Isaac Lab 2.0 source code will be available in this container under ``/workspace/IsaacLab``.
+the docker image. The Isaac Lab source code will be available in this container under ``/workspace/IsaacLab``.
This container is designed for running **headless** only and does not allow for X11 forwarding or running
with the GUI. Please only use this container for headless training. For other use cases, we recommend
following the above steps to build your own Isaac Lab docker image.
+.. note::
+
+ Currently, we only provide docker images with every major release of Isaac Lab.
+ For example, we provide the docker image for release 2.0.0 and 2.1.0, but not 2.0.2.
+ In the future, we will provide docker images for every minor release of Isaac Lab.
+
To pull the minimal Isaac Lab container, run:
.. code:: bash
- docker pull nvcr.io/nvidia/isaac-lab:2.0.2
+ docker pull nvcr.io/nvidia/isaac-lab:2.3.2
To run the Isaac Lab container with an interactive bash session, run:
@@ -282,7 +324,26 @@ To run the Isaac Lab container with an interactive bash session, run:
-v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \
-v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \
-v ~/docker/isaac-sim/documents:/root/Documents:rw \
- nvcr.io/nvidia/isaac-lab:2.0.2
+ nvcr.io/nvidia/isaac-lab:2.3.2
+
+To enable rendering through X11 forwarding, run:
+
+.. code:: bash
+
+ xhost +
+ docker run --name isaac-lab --entrypoint bash -it --gpus all -e "ACCEPT_EULA=Y" --rm --network=host \
+ -e "PRIVACY_CONSENT=Y" \
+ -e DISPLAY \
+ -v $HOME/.Xauthority:/root/.Xauthority \
+ -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw \
+ -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \
+ -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \
+ -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \
+ -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \
+ -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \
+ -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \
+ -v ~/docker/isaac-sim/documents:/root/Documents:rw \
+ nvcr.io/nvidia/isaac-lab:2.3.2
To run an example within the container, run:
diff --git a/docs/source/deployment/index.rst b/docs/source/deployment/index.rst
index c8e07ef9e2e8..235a23c9d754 100644
--- a/docs/source/deployment/index.rst
+++ b/docs/source/deployment/index.rst
@@ -1,3 +1,5 @@
+.. _container-deployment:
+
Container Deployment
====================
@@ -11,12 +13,65 @@ The Dockerfile is based on the Isaac Sim image provided by NVIDIA, which include
application launcher and the Isaac Sim application. The Dockerfile installs Isaac Lab and its dependencies
on top of this image.
-The following guides provide instructions for building the Docker image and running Isaac Lab in a
-container.
+Cloning the Repository
+----------------------
+
+Before building the container, clone the Isaac Lab repository (if not already done):
+
+.. tab-set::
+
+ .. tab-item:: SSH
+
+ .. code:: bash
+
+ git clone git@github.com:isaac-sim/IsaacLab.git
+
+ .. tab-item:: HTTPS
+
+ .. code:: bash
+
+ git clone https://github.com/isaac-sim/IsaacLab.git
+
+Next Steps
+----------
+
+After cloning, you can choose the deployment workflow that fits your needs:
+
+- :doc:`docker`
+
+ - Learn how to build, configure, and run Isaac Lab in Docker containers.
+ - Explains the repository's ``docker/`` setup, the ``container.py`` helper script, mounted volumes,
+ image extensions (like ROS 2), and optional CloudXR streaming support.
+ - Covers running pre-built Isaac Lab containers from NVIDIA NGC for headless training.
+
+- :doc:`run_docker_example`
+
+ - Learn how to run a development workflow inside the Isaac Lab Docker container.
+ - Demonstrates building the container, entering it, executing a sample Python script (`log_time.py`),
+ and retrieving logs using mounted volumes.
+ - Highlights bind-mounted directories for live code editing and explains how to stop or remove the container
+ while keeping the image and artifacts.
+
+- :doc:`cluster`
+
+ - Learn how to run Isaac Lab on high-performance computing (HPC) clusters.
+ - Explains how to export the Docker image to a Singularity (Apptainer) image, configure cluster-specific parameters,
+ and submit jobs using common workload managers (SLURM or PBS).
+ - Includes tested workflows for ETH Zurich's Euler cluster and IIT Genoa's Franklin cluster,
+ with notes on adapting to other environments.
+
+- :doc:`cloudxr_teleoperation_cluster`
+
+ - Deploy CloudXR Teleoperation for Isaac Lab on a Kubernetes cluster.
+ - Covers system requirements, software dependencies, and preparation steps including RBAC permissions.
+ - Demonstrates how to install and verify the Helm chart, run the pod, and uninstall it.
+
.. toctree::
- :maxdepth: 1
+ :maxdepth: 1
+ :hidden:
- docker
- cluster
- run_docker_example
+ docker
+ run_docker_example
+ cluster
+ cloudxr_teleoperation_cluster
diff --git a/docs/source/experimental-features/bleeding-edge.rst b/docs/source/experimental-features/bleeding-edge.rst
new file mode 100644
index 000000000000..5927ba1ae8df
--- /dev/null
+++ b/docs/source/experimental-features/bleeding-edge.rst
@@ -0,0 +1,11 @@
+Welcome to the bleeding edge!
+=============================
+
+Isaac Lab is open source because our intention is to grow a community of open collaboration for robotic simulation.
+We believe that robust tools are crucial for the future of robotics.
+
+Sometimes new features may require extensive changes to the internal structure of Isaac Lab.
+Directly integrating such features before they are complete and without feedback from the full community could cause serious issues for users caught unaware.
+
+To address this, some major features will be released as Experimental Feature Branches.
+This way, the community can experiment with and contribute to the feature before it's fully integrated, reducing the likelihood of being derailed by unexpected and new errors.
diff --git a/docs/source/experimental-features/newton-physics-integration/index.rst b/docs/source/experimental-features/newton-physics-integration/index.rst
new file mode 100644
index 000000000000..48d19caca874
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/index.rst
@@ -0,0 +1,47 @@
+Newton Physics Integration
+===========================
+
+`Newton `_ is a GPU-accelerated, extensible, and differentiable physics simulation engine designed for robotics, research,
+and advanced simulation workflows. Built on top of `NVIDIA Warp `_ and integrating MuJoCo Warp, Newton provides high-performance
+simulation, modern Python APIs, and a flexible architecture for both users and developers.
+
+Newton is an Open Source community-driven project with contributions from NVIDIA, Google Deep Mind, and Disney Research,
+managed through the Linux Foundation.
+
+This `experimental feature branch `_ of Isaac Lab provides an initial integration with the Newton Physics Engine, and is
+under active development. Many features are not yet supported, and only a limited set of classic RL and flat terrain locomotion
+reinforcement learning examples are included at the moment.
+
+Both this Isaac Lab integration branch and Newton itself are under heavy development. We intend to support additional
+features for other reinforcement learning and imitation learning workflows in the future, but the above tasks should be
+a good lens through which to understand how Newton integration works in Isaac Lab.
+
+We have validated Newton simulation against PhysX by transferring learned policies from Newton to PhysX and vice versa
+Furthermore, we have also successfully deployed a Newton-trained locomotion policy to a G1 robot. Please see :ref:`here ` for more information.
+
+Newton can support `multiple solvers `_ for handling different types of physics simulation, but for the moment, the Isaac
+Lab integration focuses primarily on the MuJoCo-Warp solver.
+
+Future updates of this branch and Newton should include both ongoing improvements in performance as well as integration
+with additional solvers.
+
+Note that this branch does not include support for the PhysX physics engine - only Newton is supported. We are considering
+several possible paths to continue to support PhysX within Lab, and feedback from users about their needs around that would be appreciated.
+
+During the early development phase of both Newton and this Isaac Lab integration, you are likely to encounter breaking
+changes as well as limited documentation. We do not expect to be able to provide official support or debugging assistance
+until the framework has reached an official release. We appreciate your understanding and patience as we work to deliver a robust and polished framework!
+
+
+.. toctree::
+ :maxdepth: 2
+ :titlesonly:
+
+ installation
+ isaaclab_newton-beta-2
+ training-environments
+ visualization
+ limitations-and-known-bugs
+ solver-transitioning
+ sim-to-sim
+ sim-to-real
diff --git a/docs/source/experimental-features/newton-physics-integration/installation.rst b/docs/source/experimental-features/newton-physics-integration/installation.rst
new file mode 100644
index 000000000000..be0f82632e66
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/installation.rst
@@ -0,0 +1,78 @@
+Installation
+============
+
+Installing the Newton physics integration branch requires three things:
+
+1) The ``feature/newton`` branch of Isaac Lab
+2) Ubuntu 22.04 or 24.04 (Windows will be supported soon)
+3) [Optional] Isaac sim 5.1 (Isaac Sim is not required if the Omniverse visualizer is not used)
+
+To begin, verify the version of Isaac Sim by checking the title of the window created when launching the simulation app. Alternatively, you can
+find more explicit version information under the ``Help -> About`` menu within the app.
+If your version is less than 5.1, you must first `update or reinstall Isaac Sim `_ before
+you can proceed further.
+
+Next, navigate to the root directory of your local copy of the Isaac Lab repository and open a terminal.
+
+Make sure we are on the ``feature/newton`` branch by running the following command:
+
+.. code-block:: bash
+
+ git checkout feature/newton
+
+Below, we provide instructions for installing Isaac Sim through pip.
+
+
+Pip Installation
+----------------
+
+We recommend using conda for managing your python environments. Conda can be downloaded and installed from `here `_.
+
+If you previously already have a virtual environment for Isaac Lab, please ensure to start from a fresh environment to avoid any dependency conflicts.
+If you have installed earlier versions of mujoco, mujoco-warp, or newton packages through pip, we recommend first
+cleaning your pip cache with ``pip cache purge`` to remove any cache of earlier versions that may be conflicting with the latest.
+
+Create a new conda environment:
+
+.. code-block:: bash
+
+ conda create -n env_isaaclab python=3.11
+
+Activate the environment:
+
+.. code-block:: bash
+
+ conda activate env_isaaclab
+
+Install the correct version of torch and torchvision:
+
+.. code-block:: bash
+
+ pip install -U torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128
+
+[Optional] Install Isaac Sim 5.1:
+
+.. code-block:: bash
+
+ pip install "isaacsim[all,extscache]==5.1.0" --extra-index-url https://pypi.nvidia.com
+
+Install Isaac Lab extensions and dependencies:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -i
+
+
+Testing the Installation
+------------------------
+
+To verify that the installation was successful, run the following command from the root directory of your Isaac Lab repository:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Cartpole-Direct-v0 --num_envs 128
+
+
+Note that since Newton requires a more recent version of Warp than Isaac Sim 5.1, there may be some incompatibility issues
+that could result in errors such as ``ModuleNotFoundError: No module named 'warp.sim'``. These are ok to ignore and should not
+impact usability.
diff --git a/docs/source/experimental-features/newton-physics-integration/isaaclab_newton-beta-2.rst b/docs/source/experimental-features/newton-physics-integration/isaaclab_newton-beta-2.rst
new file mode 100644
index 000000000000..2e7b4dd9ec42
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/isaaclab_newton-beta-2.rst
@@ -0,0 +1,52 @@
+Isaac Lab - Newton Beta 2
+=========================
+
+Isaac Lab - Newton Beta 2 (feature/newton branch) provides Newton physics engine integration for Isaac Lab. We refactored our code so that we can not only support PhysX and Newton, but
+any other physics engine, enabling users to bring their own physics engine to Isaac Lab if they desire. To enable this, we introduce base implementations of
+our ``simulation interfaces``, :class:`~isaaclab.assets.articulation.Articulation` or :class:`~isaaclab.sensors.ContactSensor` for instance. These provide a
+set of abstract methods that all physics engines must implement. In turn this allows all of the default Isaac Lab environments to work with any physics engine.
+This also allows us to ensure that Isaac Lab - Newton Beta 2 is backwards compatible with Isaac Lab 2.X. For engine specific calls, users could get the underlying view of
+the physics engine and call the engine specific APIs directly.
+
+However, as we are refactoring the code, we are also looking at ways to limit the overhead of Isaac Lab's. In an effort to minimize the overhead, we are moving
+all our low level code away from torch, and instead will rely heavily on warp. This will allow us to write low level code that is more efficient, and also
+to take advantage of the cuda-graphing. However, this means that the ``data classes`` such as :class:`~isaaclab.assets.articulation.ArticulationData` or
+:class:`~isaaclab.sensors.ContactSensorData` will only return warp arrays. Users will hence have to call ``wp.to_torch`` to convert them to torch tensors if they desire.
+Our setters/writers will support both warp arrays and torch tensors, and will use the most optimal strategy to update the warp arrays under the hood. This minimizes the
+amount of changes required for users to migrate to Isaac Lab - Newton Beta 2.
+
+Another new feature of the writers and setters is the ability to provide them with masks and complete data (as opposed to indices and partial data in Isaac Lab 2.X).
+Note that this feature will be available along with the ability to provide indices and partial data, and that the default behavior will still be to provide indices and partial data.
+However, if using warp, users will have to provide masks and complete data. In general we encourage users to move to adopt this new feature as, if done well, it will
+reduce on the fly memory allocations, and should result in better performance.
+
+On the optimization front, we decided to change quaternion conventions. Originally, Isaac Lab and Isaac Sim both adopted the ``wxyz`` convention. However, we were doing several
+conversions to and from ``xyzw`` in our setters/writers as PhysX uses the ``xyzw`` convention. Since both Newton and Warp, also use the ``xyzw`` convention, we decided to change
+our default convention to ``xyzw``. This means that all our APIs will now return quaternions in the ``xyzw`` convention. This is likely a breaking change for all the custom
+mdps that are not using our :mod:`~isaaclab.utils.math` module. While this change is substantial, it should make things more consistent for when users are using the simulation
+views directly, and will remove needless conversions.
+
+Finally, alongside the new isaaclab_newton extension, we are also introducing new isaaclab_experimental and isaaclab_task_experimental extensions. These extensions will allow
+us to quickly bring new features to Isaac Lab main while giving them the time they need to mature before being fully integrated into the core Isaac Lab extensions. In this release,
+we are introducing cuda-graphing support for direct rl tasks. This drastically reduces Isaac Lab's overhead making training faster. Try them out and let us know what you think!
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-Direct-Warp-v0 --num_envs 4096 --headless
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Ant-Direct-Warp-v0 --num_envs 4096 --headless
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Humanoid-Direct-Warp-v0 --num_envs 4096 --headless
+
+
+What's Next?
+============
+
+Isaac Lab 3.0 is the upcoming release of Isaac Lab, which will be compatible with Isaac Sim 6.0, and at the same time will support the new Newton physics engine.
+This will allow users to train policies on the Newton physics engine, or PhysX. To accommodate this major code refactoring are required. In this section, we
+will go over some of the changes, how that will affect Isaac Lab 2.X users, and how to migrate to Isaac Lab 3.0. The current branch of ``feature/newton`` gives
+a glance of what is to come. While the changes to the internal code structure are significant, the changes to the user API are minimal.
diff --git a/docs/source/experimental-features/newton-physics-integration/limitations-and-known-bugs.rst b/docs/source/experimental-features/newton-physics-integration/limitations-and-known-bugs.rst
new file mode 100644
index 000000000000..e5eab3996d8a
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/limitations-and-known-bugs.rst
@@ -0,0 +1,55 @@
+Limitations
+===========
+
+During the early development phase of both Newton and this Isaac Lab integration,
+you are likely to encounter breaking changes as well as limited documentation.
+
+We do not expect to be able to provide support or debugging assistance until the framework has reached an official release.
+
+Here is a non-exhaustive list of capabilities currently supported in the Newton experimental feature branch grouped by extension:
+
+* isaaclab:
+ * Articulation API (supports both articulations and single-body articulations as rigid bodies)
+ * Contact Sensor
+ * Direct & Manager single agent workflows
+ * Omniverse Kit visualizer
+ * Newton visualizer
+* isaaclab_assets:
+ * Quadrupeds
+ * Anymal-B, Anymal-C, Anymal-D
+ * Unitree A1, Go1, Go2
+ * Spot
+ * Humanoids
+ * Unitree H1 & G1
+ * Cassie
+ * Arms and Hands
+ * Franka
+ * UR10
+ * Allegro Hand
+ * Toy examples
+ * Cartpole
+ * Ant
+ * Humanoid
+* isaaclab_tasks:
+ * Direct:
+ * Cartpole (State, RGB, Depth)
+ * Ant
+ * Humanoid
+ * Allegro Hand Repose Cube
+ * Manager based:
+ * Cartpole (State)
+ * Ant
+ * Humanoid
+ * Locomotion (velocity flat terrain)
+ * Anymal-B
+ * Anymal-C
+ * Anymal-D
+ * Cassie
+ * A1
+ * Go1
+ * Go2
+ * Unitree G1
+ * Unitree H1
+ * Manipulation reach
+ * Franka
+ * UR10
diff --git a/docs/source/experimental-features/newton-physics-integration/sim-to-real.rst b/docs/source/experimental-features/newton-physics-integration/sim-to-real.rst
new file mode 100644
index 000000000000..6b7a952a76c4
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/sim-to-real.rst
@@ -0,0 +1,92 @@
+.. _sim2real:
+
+Sim-to-Real Policy Transfer
+===========================
+Deploying policies from simulation to real robots involves important nuances that must be addressed.
+This section provides a high-level guide for training policies that can be deployed on a real Unitree G1 robot.
+The key challenge is that not all observations available in simulation can be directly measured by real robot sensors.
+This means RL-trained policies cannot be directly deployed unless they use only sensor-available observations. For example, while real robot IMU sensors provide angular acceleration (which can be integrated to get angular velocity), they cannot directly measure linear velocity. Therefore, if a policy relies on base linear velocity during training, this information must be removed before real robot deployment.
+
+
+Requirements
+~~~~~~~~~~~~
+
+We assume that policies from this workflow are first verified through sim-to-sim transfer before real robot deployment.
+Please see :ref:`here ` for more information.
+
+
+Overview
+--------
+
+This section demonstrates a sim-to-real workflow using teacherโstudent distillation for the Unitree G1
+velocity-tracking task with the Newton backend.
+
+The teacherโstudent distillation workflow consists of three stages:
+
+1. Train a teacher policy with privileged observations that are not available in real-world sensors.
+2. Distill a student policy that excludes privileged terms (e.g., root linear velocity) by behavior cloning from the teacher policy.
+3. Fine-tune the student policy with RL using only real-sensor observations.
+
+The teacher and student observation groups are implemented in the velocity task configuration. See the following source for details:
+
+- Teacher observations: ``PolicyCfg(ObsGroup)`` in `velocity_env_cfg.py `__
+- Student observations: ``StudentPolicyCfg(ObsGroup)`` in `velocity_env_cfg.py `__
+
+
+1. Train the teacher policy
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Train the teacher policy for the G1 velocity task using the Newton backend. The task ID is ``Isaac-Velocity-Flat-G1-v1``
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Velocity-Flat-G1-v1 --num_envs=4096
+
+The teacher policy includes privileged observations (e.g., root linear velocity) defined in ``PolicyCfg(ObsGroup)``.
+
+
+2. Distill the student policy (remove privileged terms)
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+During distillation, the student policy learns to mimic the teacher through behavior cloning by minimizing the mean squared error
+between their actions: :math:`loss = MSE(\pi(O_{teacher}), \pi(O_{student}))`.
+
+The student policy only uses observations available from real sensors (see ``StudentPolicyCfg(ObsGroup)``
+in `velocity_env_cfg.py `__).
+Specifically: **Root angular velocity** and **Projected gravity** come from the IMU sensor, **Joint positions and velocities** come from joint encoders, and **Actions** are the joint torques applied by the controller.
+
+Run the student distillation task ``Velocity-G1-Distillation-v1`` using ``--load_run`` and ``--checkpoint`` to specify the teacher policy you want to distill from.
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Velocity-G1-Distillation-v1 --num_envs=4096 --load_run 2025-08-13_23-53-28 --checkpoint model_1499.pt
+
+.. note::
+
+ Use the correct ``--load_run`` and ``--checkpoint`` to ensure you distill from the intended teacher policy.
+
+
+3. Fine-tune the student policy with RL
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Fine-tune the distilled student policy using RL with the ``Velocity-G1-Student-Finetune-v1`` task.
+Use ``--load_run`` and ``--checkpoint`` to initialize from the distilled policy.
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Velocity-G1-Student-Finetune-v1 --num_envs=4096 --load_run 2025-08-20_16-06-52_distillation --checkpoint model_1499.pt
+
+This starts from the distilled student policy and improves it further with RL training.
+
+.. note::
+
+ Make sure ``--load_run`` and ``--checkpoint`` point to the correct initial policy (usually the latest checkpoint from the distillation step).
+
+You can replay the student policy via:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task=Velocity-G1-Student-Finetune-v1 --num_envs=32 --visualizer newton
+
+
+This exports the policy as ``.pt`` and ``.onnx`` files in the run's export directory, ready for real robot deployment.
diff --git a/docs/source/experimental-features/newton-physics-integration/sim-to-sim.rst b/docs/source/experimental-features/newton-physics-integration/sim-to-sim.rst
new file mode 100644
index 000000000000..8eebbdffac3f
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/sim-to-sim.rst
@@ -0,0 +1,171 @@
+.. _sim2sim:
+
+Sim-to-Sim Policy Transfer
+==========================
+This section provides examples of sim-to-sim policy transfer between PhysX and Newton backends. Sim-to-sim transfer is an essential step before real robot deployment because it verifies that policies work across different simulators. Policies that pass sim-to-sim verification are much more likely to succeed on real robots.
+
+
+Overview
+--------
+
+This guide shows how to transfer policies between PhysX and Newton backends in both directions. The main challenge is that different physics engines may parse the same robot model with different joint and link ordering.
+
+Policies trained in one backend expect joints and links in a specific order determined by how that backend parses the robot model. When transferring to another backend, the joint ordering may be different, requiring remapping of observations and actions.
+
+In the future, we plan to solve this using **robot schema** that standardizes joint and link ordering across different backends.
+
+Currently, we solve this by remapping observations and actions using joint mappings defined in YAML files. These files specify joint names in both source and target backend orders. During policy execution, we use this mapping to reorder observations and actions so they work correctly with the target backend.
+
+The method has been tested with Unitree G1, Unitree Go2, Unitree H1, and ANYmal-D robots for both transfer directions.
+
+
+What you need
+~~~~~~~~~~~~~
+
+- A policy checkpoint trained with either PhysX or Newton (RSL-RL).
+- A joint mapping YAML for your robot under ``scripts/sim2sim_transfer/config/``.
+- The provided player script: ``scripts/sim2sim_transfer/rsl_rl_transfer.py``.
+
+To add a new robot, create a YAML file with two lists where each joint name appears exactly once in both:
+
+.. code-block:: yaml
+
+ # Example structure
+ source_joint_names: # Source backend joint order
+ - joint_1
+ - joint_2
+ # ...
+ target_joint_names: # Target backend joint order
+ - joint_1
+ - joint_2
+ # ...
+
+The script automatically computes the necessary mappings for locomotion tasks.
+
+
+PhysX-to-Newton Transfer
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+To run a PhysX-trained policy with the Newton backend, use this command template:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task= \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file \
+ --visualizer newton
+
+Here are examples for different robots:
+
+1. Unitree G1
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task=Isaac-Velocity-Flat-G1-v0 \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file scripts/sim2sim_transfer/config/physx_to_newton_g1.yaml \
+ --visualizer newton
+
+2. Unitree H1
+
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task=Isaac-Velocity-Flat-H1-v0 \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file scripts/sim2sim_transfer/config/physx_to_newton_h1.yaml \
+ --visualizer newton
+
+
+3. Unitree Go2
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task=Isaac-Velocity-Flat-Go2-v0 \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file scripts/sim2sim_transfer/config/physx_to_newton_go2.yaml \
+ --visualizer newton
+
+
+4. ANYmal-D
+
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task=Isaac-Velocity-Flat-Anymal-D-v0 \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file scripts/sim2sim_transfer/config/physx_to_newton_anymal_d.yaml \
+ --visualizer newton
+
+Note that to run this, you need to checkout the Newton-based branch of IsaacLab such as ``feature/newton``.
+
+Newton-to-PhysX Transfer
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+To transfer Newton-trained policies to PhysX-based IsaacLab, use the reverse mapping files:
+
+Here are examples for different robots:
+
+1. Unitree G1
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task=Isaac-Velocity-Flat-G1-v0 \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_g1.yaml
+
+
+2. Unitree H1
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task=Isaac-Velocity-Flat-H1-v0 \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_h1.yaml
+
+
+3. Unitree Go2
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task=Isaac-Velocity-Flat-Go2-v0 \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_go2.yaml
+
+
+4. ANYmal-D
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/sim2sim_transfer/rsl_rl_transfer.py \
+ --task=Isaac-Velocity-Flat-Anymal-D-v0 \
+ --num_envs=32 \
+ --checkpoint \
+ --policy_transfer_file scripts/sim2sim_transfer/config/newton_to_physx_anymal_d.yaml
+
+The key difference is using the ``newton_to_physx_*.yaml`` mapping files instead of ``physx_to_newton_*.yaml`` files. Also note that you need to checkout a PhysX-based IsaacLab branch such as ``main``.
+
+Notes and Limitations
+~~~~~~~~~~~~~~~~~~~~~
+
+- Both transfer directions have been tested with Unitree G1, Unitree Go2, Unitree H1, and ANYmal-D robots.
+- PhysX-to-Newton transfer uses ``physx_to_newton_*.yaml`` mapping files.
+- Newton-to-PhysX transfer requires the corresponding ``newton_to_physx_*.yaml`` mapping files and the PhysX branch of IsaacLab.
+- The observation remapping assumes a locomotion layout with base observations followed by joint observations. For different observation layouts, you'll need to modify the ``get_joint_mappings`` function in ``scripts/sim2sim_transfer/rsl_rl_transfer.py``.
+- When adding new robots or backends, make sure both source and target have identical joint names, and that the YAML lists reflect how each backend orders these joints.
diff --git a/docs/source/experimental-features/newton-physics-integration/solver-transitioning.rst b/docs/source/experimental-features/newton-physics-integration/solver-transitioning.rst
new file mode 100644
index 000000000000..db85df0f991f
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/solver-transitioning.rst
@@ -0,0 +1,73 @@
+Solver Transitioning
+====================
+
+Transitioning to the Newton physics engine introduces new physics solvers that handle simulation using different numerical approaches.
+While Newton supports several different solvers, our initial focus for Isaac Lab is on using the MuJoCo-Warp solver from Google DeepMind.
+
+The way the physics scene itself is defined does not change - we continue to use USD as the primary way to set basic parameters of objects and robots in the scene,
+and for current environments, the exact same USD files used for the PhysX-based Isaac Lab are used.
+In the future, that may change, as new USD schemas are under development that capture additional physics parameters.
+
+What does require change is the way that some solver-specific settings are configured.
+Tuning these parameters can have a significant impact on both simulation performance and behaviour.
+
+For now, we will show an example of setting these parameters to help provide a feel for these changes.
+Note that the :class:`~isaaclab.sim.NewtonCfg` replaces the :class:`~isaaclab.sim.PhysxCfg` and is used to set everything related to the physical simulation parameters except for the ``dt``:
+
+.. code-block:: python
+
+ from isaaclab.sim._impl.newton_manager_cfg import NewtonCfg
+ from isaaclab.sim._impl.solvers_cfg import MJWarpSolverCfg
+
+ solver_cfg = MJWarpSolverCfg(
+ nefc_per_env=35,
+ ls_iterations=10,
+ cone="pyramidal",
+ ls_parallel=True,
+ impratio=1,
+ )
+ newton_cfg = NewtonCfg(
+ solver_cfg=solver_cfg,
+ num_substeps=1,
+ debug_mode=False,
+ )
+ sim: SimulationCfg = SimulationCfg(dt=1 / 120, render_interval=decimation, newton_cfg=newton_cfg)
+
+
+Here is a very brief explanation of some of the key parameters above:
+
+* ``nefc_per_env``: This is the size of the buffer constraints we want MuJoCo warp to
+ pre-allocate for a given environment. A large value will slow down the simulation,
+ while a too small value may lead to some contacts being missed.
+
+* ``ls_iterations``: The number of line searches performed by the MuJoCo Warp solver.
+ Line searches are used to find an optimal step size, and for each solver step,
+ at most ``ls_iterations`` line searches will be performed. Keeping this number low
+ is important for performance. This number is also an upper bound when
+ ``ls_parallel`` is not set.
+
+* ``cone``: This parameter provides a choice between pyramidal and elliptic
+ approximations for the friction cone used in contact handling. Please see the
+ MuJoCo documentation for additional information on contact:
+ https://mujoco.readthedocs.io/en/stable/computation/index.html#contact
+
+* ``ls_parallel``: This switches line searches from iterative to parallel execution.
+ Enabling ``ls_parallel`` provides a performance boost, but at the cost of some
+ simulation stability. To ensure good simulation behaviour when enabled, a higher
+ ``ls_iterations`` setting is required. Usually an increase of approximately 50% is
+ best over the ``ls_iterations`` setting when ``ls_parallel`` is disabled.
+
+* ``impratio``: This is the frictional-to-normal constraint impedance ratio that
+ enables finer-grained control of the significance of the tangential forces
+ compared to the normal forces. Larger values signify more emphasis on harder
+ frictional constraints to avoid slip. More on how to tune this parameter (and
+ cone) can be found in the MuJoCo documentation here:
+ https://mujoco.readthedocs.io/en/stable/XMLreference.html#option-impratio
+
+* ``num_substeps``: The number of substeps to perform when running the simulation.
+ Setting this to a number larger than one allows to decimate the simulation
+ without requiring Isaac Lab to process data between two substeps. This can be
+ of value when using implicit actuators, for example.
+
+
+A more detailed transition guide covering the full set of available parameters and describing tuning approaches will follow in an upcoming release.
diff --git a/docs/source/experimental-features/newton-physics-integration/training-environments.rst b/docs/source/experimental-features/newton-physics-integration/training-environments.rst
new file mode 100644
index 000000000000..5e25564a1360
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/training-environments.rst
@@ -0,0 +1,89 @@
+Training Environments
+======================
+
+To run training, we follow the standard Isaac Lab workflow. If you are new to Isaac Lab, we recommend that you review the `Quickstart Guide here `_.
+
+The currently supported tasks are as follows:
+
+* Isaac-Cartpole-Direct-v0
+* Isaac-Cartpole-v0
+* Isaac-Cartpole-RGB-Camera-Direct-v0
+* Isaac-Cartpole-Depth-Camera-Direct-v0
+* Isaac-Ant-Direct-v0
+* Isaac-Ant-v0
+* Isaac-Humanoid-Direct-v0
+* Isaac-Humanoid-v0
+* Isaac-Velocity-Flat-Anymal-B-v0
+* Isaac-Velocity-Flat-Anymal-C-v0
+* Isaac-Velocity-Flat-Anymal-D-v0
+* Isaac-Velocity-Flat-Cassie-v0
+* Isaac-Velocity-Flat-G1-v0
+* Isaac-Velocity-Flat-G1-v1 (Sim-to-Real tested)
+* Isaac-Velocity-Flat-H1-v0
+* Isaac-Velocity-Flat-Unitree-A1-v0
+* Isaac-Velocity-Flat-Unitree-Go1-v0
+* Isaac-Velocity-Flat-Unitree-Go2-v0
+* Isaac-Reach-Franka-v0
+* Isaac-Reach-UR10-v0
+* Isaac-Repose-Cube-Allegro-Direct-v0
+
+New experimental warp-based enviromnets:
+
+* Isaac-Cartpole-Direct-Warp-v0
+* Isaac-Ant-Direct-Warp-v0
+* Isaac-Humanoid-Direct-Warp-v0
+
+To launch an environment and check that it loads as expected, we can start by trying it out with zero actions sent to its actuators.
+This can be done as follows, where ``TASK_NAME`` is the name of the task youโd like to run, and ``NUM_ENVS`` is the number of instances of the task that youโd like to create.
+
+.. code-block:: shell
+
+ ./isaaclab.sh -p scripts/environments/zero_agent.py --task TASK_NAME --num_envs NUM_ENVS
+
+For cartpole with 128 instances it would look like this:
+
+.. code-block:: shell
+
+ ./isaaclab.sh -p scripts/environments/zero_agent.py --task Isaac-Cartpole-Direct-v0 --num_envs 128
+
+To run the same environment with random actions we can use a different script:
+
+.. code-block:: shell
+
+ ./isaaclab.sh -p scripts/environments/random_agent.py --task Isaac-Cartpole-Direct-v0 --num_envs 128
+
+To train the environment we provide hooks to different rl frameworks. See the `Reinforcement Learning Scripts documentation `_ for more information.
+
+Here are some examples on how to run training on several different RL frameworks. Note that we are explicitly setting the number of environments to
+4096 to benefit more from GPU parallelization.
+
+By default, environments will train in headless mode. If visualization is required, use ``--visualizer`` and specify the desired visualizer.
+Available options are ``newton``, ``rerun``, and ``omniverse`` (requires Isaac Sim installation). Note, multiple visualizers can be selected and launched.
+
+.. code-block:: shell
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-Direct-v0 --num_envs 4096
+
+.. code-block:: shell
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/skrl/train.py --task Isaac-Cartpole-Direct-v0 --num_envs 4096
+
+.. code-block:: shell
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py --task Isaac-Cartpole-Direct-v0 --num_envs 4096
+
+Once a policy is trained we can visualize it by using the play scripts. But first, we need to find the checkpoint of the trained policy. Typically, these are stored under:
+``logs/NAME_OF_RL_FRAMEWORK/TASK_NAME/DATE``.
+
+For instance with our rsl_rl example it could look like this:
+``logs/rsl_rl/cartpole_direct/2025-08-21_15-45-30/model_299.pt``
+
+To then run this policy we can use the following command, note that we reduced the number of environments and added the ``--visualizer newton`` option so that we can see our policy in action!
+
+.. code-block:: shell
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Cartpole-Direct-v0 --num_envs 128 --visualizer newton --checkpoint logs/rsl_rl/cartpole_direct/2025-08-21_15-45-30/model_299.pt
+
+The same approach applies to all other frameworks.
+
+Note that not all environments are supported in all frameworks. For example, several of the locomotion environments are only supported in the rsl_rl framework.
diff --git a/docs/source/experimental-features/newton-physics-integration/visualization.rst b/docs/source/experimental-features/newton-physics-integration/visualization.rst
new file mode 100644
index 000000000000..f54435733934
--- /dev/null
+++ b/docs/source/experimental-features/newton-physics-integration/visualization.rst
@@ -0,0 +1,310 @@
+Visualization
+=============
+
+.. currentmodule:: isaaclab
+
+Isaac Lab offers several lightweight visualizers for real-time simulation inspection and debugging. Unlike renderers that process sensor data, visualizers are meant for fast, interactive feedback.
+
+You can use any visualizer regardless of your chosen physics engine or rendering backend.
+
+
+Overview
+--------
+
+Isaac Lab supports three visualizer backends, each optimized for different use cases:
+
+.. list-table:: Visualizer Comparison
+ :widths: 15 35 50
+ :header-rows: 1
+
+ * - Visualizer
+ - Best For
+ - Key Features
+ * - **Omniverse**
+ - High-fidelity, Isaac Sim integration
+ - USD, visual markers, live plots
+ * - **Newton**
+ - Fast iteration
+ - Low overhead, visual markers
+ * - **Rerun**
+ - Remote viewing, replay
+ - Webviewer, time scrubbing, recording export
+
+
+*The following visualizers are shown training the Isaac-Velocity-Flat-Anymal-D-v0 environment.*
+
+.. figure:: ../../_static/visualizers/ov_viz.jpg
+ :width: 100%
+ :alt: Omniverse Visualizer
+
+ Omniverse Visualizer
+
+.. figure:: ../../_static/visualizers/newton_viz.jpg
+ :width: 100%
+ :alt: Newton Visualizer
+
+ Newton Visualizer
+
+.. figure:: ../../_static/visualizers/rerun_viz.jpg
+ :width: 100%
+ :alt: Rerun Visualizer
+
+ Rerun Visualizer
+
+
+Quick Start
+-----------
+
+Launch visualizers from the command line with ``--visualizer``:
+
+.. code-block:: bash
+
+ # Launch all visualizers
+ python scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer omniverse newton rerun
+
+ # Launch just newton visualizer
+ python scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer newton
+
+
+If ``--headless`` is given, no visualizers will be launched.
+
+.. note::
+
+ The ``--headless`` argument may be deprecated in future versions to avoid confusion with the ``--visualizer``
+ argument. For now, ``--headless`` takes precedence and disables all visualizers.
+
+
+Configuration
+~~~~~~~~~~~~~
+
+Launching visualizers with the command line will use default visualizer configurations. Default configs can be found and edited in ``source/isaaclab/isaaclab/visualizers``.
+
+You can also configure custom visualizers in the code by defining new ``VisualizerCfg`` instances for the ``SimulationCfg``, for example:
+
+.. code-block:: python
+
+ from isaaclab.sim import SimulationCfg
+ from isaaclab.visualizers import NewtonVisualizerCfg, OVVisualizerCfg, RerunVisualizerCfg
+
+ sim_cfg = SimulationCfg(
+ visualizer_cfgs=[
+ OVVisualizerCfg(
+ viewport_name="Visualizer Viewport",
+ create_viewport=True,
+ dock_position="SAME",
+ window_width=1280,
+ window_height=720,
+ camera_position=(0.0, 0.0, 20.0), # high top down view
+ camera_target=(0.0, 0.0, 0.0),
+ ),
+ NewtonVisualizerCfg(
+ camera_position=(5.0, 5.0, 5.0), # closer quarter view
+ camera_target=(0.0, 0.0, 0.0),
+ show_joints=True,
+ ),
+ RerunVisualizerCfg(
+ keep_historical_data=True,
+ keep_scalar_history=True,
+ record_to_rrd="my_training.rrd",
+ ),
+ ]
+ )
+
+
+Visualizer Backends
+-------------------
+
+Omniverse Visualizer
+~~~~~~~~~~~~~~~~~~~~
+
+**Main Features:**
+
+- Native USD stage integration
+- Visualization markers for debugging (arrows, frames, points, etc.)
+- Live plots for monitoring training metrics
+- Full Isaac Sim rendering capabilities and tooling
+
+**Core Configuration:**
+
+.. code-block:: python
+
+ from isaaclab.visualizers import OVVisualizerCfg
+
+ visualizer_cfg = OVVisualizerCfg(
+ # Viewport settings
+ viewport_name="Visualizer Viewport", # Viewport window name
+ create_viewport=True, # Create new viewport vs. use existing
+ dock_position="SAME", # Docking: 'LEFT', 'RIGHT', 'BOTTOM', 'SAME'
+ window_width=1280, # Viewport width in pixels
+ window_height=720, # Viewport height in pixels
+
+ # Camera settings
+ camera_position=(8.0, 8.0, 3.0), # Initial camera position (x, y, z)
+ camera_target=(0.0, 0.0, 0.0), # Camera look-at target
+
+ # Feature toggles
+ enable_markers=True, # Enable visualization markers
+ enable_live_plots=True, # Enable live plots (auto-expands frames)
+ )
+
+
+Newton Visualizer
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Main Features:**
+
+- Lightweight OpenGL rendering with low overhead
+- Visualization markers (joints, contacts, springs, COM)
+- Training and rendering pause controls
+- Adjustable update frequency for performance tuning
+- Some customizable rendering options (shadows, sky, wireframe)
+
+
+**Interactive Controls:**
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 1
+
+ * - Key/Input
+ - Action
+ * - **W, A, S, D** or **Arrow Keys**
+ - Forward / Left / Back / Right
+ * - **Q, E**
+ - Down / Up
+ * - **Left Click + Drag**
+ - Look around
+ * - **Mouse Scroll**
+ - Zoom in/out
+ * - **Space**
+ - Pause/resume rendering (physics continues)
+ * - **H**
+ - Toggle UI sidebar
+ * - **ESC**
+ - Exit viewer
+
+**Core Configuration:**
+
+.. code-block:: python
+
+ from isaaclab.visualizers import NewtonVisualizerCfg
+
+ visualizer_cfg = NewtonVisualizerCfg(
+ # Window settings
+ window_width=1920, # Window width in pixels
+ window_height=1080, # Window height in pixels
+
+ # Camera settings
+ camera_position=(8.0, 8.0, 3.0), # Initial camera position (x, y, z)
+ camera_target=(0.0, 0.0, 0.0), # Camera look-at target
+
+ # Performance tuning
+ update_frequency=1, # Update every N frames (1=every frame)
+
+ # Physics debug visualization
+ show_joints=False, # Show joint visualizations
+ show_contacts=False, # Show contact points and normals
+ show_springs=False, # Show spring constraints
+ show_com=False, # Show center of mass markers
+
+ # Rendering options
+ enable_shadows=True, # Enable shadow rendering
+ enable_sky=True, # Enable sky rendering
+ enable_wireframe=False, # Enable wireframe mode
+
+ # Color customization
+ background_color=(0.53, 0.81, 0.92), # Sky/background color (RGB [0,1])
+ ground_color=(0.18, 0.20, 0.25), # Ground plane color (RGB [0,1])
+ light_color=(1.0, 1.0, 1.0), # Directional light color (RGB [0,1])
+ )
+
+
+Rerun Visualizer
+~~~~~~~~~~~~~~~~
+
+**Main Features:**
+
+- Web viewer interface accessible from local or remote browser
+- Metadata logging and filtering
+- Recording to .rrd files for offline replay (.rrd files can be opened with ctrl+O from the web viewer)
+- Timeline scrubbing and playback controls of recordings
+
+**Core Configuration:**
+
+.. code-block:: python
+
+ from isaaclab.visualizers import RerunVisualizerCfg
+
+ visualizer_cfg = RerunVisualizerCfg(
+ # Server settings
+ app_id="isaaclab-simulation", # Application identifier for viewer
+ web_port=9090, # Port for local web viewer (launched in browser)
+
+ # Camera settings
+ camera_position=(8.0, 8.0, 3.0), # Initial camera position (x, y, z)
+ camera_target=(0.0, 0.0, 0.0), # Camera look-at target
+
+ # History settings
+ keep_historical_data=False, # Keep transforms for time scrubbing
+ keep_scalar_history=False, # Keep scalar/plot history
+
+ # Recording
+ record_to_rrd="recording.rrd", # Path to save .rrd file (None = no recording)
+ )
+
+
+Performance Note
+----------------
+
+To reduce overhead when visualizing large-scale environments, consider:
+
+- Using Newton instead of Omniverse or Rerun
+- Reducing window sizes
+- Higher update frequencies
+- Pausing visualizers while they are not being used
+
+
+Limitations
+-----------
+
+**Rerun Visualizer Performance**
+
+The Rerun web-based visualizer may experience performance issues or crashes when visualizing large-scale
+environments. For large-scale simulations, the Newton visualizer is recommended. Alternatively, to reduce load,
+the num of environments can be overwritten and decreased using ``--num_envs``:
+
+.. code-block:: bash
+
+ python scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Cartpole-v0 --visualizer rerun --num_envs 512
+
+
+.. note::
+
+ A future feature will support visualizing only a subset of environments, which will improve visualization performance
+ and reduce resource usage while maintaining full-scale training in the background.
+
+
+**Rerun Visualizer FPS Control**
+
+The FPS control in the Rerun visualizer UI may not affect the visualization frame rate in all configurations.
+
+
+**Newton Visualizer Contact and Center of Mass Markers**
+
+Contact and center of mass markers are not yet supported in the Newton visualizer. This will be addressed in a future release.
+
+
+**Newton Visualizer CUDA/OpenGL Interoperability Warnings**
+
+On some system configurations, the Newton visualizer may display warnings about CUDA/OpenGL interoperability:
+
+.. code-block:: text
+
+ Warning: Could not get MSAA config, falling back to non-AA.
+ Warp CUDA error 999: unknown error (in function wp_cuda_graphics_register_gl_buffer)
+ Warp UserWarning: Could not register GL buffer since CUDA/OpenGL interoperability
+ is not available. Falling back to copy operations between the Warp array and the
+ OpenGL buffer.
+
+The visualizer will still function correctly but may experience reduced performance due to falling back to
+CPU copy operations instead of direct GPU memory sharing.
diff --git a/docs/source/features/multi_gpu.rst b/docs/source/features/multi_gpu.rst
index 6d60c1a2a8f4..2537e5eff25b 100644
--- a/docs/source/features/multi_gpu.rst
+++ b/docs/source/features/multi_gpu.rst
@@ -4,7 +4,7 @@ Multi-GPU and Multi-Node Training
.. currentmodule:: isaaclab
Isaac Lab supports multi-GPU and multi-node reinforcement learning. Currently, this feature is only
-available for RL-Games and skrl libraries workflows. We are working on extending this feature to
+available for RL-Games, RSL-RL and skrl libraries workflows. We are working on extending this feature to
other workflows.
.. attention::
@@ -16,19 +16,57 @@ other workflows.
Multi-GPU Training
------------------
-For complex reinforcement learning environments, it may be desirable to scale up training across multiple GPUs.
-This is possible in Isaac Lab through the use of the
-`PyTorch distributed `_ framework or the
-`JAX distributed `_ module respectively.
+Isaac Lab supports the following multi-GPU training frameworks:
-In PyTorch, the :meth:`torch.distributed` API is used to launch multiple processes of training, where the number of
-processes must be equal to or less than the number of GPUs available. Each process runs on
-a dedicated GPU and launches its own instance of Isaac Sim and the Isaac Lab environment.
-Each process collects its own rollouts during the training process and has its own copy of the policy
-network. During training, gradients are aggregated across the processes and broadcasted back to the process
-at the end of the epoch.
+* `Torchrun `_ through `PyTorch distributed `_
+* `JAX distributed `_
-In JAX, since the ML framework doesn't automatically start multiple processes from a single program invocation,
+Pytorch Torchrun Implementation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+We are using `Pytorch Torchrun `_ to manage multi-GPU
+training. Torchrun manages the distributed training by:
+
+* **Process Management**: Launching one process per GPU, where each process is assigned to a specific GPU.
+* **Script Execution**: Running the same training script (e.g., RL Games trainer) on each process.
+* **Environment Instances**: Each process creates its own instance of the Isaac Lab environment.
+* **Gradient Synchronization**: Aggregating gradients across all processes and broadcasting the synchronized
+ gradients back to each process after each training step.
+
+.. tip::
+ Check out this `3 minute youtube video from PyTorch `_
+ to understand how Torchrun works.
+
+The key components in this setup are:
+
+* **Torchrun**: Handles process spawning, communication, and gradient synchronization.
+* **RL Library**: The reinforcement learning library that runs the actual training algorithm.
+* **Isaac Lab**: Provides the simulation environment that each process instantiates independently.
+
+Under the hood, Torchrun uses the `DistributedDataParallel `_
+module to manage the distributed training. When training with multiple GPUs using Torchrun, the following happens:
+
+* Each GPU runs an independent process
+* Each process executes the full training script
+* Each process maintains its own:
+
+ * Isaac Lab environment instance (with *n* parallel environments)
+ * Policy network copy
+ * Experience buffer for rollout collection
+
+* All processes synchronize only for gradient updates
+
+For a deeper dive into how Torchrun works, checkout
+`PyTorch Docs: DistributedDataParallel - Internal Design `_.
+
+Jax Implementation
+^^^^^^^^^^^^^^^^^^
+
+.. tip::
+ JAX is only supported with the skrl library.
+
+With JAX, we are using `skrl.utils.distributed.jax `_
+Since the ML framework doesn't automatically start multiple processes from a single program invocation,
the skrl library provides a module to start them.
.. image:: ../_static/multi-gpu-rl/a3c-light.svg
@@ -45,6 +83,9 @@ the skrl library provides a module to start them.
|
+Running Multi-GPU Training
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+
To train with multiple GPUs, use the following command, where ``--nproc_per_node`` represents the number of available GPUs:
.. tab-set::
@@ -57,6 +98,13 @@ To train with multiple GPUs, use the following command, where ``--nproc_per_node
python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed
+ .. tab-item:: rsl_rl
+ :sync: rsl_rl
+
+ .. code-block:: shell
+
+ python -m torch.distributed.run --nnodes=1 --nproc_per_node=2 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed
+
.. tab-item:: skrl
:sync: skrl
@@ -93,7 +141,14 @@ For the master node, use the following command, where ``--nproc_per_node`` repre
.. code-block:: shell
- python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=localhost:5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed
+ python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed
+
+ .. tab-item:: rsl_rl
+ :sync: rsl_rl
+
+ .. code-block:: shell
+
+ python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed
.. tab-item:: skrl
:sync: skrl
@@ -105,7 +160,7 @@ For the master node, use the following command, where ``--nproc_per_node`` repre
.. code-block:: shell
- python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=localhost:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed
+ python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed
.. tab-item:: JAX
:sync: jax
@@ -126,7 +181,14 @@ For non-master nodes, use the following command, replacing ``--node_rank`` with
.. code-block:: shell
- python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=ip_of_master_machine:5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed
+ python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rl_games/train.py --task=Isaac-Cartpole-v0 --headless --distributed
+
+ .. tab-item:: rsl_rl
+ :sync: rsl_rl
+
+ .. code-block:: shell
+
+ python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Cartpole-v0 --headless --distributed
.. tab-item:: skrl
:sync: skrl
@@ -138,7 +200,7 @@ For non-master nodes, use the following command, replacing ``--node_rank`` with
.. code-block:: shell
- python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=ip_of_master_machine:5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed
+ python -m torch.distributed.run --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr= --master_port=5555 scripts/reinforcement_learning/skrl/train.py --task=Isaac-Cartpole-v0 --headless --distributed
.. tab-item:: JAX
:sync: jax
diff --git a/docs/source/features/population_based_training.rst b/docs/source/features/population_based_training.rst
new file mode 100644
index 000000000000..d88b8195bc7c
--- /dev/null
+++ b/docs/source/features/population_based_training.rst
@@ -0,0 +1,140 @@
+Population Based Training
+=========================
+
+What PBT Does
+-------------
+
+* Trains *N* policies in parallel (a "population") on the **same task**.
+* Every ``interval_steps``:
+
+ #. Save each policy's checkpoint and objective.
+ #. Score the population and identify **leaders** and **underperformers**.
+ #. For underperformers, replace weights from a random leader and **mutate** selected hyperparameters.
+ #. Restart that process with the new weights/params automatically.
+
+Leader / Underperformer Selection
+---------------------------------
+
+Let ``o_i`` be each initialized policy's objective, with mean ``ฮผ`` and std ``ฯ``.
+
+Upper and lower performance cuts are::
+
+ upper_cut = max(ฮผ + threshold_std * ฯ, ฮผ + threshold_abs)
+ lower_cut = min(ฮผ - threshold_std * ฯ, ฮผ - threshold_abs)
+
+* **Leaders**: ``o_i > upper_cut``
+* **Underperformers**: ``o_i < lower_cut``
+
+The "Natural-Selection" rules:
+
+1. Only underperformers are acted on (mutated or replaced).
+2. If leaders exist, replace an underperformer with a random leader; otherwise, self-mutate.
+
+Mutation (Hyperparameters)
+--------------------------
+
+* Each param has a mutation function (e.g., ``mutate_float``, ``mutate_discount``, etc.).
+* A param is mutated with probability ``mutation_rate``.
+* When mutated, its value is perturbed within ``change_range = (min, max)``.
+* Only whitelisted keys (from the PBT config) are considered.
+
+Example Config
+--------------
+
+.. code-block:: yaml
+
+ pbt:
+ enabled: True
+ policy_idx: 0
+ num_policies: 8
+ directory: .
+ workspace: "pbt_workspace"
+ objective: episode.Curriculum/difficulty_level
+ interval_steps: 50000000
+ threshold_std: 0.1
+ threshold_abs: 0.025
+ mutation_rate: 0.25
+ change_range: [1.1, 2.0]
+ mutation:
+ agent.params.config.learning_rate: "mutate_float"
+ agent.params.config.grad_norm: "mutate_float"
+ agent.params.config.entropy_coef: "mutate_float"
+ agent.params.config.critic_coef: "mutate_float"
+ agent.params.config.bounds_loss_coef: "mutate_float"
+ agent.params.config.kl_threshold: "mutate_float"
+ agent.params.config.gamma: "mutate_discount"
+ agent.params.config.tau: "mutate_discount"
+
+
+``objective: episode.Curriculum/difficulty_level`` is the dotted expression that uses
+``infos["episode"]["Curriculum/difficulty_level"]`` as the scalar to **rank policies** (higher is better).
+With ``num_policies: 8``, launch eight processes sharing the same ``workspace`` and unique ``policy_idx`` (0-7).
+
+
+Launching PBT
+-------------
+
+You must start **one process per policy** and point them to the **same workspace**. Set a unique
+``policy_idx`` for each process and the common ``num_policies``.
+
+Minimal flags you need:
+
+* ``agent.pbt.enabled=True``
+* ``agent.pbt.directory=``
+* ``agent.pbt.policy_idx=<0..num_policies-1>``
+
+.. note::
+ All processes must use the same ``agent.pbt.workspace`` so they can see each other's checkpoints.
+
+.. caution::
+ PBT is currently supported **only** with the **rl_games** library. Other RL libraries are not supported yet.
+
+Tips
+----
+
+* Keep checkpoints reasonable: reduce ``interval_steps`` only if you really need tighter PBT cadence.
+* Use larger ``threshold_std`` and ``threshold_abs`` for greater population diversity.
+* It is recommended to run 6+ workers to see benefit of pbt.
+
+
+Training Example
+----------------
+
+We provide a reference PPO config here for task:
+`Isaac-Dexsuite-Kuka-Allegro-Lift-v0 `_.
+For the best logging experience, we recommend using wandb for the logging in the script.
+
+Launch *N* workers, where *n* indicates each worker index:
+
+.. code-block:: bash
+
+ # Run this once per worker (n = 0..N-1), all pointing to the same directory/workspace
+ ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py \
+ --seed= \
+ --task=Isaac-Dexsuite-Kuka-Allegro-Lift-v0 \
+ --num_envs=8192 \
+ --headless \
+ --track \
+ --wandb-name=idx \
+ --wandb-entity=<**entity**> \
+ --wandb-project-name=<**project**>
+ agent.pbt.enabled=True \
+ agent.pbt.num_policies= \
+ agent.pbt.policy_idx= \
+ agent.pbt.workspace=<**pbt_workspace_name**> \
+ agent.pbt.directory=<**/path/to/shared_folder**> \
+
+
+References
+----------
+
+This PBT implementation reimplements and is inspired by *Dexpbt: Scaling up dexterous manipulation for hand-arm systems with population based training* (Petrenko et al., 2023).
+
+.. code-block:: bibtex
+
+ @article{petrenko2023dexpbt,
+ title={Dexpbt: Scaling up dexterous manipulation for hand-arm systems with population based training},
+ author={Petrenko, Aleksei and Allshire, Arthur and State, Gavriel and Handa, Ankur and Makoviychuk, Viktor},
+ journal={arXiv preprint arXiv:2305.12127},
+ year={2023}
+ }
diff --git a/docs/source/features/ray.rst b/docs/source/features/ray.rst
index 1f18a804ed05..0edf935e8389 100644
--- a/docs/source/features/ray.rst
+++ b/docs/source/features/ray.rst
@@ -16,9 +16,14 @@ the general workflow is the same.
This functionality is experimental, and has been tested only on Linux.
-.. contents:: Table of Contents
- :depth: 3
- :local:
+.. warning::
+
+ **Security Notice**: Due to security risks associated with Ray,
+ this workflow is not intended for use outside of a strictly controlled
+ network environment. Ray clusters should only be deployed in trusted,
+ isolated networks with appropriate access controls and security measures in place.
+
+
Overview
--------
@@ -46,22 +51,28 @@ specifying the ``--num_workers`` argument for resource-wrapped jobs, or ``--num_
for tuning jobs, which is especially critical for parallel aggregate
job processing on local/virtual multi-GPU machines. Tuning jobs assume homogeneous node resource composition for nodes with GPUs.
-The two following files contain the core functionality of the Ray integration.
+The three following files contain the core functionality of the Ray integration.
.. dropdown:: scripts/reinforcement_learning/ray/wrap_resources.py
:icon: code
.. literalinclude:: ../../../scripts/reinforcement_learning/ray/wrap_resources.py
:language: python
- :emphasize-lines: 14-66
+ :emphasize-lines: 10-63
.. dropdown:: scripts/reinforcement_learning/ray/tuner.py
:icon: code
.. literalinclude:: ../../../scripts/reinforcement_learning/ray/tuner.py
:language: python
- :emphasize-lines: 18-53
+ :emphasize-lines: 18-59
+.. dropdown:: scripts/reinforcement_learning/ray/task_runner.py
+ :icon: code
+
+ .. literalinclude:: ../../../scripts/reinforcement_learning/ray/task_runner.py
+ :language: python
+ :emphasize-lines: 13-105
The following script can be used to submit aggregate
jobs to one or more Ray cluster(s), which can be used for
@@ -73,7 +84,7 @@ resource requirements.
.. literalinclude:: ../../../scripts/reinforcement_learning/ray/submit_job.py
:language: python
- :emphasize-lines: 12-53
+ :emphasize-lines: 13-61
The following script can be used to extract KubeRay cluster information for aggregate job submission.
@@ -91,7 +102,7 @@ The following script can be used to easily create clusters on Google GKE.
.. literalinclude:: ../../../scripts/reinforcement_learning/ray/launch.py
:language: python
- :emphasize-lines: 16-37
+ :emphasize-lines: 15-36
Docker-based Local Quickstart
-----------------------------
@@ -149,7 +160,26 @@ Submitting resource-wrapped individual jobs instead of automatic tuning runs is
.. literalinclude:: ../../../scripts/reinforcement_learning/ray/wrap_resources.py
:language: python
- :emphasize-lines: 14-66
+ :emphasize-lines: 10-63
+
+The ``task_runner.py`` dispatches Python tasks to a Ray cluster via a single declarative YAML file. This approach allows users to specify additional pip packages and Python modules for each run. Fine-grained resource allocation is supported, with explicit control over the number of CPUs, GPUs, and memory assigned to each task. The runner also offers advanced scheduling capabilities: tasks can be restricted to specific nodes by hostname or node ID, and supports two launch modes: tasks can be executed independently as resources become available, or grouped into a simultaneous batchโideal for multi-node training jobsโwhich ensures that all tasks launch together only when sufficient resources are available across the cluster.
+
+.. dropdown:: scripts/reinforcement_learning/ray/task_runner.py
+ :icon: code
+
+ .. literalinclude:: ../../../scripts/reinforcement_learning/ray/task_runner.py
+ :language: python
+ :emphasize-lines: 13-105
+
+To use this script, run a command similar to the following (replace ``tasks.yaml`` with your actual configuration file):
+
+.. code-block:: bash
+
+ python3 scripts/reinforcement_learning/ray/submit_job.py --aggregate_jobs task_runner.py --task_cfg tasks.yaml
+
+For detailed instructions on how to write your ``tasks.yaml`` file, please refer to the comments in ``task_runner.py``.
+
+**Tip:** Place the ``tasks.yaml`` file in the ``scripts/reinforcement_learning/ray`` directory so that it is included when the ``working_dir`` is uploaded. You can then reference it using a relative path in the command.
Transferring files from the running container can be done as follows.
@@ -290,7 +320,7 @@ where instructions are included in the following creation file.
.. literalinclude:: ../../../scripts/reinforcement_learning/ray/launch.py
:language: python
- :emphasize-lines: 15-37
+ :emphasize-lines: 15-36
For other cloud services, the ``kuberay.yaml.ninja`` will be similar to that of
Google's.
@@ -347,7 +377,7 @@ Dispatching Steps Shared Between KubeRay and Pure Ray Part II
.. literalinclude:: ../../../scripts/reinforcement_learning/ray/submit_job.py
:language: python
- :emphasize-lines: 12-53
+ :emphasize-lines: 13-61
3.) For tuning jobs, specify the tuning job / hyperparameter sweep as a :class:`JobCfg` .
The included :class:`JobCfg` only supports the ``rl_games`` workflow due to differences in
diff --git a/docs/source/features/reproducibility.rst b/docs/source/features/reproducibility.rst
index 9895a375d5d4..631e138376c9 100644
--- a/docs/source/features/reproducibility.rst
+++ b/docs/source/features/reproducibility.rst
@@ -10,7 +10,7 @@ or soft bodies. For more information, please refer to the `PhysX Determinism doc
Based on above, Isaac Lab provides a deterministic simulation that ensures consistent simulation
results across different runs. This is achieved by using the same random seed for the
simulation environment and the physics engine. At construction of the environment, the random seed
-is set to a fixed value using the :meth:`~isaacsim.core.utils.torch.set_seed` method. This method sets the
+is set to a fixed value using the :meth:`~isaaclab.utils.seed.configure_seed` method. This method sets the
random seed for both the CPU and GPU globally across different libraries, including PyTorch and
NumPy.
diff --git a/docs/source/how-to/add_own_library.rst b/docs/source/how-to/add_own_library.rst
index d74319ebd8ad..8a0347d65979 100644
--- a/docs/source/how-to/add_own_library.rst
+++ b/docs/source/how-to/add_own_library.rst
@@ -1,3 +1,5 @@
+.. _how-to-add-library:
+
Adding your own learning library
================================
@@ -5,7 +7,7 @@ Isaac Lab comes pre-integrated with a number of libraries (such as RSL-RL, RL-Ga
However, you may want to integrate your own library with Isaac Lab or use a different version of the libraries than
the one installed by Isaac Lab. This is possible as long as the library is available as Python package that supports
the Python version used by the underlying simulator. For instance, if you are using Isaac Sim 4.0.0 onwards, you need
-to ensure that the library is available for Python 3.10.
+to ensure that the library is available for Python 3.11.
Using a different version of a library
--------------------------------------
@@ -39,7 +41,7 @@ command:
.. code-block:: bash
- ./isaaclab.sh -p -m pip show rsl-rl
+ ./isaaclab.sh -p -m pip show rsl-rl-lib
This should now show the location of the ``rsl-rl`` library as the directory where you cloned the library.
For instance, if you cloned the library to ``/home/user/git/rsl_rl``, the output of the above command should be:
@@ -47,7 +49,7 @@ For instance, if you cloned the library to ``/home/user/git/rsl_rl``, the output
.. code-block:: bash
Name: rsl_rl
- Version: 2.0.2
+ Version: 3.0.1
Summary: Fast and simple RL algorithms implemented in pytorch
Home-page: https://github.com/leggedrobotics/rsl_rl
Author: ETH Zurich, NVIDIA CORPORATION
@@ -63,12 +65,12 @@ Integrating a new library
Adding a new library to Isaac Lab is similar to using a different version of a library. You can install the library
in your Python environment and use it in your experiments. However, if you want to integrate the library with
-Isaac Lab, you can will first need to make a wrapper for the library, as explained in
+Isaac Lab, you will first need to make a wrapper for the library, as explained in
:ref:`how-to-env-wrappers`.
The following steps can be followed to integrate a new library with Isaac Lab:
-1. Add your library as an extra-dependency in the ``setup.py`` for the extension ``isaaclab_tasks``.
+1. Add your library as an extra-dependency in the ``setup.py`` for the extension ``isaaclab_rl``.
This will ensure that the library is installed when you install Isaac Lab or it will complain if the library is not
installed or available.
2. Install your library in the Python environment used by Isaac Lab. You can do this by following the steps mentioned
@@ -86,6 +88,15 @@ works as expected and can guide users on how to use the wrapper.
* Add some tests to ensure that the wrapper works as expected and remains compatible with the library.
These tests can be added to the ``source/isaaclab_rl/test`` directory.
* Add some documentation for the wrapper. You can add the API documentation to the
- ``docs/source/api/lab_tasks/isaaclab_rl.rst`` file.
+ :ref:`API documentation` for the ``isaaclab_rl`` module.
+
+
+Configuring an RL Agent
+-----------------------
+
+Once you have integrated a new library with Isaac Lab, you can configure the example environment to use the new library.
+You can check the :ref:`tutorial-configure-rl-training` for an example of how to configure the training process to use a
+different library.
+
.. _rsl-rl: https://github.com/leggedrobotics/rsl_rl
diff --git a/docs/source/how-to/cloudxr_teleoperation.rst b/docs/source/how-to/cloudxr_teleoperation.rst
new file mode 100644
index 000000000000..e13b76305dcb
--- /dev/null
+++ b/docs/source/how-to/cloudxr_teleoperation.rst
@@ -0,0 +1,1132 @@
+.. _cloudxr-teleoperation:
+
+Setting up CloudXR Teleoperation
+================================
+
+.. currentmodule:: isaaclab
+
+`NVIDIA CloudXR`_ enables seamless, high-fidelity immersive streaming to extended reality (XR)
+devices over any network.
+
+Isaac Lab developers can use CloudXR with Isaac Lab to build teleoperation workflows that require
+immersive XR rendering for increased spatial acuity and/or hand tracking for teleoperation of
+dextrous robots.
+
+In these workflows, Isaac Lab renders and submits stereo views of the robot simulation to CloudXR,
+which then encodes and streams the rendered views to a compatible XR device in realtime using a
+low-latency, GPU-accelerated pipeline. Control inputs such as hand tracking data are sent from the
+XR device back to Isaac Lab through CloudXR, where they can be used to control the robot.
+
+This guide explains how to use CloudXR and `Apple Vision Pro`_ for immersive streaming and
+teleoperation in Isaac Lab.
+
+.. note::
+
+ See :ref:`manus-vive-handtracking` for more information on supported hand-tracking peripherals.
+
+.. note::
+
+ **Meta Quest 3 and Pico 4 Ultra Support (Early Access)**
+
+ Meta Quest 3 and Pico 4 Ultra are now supported via the `CloudXR Early Access program`_.
+ Join the program by mentioning isaac use cases. Once approved, you'll receive email to set up NGC,
+ then download `CloudXR.js with Isaac Teleop samples`_ and follow its guide.
+ Pico 4 Ultra must use HTTPS mode (see NGC documentation for details). General availability
+ will be provided in a future version of Isaac Lab.
+
+.. _`CloudXR Early Access program`: https://developer.nvidia.com/cloudxr-sdk-early-access-program/join
+.. _`CloudXR.js with Isaac Teleop samples`: https://catalog.ngc.nvidia.com/orgs/nvidia/resources/cloudxr-js-early-access?version=6.0.0-beta
+
+Overview
+--------
+
+Using CloudXR with Isaac Lab involves the following components:
+
+* **Isaac Lab** is used to simulate the robot environment and apply control data received from the
+ teleoperator.
+
+* The **NVIDIA CloudXR Runtime** runs on the Isaac Lab workstation in a Docker container, and streams
+ the virtual simulation from Isaac Lab to compatible XR devices.
+
+* The **Isaac XR Teleop Sample Client** is a sample app for Apple Vision Pro which enables
+ immersive streaming and teleoperation of an Isaac Lab simulation using CloudXR.
+
+This guide will walk you through how to:
+
+* :ref:`run-isaac-lab-with-the-cloudxr-runtime`
+
+* :ref:`use-apple-vision-pro`, including how to :ref:`build-apple-vision-pro`,
+ :ref:`teleoperate-apple-vision-pro`, and :ref:`manus-vive-handtracking`.
+
+* :ref:`develop-xr-isaac-lab`, including how to :ref:`run-isaac-lab-with-xr`,
+ :ref:`configure-scene-placement`, and :ref:`optimize-xr-performance`.
+
+* :ref:`control-robot-with-xr`, including the :ref:`openxr-device-architecture`,
+ :ref:`control-robot-with-xr-retargeters`, and how to implement :ref:`control-robot-with-xr-callbacks`.
+
+As well as :ref:`xr-known-issues`.
+
+
+System Requirements
+-------------------
+
+Prior to using CloudXR with Isaac Lab, please review the following system requirements:
+
+ * Isaac Lab workstation
+
+ * Ubuntu 22.04 or Ubuntu 24.04
+ * Hardware requirements to sustain 45 FPS with a 120Hz physics simulation:
+ * CPU: 16-Cores AMD Ryzen Threadripper Pro 5955WX or higher
+ * Memory: 64GB RAM
+ * GPU: 1x RTX PRO 6000 GPUs (or equivalent e.g. 1x RTX 5090) or higher
+ * For details on driver requirements, please see the `Technical Requirements `_ guide
+ * `Docker`_ 26.0.0+, `Docker Compose`_ 2.25.0+, and the `NVIDIA Container Toolkit`_. Refer to
+ the Isaac Lab :ref:`deployment-docker` for how to install.
+
+ * Apple Vision Pro
+
+ * visionOS 26
+ * Apple M3 Pro chip with an 11-core CPU with at least 5 performance cores and 6 efficiency cores
+ * 16GB unified memory
+ * 256 GB SSD
+
+ * Apple Silicon based Mac (for building the Isaac XR Teleop Sample Client App for Apple Vision Pro
+ with Xcode)
+
+ * macOS Sequoia 15.6 or later
+ * Xcode 26.0
+
+ * Wifi 6 capable router
+
+ * A strong wireless connection is essential for a high-quality streaming experience. Refer to the
+ requirements of `Omniverse Spatial Streaming`_ for more details.
+ * We recommend using a dedicated router, as concurrent usage will degrade quality
+ * The Apple Vision Pro and Isaac Lab workstation must be IP-reachable from one another (note:
+ many institutional wireless networks will prevent devices from reaching each other, resulting
+ in the Apple Vision Pro being unable to find the Isaac Lab workstation on the network)
+
+.. note::
+ If you are using DGX Spark, check `DGX Spark Limitations `_ for compatibility.
+
+
+.. _`Omniverse Spatial Streaming`: https://docs.omniverse.nvidia.com/avp/latest/setup-network.html
+
+
+.. _run-isaac-lab-with-the-cloudxr-runtime:
+
+Run Isaac Lab with the CloudXR Runtime
+--------------------------------------
+
+The CloudXR Runtime runs in a Docker container on your Isaac Lab workstation, and is responsible for
+streaming the Isaac Lab simulation to a compatible XR device.
+
+Ensure that `Docker`_, `Docker Compose`_, and the `NVIDIA Container Toolkit`_ are installed on your
+Isaac Lab workstation as described in the Isaac Lab :ref:`deployment-docker`.
+
+Also ensure that your firewall allows connections to the ports used by CloudXR by running:
+
+.. code:: bash
+
+ sudo ufw allow 47998:48000,48005,48008,48012/udp
+ sudo ufw allow 48010/tcp
+
+There are two options to run the CloudXR Runtime Docker container:
+
+.. dropdown:: Option 1 (Recommended): Use Docker Compose to run the Isaac Lab and CloudXR Runtime
+ containers together
+ :open:
+
+ On your Isaac Lab workstation:
+
+ #. From the root of the Isaac Lab repository, start the Isaac Lab and CloudXR Runtime containers
+ using the Isaac Lab ``container.py`` script
+
+ .. code:: bash
+
+ ./docker/container.py start \
+ --files docker-compose.cloudxr-runtime.patch.yaml \
+ --env-file .env.cloudxr-runtime
+
+ If prompted, elect to activate X11 forwarding, which is necessary to see the Isaac Sim UI.
+
+ .. note::
+
+ The ``container.py`` script is a thin wrapper around Docker Compose. The additional
+ ``--files`` and ``--env-file`` arguments augment the base Docker Compose configuration to
+ additionally run the CloudXR Runtime
+
+ For more details on ``container.py`` and running Isaac Lab with Docker Compose, see the
+ :ref:`deployment-docker`.
+
+ #. Enter the Isaac Lab base container with:
+
+ .. code:: bash
+
+ ./docker/container.py enter base
+
+ From within the Isaac Lab base container, you can run Isaac Lab scripts that use XR.
+
+ #. Run an example teleop task with:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \
+ --task Isaac-PickPlace-GR1T2-Abs-v0 \
+ --teleop_device handtracking \
+ --enable_pinocchio
+
+ #. You'll want to leave the container running for the next steps. But once you are finished, you can
+ stop the containers with:
+
+ .. code:: bash
+
+ ./docker/container.py stop \
+ --files docker-compose.cloudxr-runtime.patch.yaml \
+ --env-file .env.cloudxr-runtime
+
+ .. tip::
+
+ If you encounter issues on restart, you can run the following command to clean up orphaned
+ containers:
+
+ .. code:: bash
+
+ docker system prune -f
+
+.. dropdown:: Option 2: Run Isaac Lab as a local process and CloudXR Runtime container with Docker
+
+ Isaac Lab can be run as a local process that connects to the CloudXR Runtime Docker container.
+ However, this method requires manually specifying a shared directory for communication between
+ the Isaac Lab instance and the CloudXR Runtime.
+
+ On your Isaac Lab workstation:
+
+ #. From the root of the Isaac Lab repository, create a local folder for temporary cache files:
+
+ .. code:: bash
+
+ mkdir -p $(pwd)/openxr
+
+ #. Start the CloudXR Runtime, mounting the directory created above to the ``/openxr`` directory in
+ the container:
+
+ .. code:: bash
+
+ docker run -it --rm --name cloudxr-runtime \
+ --user $(id -u):$(id -g) \
+ --gpus=all \
+ -e "ACCEPT_EULA=Y" \
+ --mount type=bind,src=$(pwd)/openxr,dst=/openxr \
+ -p 48010:48010 \
+ -p 47998:47998/udp \
+ -p 47999:47999/udp \
+ -p 48000:48000/udp \
+ -p 48005:48005/udp \
+ -p 48008:48008/udp \
+ -p 48012:48012/udp \
+ nvcr.io/nvidia/cloudxr-runtime:5.0.1
+
+ .. note::
+ If you choose a particular GPU instead of ``all``, you need to make sure Isaac Lab also runs
+ on that GPU.
+
+ .. tip::
+
+ If you encounter issues on running cloudxr-runtime container, you can run the following
+ command to clean up the orphaned container:
+
+ .. code:: bash
+
+ docker stop cloudxr-runtime
+ docker rm cloudxr-runtime
+
+ #. In a new terminal where you intend to run Isaac Lab, export the following environment
+ variables, which reference the directory created above:
+
+ .. code:: bash
+
+ export XDG_RUNTIME_DIR=$(pwd)/openxr/run
+ export XR_RUNTIME_JSON=$(pwd)/openxr/share/openxr/1/openxr_cloudxr.json
+
+ You can now run Isaac Lab scripts that use XR.
+
+ #. Run an example teleop task with:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \
+ --task Isaac-PickPlace-GR1T2-Abs-v0 \
+ --teleop_device handtracking \
+ --enable_pinocchio
+
+With Isaac Lab and the CloudXR Runtime running:
+
+#. In the Isaac Sim UI: locate the Panel named **AR** and choose the following options:
+
+ * Selected Output Plugin: **OpenXR**
+
+ * OpenXR Runtime: **System OpenXR Runtime**
+
+ .. figure:: ../_static/setup/cloudxr_ar_panel.jpg
+ :align: center
+ :figwidth: 50%
+ :alt: Isaac Sim UI: AR Panel
+
+ .. note::
+ Isaac Sim lets you choose from several OpenXR runtime options:
+
+ * **System OpenXR Runtime**: Use a runtime installed outside of Isaac Lab, such as the CloudXR Runtime set up via Docker in this tutorial.
+
+ * **CloudXR Runtime (5.0)**: Use the built-in CloudXR Runtime.
+
+ * **Custom**: Allow you to specify and run any custom OpenXR Runtime of your choice.
+
+#. Click **Start AR**.
+
+The Viewport should show two eyes being rendered, and you should see the status "AR profile is
+active".
+
+.. figure:: ../_static/setup/cloudxr_viewport.jpg
+ :align: center
+ :figwidth: 100%
+ :alt: Isaac Lab viewport rendering two eyes
+
+Isaac Lab is now ready to receive connections from a CloudXR client. The next sections will walk
+you through building and connecting a CloudXR client.
+
+.. admonition:: Learn More about Teleoperation and Imitation Learning in Isaac Lab
+
+ To learn more about the Isaac Lab teleoperation scripts, and how to build new teleoperation and
+ imitation learning workflows in Isaac Lab, see :ref:`teleoperation-imitation-learning`.
+
+
+.. _use-apple-vision-pro:
+
+Use Apple Vision Pro for Teleoperation
+--------------------------------------
+
+This section will walk you through building and installing the Isaac XR Teleop Sample Client for
+Apple Vision Pro, connecting to Isaac Lab, and teleoperating a simulated robot.
+
+
+.. _build-apple-vision-pro:
+
+Build and Install the Isaac XR Teleop Sample Client App for Apple Vision Pro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On your Mac:
+
+#. Clone the `Isaac XR Teleop Sample Client`_ GitHub repository:
+
+ .. code-block:: bash
+
+ git clone git@github.com:isaac-sim/isaac-xr-teleop-sample-client-apple.git
+
+#. Check out the App version that matches your Isaac Lab version:
+
+ +-------------------+---------------------+
+ | Isaac Lab Version | Client App Version |
+ +-------------------+---------------------+
+ | 2.3 | v2.3.0 |
+ +-------------------+---------------------+
+ | 2.2 | v2.2.0 |
+ +-------------------+---------------------+
+ | 2.1 | v1.0.0 |
+ +-------------------+---------------------+
+
+ .. code-block:: bash
+
+ git checkout
+
+#. Follow the README in the repository to build and install the app on your Apple Vision Pro.
+
+
+.. _teleoperate-apple-vision-pro:
+
+Teleoperate an Isaac Lab Robot with Apple Vision Pro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+With the Isaac XR Teleop Sample Client installed on your Apple Vision Pro, you are ready to connect
+to Isaac Lab.
+
+.. tip::
+
+ **Before wearing the headset**, you can first verify connectivity from your Mac:
+
+ .. code:: bash
+
+ # Test signaling port (replace with your workstation IP)
+ nc -vz 48010
+
+ Expected output: ``Connection to port 48010 [tcp/*] succeeded!``
+
+ If the connection fails, check that the runtime container is running (``docker ps``) and no stale
+ runtime container is blocking ports.
+
+On your Isaac Lab workstation:
+
+#. Ensure that Isaac Lab and CloudXR are both running as described in
+ :ref:`run-isaac-lab-with-the-cloudxr-runtime`, including starting Isaac Lab with a script that
+ supports teleoperation. For example:
+
+ .. code-block:: bash
+
+ ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \
+ --task Isaac-PickPlace-GR1T2-Abs-v0 \
+ --teleop_device handtracking \
+ --enable_pinocchio
+
+ .. note::
+ Recall that the script above should either be run within the Isaac Lab Docker container
+ (Option 1, recommended), or with environment variables configured to a directory shared by a
+ running CloudXR Runtime Docker container (Option 2).
+
+#. Locate the Panel named **AR**.
+
+#. Click **Start AR** and ensure that the Viewport shows two eyes being rendered.
+
+Back on your Apple Vision Pro:
+
+#. Open the Isaac XR Teleop Sample Client. You should see a UI window:
+
+ .. figure:: ../_static/setup/cloudxr_avp_connect_ui.jpg
+ :align: center
+ :figwidth: 50%
+ :alt: Isaac Sim UI: AR Panel
+
+#. Enter the IP address of your Isaac Lab workstation.
+
+ .. note::
+ The Apple Vision Pro and Isaac Lab machine must be IP-reachable from one another.
+
+ We recommend using a dedicated Wifi 6 router for this process, as many institutional wireless
+ networks will prevent devices from reaching each other, resulting in the Apple Vision Pro
+ being unable to find the Isaac Lab workstation on the network.
+
+#. Click **Connect**.
+
+ The first time you attempt to connect, you may need to allow the application access to
+ permissions such as hand tracking and local network usage, and then connect again.
+
+#. After a brief period, you should see the Isaac Lab simulation rendered in the Apple Vision Pro,
+ as well as a set of controls for teleoperation.
+
+ .. figure:: ../_static/setup/cloudxr_avp_teleop_ui.jpg
+ :align: center
+ :figwidth: 50%
+ :alt: Isaac Sim UI: AR Panel
+
+#. Click **Play** to begin teleoperating the simulated robot. The robot motion should now be
+ directed by your hand movements.
+
+ You may repeatedly **Play**, **Stop**, and **Reset** the teleoperation session using the UI
+ controls.
+
+ .. tip::
+ For teleoperation tasks that require bimanual manipulation, visionOS accessibility features
+ can be used to control teleoperation without the use of hand gestures. For example, in order
+ to enable voice control of the UI:
+
+ #. In **Settings** > **Accessibility** > **Voice Control**, Turn on **Voice Control**
+
+ #. In **Settings** > **Accessibility** > **Voice Control** > **Commands** > **Basic
+ Navigation** > Turn on ****
+
+ #. Now you can say "Play", "Stop", and "Reset" to control teleoperation while the app is
+ connected.
+
+#. Teleoperate the simulated robot by moving your hands.
+
+ .. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/cloudxr_bimanual_teleop.gif
+ :align: center
+ :alt: Isaac Lab teleoperation of a bimanual dexterous robot with CloudXR
+
+ .. note::
+
+ The red dots represent the tracked position of the hand joints. Latency or offset between the
+ motion of the dots and the robot may be caused by the limits of the robot joints and/or robot
+ controller.
+
+ .. note::
+ When the inverse kinematics solver fails to find a valid solution, an error message will appear
+ in the XR device display. To recover from this state, click the **Reset** button to return
+ the robot to its original pose and continue teleoperation.
+
+ .. figure:: ../_static/setup/cloudxr_avp_ik_error.jpg
+ :align: center
+ :figwidth: 80%
+ :alt: IK Error Message Display in XR Device
+
+
+
+#. When you are finished with the example, click **Disconnect** to disconnect from Isaac Lab.
+
+.. admonition:: Learn More about Teleoperation and Imitation Learning in Isaac Lab
+
+ See :ref:`teleoperation-imitation-learning` to learn how to record teleoperated demonstrations
+ and build teleoperation and imitation learning workflows with Isaac Lab.
+
+
+.. _manus-vive-handtracking:
+
+Manus + Vive Hand Tracking
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Manus gloves and HTC Vive trackers can provide hand tracking when optical hand tracking from a headset is occluded.
+This setup expects Manus gloves with a Manus SDK license and Vive trackers attached to the gloves.
+Requires Isaac Sim 5.1 or later.
+
+Run the teleoperation example with Manus + Vive tracking:
+
+.. dropdown:: Installation instructions
+ :open:
+
+ Vive tracker integration is provided through the libsurvive library.
+
+ To install, clone the repository, build the python package, and install the required udev rules.
+ In your Isaac Lab virtual environment, run the following commands:
+
+ .. code-block:: bash
+
+ git clone https://github.com/collabora/libsurvive.git
+ cd libsurvive
+ pip install scikit-build
+ python setup.py install
+
+ sudo cp ./useful_files/81-vive.rules /etc/udev/rules.d/
+ sudo udevadm control --reload-rules && sudo udevadm trigger
+
+
+ The Manus integration is provided through the Isaac Sim teleoperation input plugin framework.
+ Install the plugin by following the build and installation steps in `isaac-teleop-device-plugins `_.
+
+In the same terminal from which you will launch Isaac Lab, set:
+
+.. code-block:: bash
+
+ export ISAACSIM_HANDTRACKER_LIB=/build-manus-default/lib/libIsaacSimManusHandTracking.so
+
+Once the plugin is installed, run the teleoperation example:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py \
+ --task Isaac-PickPlace-GR1T2-Abs-v0 \
+ --teleop_device manusvive \
+ --xr \
+ --enable_pinocchio
+
+The recommended workflow, is to start Isaac Lab, click **Start AR**, and then put on the Manus gloves, vive trackers, and
+headset. Once you are ready to begin the session, use voice commands to launch the Isaac XR teleop sample client and
+connect to Isaac Lab.
+
+Isaac Lab automatically calibrates the Vive trackers using wrist pose data from the Apple Vision Pro during the initial
+frames of the session. If calibration fails, for example, if the red dots do not accurately follow the teleoperator's
+hands, restart Isaac Lab and begin with your hands in a palm-up position to improve calibration reliability.
+
+For optimal performance, position the lighthouse above the hands, tilted slightly downward.
+Ensure the lighthouse remains stable; a stand is recommended to prevent wobbling.
+
+Ensure that while the task is being teleoperated, the hands remain stable and visible to the lighthouse at all times.
+See: `Installing the Base Stations `_
+and `Tips for Setting Up the Base Stations `_
+
+.. note::
+
+ On first launch of the Manus Vive device, the Vive lighthouses may take a few seconds to calibrate. Keep the Vive trackers
+ stable and visible to the lighthouse during this time. If the light houses are moved or if tracking fails or is unstable,
+ calibration can be forced by deleting the calibration file at: ``$XDG_RUNTIME_DIR/libsurvive/config.json``. If XDG_RUNTIME_DIR
+ is not set, the default directory is ``~/.config/libsurvive``.
+
+ For more information consult the libsurvive documentation: `libsurvive `_.
+
+For optimal performance, position the lighthouse above the hands, tilted slightly downward.
+One lighthouse is sufficient if both hands are visible.
+Ensure the lighthouse remains stable; a stand is recommended to prevent wobbling.
+
+.. note::
+
+ To avoid resource contention and crashes, ensure Manus and Vive devices are connected to different USB controllers/buses.
+ Use ``lsusb -t`` to identify different buses and connect devices accordingly.
+
+ Vive trackers are automatically calculated to map to the left and right wrist joints obtained from a stable
+ OpenXR hand tracking wrist pose.
+ This auto-mapping calculation supports up to 2 Vive trackers;
+ if more than 2 Vive trackers are detected, it uses the first two trackers detected for calibration, which may not be correct.
+
+.. _develop-xr-isaac-lab:
+
+Develop for XR in Isaac Lab
+---------------------------
+
+This section will walk you through how to develop XR environments in Isaac Lab for building
+teleoperation workflows.
+
+
+.. _run-isaac-lab-with-xr:
+
+Run Isaac Lab with XR Extensions Enabled
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In order to enable extensions necessary for XR, and to see the AR Panel in the UI, Isaac Lab must be
+loaded with an XR experience file. This can be done automatically by passing the ``--xr`` flag to
+any Isaac Lab script that uses :class:`app.AppLauncher`.
+
+For example: you can enable and use XR in any of the :ref:`tutorials` by invoking them with the
+additional ``--xr`` flag.
+
+
+.. _configure-scene-placement:
+
+Configure XR Scene Placement
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Placement of the robot simulation within the XR device's local coordinate frame can be achieved
+using an XR anchor, and is configurable using the ``xr`` field (type :class:`openxr.XrCfg`) in the
+environment configuration.
+
+Specifically: the pose specified by the ``anchor_pos`` and ``anchor_rot`` fields of the
+:class:`openxr.XrCfg` will appear at the origin of the XR device's local coordinate frame, which
+should be on the floor.
+
+.. note::
+
+ On Apple Vision Pro, the local coordinate frame can be reset to a point on the floor beneath the
+ user by holding the digital crown.
+
+For example: if a robot should appear at the position of the user, the ``anchor_pos`` and
+``anchor_rot`` properties should be set to a pose on the floor directly beneath the robot.
+
+.. note::
+
+ The XR anchor configuration is applied in :class:`openxr.OpenXRDevice` by creating a prim at the
+ position of the anchor, and modifying the ``xr/profile/ar/anchorMode`` and
+ ``/xrstage/profile/ar/customAnchor`` settings.
+
+ If you are running a script that does not use :class:`openxr.OpenXRDevice`, you will need to do
+ this explicitly.
+
+
+.. _optimize-xr-performance:
+
+Optimize XR Performance
+~~~~~~~~~~~~~~~~~~~~~~~
+
+.. dropdown:: Configure the physics and render time step
+ :open:
+
+ In order to provide a high-fidelity immersive experience, it is recommended to ensure that the
+ simulation render time step roughly matches the XR device display time step.
+
+ It is also important to ensure that this time step can be simulated and rendered in real time.
+
+ The Apple Vision Pro display runs at 90Hz, but many Isaac Lab simulations will not achieve 90Hz
+ performance when rendering stereo views for XR; so for best experience on Apple Vision Pro, we
+ suggest running with a simulation dt of 90Hz and a render interval of 2, meaning that the
+ simulation is rendered once for every two simulation steps, or at 45Hz, if performance allows.
+
+ You can still set the simulation dt lower or higher depending on your requirements, but this may
+ result in the simulation appearing faster or slower when rendered in XR.
+
+ Overriding the time step configuration for an environment can be done by modifying the
+ :class:`sim.SimulationCfg` in the environment's ``__post_init__`` function. For instance:
+
+ .. code-block:: python
+
+ @configclass
+ class XrTeleopEnvCfg(ManagerBasedRLEnvCfg):
+
+ def __post_init__(self):
+ self.sim.dt = 1.0 / 90
+ self.sim.render_interval = 2
+
+ Also note that by default the CloudXR Runtime attempts to dynamically adjust its pacing based on
+ how long Isaac Lab takes to render. If render times are highly variable, this can lead to the
+ simulation appearing to speed up or slow down when rendered in XR. If this is an issue, the
+ CloudXR Runtime can be configured to use a fixed time step by setting the environment variable
+ ``NV_PACER_FIXED_TIME_STEP_MS`` to an integer quantity when starting the CloudXR Runtime Docker
+ containere.
+
+
+.. dropdown:: Try running physics on CPU
+ :open:
+
+ It is currently recommended to try running Isaac Lab teleoperation scripts with the ``--device
+ cpu`` flag. This will cause Physics calculations to be done on the CPU, which may be reduce
+ latency when only a single environment is present in the simulation.
+
+
+.. _control-robot-with-xr:
+
+Control the Robot with XR Device Inputs
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Isaac Lab provides a flexible architecture for using XR tracking data to control
+simulated robots. This section explains the components of this architecture and how they work together.
+
+.. _openxr-device-architecture:
+
+OpenXR Device
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The :class:`isaaclab.devices.OpenXRDevice` is the core component that enables XR-based teleoperation in Isaac Lab.
+This device interfaces with CloudXR to receive tracking data from the XR headset and transform it into robot control
+commands.
+
+At its heart, XR teleoperation requires mapping (or "retargeting") user inputs, such as hand movements and poses,
+into robot control signals. Isaac Lab makes this straightforward through its OpenXRDevice and Retargeter architecture.
+The OpenXRDevice captures hand tracking data via Isaac Sim's OpenXR API, then passes this data through one or more
+Retargeters that convert it into robot actions.
+
+The OpenXRDevice also integrates with the XR device's user interface when using CloudXR, allowing users to trigger
+simulation events directly from their XR environment.
+
+.. _control-robot-with-xr-retargeters:
+
+Retargeting Architecture
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Retargeters are specialized components that convert raw tracking data into meaningful control signals
+for robots. They implement the :class:`isaaclab.devices.RetargeterBase` interface and are passed to
+the OpenXRDevice during initialization.
+
+Isaac Lab provides three main retargeters for hand tracking:
+
+.. dropdown:: Se3RelRetargeter (:class:`isaaclab.devices.openxr.retargeters.Se3RelRetargeter`)
+
+ * Generates incremental robot commands from relative hand movements
+ * Best for precise manipulation tasks
+
+.. dropdown:: Se3AbsRetargeter (:class:`isaaclab.devices.openxr.retargeters.Se3AbsRetargeter`)
+
+ * Maps hand position directly to robot end-effector position
+ * Enables 1:1 spatial control
+
+.. dropdown:: GripperRetargeter (:class:`isaaclab.devices.openxr.retargeters.GripperRetargeter`)
+
+ * Controls gripper state based on thumb-index finger distance
+ * Used alongside position retargeters for full robot control
+
+.. dropdown:: GR1T2Retargeter (:class:`isaaclab.devices.openxr.retargeters.GR1T2Retargeter`)
+
+ * Retargets OpenXR hand tracking data to GR1T2 hand end-effector commands
+ * Handles both left and right hands, converting hand poses to joint angles for the GR1T2 robot's hands
+ * Supports visualization of tracked hand joints
+
+.. dropdown:: UnitreeG1Retargeter (:class:`isaaclab.devices.openxr.retargeters.UnitreeG1Retargeter`)
+
+ * Retargets OpenXR hand tracking data to Unitree G1 using Inspire 5-finger hand end-effector commands
+ * Handles both left and right hands, converting hand poses to joint angles for the G1 robot's hands
+ * Supports visualization of tracked hand joints
+
+Retargeters can be combined to control different robot functions simultaneously.
+
+Using Retargeters with Hand Tracking
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Here's an example of setting up hand tracking:
+
+.. code-block:: python
+
+ from isaaclab.devices import OpenXRDevice, OpenXRDeviceCfg
+ from isaaclab.devices.openxr.retargeters import Se3AbsRetargeter, GripperRetargeter
+
+ # Create retargeters
+ position_retargeter = Se3AbsRetargeter(
+ bound_hand=DeviceBase.TrackingTarget.HAND_RIGHT,
+ zero_out_xy_rotation=True,
+ use_wrist_position=False # Use pinch position (thumb-index midpoint) instead of wrist
+ )
+ gripper_retargeter = GripperRetargeter(bound_hand=DeviceBase.TrackingTarget.HAND_RIGHT)
+
+ # Create OpenXR device with hand tracking and both retargeters
+ device = OpenXRDevice(
+ OpenXRDeviceCfg(xr_cfg=env_cfg.xr),
+ retargeters=[position_retargeter, gripper_retargeter],
+ )
+
+ # Main control loop
+ while True:
+ # Get the latest commands from the XR device
+ commands = device.advance()
+ if commands is None:
+ continue
+
+ # Apply the commands to the environment
+ obs, reward, terminated, truncated, info = env.step(commands)
+
+ if terminated or truncated:
+ break
+
+Here's a diagram for the dataflow and algorithm used in humanoid teleoperation. Using Apple Vision Pro, we collect 26 keypoints for each hand.
+The wrist keypoint is used to control the hand end-effector, while the remaining hand keypoints are used for hand retargeting.
+
+.. figure:: ../_static/teleop/teleop_diagram.jpg
+ :align: center
+ :figwidth: 80%
+ :alt: teleop_diagram
+
+For dex-retargeting, we are currently using the Dexpilot optimizer, which relies on the five fingertips and the palm for retargeting. It is essential
+that the links used for retargeting are defined exactly at the fingertipsโnot in the middle of the fingersโto ensure accurate optimization.Please refer
+to the image below for hand asset selection, find a suitable hand asset, or add fingertip links in IsaacLab as needed.
+
+.. figure:: ../_static/teleop/hand_asset.jpg
+ :align: center
+ :figwidth: 60%
+ :alt: hand_asset
+
+.. _control-robot-with-xr-callbacks:
+
+Adding Callbacks for XR UI Events
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The OpenXRDevice can handle events triggered by user interactions with XR UI elements like buttons and menus.
+When a user interacts with these elements, the device triggers registered callback functions:
+
+.. code-block:: python
+
+ # Register callbacks for teleop control events
+ device.add_callback("RESET", reset_callback)
+ device.add_callback("START", start_callback)
+ device.add_callback("STOP", stop_callback)
+
+When the user interacts with the XR UI, these callbacks will be triggered to control the simulation
+or recording process. You can also add custom messages from the client side using custom keys that will
+trigger these callbacks, allowing for programmatic control of the simulation alongside direct user interaction.
+The custom keys can be any string value that matches the callback registration.
+
+
+Teleop Environment Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+XR-based teleoperation can be integrated with Isaac Lab's environment configuration system using the
+``teleop_devices`` field in your environment configuration:
+
+.. code-block:: python
+
+ from dataclasses import field
+ from isaaclab.envs import ManagerBasedEnvCfg
+ from isaaclab.devices import DevicesCfg, OpenXRDeviceCfg
+ from isaaclab.devices.openxr import XrCfg
+ from isaaclab.devices.openxr.retargeters import Se3AbsRetargeterCfg, GripperRetargeterCfg
+
+ @configclass
+ class MyEnvironmentCfg(ManagerBasedEnvCfg):
+ """Configuration for a teleoperation-enabled environment."""
+
+ # Add XR configuration with custom anchor position
+ xr: XrCfg = XrCfg(
+ anchor_pos=[0.0, 0.0, 0.0],
+ anchor_rot=[1.0, 0.0, 0.0, 0.0]
+ )
+
+ # Define teleoperation devices
+ teleop_devices: DevicesCfg = field(default_factory=lambda: DevicesCfg(
+ # Configuration for hand tracking with absolute position control
+ handtracking=OpenXRDeviceCfg(
+ xr_cfg=None, # Will use environment's xr config
+ retargeters=[
+ Se3AbsRetargeterCfg(
+ bound_hand=0, # HAND_LEFT enum value
+ zero_out_xy_rotation=True,
+ use_wrist_position=False,
+ ),
+ GripperRetargeterCfg(bound_hand=0),
+ ]
+ ),
+ # Add other device configurations as needed
+ ))
+
+
+Teleop Device Factory
+^^^^^^^^^^^^^^^^^^^^^
+
+To create a teleoperation device from your environment configuration, use the ``create_teleop_device`` factory function:
+
+.. code-block:: python
+
+ from isaaclab.devices import create_teleop_device
+ from isaaclab.envs import ManagerBasedEnv
+
+ # Create environment from configuration
+ env_cfg = MyEnvironmentCfg()
+ env = ManagerBasedEnv(env_cfg)
+
+ # Define callbacks for teleop events
+ callbacks = {
+ "RESET": lambda: print("Reset simulation"),
+ "START": lambda: print("Start teleoperation"),
+ "STOP": lambda: print("Stop teleoperation"),
+ }
+
+ # Create teleop device from configuration with callbacks
+ device_name = "handtracking" # Must match a key in teleop_devices
+ device = create_teleop_device(
+ device_name,
+ env_cfg.teleop_devices,
+ callbacks=callbacks
+ )
+
+ # Use device in control loop
+ while True:
+ # Get the latest commands from the device
+ commands = device.advance()
+ if commands is None:
+ continue
+
+ # Apply commands to environment
+ obs, reward, terminated, truncated, info = env.step(commands)
+
+
+Extending the Retargeting System
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The retargeting system is designed to be extensible. You can create custom retargeters by following these steps:
+
+1. Create a configuration dataclass for your retargeter:
+
+.. code-block:: python
+
+ from dataclasses import dataclass
+ from isaaclab.devices.retargeter_base import RetargeterCfg
+
+ @dataclass
+ class MyCustomRetargeterCfg(RetargeterCfg):
+ """Configuration for my custom retargeter."""
+ scaling_factor: float = 1.0
+ filter_strength: float = 0.5
+ # Add any other configuration parameters your retargeter needs
+
+2. Implement your retargeter class by extending the RetargeterBase:
+
+.. code-block:: python
+
+ from isaaclab.devices.retargeter_base import RetargeterBase
+ from isaaclab.devices import OpenXRDevice
+ import torch
+ from typing import Any
+
+ class MyCustomRetargeter(RetargeterBase):
+ """A custom retargeter that processes OpenXR tracking data."""
+
+ def __init__(self, cfg: MyCustomRetargeterCfg):
+ """Initialize retargeter with configuration.
+
+ Args:
+ cfg: Configuration object for retargeter settings.
+ """
+ super().__init__()
+ self.scaling_factor = cfg.scaling_factor
+ self.filter_strength = cfg.filter_strength
+ # Initialize any other required attributes
+
+ def retarget(self, data: dict) -> Any:
+ """Transform raw tracking data into robot control commands.
+
+ Args:
+ data: Dictionary containing tracking data from OpenXRDevice.
+ Keys are TrackingTarget enum values, values are joint pose dictionaries.
+
+ Returns:
+ Any: The transformed control commands for the robot.
+ """
+ # Access hand tracking data using TrackingTarget enum
+ right_hand_data = data[DeviceBase.TrackingTarget.HAND_RIGHT]
+
+ # Extract specific joint positions and orientations
+ wrist_pose = right_hand_data.get("wrist")
+ thumb_tip_pose = right_hand_data.get("thumb_tip")
+ index_tip_pose = right_hand_data.get("index_tip")
+
+ # Access head tracking data
+ head_pose = data[DeviceBase.TrackingTarget.HEAD]
+
+ # Process the tracking data and apply your custom logic
+ # ...
+
+ # Return control commands in appropriate format
+ return torch.tensor([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]) # Example output
+
+3. Register your retargeter by setting ``retargeter_type`` on the config class:
+
+.. code-block:: python
+
+ # Import your retargeter at the top of your module
+ from my_package.retargeters import MyCustomRetargeter, MyCustomRetargeterCfg
+
+ # Link the config to the implementation for factory construction
+ MyCustomRetargeterCfg.retargeter_type = MyCustomRetargeter
+
+4. Now you can use your custom retargeter in teleop device configurations:
+
+.. code-block:: python
+
+ from isaaclab.devices import OpenXRDeviceCfg, DevicesCfg
+ from isaaclab.devices.openxr import XrCfg
+ from my_package.retargeters import MyCustomRetargeterCfg
+
+ # Create XR configuration for proper scene placement
+ xr_config = XrCfg(anchor_pos=[0.0, 0.0, 0.0], anchor_rot=[1.0, 0.0, 0.0, 0.0])
+
+ # Define teleop devices with custom retargeter
+ teleop_devices = DevicesCfg(
+ handtracking=OpenXRDeviceCfg(
+ xr_cfg=xr_config,
+ retargeters=[
+ MyCustomRetargeterCfg(
+ scaling_factor=1.5,
+ filter_strength=0.7,
+ ),
+ ]
+ ),
+ )
+
+As the OpenXR capabilities expand beyond hand tracking to include head tracking and other features,
+additional retargeters can be developed to map this data to various robot control paradigms.
+
+
+Creating Custom Teleop Devices
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can create and register your own custom teleoperation devices by following these steps:
+
+1. Create a configuration dataclass for your device:
+
+.. code-block:: python
+
+ from dataclasses import dataclass
+ from isaaclab.devices import DeviceCfg
+
+ @dataclass
+ class MyCustomDeviceCfg(DeviceCfg):
+ """Configuration for my custom device."""
+ sensitivity: float = 1.0
+ invert_controls: bool = False
+ # Add any other configuration parameters your device needs
+
+2. Implement your device class by inheriting from DeviceBase:
+
+.. code-block:: python
+
+ from isaaclab.devices import DeviceBase
+ import torch
+
+ class MyCustomDevice(DeviceBase):
+ """A custom teleoperation device."""
+
+ def __init__(self, cfg: MyCustomDeviceCfg):
+ """Initialize the device with configuration.
+
+ Args:
+ cfg: Configuration object for device settings.
+ """
+ super().__init__()
+ self.sensitivity = cfg.sensitivity
+ self.invert_controls = cfg.invert_controls
+ # Initialize any other required attributes
+ self._device_input = torch.zeros(7) # Example: 6D pose + gripper
+
+ def reset(self):
+ """Reset the device state."""
+ self._device_input.zero_()
+ # Reset any other state variables
+
+ def add_callback(self, key: str, func):
+ """Add callback function for a button/event.
+
+ Args:
+ key: Button or event name.
+ func: Callback function to be called when event occurs.
+ """
+ # Implement callback registration
+ pass
+
+ def advance(self) -> torch.Tensor:
+ """Get the latest commands from the device.
+
+ Returns:
+ torch.Tensor: Control commands (e.g., delta pose + gripper).
+ """
+ # Update internal state based on device input
+ # Return command tensor
+ return self._device_input
+
+3. Register your device with the teleoperation device factory by adding it to the ``DEVICE_MAP``:
+
+.. code-block:: python
+
+ # Import your device at the top of your module
+ from my_package.devices import MyCustomDevice, MyCustomDeviceCfg
+
+ # Add your device to the factory
+ from isaaclab.devices.teleop_device_factory import DEVICE_MAP
+
+ # Register your device type with its constructor
+ DEVICE_MAP[MyCustomDeviceCfg] = MyCustomDevice
+
+4. Now you can use your custom device in environment configurations:
+
+.. code-block:: python
+
+ from dataclasses import field
+ from isaaclab.envs import ManagerBasedEnvCfg
+ from isaaclab.devices import DevicesCfg
+ from my_package.devices import MyCustomDeviceCfg
+
+ @configclass
+ class MyEnvironmentCfg(ManagerBasedEnvCfg):
+ """Environment configuration with custom teleop device."""
+
+ teleop_devices: DevicesCfg = field(default_factory=lambda: DevicesCfg(
+ my_custom_device=MyCustomDeviceCfg(
+ sensitivity=1.5,
+ invert_controls=True,
+ ),
+ ))
+
+
+.. _xr-known-issues:
+
+Known Issues
+------------
+
+* ``XR_ERROR_VALIDATION_FAILURE: xrWaitFrame(frameState->type == 0)`` when stopping AR Mode
+
+ This error message can be safely ignored. It is caused by a race condition in the exit handler for
+ AR Mode.
+
+* ``XR_ERROR_INSTANCE_LOST in xrPollEvent: Call to "xrt_session_poll_events" failed``
+
+ This error may occur if the CloudXR runtime exits before Isaac Lab. Restart the CloudXR
+ runtime to resume teleoperation.
+
+* ``[omni.usd] TF_PYTHON_EXCEPTION`` when starting/stopping AR Mode
+
+ This error message can be safely ignored. It is caused by a race condition in the enter/exit
+ handler for AR Mode.
+
+* ``Invalid version string in _ParseVersionString``
+
+ This error message can be caused by shader assets authored with older versions of USD, and can
+ typically be ignored.
+
+* The XR device connects successfully, but no video is displayed, even though the Isaac Lab viewport responds to tracking.
+
+ This error occurs when the GPU index differs between the host and the container, causing CUDA
+ to load on the wrong GPU. To fix this, set ``NV_GPU_INDEX`` in the runtime container to ``0``, ``1``,
+ or ``2`` to ensure the GPU selected by CUDA matches the host.
+
+
+Kubernetes Deployment
+---------------------
+
+For information on deploying XR Teleop for Isaac Lab on a Kubernetes cluster, see :ref:`cloudxr-teleoperation-cluster`.
+
+..
+ References
+.. _`Apple Vision Pro`: https://www.apple.com/apple-vision-pro/
+.. _`Docker Compose`: https://docs.docker.com/compose/install/linux/#install-using-the-repository
+.. _`Docker`: https://docs.docker.com/desktop/install/linux-install/
+.. _`NVIDIA CloudXR`: https://developer.nvidia.com/cloudxr-sdk
+.. _`NVIDIA Container Toolkit`: https://github.com/NVIDIA/nvidia-container-toolkit
+.. _`Isaac XR Teleop Sample Client`: https://github.com/isaac-sim/isaac-xr-teleop-sample-client-apple
diff --git a/docs/source/how-to/configure_rendering.rst b/docs/source/how-to/configure_rendering.rst
new file mode 100644
index 000000000000..adfa8b5556cc
--- /dev/null
+++ b/docs/source/how-to/configure_rendering.rst
@@ -0,0 +1,151 @@
+Configuring Rendering Settings
+==============================
+
+Isaac Lab offers 3 preset rendering modes: performance, balanced, and quality.
+You can select a mode via a command line argument or from within a script, and customize settings as needed.
+Adjust and fine-tune rendering to achieve the ideal balance for your workflow.
+
+Selecting a Rendering Mode
+--------------------------
+
+Rendering modes can be selected in 2 ways.
+
+1. using the ``rendering_mode`` input class argument in :class:`~sim.RenderCfg`
+
+ .. code-block:: python
+
+ # for an example of how this can be used, checkout the tutorial script
+ # scripts/tutorials/00_sim/set_rendering_mode.py
+ render_cfg = sim_utils.RenderCfg(rendering_mode="performance")
+
+2. using the ``--rendering_mode`` CLI argument, which takes precedence over the ``rendering_mode`` argument in :class:`~sim.RenderCfg`.
+
+ .. code-block:: bash
+
+ ./isaaclab.sh -p scripts/tutorials/00_sim/set_rendering_mode.py --rendering_mode {performance/balanced/quality}
+
+
+Note, the ``rendering_mode`` defaults to ``balanced``.
+However, in the case where the launcher argument ``--enable_cameras`` is not set, then
+the default ``rendering_mode`` is not applied and, instead, the default kit rendering settings are used.
+
+
+Example renders from the ``set_rendering_mode.py`` script.
+To help assess rendering, the example scene includes some reflections, translucency, direct and ambient lighting, and several material types.
+
+- Quality Mode
+
+ .. image:: ../_static/how-to/howto_rendering_example_quality.jpg
+ :width: 100%
+ :alt: Quality Rendering Mode Example
+
+- Balanced Mode
+
+ .. image:: ../_static/how-to/howto_rendering_example_balanced.jpg
+ :width: 100%
+ :alt: Balanced Rendering Mode Example
+
+- Performance Mode
+
+ .. image:: ../_static/how-to/howto_rendering_example_performance.jpg
+ :width: 100%
+ :alt: Performance Rendering Mode Example
+
+Overwriting Specific Rendering Settings
+---------------------------------------
+
+Preset rendering settings can be overwritten via the :class:`~sim.RenderCfg` class.
+
+There are 2 ways to provide settings that overwrite presets.
+
+1. :class:`~sim.RenderCfg` supports overwriting specific settings via user-friendly setting names that map to underlying RTX settings.
+ For example:
+
+ .. code-block:: python
+
+ render_cfg = sim_utils.RenderCfg(
+ rendering_mode="performance",
+ # user friendly setting overwrites
+ enable_translucency=True, # defaults to False in performance mode
+ enable_reflections=True, # defaults to False in performance mode
+ dlss_mode="3", # defaults to 1 in performance mode
+ )
+
+ List of user-friendly settings.
+
+ .. table::
+ :widths: 25 75
+
+ +----------------------------+--------------------------------------------------------------------------+
+ | enable_translucency | Bool. Enables translucency for specular transmissive surfaces such as |
+ | | glass at the cost of some performance. |
+ +----------------------------+--------------------------------------------------------------------------+
+ | enable_reflections | Bool. Enables reflections at the cost of some performance. |
+ +----------------------------+--------------------------------------------------------------------------+
+ | enable_global_illumination | Bool. Enables Diffused Global Illumination at the cost of some |
+ | | performance. |
+ +----------------------------+--------------------------------------------------------------------------+
+ | antialiasing_mode | Literal["Off", "FXAA", "DLSS", "TAA", "DLAA"]. |
+ | | |
+ | | DLSS: Boosts performance by using AI to output higher resolution frames |
+ | | from a lower resolution input. DLSS samples multiple lower resolution |
+ | | images and uses motion data and feedback from prior frames to reconstruct|
+ | | native quality images. |
+ | | DLAA: Provides higher image quality with an AI-based anti-aliasing |
+ | | technique. DLAA uses the same Super Resolution technology developed for |
+ | | DLSS, reconstructing a native resolution image to maximize image quality.|
+ +----------------------------+--------------------------------------------------------------------------+
+ | enable_dlssg | Bool. Enables the use of DLSS-G. DLSS Frame Generation boosts performance|
+ | | by using AI to generate more frames. This feature requires an Ada |
+ | | Lovelace architecture GPU and can hurt performance due to additional |
+ | | thread-related activities. |
+ +----------------------------+--------------------------------------------------------------------------+
+ | enable_dl_denoiser | Bool. Enables the use of a DL denoiser, which improves the quality of |
+ | | renders at the cost of performance. |
+ +----------------------------+--------------------------------------------------------------------------+
+ | dlss_mode | Literal[0, 1, 2, 3]. For DLSS anti-aliasing, selects the performance/ |
+ | | quality tradeoff mode. Valid values are 0 (Performance), 1 (Balanced), |
+ | | 2 (Quality), or 3 (Auto). |
+ +----------------------------+--------------------------------------------------------------------------+
+ | enable_direct_lighting | Bool. Enable direct light contributions from lights. |
+ +----------------------------+--------------------------------------------------------------------------+
+ | samples_per_pixel | Int. Defines the Direct Lighting samples per pixel. Higher values |
+ | | increase the direct lighting quality at the cost of performance. |
+ +----------------------------+--------------------------------------------------------------------------+
+ | enable_shadows | Bool. Enables shadows at the cost of performance. When disabled, lights |
+ | | will not cast shadows. |
+ +----------------------------+--------------------------------------------------------------------------+
+ | enable_ambient_occlusion | Bool. Enables ambient occlusion at the cost of some performance. |
+ +----------------------------+--------------------------------------------------------------------------+
+
+
+2. For more control, :class:`~sim.RenderCfg` allows you to overwrite any RTX setting by using the ``carb_settings`` argument.
+
+ Examples of RTX settings can be found from within the repo, in the render mode preset files located in ``apps/rendering_modes``.
+
+ In addition, the RTX documentation can be found here - https://docs.omniverse.nvidia.com/materials-and-rendering/latest/rtx-renderer.html.
+
+ An example usage of ``carb_settings``.
+
+ .. code-block:: python
+
+ render_cfg = sim_utils.RenderCfg(
+ rendering_mode="quality",
+ # carb setting overwrites
+ carb_settings={
+ "rtx.translucency.enabled": False,
+ "rtx.reflections.enabled": False,
+ "rtx.domeLight.upperLowerStrategy": 3,
+ }
+ )
+
+
+Current Limitations
+-------------------
+
+For performance reasons, we default to using DLSS for denoising, which generally provides better performance.
+This may result in renders of lower quality, which may be especially evident at lower resolutions.
+Due to this, we recommend using per-tile or per-camera resolution of at least 100 x 100.
+For renders at lower resolutions, we advice setting the ``antialiasing_mode`` attribute in :class:`~sim.RenderCfg` to
+``DLAA``, and also potentially enabling ``enable_dl_denoiser``. Both of these settings should help improve render
+quality, but also comes at a cost of performance. Additional rendering parameters can also be specified in :class:`~sim.RenderCfg`.
diff --git a/docs/source/how-to/curriculums.rst b/docs/source/how-to/curriculums.rst
new file mode 100644
index 000000000000..8c2a94e82cbe
--- /dev/null
+++ b/docs/source/how-to/curriculums.rst
@@ -0,0 +1,122 @@
+Curriculum Utilities
+====================
+
+.. currentmodule:: isaaclab.managers
+
+This guide walks through the common curriculum helper functions and terms that can be used to create flexible curricula
+for RL environments in Isaac Lab. These utilities can be passed to a :class:`~isaaclab.managers.CurriculumTermCfg`
+object to enable dynamic modification of reward weights and environment parameters during training.
+
+.. note::
+
+ We cover three utilities in this guide:
+ - The simple function modifies reward :func:`modify_reward_weight`
+ - The term modify any environment parameters :class:`modify_env_param`
+ - The term modify term_cfg :class:`modify_term_cfg`
+
+.. dropdown:: Full source for curriculum utilities
+ :icon: code
+
+ .. literalinclude:: ../../../source/isaaclab/isaaclab/envs/mdp/curriculums.py
+ :language: python
+
+
+Modifying Reward Weights
+------------------------
+
+The function :func:`modify_reward_weight` updates the weight of a reward term after a specified number of simulation
+steps. This can be passed directly as the ``func`` in a ``CurriculumTermCfg``.
+
+.. literalinclude:: ../../../source/isaaclab/isaaclab/envs/mdp/curriculums.py
+ :language: python
+ :pyobject: modify_reward_weight
+
+**Usage example**:
+
+.. code-block:: python
+
+ from isaaclab.managers import CurriculumTermCfg
+ import isaaclab.managers.mdp as mdp
+
+ # After 100k steps, set the "sparse_reward" term weight to 0.5
+ sparse_reward_schedule = CurriculumTermCfg(
+ func=mdp.modify_reward_weight,
+ params={
+ "term_name": "sparse_reward",
+ "weight": 0.5,
+ "num_steps": 100_000,
+ }
+ )
+
+
+Dynamically Modifying Environment Parameters
+--------------------------------------------
+
+The class :class:`modify_env_param` is a :class:`~isaaclab.managers.ManagerTermBase` subclass that lets you target any
+dotted attribute path in the environment and apply a user-supplied function to compute a new value at runtime. It
+handles nested attributes, dictionary keys, list or tuple indexing, and respects a ``NO_CHANGE`` sentinel if no update
+is desired.
+
+.. literalinclude:: ../../../source/isaaclab/isaaclab/envs/mdp/curriculums.py
+ :language: python
+ :pyobject: modify_env_param
+
+**Usage example**:
+
+.. code-block:: python
+
+ import torch
+ from isaaclab.managers import CurriculumTermCfg
+ import isaaclab.managers.mdp as mdp
+
+ def resample_friction(env, env_ids, old_value, low, high, num_steps):
+ # After num_steps, sample a new friction coefficient uniformly
+ if env.common_step_counter > num_steps:
+ return torch.empty((len(env_ids),), device="cpu").uniform_(low, high)
+ return mdp.modify_env_param.NO_CHANGE
+
+ friction_curriculum = CurriculumTermCfg(
+ func=mdp.modify_env_param,
+ params={
+ "address": "event_manager.cfg.object_physics_material.func.material_buckets",
+ "modify_fn": resample_friction,
+ "modify_params": {
+ "low": 0.3,
+ "high": 1.0,
+ "num_steps": 120_000,
+ }
+ }
+ )
+
+
+Modify Term Configuration
+-------------------------
+
+The subclass :class:`modify_term_cfg` provides a more concise style address syntax, using consistent with hydra config
+syntax. It otherwise behaves identically to :class:`modify_env_param`.
+
+.. literalinclude:: ../../../source/isaaclab/isaaclab/envs/mdp/curriculums.py
+ :language: python
+ :pyobject: modify_term_cfg
+
+**Usage example**:
+
+.. code-block:: python
+
+ def override_command_range(env, env_ids, old_value, value, num_steps):
+ # Override after num_steps
+ if env.common_step_counter > num_steps:
+ return value
+ return mdp.modify_term_cfg.NO_CHANGE
+
+ range_override = CurriculumTermCfg(
+ func=mdp.modify_term_cfg,
+ params={
+ "address": "commands.object_pose.ranges.pos_x",
+ "modify_fn": override_command_range,
+ "modify_params": {
+ "value": (-0.75, -0.25),
+ "num_steps": 12_000,
+ }
+ }
+ )
diff --git a/docs/source/how-to/haply_teleoperation.rst b/docs/source/how-to/haply_teleoperation.rst
new file mode 100644
index 000000000000..1f8d1d6e2522
--- /dev/null
+++ b/docs/source/how-to/haply_teleoperation.rst
@@ -0,0 +1,240 @@
+.. _haply-teleoperation:
+
+Setting up Haply Teleoperation
+===============================
+
+.. currentmodule:: isaaclab
+
+`Haply Devices`_ provides haptic devices that enable intuitive robot teleoperation with
+directional force feedback. The Haply Inverse3 paired with the VerseGrip creates an
+end-effector control system with force feedback capabilities.
+
+Isaac Lab supports Haply devices for teleoperation workflows that require precise spatial
+control with haptic feedback. This enables operators to feel contact forces during manipulation
+tasks, improving control quality and task performance.
+
+This guide explains how to set up and use Haply devices with Isaac Lab for robot teleoperation.
+
+.. _Haply Devices: https://haply.co/
+
+
+Overview
+--------
+
+Using Haply with Isaac Lab involves the following components:
+
+* **Isaac Lab** simulates the robot environment and streams contact forces back to the operator
+
+* **Haply Inverse3** provides 3-DOF position tracking and force feedback in the operator's workspace
+
+* **Haply VerseGrip** adds orientation sensing and button inputs for gripper control
+
+* **Haply SDK** manages WebSocket communication between Isaac Lab and the Haply hardware
+
+This guide will walk you through:
+
+* :ref:`haply-system-requirements`
+* :ref:`haply-installation`
+* :ref:`haply-device-setup`
+* :ref:`haply-running-demo`
+* :ref:`haply-troubleshooting`
+
+
+.. _haply-system-requirements:
+
+System Requirements
+-------------------
+
+Hardware Requirements
+~~~~~~~~~~~~~~~~~~~~~
+
+* **Isaac Lab Workstation**
+
+ * Ubuntu 22.04 or Ubuntu 24.04
+ * Hardware requirements for 200Hz physics simulation:
+
+ * CPU: 8-Core Intel Core i7 or AMD Ryzen 7 (or higher)
+ * Memory: 32GB RAM (64GB recommended)
+ * GPU: RTX 3090 or higher
+
+ * Network: Same local network as Haply devices for WebSocket communication
+
+* **Haply Devices**
+
+ * Haply Inverse3 - Haptic device for position tracking and force feedback
+ * Haply VerseGrip - Wireless controller for orientation and button inputs
+ * Both devices must be powered on and connected to the Haply SDK
+
+Software Requirements
+~~~~~~~~~~~~~~~~~~~~~
+
+* Isaac Lab (follow the :ref:`installation guide `)
+* Haply SDK (provided by Haply Robotics)
+* Python 3.10+
+* ``websockets`` Python package (automatically installed with Isaac Lab)
+
+
+.. _haply-installation:
+
+Installation
+------------
+
+1. Install Isaac Lab
+~~~~~~~~~~~~~~~~~~~~
+
+Follow the Isaac Lab :ref:`installation guide ` to set up your environment.
+
+The ``websockets`` dependency is automatically included in Isaac Lab's requirements.
+
+2. Install Haply SDK
+~~~~~~~~~~~~~~~~~~~~
+
+Download the Haply SDK from the `Haply Devices`_ website.
+Install the SDK software and configure the devices.
+
+3. Verify Installation
+~~~~~~~~~~~~~~~~~~~~~~
+
+Test that your Haply devices are detected by the Haply Device Manager.
+You should see both Inverse3 and VerseGrip as connected.
+
+
+.. _haply-device-setup:
+
+Device Setup
+------------
+
+1. Physical Setup
+~~~~~~~~~~~~~~~~~
+
+* Place the Haply Inverse3 on a stable surface
+* Ensure the VerseGrip is charged and paired
+* Position yourself comfortably to reach the Inverse3 workspace
+* Keep the workspace clear of obstacles
+
+2. Start Haply SDK
+~~~~~~~~~~~~~~~~~~
+
+Launch the Haply SDK according to Haply's documentation. The SDK typically:
+
+* Runs a WebSocket server on ``localhost:10001``
+* Streams device data at 200Hz
+* Displays connection status for both devices
+
+3. Test Communication
+~~~~~~~~~~~~~~~~~~~~~
+
+You can test the WebSocket connection using the following Python script:
+
+.. code:: python
+
+ import asyncio
+ import websockets
+ import json
+
+ async def test_haply():
+ uri = "ws://localhost:10001"
+ async with websockets.connect(uri) as ws:
+ response = await ws.recv()
+ data = json.loads(response)
+ print("Inverse3:", data.get("inverse3", []))
+ print("VerseGrip:", data.get("wireless_verse_grip", []))
+
+ asyncio.run(test_haply())
+
+You should see device data streaming from both Inverse3 and VerseGrip.
+
+
+.. _haply-running-demo:
+
+Running the Demo
+----------------
+
+The Haply teleoperation demo showcases robot manipulation with force feedback using
+a Franka Panda arm.
+
+Basic Usage
+~~~~~~~~~~~
+
+.. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code:: bash
+
+ # Ensure Haply SDK is running
+ ./isaaclab.sh -p scripts/demos/haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code:: batch
+
+ REM Ensure Haply SDK is running
+ isaaclab.bat -p scripts\demos\haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65
+
+The demo will:
+
+1. Connect to the Haply devices via WebSocket
+2. Spawn a Franka Panda robot and a cube in simulation
+3. Map Haply position to robot end-effector position
+4. Stream contact forces back to the Inverse3 for haptic feedback
+
+Controls
+~~~~~~~~
+
+* **Move Inverse3**: Controls the robot end-effector position
+* **VerseGrip Button A**: Open gripper
+* **VerseGrip Button B**: Close gripper
+* **VerseGrip Button C**: Rotate end-effector by 60ยฐ
+
+Advanced Options
+~~~~~~~~~~~~~~~~
+
+Customize the demo with command-line arguments:
+
+.. code:: bash
+
+ # Use custom WebSocket URI
+ ./isaaclab.sh -p scripts/demos/haply_teleoperation.py \
+ --websocket_uri ws://192.168.1.100:10001
+
+ # Adjust position sensitivity (default: 1.0)
+ ./isaaclab.sh -p scripts/demos/haply_teleoperation.py \
+ --websocket_uri ws://localhost:10001 \
+ --pos_sensitivity 2.0
+
+Demo Features
+~~~~~~~~~~~~~
+
+* **Workspace Mapping**: Haply workspace is mapped to robot reachable space with safety limits
+* **Inverse Kinematics**: Inverse Kinematics (IK) computes joint positions for desired end-effector pose
+* **Force Feedback**: Contact forces from end-effector sensors are sent to Inverse3 for haptic feedback
+
+
+.. _haply-troubleshooting:
+
+Troubleshooting
+---------------
+
+No Haptic Feedback
+~~~~~~~~~~~~~~~~~~
+
+**Problem**: No haptic feedback felt on Inverse3
+
+Solutions:
+
+* Verify Inverse3 is the active device in Haply SDK
+* Check contact forces are non-zero in simulation (try grasping the cube)
+* Ensure ``limit_force`` is not set too low (default: 2.0N)
+
+
+Next Steps
+----------
+
+* **Customize the demo**: Modify the workspace mapping or add custom button behaviors
+* **Implement your own controller**: Use :class:`~isaaclab.devices.HaplyDevice` in your own scripts
+
+For more information on device APIs, see :class:`~isaaclab.devices.HaplyDevice` in the API documentation.
diff --git a/docs/source/how-to/import_new_asset.rst b/docs/source/how-to/import_new_asset.rst
index 52a683c69062..41eacc48673d 100644
--- a/docs/source/how-to/import_new_asset.rst
+++ b/docs/source/how-to/import_new_asset.rst
@@ -80,24 +80,47 @@ pre-processed URDF and the original URDF are:
The following shows the steps to clone the repository and run the converter:
-.. code-block:: bash
- # create a directory to clone
- mkdir ~/git && cd ~/git
- # clone a repository with URDF files
- git clone git@github.com:isaac-orbit/anymal_d_simple_description.git
+.. tab-set::
+ :sync-group: os
- # go to top of the Isaac Lab repository
- cd IsaacLab
- # run the converter
- ./isaaclab.sh -p scripts/tools/convert_urdf.py \
- ~/git/anymal_d_simple_description/urdf/anymal.urdf \
- source/isaaclab_assets/data/Robots/ANYbotics/anymal_d.usd \
- --merge-joints \
- --joint-stiffness 0.0 \
- --joint-damping 0.0 \
- --joint-target-type none
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+ .. code-block:: bash
+
+ # clone a repository with URDF files
+ git clone git@github.com:isaac-orbit/anymal_d_simple_description.git
+
+ # go to top of the Isaac Lab repository
+ cd IsaacLab
+ # run the converter
+ ./isaaclab.sh -p scripts/tools/convert_urdf.py \
+ ../anymal_d_simple_description/urdf/anymal.urdf \
+ source/isaaclab_assets/data/Robots/ANYbotics/anymal_d.usd \
+ --merge-joints \
+ --joint-stiffness 0.0 \
+ --joint-damping 0.0 \
+ --joint-target-type none
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ :: clone a repository with URDF files
+ git clone git@github.com:isaac-orbit/anymal_d_simple_description.git
+
+ :: go to top of the Isaac Lab repository
+ cd IsaacLab
+ :: run the converter
+ isaaclab.bat -p scripts\tools\convert_urdf.py ^
+ ..\anymal_d_simple_description\urdf\anymal.urdf ^
+ source\isaaclab_assets\data\Robots\ANYbotics\anymal_d.usd ^
+ --merge-joints ^
+ --joint-stiffness 0.0 ^
+ --joint-damping 0.0 ^
+ --joint-target-type none
Executing the above script will create a USD file inside the
``source/isaaclab_assets/data/Robots/ANYbotics/`` directory:
@@ -150,21 +173,43 @@ In this example, we use the MuJoCo model of the Unitree's H1 humanoid robot in t
The following shows the steps to clone the repository and run the converter:
-.. code-block:: bash
- # create a directory to clone
- mkdir ~/git && cd ~/git
- # clone a repository with URDF files
- git clone git@github.com:google-deepmind/mujoco_menagerie.git
+.. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ # clone a repository with URDF files
+ git clone git@github.com:google-deepmind/mujoco_menagerie.git
+
+ # go to top of the Isaac Lab repository
+ cd IsaacLab
+ # run the converter
+ ./isaaclab.sh -p scripts/tools/convert_mjcf.py \
+ ../mujoco_menagerie/unitree_h1/h1.xml \
+ source/isaaclab_assets/data/Robots/Unitree/h1.usd \
+ --import-sites \
+ --make-instanceable
- # go to top of the Isaac Lab repository
- cd IsaacLab
- # run the converter
- ./isaaclab.sh -p scripts/tools/convert_mjcf.py \
- ~/git/mujoco_menagerie/unitree_h1/h1.xml \
- source/isaaclab_assets/data/Robots/Unitree/h1.usd \
- --import-sites \
- --make-instanceable
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ :: clone a repository with URDF files
+ git clone git@github.com:google-deepmind/mujoco_menagerie.git
+
+ :: go to top of the Isaac Lab repository
+ cd IsaacLab
+ :: run the converter
+ isaaclab.bat -p scripts\tools\convert_mjcf.py ^
+ ..\mujoco_menagerie\unitree_h1\h1.xml ^
+ source\isaaclab_assets\data\Robots\Unitree\h1.usd ^
+ --import-sites ^
+ --make-instanceable
Executing the above script will create USD files inside the
``source/isaaclab_assets/data/Robots/Unitree/`` directory:
@@ -202,22 +247,44 @@ Example Usage
We use an OBJ file of a cube to demonstrate the usage of the mesh converter. The following shows
the steps to clone the repository and run the converter:
-.. code-block:: bash
+.. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ # clone a repository with URDF files
+ git clone git@github.com:NVIDIA-Omniverse/IsaacGymEnvs.git
+
+ # go to top of the Isaac Lab repository
+ cd IsaacLab
+ # run the converter
+ ./isaaclab.sh -p scripts/tools/convert_mesh.py \
+ ../IsaacGymEnvs/assets/trifinger/objects/meshes/cube_multicolor.obj \
+ source/isaaclab_assets/data/Props/CubeMultiColor/cube_multicolor.usd \
+ --make-instanceable \
+ --collision-approximation convexDecomposition \
+ --mass 1.0
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
- # create a directory to clone
- mkdir ~/git && cd ~/git
- # clone a repository with URDF files
- git clone git@github.com:NVIDIA-Omniverse/IsaacGymEnvs.git
+ :: clone a repository with URDF files
+ git clone git@github.com:NVIDIA-Omniverse/IsaacGymEnvs.git
- # go to top of the Isaac Lab repository
- cd IsaacLab
- # run the converter
- ./isaaclab.sh -p scripts/tools/convert_mesh.py \
- ~/git/IsaacGymEnvs/assets/trifinger/objects/meshes/cube_multicolor.obj \
- source/isaaclab_assets/data/Props/CubeMultiColor/cube_multicolor.usd \
- --make-instanceable \
- --collision-approximation convexDecomposition \
- --mass 1.0
+ :: go to top of the Isaac Lab repository
+ cd IsaacLab
+ :: run the converter
+ isaaclab.bat -p scripts\tools\convert_mesh.py ^
+ ..\IsaacGymEnvs\assets\trifinger\objects\meshes\cube_multicolor.obj ^
+ source\isaaclab_assets\data\Props\CubeMultiColor\cube_multicolor.usd ^
+ --make-instanceable ^
+ --collision-approximation convexDecomposition ^
+ --mass 1.0
You may need to press 'F' to zoom in on the asset after import.
@@ -240,8 +307,8 @@ of gravity.
.. _instanceable: https://openusd.org/dev/api/_usd__page__scenegraph_instancing.html
.. _documentation: https://docs.isaacsim.omniverse.nvidia.com/latest/isaac_lab_tutorials/tutorial_instanceable_assets.html
-.. _MJCF importer: https://docs.isaacsim.omniverse.nvidia.com/latest/robot_setup/import_mjcf.html
-.. _URDF importer: https://docs.isaacsim.omniverse.nvidia.com/latest/robot_setup/import_urdf.html
+.. _MJCF importer: https://docs.isaacsim.omniverse.nvidia.com/latest/importer_exporter/ext_isaacsim_asset_importer_mjcf.html
+.. _URDF importer: https://docs.isaacsim.omniverse.nvidia.com/latest/importer_exporter/ext_isaacsim_asset_importer_urdf.html
.. _anymal.urdf: https://github.com/isaac-orbit/anymal_d_simple_description/blob/master/urdf/anymal.urdf
.. _asset converter: https://docs.omniverse.nvidia.com/extensions/latest/ext_asset-converter.html
.. _mujoco_menagerie: https://github.com/google-deepmind/mujoco_menagerie/tree/main/unitree_h1
diff --git a/docs/source/how-to/index.rst b/docs/source/how-to/index.rst
index c884a071def2..02c0ff99ae14 100644
--- a/docs/source/how-to/index.rst
+++ b/docs/source/how-to/index.rst
@@ -67,6 +67,15 @@ This guide demonstrates how to estimate the number of cameras one can run on the
estimate_how_many_cameras_can_run
+Configure Rendering
+-------------------
+
+This guide demonstrates how to select rendering mode presets and overwrite preset rendering settings.
+
+.. toctree::
+ :maxdepth: 1
+
+ configure_rendering
Drawing Markers
---------------
@@ -103,6 +112,19 @@ This guide explains how to record an animation and video in Isaac Lab.
record_animation
record_video
+
+Dynamically Modifying Environment Parameters With CurriculumTerm
+----------------------------------------------------------------
+
+This guide explains how to dynamically modify environment parameters during training in Isaac Lab.
+It covers the use of curriculum utilities to change environment parameters at runtime.
+
+.. toctree::
+ :maxdepth: 1
+
+ curriculums
+
+
Mastering Omniverse
-------------------
@@ -113,3 +135,51 @@ additional resources that help you use Omniverse features in Isaac Lab.
:maxdepth: 1
master_omniverse
+
+
+Setting up CloudXR Teleoperation
+--------------------------------
+
+This guide explains how to use CloudXR and Apple Vision Pro for immersive streaming and
+teleoperation in Isaac Lab.
+
+.. toctree::
+ :maxdepth: 1
+
+ cloudxr_teleoperation
+
+
+Setting up Haply Teleoperation
+------------------------------
+
+This guide explains how to use Haply Inverse3 and VerseGrip devices for robot teleoperation
+with directional force feedback in Isaac Lab.
+
+.. toctree::
+ :maxdepth: 1
+
+ haply_teleoperation
+
+
+Understanding Simulation Performance
+------------------------------------
+
+This guide provides tips on optimizing simulation performance for different simulation use cases.
+Additional resources are also linked to provide relevant performance guides for Isaac Sim and
+Omniverse Physics.
+
+.. toctree::
+ :maxdepth: 1
+
+ simulation_performance
+
+
+Optimize Stage Creation
+-----------------------
+
+This guide explains 2 features that can speed up stage initialization, **fabric cloning** and **stage in memory**.
+
+.. toctree::
+ :maxdepth: 1
+
+ optimize_stage_creation
diff --git a/docs/source/how-to/master_omniverse.rst b/docs/source/how-to/master_omniverse.rst
index 0108ab64821b..ee3e0d55c4e4 100644
--- a/docs/source/how-to/master_omniverse.rst
+++ b/docs/source/how-to/master_omniverse.rst
@@ -68,7 +68,7 @@ Importing assets
- `Omniverse Create - Importing FBX Files \| NVIDIA Omniverse Tutorials `__
- `Omniverse Asset Importer `__
-- `Isaac Sim URDF impoter `__
+- `Isaac Sim URDF impoter `__
Part 2: Scripting in Omniverse
@@ -119,6 +119,5 @@ Part 3: More Resources
- `Omniverse Glossary of Terms `__
- `Omniverse Code Samples `__
-- `PhysX Collider Compatibility `__
- `PhysX Limitations `__
- `PhysX Documentation `__.
diff --git a/docs/source/how-to/optimize_stage_creation.rst b/docs/source/how-to/optimize_stage_creation.rst
new file mode 100644
index 000000000000..b262878d6671
--- /dev/null
+++ b/docs/source/how-to/optimize_stage_creation.rst
@@ -0,0 +1,146 @@
+Optimize Stage Creation
+=======================
+
+Isaac Lab supports two experimental features to speed-up stage creation: **fabric cloning** and **stage in memory**.
+These features are particularly effective for large-scale RL setups with thousands of environments.
+
+What These Features Do
+-----------------------
+
+**Fabric Cloning**
+
+- Clones environments using Fabric library (see `USD Fabric USDRT Documentation `_)
+- Partially supported and enabled by default on some environments (see `Limitations`_ section for a list)
+
+**Stage in Memory**
+
+- Constructs the stage in memory, rather than with a USD file, avoiding overhead from disk I/O
+- After stage creation, if rendering is required, the stage is attached to the USD context, returning to the default stage configuration
+- Not enabled by default
+
+Usage Examples
+--------------
+
+Fabric cloning can be toggled by setting the :attr:`isaaclab.scene.InteractiveSceneCfg.clone_in_fabric` flag.
+
+**Using Fabric Cloning with a RL environment**
+
+.. code-block:: python
+
+ # create environment configuration
+ env_cfg = CartpoleEnvCfg()
+ env_cfg.scene.clone_in_fabric = True
+ # setup RL environment
+ env = ManagerBasedRLEnv(cfg=env_cfg)
+
+
+Stage in memory can be toggled by setting the :attr:`isaaclab.sim.SimulationCfg.create_stage_in_memory` flag.
+
+**Using Stage in Memory with a RL environment**
+
+.. code-block:: python
+
+ # create config and set flag
+ cfg = CartpoleEnvCfg()
+ cfg.scene.num_envs = 1024
+ cfg.sim.create_stage_in_memory = True
+ # create env with stage in memory
+ env = ManagerBasedRLEnv(cfg=cfg)
+
+Note, if stage in memory is enabled without using an existing RL environment class, a few more steps are need.
+The stage creation steps should be wrapped in a :py:keyword:`with` statement to set the stage context.
+If the stage needs to be attached, the :meth:`~isaaclab.sim.utils.attach_stage_to_usd_context` function should
+be called after the stage is created.
+
+**Using Stage in Memory with a manual scene setup**
+
+.. code-block:: python
+
+ # init simulation context with stage in memory
+ sim = SimulationContext(cfg=SimulationCfg(create_stage_in_memory=True))
+
+ # grab stage in memory and set stage context
+ stage_in_memory = sim.get_initial_stage()
+ with stage_utils.use_stage(stage_in_memory):
+ # create cartpole scene
+ scene_cfg = CartpoleSceneCfg(num_envs=1024)
+ scene = InteractiveScene(scene_cfg)
+ # attach stage to memory after stage is created
+ sim_utils.attach_stage_to_usd_context()
+
+ sim.play()
+
+
+Limitations
+-----------
+
+**Fabric Cloning**
+
+- Fabric-cloned environments must be accessed using USDRT functions, rather than USD functions.
+- Fabric cloning is partially supported and enabled by default on some environments, listed here.
+
+.. code-block:: none
+
+ 1. Isaac-Ant-Direct-v0
+ 2. Isaac-Ant-v0
+ 3. Isaac-Cartpole-Direct-v0
+ 4. Isaac-Cartpole-Showcase-Box-Box-Direct-v0
+ 5. Isaac-Cartpole-Showcase-Box-Discrete-Direct-v0
+ 6. Isaac-Cartpole-Showcase-Box-MultiDiscrete-Direct-v0
+ 7. Isaac-Cartpole-Showcase-Dict-Box-Direct-v0
+ 8. Isaac-Cartpole-Showcase-Dict-Discrete-Direct-v0
+ 9. Isaac-Cartpole-Showcase-Dict-MultiDiscrete-Direct-v0
+ 10. Isaac-Cartpole-Showcase-Discrete-Box-Direct-v0
+ 11. Isaac-Cartpole-Showcase-Discrete-Discrete-Direct-v0
+ 12. Isaac-Cartpole-Showcase-Discrete-MultiDiscrete-Direct-v0
+ 13. Isaac-Cartpole-Showcase-MultiDiscrete-Box-Direct-v0
+ 14. Isaac-Cartpole-Showcase-MultiDiscrete-Discrete-Direct-v0
+ 15. Isaac-Cartpole-Showcase-MultiDiscrete-MultiDiscrete-Direct-v0
+ 16. Isaac-Cartpole-Showcase-Tuple-Box-Direct-v0
+ 17. Isaac-Cartpole-Showcase-Tuple-Discrete-Direct-v0
+ 18. Isaac-Cartpole-Showcase-Tuple-MultiDiscrete-Direct-v0
+ 19. Isaac-Cartpole-v0
+ 20. Isaac-Factory-GearMesh-Direct-v0
+ 21. Isaac-Factory-NutThread-Direct-v0
+ 22. Isaac-Factory-PegInsert-Direct-v0
+ 23. Isaac-Franka-Cabinet-Direct-v0
+ 24. Isaac-Humanoid-Direct-v0
+ 25. Isaac-Humanoid-v0
+ 26. Isaac-Quadcopter-Direct-v0
+ 27. Isaac-Repose-Cube-Allegro-Direct-v0
+ 28. Isaac-Repose-Cube-Allegro-NoVelObs-v0
+ 29. Isaac-Repose-Cube-Allegro-v0
+ 30. Isaac-Repose-Cube-Shadow-Direct-v0
+ 31. Isaac-Repose-Cube-Shadow-OpenAI-FF-Direct-v0
+ 32. Isaac-Repose-Cube-Shadow-OpenAI-LSTM-Direct-v0
+
+**Stage in Memory**
+
+- Cannot be currently enabled at the same time as **Fabric Cloning**.
+
+- Attaching stage in memory to the USD context can be slow, offsetting some or all of the performance benefits.
+
+ - Note, attaching is only necessary when rendering is enabled. For example, in headless mode, attachment is not required.
+
+- Certain low-level Kit APIs do not yet support stage in memory.
+
+ - In most cases, when these APIs are hit, existing scripts will automatically early attach the stage and print a warning message.
+ - In one particular case, for some environments, the API call to color the ground plane is skipped, when stage in memory is enabled.
+
+
+Benchmark Results
+-----------------
+
+Performance comparison cloning 4000 ShadowHand robots with rendering enabled
+
++--------+-----------------+-------------------+------------------------+---------------------------+------------------------+------------------------+
+| Test # | Stage in Memory | Clone in Fabric | Attach Stage Time (s) | Fabric Attach Time (s) | Clone Paths Time (s) | First Step Time (s) |
++========+=================+===================+========================+===========================+========================+========================+
+| 1 | Yes | Yes | 3.88 | 0.15 | 4.84 | 1.39 |
++--------+-----------------+-------------------+------------------------+---------------------------+------------------------+------------------------+
+| 2 | No | No | โ | 60.17 | 4.46 | 3.52 |
++--------+-----------------+-------------------+------------------------+---------------------------+------------------------+------------------------+
+| 3 | No | Yes | โ | 0.47 | 4.72 | 2.56 |
++--------+-----------------+-------------------+------------------------+---------------------------+------------------------+------------------------+
+| 4 | Yes | No | 42.64 | 21.75 | 1.87 | 2.16 |
++--------+-----------------+-------------------+------------------------+---------------------------+------------------------+------------------------+
diff --git a/docs/source/how-to/record_animation.rst b/docs/source/how-to/record_animation.rst
index ed5eca12e95d..2d675684fbf4 100644
--- a/docs/source/how-to/record_animation.rst
+++ b/docs/source/how-to/record_animation.rst
@@ -3,32 +3,41 @@ Recording Animations of Simulations
.. currentmodule:: isaaclab
-Omniverse includes tools to record animations of physics simulations. The `Stage Recorder`_ extension
-listens to all the motion and USD property changes within a USD stage and records them to a USD file.
-This file contains the time samples of the changes, which can be played back to render the animation.
+Isaac Lab supports two approaches for recording animations of physics simulations: the **Stage Recorder** and the **OVD Recorder**.
+Both generate USD outputs that can be played back in Omniverse, but they differ in how they work and when youโd use them.
-The timeSampled USD file only contains the changes to the stage. It uses the same hierarchy as the original
-stage at the time of recording. This allows adding the animation to the original stage, or to a different
-stage with the same hierarchy. The timeSampled file can be directly added as a sublayer to the original stage
-to play back the animation.
+The `Stage Recorder`_ extension listens to all motion and USD property changes in the stage during simulation
+and records them as **time-sampled data**. The result is a USD file that captures only the animated changesโ**not** the
+full sceneโand matches the hierarchy of the original stage at the time of recording.
+This makes it easy to add as a sublayer for playback or rendering.
+
+This method is built into Isaac Labโs UI through the :class:`~isaaclab.envs.ui.BaseEnvWindow`.
+However, to record the animation of a simulation, you need to disable `Fabric`_ to allow reading and writing
+all the changes (such as motion and USD properties) to the USD stage.
+
+The **OVD Recorder** is designed for more scalable or automated workflows. It uses OmniPVD to capture simulated physics from a played stage
+and then **bakes** that directly into an animated USD file. It works with Fabric enabled and runs with CLI arguments.
+The animated USD can be quickly replayed and reviewed by scrubbing through the timeline window, without simulating expensive physics operations.
.. note::
- Omniverse only supports playing animation or playing physics on a USD prim at the same time. If you want to
- play back the animation of a USD prim, you need to disable the physics simulation on the prim.
+ Omniverse only supports **either** physics simulation **or** animation playback on a USD primโnever both at once.
+ Disable physics on the prims you want to animate.
-In Isaac Lab, we directly use the `Stage Recorder`_ extension to record the animation of the physics simulation.
-This is available as a feature in the :class:`~isaaclab.envs.ui.BaseEnvWindow` class.
-However, to record the animation of a simulation, you need to disable `Fabric`_ to allow reading and writing
-all the changes (such as motion and USD properties) to the USD stage.
+Stage Recorder
+--------------
+In Isaac Lab, the Stage Recorder is integrated into the :class:`~isaaclab.envs.ui.BaseEnvWindow` class.
+Itโs the easiest way to capture physics simulations visually and works directly through the UI.
+
+To record, Fabric must be disabledโthis allows the recorder to track changes to USD and write them out.
Stage Recorder Settings
~~~~~~~~~~~~~~~~~~~~~~~
-Isaac Lab integration of the `Stage Recorder`_ extension assumes certain default settings. If you want to change the
-settings, you can directly use the `Stage Recorder`_ extension in the Omniverse Create application.
+Isaac Lab sets up the Stage Recorder with sensible defaults in ``base_env_window.py``. If needed,
+you can override or inspect these by using the Stage Recorder extension directly in Omniverse Create.
.. dropdown:: Settings used in base_env_window.py
:icon: code
@@ -38,39 +47,79 @@ settings, you can directly use the `Stage Recorder`_ extension in the Omniverse
:linenos:
:pyobject: BaseEnvWindow._toggle_recording_animation_fn
-
Example Usage
~~~~~~~~~~~~~
-In all environment standalone scripts, Fabric can be disabled by passing the ``--disable_fabric`` flag to the script.
-Here we run the state-machine example and record the animation of the simulation.
+In standalone Isaac Lab environments, pass the ``--disable_fabric`` flag:
.. code-block:: bash
./isaaclab.sh -p scripts/environments/state_machine/lift_cube_sm.py --num_envs 8 --device cpu --disable_fabric
+After launching, the Isaac Lab UI window will display a "Record Animation" button.
+Click to begin recording. Click again to stop.
-On running the script, the Isaac Lab UI window opens with the button "Record Animation" in the toolbar.
-Clicking this button starts recording the animation of the simulation. On clicking the button again, the
-recording stops. The recorded animation and the original stage (with all physics disabled) are saved
-to the ``recordings`` folder in the current working directory. The files are stored in the ``usd`` format:
+The following files are saved to the ``recordings/`` folder:
-- ``Stage.usd``: The original stage with all physics disabled
-- ``TimeSample_tk001.usd``: The timeSampled file containing the recorded animation
+- ``Stage.usd`` โ the original stage with physics disabled
+- ``TimeSample_tk001.usd`` โ the animation (time-sampled) layer
-You can open Omniverse Isaac Sim application to play back the animation. There are many ways to launch
-the application (such as from terminal or `Omniverse Launcher`_). Here we use the terminal to open the
-application and play the animation.
+To play back:
.. code-block:: bash
- ./isaaclab.sh -s # Opens Isaac Sim application through _isaac_sim/isaac-sim.sh
+ ./isaaclab.sh -s # Opens Isaac Sim
+
+Inside the Layers panel, insert both ``Stage.usd`` and ``TimeSample_tk001.usd`` as sublayers.
+The animation will now play back when you hit the play button.
+
+See the `tutorial on layering in Omniverse`_ for more on working with layers.
+
+
+OVD Recorder
+------------
+
+The OVD Recorder uses OmniPVD to record simulation data and bake it directly into a new USD stage.
+This method is more scalable and better suited for large-scale training scenarios (e.g. multi-env RL).
+
+Itโs not UI-controlledโthe whole process is enabled through CLI flags and runs automatically.
+
+
+Workflow Summary
+~~~~~~~~~~~~~~~~
+
+1. User runs Isaac Lab with animation recording enabled via CLI
+2. Isaac Lab starts simulation
+3. OVD data is recorded as the simulation runs
+4. At the specified stop time, the simulation is baked into an outputted USD file, and IsaacLab is closed
+5. The final result is a fully baked, self-contained USD animation
+
+Example Usage
+~~~~~~~~~~~~~
+
+To record an animation:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/tutorials/03_envs/run_cartpole_rl_env.py \
+ --anim_recording_enabled \
+ --anim_recording_start_time 1 \
+ --anim_recording_stop_time 3
+
+.. note::
+
+ The provided ``--anim_recording_stop_time`` should be greater than the simulation time.
+
+.. warning::
+
+ Currently, the final recording step can output many warning logs from [omni.usd]. This is a known issue, and these warning messages can be ignored.
+
+After the stop time is reached, a file will be saved to:
+
+.. code-block:: none
-On a new stage, add the ``Stage.usd`` as a sublayer and then add the ``TimeSample_tk001.usd`` as a sublayer.
-You can do this by dragging and dropping the files from the file explorer to the stage. Please check out
-the `tutorial on layering in Omniverse`_ for more details.
+ anim_recordings//baked_animation_recording.usda
-You can then play the animation by pressing the play button.
.. _Stage Recorder: https://docs.omniverse.nvidia.com/extensions/latest/ext_animation_stage-recorder.html
.. _Fabric: https://docs.omniverse.nvidia.com/kit/docs/usdrt/latest/docs/usd_fabric_usdrt.html
diff --git a/docs/source/how-to/simulation_performance.rst b/docs/source/how-to/simulation_performance.rst
new file mode 100644
index 000000000000..3dd113a1285d
--- /dev/null
+++ b/docs/source/how-to/simulation_performance.rst
@@ -0,0 +1,72 @@
+Simulation Performance and Tuning
+====================================
+
+The performance of the simulation can be affected by various factors, including the number of objects in the scene,
+the complexity of the physics simulation, and the hardware being used. Here are some tips to improve performance:
+
+1. **Use Headless Mode**: Running the simulation in headless mode can significantly improve performance, especially
+ when rendering is not required. You can enable headless mode by using the ``--headless`` flag when running the
+ simulator.
+2. **Avoid Unnecessary Collisions**: If possible, reduce the number of object overlaps to reduce overhead in the simulation.
+ Excessive contacts and collisions in the simulation can be expensive in the collision phase in the simulation.
+3. **Use Simplified Physics**: Consider using simplified physics collision geometries or lowering simulation fidelity
+ for better performance. This can be done by modifying the assets and adjusting the physics parameters in the simulation configuration.
+4. **Use CPU/GPU Simulation**: If your scene consists of just a few articulations or rigid bodies, consider using CPU simulation
+ for better performance. For larger scenes, using GPU simulation can significantly improve performance.
+
+Collision Geometries
+--------------------
+
+Collision geometries are used to define the shape of objects in the simulation for collision detection. Using
+simplified collision geometries can improve performance and reduce the complexity of the simulation.
+
+For example, if you have a complex mesh, you can create a simplified collision geometry that approximates the shape
+of the mesh. This can be done in Isaac Sim through the UI by modifying the collision mesh and approximation methods.
+
+Additionally, we can often remove collision geometries on areas of the robot that are not important for training.
+In the Anymal-C robot, we keep the collision geometries for the kneeds and feet, but remove the collision geometries
+on other parts of the legs to optimize for performance.
+
+Simpler collision geometries such as primitive shapes like spheres will also yield better performance than complex meshes.
+For example, an SDF mesh collider will be more expensive than a simple sphere.
+
+Note that cylinder and cone collision geometries have special support for smooth collisions with triangle meshes for
+better wheeled simulation behavior. This comes at a cost of performance and may not always be desired. To disable this feature,
+we can set the stage settings ``--/physics/collisionApproximateCylinders=true`` and ``--/physics/collisionApproximateCones=true``.
+
+Another item to watch out for in GPU RL workloads is warnings about GPU compatibility of ``Convex Hull`` approximated mesh collision geometry.
+If the input mesh has a high aspect ratio (e.g. a long thin shape), the convex hull approximation may be incompatible with GPU simulation,
+triggering a CPU fallback that can significantly impact performance.
+
+A CPU-fallback warning looks as follows: ``[Warning] [omni.physx.cooking.plugin] ConvexMeshCookingTask: failed to cook GPU-compatible mesh,
+collision detection will fall back to CPU. Collisions with particles and deformables will not work with this mesh.``.
+Suitable workarounds include switching to a bounding cube approximation, or using a static triangle mesh collider
+if the geometry is not part of a dynamic rigid body.
+
+CPU Governor Settings on Linux
+------------------------------
+
+CPU governors dictate the operating clock frequency range and scaling of the CPU. This can be a limiting factor for Isaac Sim performance. For maximum performance, the CPU governor should be set to ``performance``. To modify the CPU governor, run the following commands:
+
+.. code-block:: bash
+
+ sudo apt-get install linux-tools-common
+ cpupower frequency-info # Check available governors
+ sudo cpupower frequency-set -g performance # Set governor with root permissions
+
+.. note::
+
+ Not all governors are available on all systems. Governors enabling higher clock speed are typically more performance-centric and will yield better performance for Isaac Sim.
+
+Additional Performance Guides
+-----------------------------
+
+There are many ways to "tune" the performance of the simulation, but the way you choose largely depends on what you are trying to simulate. In general, the first place
+you will want to look for performance gains is with the `physics engine `_. Next to rendering
+and running deep learning models, the physics engine is the most computationally costly. Tuning the physics sim to limit the scope to only the task of interest is a great place to
+start hunting for performance gains.
+
+We have recently released a new `gripper tuning guide `_ , specific to contact and grasp tuning. Please check it first if you intend to use robot grippers. For additional details, you should also checkout these guides!
+
+* `Isaac Sim Performance Optimization Handbook `_
+* `Omni Physics Simulation Performance Guide `_
diff --git a/docs/source/how-to/write_articulation_cfg.rst b/docs/source/how-to/write_articulation_cfg.rst
index 90db3232e47b..d681f281473b 100644
--- a/docs/source/how-to/write_articulation_cfg.rst
+++ b/docs/source/how-to/write_articulation_cfg.rst
@@ -17,7 +17,8 @@ properties of an :class:`~assets.Articulation` in Isaac Lab.
We will use the Cartpole example to demonstrate how to create an :class:`~assets.ArticulationCfg`.
The Cartpole is a simple robot that consists of a cart with a pole attached to it. The cart
-is free to move along a rail, and the pole is free to rotate about the cart.
+is free to move along a rail, and the pole is free to rotate about the cart. The file for this configuration example is
+``source/isaaclab_assets/isaaclab_assets/robots/cartpole.py``.
.. dropdown:: Code for Cartpole configuration
:icon: code
@@ -114,3 +115,154 @@ to combine them into a single actuator model.
damping={"slider_to_cart": 10.0, "cart_to_pole": 0.0},
),
},
+
+
+ActuatorCfg velocity/effort limits considerations
+-------------------------------------------------
+
+In IsaacLab v1.4.0, the plain ``velocity_limit`` and ``effort_limit`` attributes were **not** consistently
+pushed into the physics solver:
+
+- **Implicit actuators**
+ - velocity_limit was ignored (never set in simulation)
+ - effort_limit was set into simulation
+
+- **Explicit actuators**
+ - both velocity_limit and effort_limit were used only by the drive model, not by the solver
+
+
+In v2.0.1 we accidentally changed this: all velocity_limit & effort_limit, implicit or
+explicit, were being applied to the solver. That caused many training under the old default uncaped solver
+limits to break.
+
+To restore the original behavior while still giving users full control over solver limits, we introduced two new flags:
+
+* **velocity_limit_sim**
+ Sets the physics-solver's maximum joint-velocity cap in simulation.
+
+* **effort_limit_sim**
+ Sets the physics-solver's maximum joint-effort cap in simulation.
+
+
+These explicitly set the solver's joint-velocity and joint-effort caps at simulation level.
+
+On the other hand, velocity_limit and effort_limit model the motor's hardware-level constraints in torque
+computation for all explicit actuators rather than limiting simulation-level constraint.
+For implicit actuators, since they do not model motor hardware limitations, ``velocity_limit`` were removed in v2.1.1
+and marked as deprecated. This preserves same behavior as they did in v1.4.0. Eventually, ``velocity_limit`` and
+``effort_limit`` will be deprecated for implicit actuators, preserving only ``velocity_limit_sim`` and
+``effort_limit_sim``
+
+
+.. table:: Limit Options Comparison
+
+ .. list-table::
+ :header-rows: 1
+ :widths: 20 40 40
+
+ * - **Attribute**
+ - **Implicit Actuator**
+ - **Explicit Actuator**
+ * - ``velocity_limit``
+ - Deprecated (alias for ``velocity_limit_sim``)
+ - Used by the model (e.g. DC motor), not set into simulation
+ * - ``effort_limit``
+ - Deprecated (alias for ``effort_limit_sim``)
+ - Used by the model, not set into simulation
+ * - ``velocity_limit_sim``
+ - Set into simulation
+ - Set into simulation
+ * - ``effort_limit_sim``
+ - Set into simulation
+ - Set into simulation
+
+
+
+Users who want to tune the underlying physics-solver limits should set the ``_sim`` flags.
+
+
+USD vs. ActuatorCfg discrepancy resolution
+------------------------------------------
+
+USD having default value and the fact that ActuatorCfg can be specified with None, or a overriding value can sometime be
+confusing what exactly gets written into simulation. The resolution follows these simple rules,per joint and per
+property:
+
+.. table:: Resolution Rules for USD vs. ActuatorCfg
+
+ +------------------------+------------------------+--------------------+
+ | **Condition** | **ActuatorCfg Value** | **Applied** |
+ +========================+========================+====================+
+ | No override provided | Not Specified | USD Value |
+ +------------------------+------------------------+--------------------+
+ | Override provided | User's ActuatorCfg | Same as ActuatorCfg|
+ +------------------------+------------------------+--------------------+
+
+
+Digging into USD can sometime be unconvinent, to help clarify what exact value is written, we designed a flag
+:attr:`~isaaclab.assets.ArticulationCfg.actuator_value_resolution_debug_print`,
+to help user figure out what exact value gets used in simulation.
+
+Whenever an actuator parameter is overridden in the user's ActuatorCfg (or left unspecified),
+we compare it to the value read from the USD definition and record any differences. For each joint and each property,
+if unmatching value is found, we log the resolution:
+
+ 1. **USD Value**
+ The default limit or gain parsed from the USD asset.
+
+ 2. **ActuatorCfg Value**
+ The user-provided override (or โNot Specifiedโ if none was given).
+
+ 3. **Applied**
+ The final value actually used for simulation: if the user didn't override it, this matches the USD value;
+ otherwise it reflects the user's setting.
+
+This resolution info is emitted as a warning table only when discrepancies exist.
+Here's an example of what you'll see::
+
+ +----------------+--------------------+---------------------+----+-------------+--------------------+----------+
+ | Group | Property | Name | ID | USD Value | ActuatorCfg Value | Applied |
+ +----------------+--------------------+---------------------+----+-------------+--------------------+----------+
+ | panda_shoulder | velocity_limit_sim | panda_joint1 | 0 | 2.17e+00 | Not Specified | 2.17e+00 |
+ | | | panda_joint2 | 1 | 2.17e+00 | Not Specified | 2.17e+00 |
+ | | | panda_joint3 | 2 | 2.17e+00 | Not Specified | 2.17e+00 |
+ | | | panda_joint4 | 3 | 2.17e+00 | Not Specified | 2.17e+00 |
+ | | stiffness | panda_joint1 | 0 | 2.29e+04 | 8.00e+01 | 8.00e+01 |
+ | | | panda_joint2 | 1 | 2.29e+04 | 8.00e+01 | 8.00e+01 |
+ | | | panda_joint3 | 2 | 2.29e+04 | 8.00e+01 | 8.00e+01 |
+ | | | panda_joint4 | 3 | 2.29e+04 | 8.00e+01 | 8.00e+01 |
+ | | damping | panda_joint1 | 0 | 4.58e+03 | 4.00e+00 | 4.00e+00 |
+ | | | panda_joint2 | 1 | 4.58e+03 | 4.00e+00 | 4.00e+00 |
+ | | | panda_joint3 | 2 | 4.58e+03 | 4.00e+00 | 4.00e+00 |
+ | | | panda_joint4 | 3 | 4.58e+03 | 4.00e+00 | 4.00e+00 |
+ | | armature | panda_joint1 | 0 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_joint2 | 1 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_joint3 | 2 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_joint4 | 3 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | panda_forearm | velocity_limit_sim | panda_joint5 | 4 | 2.61e+00 | Not Specified | 2.61e+00 |
+ | | | panda_joint6 | 5 | 2.61e+00 | Not Specified | 2.61e+00 |
+ | | | panda_joint7 | 6 | 2.61e+00 | Not Specified | 2.61e+00 |
+ | | stiffness | panda_joint5 | 4 | 2.29e+04 | 8.00e+01 | 8.00e+01 |
+ | | | panda_joint6 | 5 | 2.29e+04 | 8.00e+01 | 8.00e+01 |
+ | | | panda_joint7 | 6 | 2.29e+04 | 8.00e+01 | 8.00e+01 |
+ | | damping | panda_joint5 | 4 | 4.58e+03 | 4.00e+00 | 4.00e+00 |
+ | | | panda_joint6 | 5 | 4.58e+03 | 4.00e+00 | 4.00e+00 |
+ | | | panda_joint7 | 6 | 4.58e+03 | 4.00e+00 | 4.00e+00 |
+ | | armature | panda_joint5 | 4 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_joint6 | 5 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_joint7 | 6 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | friction | panda_joint5 | 4 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_joint6 | 5 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_joint7 | 6 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | panda_hand | velocity_limit_sim | panda_finger_joint1 | 7 | 2.00e-01 | Not Specified | 2.00e-01 |
+ | | | panda_finger_joint2 | 8 | 2.00e-01 | Not Specified | 2.00e-01 |
+ | | stiffness | panda_finger_joint1 | 7 | 1.00e+06 | 2.00e+03 | 2.00e+03 |
+ | | | panda_finger_joint2 | 8 | 1.00e+06 | 2.00e+03 | 2.00e+03 |
+ | | armature | panda_finger_joint1 | 7 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_finger_joint2 | 8 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | friction | panda_finger_joint1 | 7 | 0.00e+00 | Not Specified | 0.00e+00 |
+ | | | panda_finger_joint2 | 8 | 0.00e+00 | Not Specified | 0.00e+00 |
+ +----------------+--------------------+---------------------+----+-------------+--------------------+----------+
+
+To keep the cleaniness of logging, :attr:`~isaaclab.assets.ArticulationCfg.actuator_value_resolution_debug_print`
+default to False, remember to turn it on when wishes.
diff --git a/docs/source/migration/comparing_simulation_isaacgym.rst b/docs/source/migration/comparing_simulation_isaacgym.rst
new file mode 100644
index 000000000000..e70292f99aad
--- /dev/null
+++ b/docs/source/migration/comparing_simulation_isaacgym.rst
@@ -0,0 +1,503 @@
+.. _migrating-from-isaacgymenvs-comparing-simulation:
+
+Comparing Simulations Between Isaac Gym and Isaac Lab
+=====================================================
+
+
+When migrating simulations from Isaac Gym to Isaac Lab, it is sometimes helpful to compare
+the simulation configurations in Isaac Gym and Isaac Lab to identify differences between the two setups.
+There may be differences in how default values are interpreted, how the importer treats certain
+hierarchies of bodies, and how values are scaled. The only way to be certain that two simulations
+are equivalent in the eyes of PhysX is to record a simulation trace of both setups and compare
+them by inspecting them side-by-side. This approach works because PhysX is the same underlying
+engine for both Isaac Gym and Isaac Lab, albeit with different versions.
+
+
+Recording to PXD2 in Isaac Gym Preview Release
+----------------------------------------------
+
+Simulation traces in Isaac Gym can be recorded using the built-in PhysX Visual Debugger (PVD)
+file output feature. Set the operating system environment variable ``GYM_PVD_FILE`` to the
+desired output file path; the ``.pxd2`` file extension will be appended automatically.
+
+For detailed instructions, refer to the tuning documentation included with Isaac Gym:
+
+.. code-block:: text
+
+ isaacgym/docs/_sources/programming/tuning.rst.txt
+
+.. note::
+
+ This file reference is provided because Isaac Gym does not have its documentation available online.
+
+
+Recording to OVD in Isaac Lab
+-----------------------------
+
+To record an OVD simulation trace file in Isaac Lab, you must set the appropriate Isaac Sim Kit
+arguments. It is important that the ``omniPvdOvdRecordingDirectory`` variable is set **before**
+``omniPvdOutputEnabled`` is set to ``true``.
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/benchmarks/benchmark_non_rl.py --task \
+ --kit_args="--/persistent/physics/omniPvdOvdRecordingDirectory=/tmp/myovds/ \
+ --/physics/omniPvdOutputEnabled=true"
+
+This example outputs a series of OVD files to the ``/tmp/myovds/`` directory.
+
+If the ``--kit_args`` argument does not work in your particular setup, you can set the Kit arguments
+manually by editing the following file directly within the Isaac Sim source code:
+
+.. code-block:: text
+
+ source/extensions/isaacsim.simulation_app/isaacsim/simulation_app/simulation_app.py
+
+Append the following lines after the ``args = []`` block:
+
+.. code-block:: python
+
+ args.append("--/persistent/physics/omniPvdOvdRecordingDirectory=/path/to/output/ovds/")
+ args.append("--/physics/omniPvdOutputEnabled=true")
+
+
+Inspecting PXD2 and OVD Files
+-----------------------------
+
+By opening the PXD2 file in a PVD viewer and the OVD file in OmniPVD (a Kit extension), you can
+manually compare the two simulation runs and their respective parameters.
+
+**PhysX Visual Debugger (PVD) for PXD2 Files**
+
+Download the PVD viewer from the NVIDIA Developer Tools page:
+
+ ``_
+
+Both version 2 and version 3 of the PVD viewer are compatible with PXD2 files.
+
+**OmniPVD for OVD Files**
+
+To view OVD files, enable the OmniPVD extension in the Isaac Sim application. For detailed
+instructions, refer to the OmniPVD developer guide:
+
+ https://docs.omniverse.nvidia.com/kit/docs/omni_physics/latest/extensions/ux/source/omni.physx.pvd/docs/dev_guide/physx_visual_debugger.html
+
+**Inspecting Contact Gizmos in OmniPVD**
+
+To inspect contact points between objects, enable the contact gizmos in OmniPVD. Ensure that the
+simulation frame is set to **PRE** (pre-simulation frames of each simulation step) in the OmniPVD
+timeline, or set the replay mode to **PRE**. This allows you to visualize contact information before
+the solver processes each step.
+
+**Comparing PVD and OVD Files**
+
+Using the PVD viewer and the OmniPVD extension, you can now compare the simulations side-by-side
+to identify configuration differences. On the left is PVD for PXD2 inspection and on the right is the OmniPVD
+extension loaded to inspect OVD files.
+
+.. image:: ../_static/migration/ovd_pvd_comparison.jpg
+
+
+Parameters to Verify During Simulation Comparison
+-------------------------------------------------
+
+For PhysX articulations, each attribute is useful to inspect because it reveals how the link or shape
+will actually behave in contact, under drives, and at constraints. Below, each attribute is expanded
+with why it matters for debugging and tuning simulations.
+
+
+PxArticulationLink
+^^^^^^^^^^^^^^^^^^
+
+Each link behaves like a rigid body with mass properties, damping, velocity limits, and contact-resolution
+limits. Inspecting these helps explain stability issues, jitter, and odd responses to forces.
+
+Mass Properties
+"""""""""""""""
+
+**Mass**
+ Determines how strongly the link accelerates under forces and how it shares impulses in collisions
+ and joint constraints.
+
+ *When to inspect:* Understand why a link seems "too heavy" (barely moves when pushed) or "too light"
+ (flies around from small impulses), and to detect inconsistent mass distribution across a chain that
+ can cause unrealistic motion or joint stress.
+
+**Center of Mass (pose)**
+ Controls where forces effectively act and how the link balances.
+
+ *When to inspect:* A character or mechanism tips over unexpectedly or feels unbalanced; an offset COM
+ can cause unrealistic torque for the same contact.
+
+**Inertia Tensor / Inertia Scale**
+ Defines rotational resistance about each axis.
+
+ *When to inspect:* Links are too easy or too hard to spin relative to their mass, which affects joint
+ drive tuning and impact responses.
+
+Damping Properties
+""""""""""""""""""
+
+**Linear Damping**
+ Models velocity-proportional drag on translation; higher values make links lose linear speed faster.
+
+ *When to inspect:* Links slide too far (damping too low) or feel "underwater" (damping too high), or
+ when articulation energy seems to vanish without obvious contact.
+
+**Angular Damping**
+ Models drag on rotation; higher values make spinning links slow more quickly.
+
+ *When to inspect:* Links keep spinning after impacts or motor drives (too low), or joints feel "sticky"
+ and fail to swing freely under gravity (too high).
+
+Velocity Properties
+"""""""""""""""""""
+
+**Linear Velocity**
+ Instantaneous world-space translational velocity of the link.
+
+ *When to inspect:* Verify whether joint motors, gravity, or contacts are generating expected motion,
+ detect numerical explosions (huge spikes), and correlate with CCD thresholds and max linear velocity clamping.
+
+**Angular Velocity**
+ Instantaneous world-space rotational velocity.
+
+ *When to inspect:* Verify joint drives, impacts, or constraints are producing the correct rotation;
+ spot runaway spin that can cause instability or tunneling before clamping takes effect.
+
+**Max Linear Velocity**
+ Upper bound PhysX uses to clamp linear speed before solving, intended to prevent numerical issues
+ from extremely fast motion.
+
+ *When to inspect:* Objects start tunneling or simulations explode at high speeds. If too high, links
+ can move too far in one step; too low, they may appear unnaturally capped like "speed-limited" robots.
+
+**Max Angular Velocity**
+ Upper bound for angular speed; PhysX clamps angular velocity similarly to linear velocity.
+
+ *When to inspect:* Links spin unrealistically fast after collisions or drives (value too large), or
+ rotation looks unnaturally limited, especially for wheels or rotors that should rotate quickly (value too small).
+
+Contact Resolution Properties
+"""""""""""""""""""""""""""""
+
+**Max Depenetration Velocity**
+ Limits how much corrective velocity the solver may add in one step to resolve penetrations at contacts.
+
+ *When to inspect:* Overlapping links "explode" outward or jitter after starting interpenetrating (too high),
+ or embedded links separate too slowly and appear stuck together (too low).
+
+**Max Contact Impulse**
+ Caps the impulse the solver can apply at contacts; per-body limit, with the actual contact limit being
+ the minimum of the two bodies' values.
+
+ *When to inspect:* Contacts feel too soft (bodies interpenetrate deeply or sink into the environment) or
+ too rigid (sharp impulses causing ringing or bouncing), or when tuning "soft collisions" like rubber or
+ skin-like surfaces.
+
+State and Behavior Flags
+""""""""""""""""""""""""
+
+**Kinematic vs Dynamic flag / Disable gravity**
+ Indicates whether a link is driven kinematically or fully simulated, and whether gravity affects it.
+
+ *When to inspect:* Parts appear frozen, snap directly to poses, or ignore gravity, which can drastically
+ change articulation behavior.
+
+**Sleep thresholds (linear, angular) and wake counter**
+ Control when a link is allowed to go to sleep and stop simulating.
+
+ *When to inspect:* Articulations sleep too early (stopping motion) or never sleep (wasting performance
+ and causing low-amplitude jitter).
+
+
+PxArticulationJoint
+^^^^^^^^^^^^^^^^^^^
+
+The inbound joint defines relative motion between a link and its parent. Inspecting motion and related
+parameters explains limits, constraints, and how drives shape articulation pose and stability.
+
+Joint Configuration
+"""""""""""""""""""
+
+**Motion**
+ Per-axis setting (locked, limited, free) that defines which degrees of freedom the joint allows and
+ whether ranges are restricted.
+
+ *When to inspect:* A link moves in an unexpected direction (axis wrongly set to free), hits a hard stop
+ sooner or later than expected (limit vs locked), or seems unconstrained because an axis is mistakenly left free.
+
+**Joint Type / Axes definition**
+ Choice of revolute, prismatic, spherical, etc., and the local joint frames that define axes.
+
+ *When to inspect:* A "hinge" behaves more like a ball joint or slides unexpectedly; incorrect type or
+ frame alignment easily produces weird motions.
+
+**Limits (swing, twist, linear)**
+ Specify allowed angular or linear ranges and often include stiffness/damping.
+
+ *When to inspect:* Joints hyper-extend, clip through geometry, or suddenly snap at boundaries; mis-set
+ limits cause popping and instability.
+
+Drive Properties
+""""""""""""""""
+
+**Drive target position (orientation) and target velocity**
+ Desired relative pose and relative velocity that drives the articulation, often using spring-damper models.
+
+ *When to inspect:* Controllers are too slow or overshoot and oscillateโtarget values and drive parameters
+ must match link mass and inertia.
+
+**Drive stiffness and damping (spring strength, tangential damping)**
+ Control how aggressively the joint tries to reach the target pose and how much overshoot is damped.
+
+ *When to inspect:* Joints buzz or oscillate under load (stiffness high, damping low) or feel unresponsive
+ and "rubbery" (stiffness low).
+
+**Joint friction / resistance (if configured)**
+ Adds resistance even without explicit damping in drives.
+
+ *When to inspect:* Passive joints keep swinging too long, or appear stuck even without drives.
+
+
+PxShape
+^^^^^^^
+
+Shapes attached to links determine collision representation and contact behavior. Even if they are internal
+in OmniPhysics, their properties have a strong impact on stability, contact timing, and visual alignment.
+
+Collision Offsets
+"""""""""""""""""
+
+**Rest Offset**
+ Distance at which two shapes come to rest; sum of their rest offsets defines the separation where they "settle".
+
+ *When to inspect:* Graphics and collision appear misaligned (gaps or visible intersections), or sliding
+ over meshes is rough. Small positive offsets can smooth sliding, while zero offset tends to align exactly
+ but may catch on geometry.
+
+**Contact Offset**
+ Distance at which contact generation begins; shapes whose distance is less than the sum of contact offsets
+ generate contacts.
+
+ *When to inspect:* Contacts appear "too early" (objects seem to collide before visually touching, increasing
+ contact count) or "too late" (tunneling or jitter). The difference between contact and rest offsets is
+ crucial for predictive, stable contacts.
+
+Geometry and Materials
+""""""""""""""""""""""
+
+**Geometry type and dimensions**
+ Box, sphere, capsule, convex, mesh, and the associated size parameters.
+
+ *When to inspect:* Collision footprint does not match the visual meshโoverly large shapes cause premature
+ contacts; small shapes allow visual intersection and change leverage at contacts.
+
+**Material(s): friction, restitution, compliance**
+ Friction coefficients and restitution define sliding and bounciness.
+
+ *When to inspect:* An articulation foot skids too easily, sticks to the ground, or bounces unexpectedly.
+ Wrong materials can make mechanisms unstable or unresponsive.
+
+Shape Flags
+"""""""""""
+
+**Flag for simulation / query / trigger**
+ Whether the shape participates in simulation contacts, raycasts only, or trigger events.
+
+ *When to inspect:* Contacts do not appear (shape set as query only) or triggers unexpectedly create
+ physical collisions.
+
+**Contact density (CCD flags, if used)**
+ Continuous collision detection flags affecting how fast-moving links are handled.
+
+ *When to inspect:* Fast articulation parts tunnel through thin obstacles, or CCD is too aggressive and
+ reduces performance.
+
+
+PxRigidDynamic
+^^^^^^^^^^^^^^
+
+``PxRigidDynamic`` is the core simulated rigid body type in PhysX, so inspecting its attributes is crucial
+for understanding individual object behavior, stability, and performance in the scene. Many attributes
+mirror ``PxArticulationLink``, but a rigid dynamic is not constrained by articulation joints and can also
+be used in kinematic mode.
+
+Mass and Mass-Related Properties
+""""""""""""""""""""""""""""""""
+
+**Mass**
+ Controls translational response to forces and impulses; for the same impulse, lower mass gives higher
+ velocity change.
+
+ *When to inspect:* An object barely reacts to hits (mass too large) or flies away from small forces
+ (mass too small), or mass ratios between interacting bodies cause overly dominant or easily bullied bodies.
+
+**Center of Mass (COM) pose**
+ Defines where forces effectively act and around which point the body rotates.
+
+ *When to inspect:* Objects tip over unexpectedly, roll in unintuitive ways, or feel "unbalanced." A COM
+ too high or off-center can cause strong torques from small contacts.
+
+**Inertia tensor / inertia scaling**
+ Determines resistance to angular acceleration around each axis for a given torque.
+
+ *When to inspect:* Bodies are too easy or too hard to spin (e.g., a large object spinning quickly from
+ small hits), or when anisotropic behavior is needed (e.g., wheels that spin easily around one axis but
+ resist others).
+
+Damping and Velocity Limits
+"""""""""""""""""""""""""""
+
+**Linear Damping**
+ Adds velocity-proportional drag on translation.
+
+ *When to inspect:* Bodies slide too far or for too long (damping too low) or appear as if moving through
+ thick fluid (damping too high), and when scenes lose energy faster than friction alone would suggest.
+
+**Angular Damping**
+ Adds drag on rotation, reducing angular velocity over time.
+
+ *When to inspect:* Spinning objects never settle or spin unrealistically long (too low), or they stop
+ rotating almost immediately after impact or motor impulses (too high).
+
+**Linear Velocity**
+ Current translational velocity used by the integrator and solver.
+
+ *When to inspect:* Debug impulses, gravity, or applied forces to see whether the body is accelerating
+ as expected; detect spikes or non-physical jumps in speed.
+
+**Angular Velocity**
+ Current rotational speed around each axis.
+
+ *When to inspect:* Rotations look jittery, explode numerically, or fail to respond to applied torques.
+ High values relative to time step and object scale can indicate instability.
+
+**Max Linear Velocity**
+ Upper bound used to clamp linear velocity before solving.
+
+ *When to inspect:* Very fast bodies cause tunneling or simulation explosions (value too high), or they
+ appear unnaturally "speed-limited," especially projectiles or debris in high-energy scenes (value too low).
+
+**Max Angular Velocity**
+ Upper bound used to clamp angular velocity.
+
+ *When to inspect:* Thin or small bodies spin so fast they destabilize the scene (value too high), or
+ spinning elements such as wheels, propellers, or debris appear artificially capped (value too low).
+
+Contact Resolution and Impulses
+"""""""""""""""""""""""""""""""
+
+**Max Depenetration Velocity**
+ Limits the corrective velocity the solver may introduce in one step to resolve interpenetrations.
+
+ *When to inspect:* Intersecting bodies "explode" apart or jitter violently after overlap (too high), or
+ separate very slowly and appear stuck or interpenetrated for several frames (too low).
+
+**Max Contact Impulse**
+ Caps the impulse that can be applied at contacts involving this body; the effective limit is the minimum
+ between the two bodies, or the dynamic body for staticโdynamic contacts.
+
+ *When to inspect:* Create softer contacts (lower limit) or very rigid, almost unyielding bodies (high or
+ default limit); objects sink into each other or bounce unrealistically.
+
+Sleep and Activation Behavior
+"""""""""""""""""""""""""""""""
+
+**Sleep Threshold**
+ Mass-normalized kinetic energy below which a body becomes a candidate for sleeping.
+
+ *When to inspect:* Bodies fall asleep too early while they should still move (threshold too high) or
+ constantly jitter and never sleep (threshold too low), which can hurt performance.
+
+**Wake Counter / isSleeping flag**
+ Internal timer and state indicating whether the body is active.
+
+ *When to inspect:* Bodies refuse to wake up on interactions or wake too easily. Bad sleep behavior can
+ make scenes feel "dead" or too noisy.
+
+Kinematic Mode and Locking
+""""""""""""""""""""""""""
+
+**Kinematic Flag (PxRigidBodyFlag::eKINEMATIC)**
+ When set, the body is moved by ``setKinematicTarget`` and ignores forces and gravity, while still
+ affecting dynamic bodies it touches.
+
+ *When to inspect:* Objects appear to have infinite mass (pushing others but not reacting) or ignore
+ gravity and impulses. Mismatched expectations here commonly cause odd behavior in characters, moving
+ platforms, or doors.
+
+**Rigid Dynamic Lock Flags (PxRigidDynamicLockFlag)**
+ Per-axis linear and angular DOF locks, effectively constraining motion without a joint.
+
+ *When to inspect:* Bodies unexpectedly move in constrained directions (lock not set) or fail to
+ move/rotate where they should (lock set by mistake), especially for 2D-style movement or simple
+ constrained mechanisms.
+
+**Disable Gravity (PxActorFlag::eDISABLE_GRAVITY)**
+ Toggles whether the body is affected by scene gravity.
+
+ *When to inspect:* Objects float in mid-air or drop unexpectedly. A common source of confusion in
+ mixed setups with some gravity-less bodies.
+
+Forces and Solver Overrides
+"""""""""""""""""""""""""""
+
+**Applied force and torque (accumulated per step)**
+ Net forces/torques that will be integrated into velocity.
+
+ *When to inspect:* Debug gameplay forces (thrusters, character pushes, explosions) to see if the expected
+ input is actually reaching the body.
+
+**Per-body solver iteration counts (minPositionIters, minVelocityIters)**
+ Overrides for how many solver iterations this body gets in constraints and contacts.
+
+ *When to inspect:* Certain bodies (e.g., characters, stacked crates, fragile structures) need higher
+ stability or more accurate stacking. Low iterations can cause jitter and penetration; too high wastes
+ performance.
+
+Shape-Related Aspects
+"""""""""""""""""""""
+
+While not properties of ``PxRigidDynamic`` itself, the shapes attached to it heavily influence behavior.
+
+**Attached Shapes' Rest and Contact Offsets**
+ Control predictive contact generation and visual separation as described earlier.
+
+ *When to inspect:* A dynamic body seems to collide too early/late or appears to float above surfaces
+ or intersect them visually.
+
+**Attached Materials (friction, restitution)**
+ Define sliding and bounciness for this body's contacts.
+
+ *When to inspect:* Rigid dynamics skid, stick, or bounce in unexpected ways. Often the "behavior issue"
+ is material configuration rather than mass or damping.
+
+
+Summary: What to Inspect and Why
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The table below summarizes the key inspection areas for each PhysX component:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 20 40 40
+
+ * - Component
+ - Key Attributes
+ - Debugging Focus
+ * - **Links**
+ - Mass, damping, velocities, limits
+ - Overall energy, stability, and response to joints/contacts
+ * - **Joints**
+ - Motion, limits, drives
+ - How articulation pose evolves; over/under-constrained motion
+ * - **Shapes**
+ - Offsets, materials, geometry
+ - Contact timing, friction behavior, visual vs physical alignment
+ * - **Rigid Dynamics**
+ - Mass, inertia, damping, velocity limits, sleep, kinematic flags
+ - Acceleration, settling, extreme motion, body state
+
+All of these attributes together provide a comprehensive picture of why an articulation or rigid body
+behaves as it does and where to adjust parameters for stability, realism, or control performance.
diff --git a/docs/source/migration/migrating_from_isaacgymenvs.rst b/docs/source/migration/migrating_from_isaacgymenvs.rst
index bbe55233eb55..db6371c40c9d 100644
--- a/docs/source/migration/migrating_from_isaacgymenvs.rst
+++ b/docs/source/migration/migrating_from_isaacgymenvs.rst
@@ -355,6 +355,10 @@ of ``1/deg`` in the Isaac Sim UI but ``1/rad`` in Isaac Gym Preview Release.
- 100.0 (rad)
+For more details on performing thorough simulation comparisons between Isaac Gym and Isaac Lab,
+please refer to the :ref:`migrating-from-isaacgymenvs-comparing-simulation` section.
+
+
Cloner
------
@@ -692,18 +696,18 @@ the need to set simulation parameters for actors in the task implementation.
| asset_root = os.path.dirname(asset_path) | actuators={ |
| asset_file = os.path.basename(asset_path) | "cart_actuator": ImplicitActuatorCfg( |
| | joint_names_expr=["slider_to_cart"], |
-| asset_options = gymapi.AssetOptions() | effort_limit=400.0, |
-| asset_options.fix_base_link = True | velocity_limit=100.0, |
+| asset_options = gymapi.AssetOptions() | effort_limit_sim=400.0, |
+| asset_options.fix_base_link = True | velocity_limit_sim=100.0, |
| cartpole_asset = self.gym.load_asset(self.sim, | stiffness=0.0, |
| asset_root, asset_file, asset_options) | damping=10.0, |
| self.num_dof = self.gym.get_asset_dof_count( | ), |
| cartpole_asset) | "pole_actuator": ImplicitActuatorCfg( |
-| | joint_names_expr=["cart_to_pole"], effort_limit=400.0, |
-| pose = gymapi.Transform() | velocity_limit=100.0, stiffness=0.0, damping=0.0 |
-| if self.up_axis == 'z': | ), |
-| pose.p.z = 2.0 | }, |
-| pose.r = gymapi.Quat(0.0, 0.0, 0.0, 1.0) | ) |
-| else: | |
+| | joint_names_expr=["cart_to_pole"], |
+| pose = gymapi.Transform() | effort_limit_sim=400.0, velocity_limit_sim=100.0, |
+| if self.up_axis == 'z': | stiffness=0.0, damping=0.0 |
+| pose.p.z = 2.0 | ), |
+| pose.r = gymapi.Quat(0.0, 0.0, 0.0, 1.0) | }, |
+| else: | ) |
| pose.p.y = 2.0 | |
| pose.r = gymapi.Quat( | |
| -np.sqrt(2)/2, 0.0, 0.0, np.sqrt(2)/2) | |
@@ -924,6 +928,15 @@ To launch inferencing in Isaac Lab, use the command:
python scripts/reinforcement_learning/rl_games/play.py --task=Isaac-Cartpole-Direct-v0 --num_envs=25 --checkpoint=
+Additional Resources
+~~~~~~~~~~~~~~~~~~~~
+
+.. toctree::
+ :maxdepth: 1
+
+ comparing_simulation_isaacgym
+
+
.. _IsaacGymEnvs: https://github.com/isaac-sim/IsaacGymEnvs
.. _Isaac Gym Preview Release: https://developer.nvidia.com/isaac-gym
.. _release notes: https://github.com/isaac-sim/IsaacLab/releases
diff --git a/docs/source/migration/migrating_from_omniisaacgymenvs.rst b/docs/source/migration/migrating_from_omniisaacgymenvs.rst
index f33fabd2bd44..b3a46f0a518f 100644
--- a/docs/source/migration/migrating_from_omniisaacgymenvs.rst
+++ b/docs/source/migration/migrating_from_omniisaacgymenvs.rst
@@ -295,8 +295,8 @@ including file path, simulation parameters, actuator properties, and initial sta
actuators={
"cart_actuator": ImplicitActuatorCfg(
joint_names_expr=["slider_to_cart"],
- effort_limit=400.0,
- velocity_limit=100.0,
+ effort_limit_sim=400.0,
+ velocity_limit_sim=100.0,
stiffness=0.0,
damping=10.0,
),
diff --git a/docs/source/overview/core-concepts/actuators.rst b/docs/source/overview/core-concepts/actuators.rst
index 4f8748300363..de34e4202868 100644
--- a/docs/source/overview/core-concepts/actuators.rst
+++ b/docs/source/overview/core-concepts/actuators.rst
@@ -35,6 +35,7 @@ maximum effort:
.. math::
\tau_{j, computed} & = k_p * (q_{des} - q) + k_d * (\dot{q}_{des} - \dot{q}) + \tau_{ff} \\
+ \tau_{j, max} & = \gamma \times \tau_{motor, max} \\
\tau_{j, applied} & = clip(\tau_{computed}, -\tau_{j, max}, \tau_{j, max})
@@ -75,3 +76,25 @@ The following figure shows the actuator groups for a legged mobile manipulator:
We provide implementations for various explicit actuator models. These are detailed in
`isaaclab.actuators <../../api/lab/isaaclab.actuators.html>`_ sub-package.
+
+Considerations when using actuators
+-----------------------------------
+
+As explained in the previous sections, there are two main types of actuator models: implicit and explicit.
+The implicit actuator model is provided by the physics engine. This means that when the user sets either
+a desired position or velocity, the physics engine will internally compute the efforts that need to be
+applied to the joints to achieve the desired behavior. In PhysX, the PD controller adds numerical damping
+to the desired effort, which results in more stable behavior.
+
+The explicit actuator model is provided by the user. This means that when the user sets either a desired
+position or velocity, the user's model will compute the efforts that need to be applied to the joints to
+achieve the desired behavior. While this provides more flexibility, it can also lead to some numerical
+instabilities. One way to mitigate this is to use the ``armature`` parameter of the actuator model, either in
+the USD file or in the articulation config. This parameter is used to dampen the joint response and helps
+improve the numerical stability of the simulation. More details on how to improve articulation stability
+can be found in the `OmniPhysics documentation `_.
+
+What does this mean for the user? It means that policies trained with implicit actuators may not transfer
+to the exact same robot model when using explicit actuators. If you are running into issues like this, or
+in cases where policies do not converge on explicit actuators while they do on implicit ones, increasing
+or setting the ``armature`` parameter to a higher value may help.
diff --git a/docs/source/overview/core-concepts/sensors/camera.rst b/docs/source/overview/core-concepts/sensors/camera.rst
index d5b0018940fc..6a34c6fab30c 100644
--- a/docs/source/overview/core-concepts/sensors/camera.rst
+++ b/docs/source/overview/core-concepts/sensors/camera.rst
@@ -157,14 +157,3 @@ Instance Segmentation
- If ``colorize_instance_segmentation=False``, a buffer of dimension (B, H, W, 1) of type ``torch.int32`` will be returned, containing the instance ID of each pixel.
The info ``idToLabels`` dictionary will be the mapping from color to USD prim path of that semantic entity. The info ``idToSemantics`` dictionary will be the mapping from color to semantic labels of that semantic entity.
-
-
-Current Limitations
--------------------
-
-For performance reasons, we default to using DLSS for denoising, which generally provides better performance.
-This may result in renders of lower quality, which may be especially evident at lower resolutions.
-Due to this, we recommend using per-tile or per-camera resolution of at least 100 x 100.
-For renders at lower resolutions, we advice setting the ``antialiasing_mode`` attribute in :class:`~sim.RenderCfg` to
-``DLAA``, and also potentially enabling ``enable_dl_denoiser``. Both of these settings should help improve render
-quality, but also comes at a cost of performance. Additional rendering parameters can also be specified in :class:`~sim.RenderCfg`.
diff --git a/docs/source/overview/core-concepts/sensors/contact_sensor.rst b/docs/source/overview/core-concepts/sensors/contact_sensor.rst
index b1cee5241a34..4ddd2d10c077 100644
--- a/docs/source/overview/core-concepts/sensors/contact_sensor.rst
+++ b/docs/source/overview/core-concepts/sensors/contact_sensor.rst
@@ -72,7 +72,14 @@ Here, we print both the net contact force and the filtered force matrix for each
Received force matrix of: tensor([[[[0., 0., 0.]]]], device='cuda:0')
Received contact force of: tensor([[[1.3529e-05, 0.0000e+00, 1.0069e+02]]], device='cuda:0')
-Notice that even with filtering, both sensors report the net contact force acting on the foot. However only the left foot has a non zero "force matrix", because the right foot isn't standing on the filtered body, ``/World/envs/env_.*/Cube``. Now, checkout the data coming from the hind feet!
+
+.. figure:: ../../../_static/overview/sensors/contact_visualization.jpg
+ :align: center
+ :figwidth: 100%
+ :alt: The contact sensor visualization
+
+
+Notice that even with filtering, both sensors report the net contact force acting on the foot. However, the "force matrix" on the right foot is zero because that foot isn't in contact with the filtered body, ``/World/envs/env_.*/Cube``. Now, checkout the data coming from the hind feet!
.. code-block:: bash
diff --git a/docs/source/overview/core-concepts/sensors/index.rst b/docs/source/overview/core-concepts/sensors/index.rst
index 31baaa9258b1..d2c63f212b76 100644
--- a/docs/source/overview/core-concepts/sensors/index.rst
+++ b/docs/source/overview/core-concepts/sensors/index.rst
@@ -19,3 +19,4 @@ The following pages describe the available sensors in more detail:
frame_transformer
imu
ray_caster
+ visuo_tactile_sensor
diff --git a/docs/source/overview/core-concepts/sensors/visuo_tactile_sensor.rst b/docs/source/overview/core-concepts/sensors/visuo_tactile_sensor.rst
new file mode 100644
index 000000000000..d761c4a2e8a8
--- /dev/null
+++ b/docs/source/overview/core-concepts/sensors/visuo_tactile_sensor.rst
@@ -0,0 +1,205 @@
+.. _overview_sensors_tactile:
+
+.. currentmodule:: isaaclab
+
+Visuo-Tactile Sensor
+====================
+
+
+The visuo-tactile sensor in Isaac Lab provides realistic tactile feedback through integration with TacSL (Tactile Sensor Learning) [Akinola2025]_. It is designed to simulate high-fidelity tactile interactions, generating both visual and force-based data that mirror real-world tactile sensors like GelSight devices. The sensor can provide tactile RGB images, force field distributions, and other intermediate tactile measurements essential for robotic manipulation tasks requiring fine tactile feedback.
+
+
+.. figure:: ../../../_static/overview/sensors/tacsl_diagram.jpg
+ :align: center
+ :figwidth: 100%
+ :alt: Tactile sensor with RGB visualization and force fields
+
+
+Configuration
+~~~~~~~~~~~~~
+
+Tactile sensors require specific configuration parameters to define their behavior and data collection properties. The sensor can be configured with various parameters including sensor resolution, force sensitivity, and output data types.
+
+.. code-block:: python
+
+ from isaaclab.sensors import TiledCameraCfg
+ from isaaclab_assets.sensors import GELSIGHT_R15_CFG
+ import isaaclab.sim as sim_utils
+
+ from isaaclab_contrib.sensors.tacsl_sensor import VisuoTactileSensorCfg
+
+ # Tactile sensor configuration
+ tactile_sensor = VisuoTactileSensorCfg(
+ prim_path="{ENV_REGEX_NS}/Robot/elastomer/tactile_sensor",
+ ## Sensor configuration
+ render_cfg=GELSIGHT_R15_CFG,
+ enable_camera_tactile=True,
+ enable_force_field=True,
+ ## Elastomer configuration
+ tactile_array_size=(20, 25),
+ tactile_margin=0.003,
+ ## Contact object configuration
+ contact_object_prim_path_expr="{ENV_REGEX_NS}/contact_object",
+ ## Force field physics parameters
+ normal_contact_stiffness=1.0,
+ friction_coefficient=2.0,
+ tangential_stiffness=0.1,
+ ## Camera configuration
+ camera_cfg=TiledCameraCfg(
+ prim_path="{ENV_REGEX_NS}/Robot/elastomer_tip/cam",
+ update_period=1 / 60, # 60 Hz
+ height=320,
+ width=240,
+ data_types=["distance_to_image_plane"],
+ spawn=None, # camera already spawned in USD file
+ ),
+ )
+
+The configuration supports customization of:
+
+* **Render Configuration**: Specify the GelSight sensor rendering parameters using predefined configs
+ (e.g., ``GELSIGHT_R15_CFG``, ``GELSIGHT_MINI_CFG`` from ``isaaclab_assets.sensors``)
+* **Tactile Modalities**:
+ * ``enable_camera_tactile`` - Enable tactile RGB imaging through camera sensors
+ * ``enable_force_field`` - Enable force field computation and visualization
+* **Force Field Grid**: Set tactile grid dimensions (``tactile_array_size``) and margins, which directly affects the spatial resolution of the computed force field
+* **Contact Object Configuration**: Define properties of interacting objects using prim path expressions to locate objects with SDF collision meshes
+* **Physics Parameters**: Control the sensor's force field computation:
+ * ``normal_contact_stiffness``, ``friction_coefficient``, ``tangential_stiffness`` - Normal stiffness, friction coefficient, and tangential stiffness
+* **Camera Settings**: Configure resolution, update rates, and data types, currently only ``distance_to_image_plane`` (alias for ``depth``) is supported.
+ ``spawn`` is set to ``None`` by default, which means that the camera is already spawned in the USD file.
+ If you want to spawn the camera yourself and set focal length, etc., you can set the spawn configuration to a valid spawn configuration.
+
+Configuration Requirements
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. important::
+ The following requirements must be satisfied for proper sensor operation:
+
+ **Camera Tactile Imaging**
+ If ``enable_camera_tactile=True``, a valid ``camera_cfg`` (TiledCameraCfg) must be provided with appropriate camera parameters.
+
+ **Force Field Computation**
+ If ``enable_force_field=True``, the following parameters are required:
+
+ * ``contact_object_prim_path_expr`` - Prim path expression to locate contact objects with SDF collision meshes
+
+ **SDF Computation**
+ When force field computation is enabled, penalty-based normal and shear forces are computed using Signed Distance Field (SDF) queries. To achieve GPU acceleration:
+
+ * Interacting objects should have SDF collision meshes
+ * An SDFView must be defined during initialization, therefore interacting objects should be specified before simulation.
+
+ **Elastomer Configuration**
+ The sensor's ``prim_path`` must be configured as a child of the elastomer prim in the USD hierarchy.
+ The query points for the force field computation is computed from the surface of the elastomer mesh, which is searched for under the prim path of the elastomer.
+
+ **Physics Materials**
+ The sensor uses physics materials to configure the compliant contact properties of the elastomer.
+ By default, physics material properties are pre-configured in the USD asset. However, you can override
+ these properties by specifying the following parameters in ``UsdFileWithCompliantContactCfg`` when
+ spawning the robot:
+
+ * ``compliant_contact_stiffness`` - Contact stiffness for the elastomer surface
+ * ``compliant_contact_damping`` - Contact damping for the elastomer surface
+ * ``physics_material_prim_path`` - Prim path where physics material is applied (typically ``"elastomer"``)
+
+ If any parameter is set to ``None``, the corresponding property from the USD asset will be retained.
+
+
+Usage Example
+~~~~~~~~~~~~~
+
+To use the tactile sensor in a simulation environment, run the demo:
+
+.. code-block:: bash
+
+ cd scripts/demos/sensors
+ python tacsl_sensor.py --use_tactile_rgb --use_tactile_ff --tactile_compliance_stiffness 100.0 --tactile_compliant_damping 1.0 --contact_object_type nut --num_envs 16 --save_viz --enable_cameras
+
+Available command-line options include:
+
+* ``--use_tactile_rgb``: Enable camera-based tactile sensing
+* ``--use_tactile_ff``: Enable force field tactile sensing
+* ``--contact_object_type``: Specify the type of contact object (nut, cube, etc.)
+* ``--num_envs``: Number of parallel environments
+* ``--save_viz``: Save visualization outputs for analysis
+* ``--tactile_compliance_stiffness``: Override compliant contact stiffness (default: use USD asset values)
+* ``--tactile_compliant_damping``: Override compliant contact damping (default: use USD asset values)
+* ``--normal_contact_stiffness``: Normal contact stiffness for force field computation
+* ``--tangential_stiffness``: Tangential stiffness for shear forces
+* ``--friction_coefficient``: Friction coefficient for shear forces
+* ``--debug_sdf_closest_pts``: Visualize closest SDF points for debugging
+* ``--debug_tactile_sensor_pts``: Visualize tactile sensor points for debugging
+* ``--trimesh_vis_tactile_points``: Enable trimesh-based visualization of tactile points
+
+For a complete list of available options:
+
+.. code-block:: bash
+
+ python tacsl_sensor.py -h
+
+.. note::
+ The demo examples are based on the Gelsight R1.5, which is a prototype sensor that is now discontinued. The same procedure can be adapted for other visuotactile sensors.
+
+.. figure:: ../../../_static/overview/sensors/tacsl_demo.jpg
+ :align: center
+ :figwidth: 100%
+ :alt: TacSL tactile sensor demo showing RGB tactile images and force field visualizations
+
+The tactile sensor supports multiple data modalities that provide comprehensive information about contact interactions:
+
+
+Output Tactile Data
+~~~~~~~~~~~~~~~~~~~
+**RGB Tactile Images**
+ Real-time generation of tactile RGB images as objects make contact with the sensor surface. These images show deformation patterns and contact geometry similar to gel-based tactile sensors [Si2022]_
+
+
+**Force Fields**
+ Detailed contact force field and pressure distributions across the sensor surface, including normal and shear components.
+
+.. list-table::
+ :widths: 50 50
+ :class: borderless
+
+ * - .. figure:: ../../../_static/overview/sensors/tacsl_taxim_example.jpg
+ :align: center
+ :figwidth: 80%
+ :alt: Tactile output with RGB visualization
+
+ - .. figure:: ../../../_static/overview/sensors/tacsl_force_field_example.jpg
+ :align: center
+ :figwidth: 80%
+ :alt: Tactile output with force field visualization
+
+Integration with Learning Frameworks
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The tactile sensor is designed to integrate seamlessly with reinforcement learning and imitation learning frameworks. The structured tensor outputs can be directly used as observations in learning algorithms:
+
+.. code-block:: python
+
+ def get_tactile_observations(self):
+ """Extract tactile observations for learning."""
+ tactile_data = self.scene["tactile_sensor"].data
+
+ # tactile RGB image
+ tactile_rgb = tactile_data.tactile_rgb_image
+
+ # tactile depth image
+ tactile_depth = tactile_data.tactile_depth_image
+
+ # force field
+ tactile_normal_force = tactile_data.tactile_normal_force
+ tactile_shear_force = tactile_data.tactile_shear_force
+
+ return [tactile_rgb, tactile_depth, tactile_normal_force, tactile_shear_force]
+
+
+
+References
+~~~~~~~~~~
+
+.. [Akinola2025] Akinola, I., Xu, J., Carius, J., Fox, D., & Narang, Y. (2025). TacSL: A library for visuotactile sensor simulation and learning. *IEEE Transactions on Robotics*.
+.. [Si2022] Si, Z., & Yuan, W. (2022). Taxim: An example-based simulation model for GelSight tactile sensors. *IEEE Robotics and Automation Letters*, 7(2), 2361-2368.
diff --git a/docs/source/overview/developer-guide/development.rst b/docs/source/overview/developer-guide/development.rst
index a88a57f1e88c..48a5019609fa 100644
--- a/docs/source/overview/developer-guide/development.rst
+++ b/docs/source/overview/developer-guide/development.rst
@@ -1,7 +1,7 @@
Extension Development
=======================
-Everything in Omniverse is either an extension, or a collection of extensions (an application). They are
+Everything in Omniverse is either an extension or a collection of extensions (an application). They are
modularized packages that form the atoms of the Omniverse ecosystem. Each extension
provides a set of functionalities that can be used by other extensions or
standalone applications. A folder is recognized as an extension if it contains
@@ -32,12 +32,12 @@ for the extension with more detailed information about the extension and a CHANG
file that contains the changes made to the extension in each version.
The ```` directory contains the main python package for the extension.
-It may also contains the ``scripts`` directory for keeping python-based applications
-that are loaded into Omniverse when then extension is enabled using the
+It may also contain the ``scripts`` directory for keeping python-based applications
+that are loaded into Omniverse when the extension is enabled using the
`Extension Manager `__.
More specifically, when an extension is enabled, the python module specified in the
-``config/extension.toml`` file is loaded and scripts that contains children of the
+``config/extension.toml`` file is loaded and scripts that contain children of the
:class:`omni.ext.IExt` class are executed.
.. code:: python
@@ -60,7 +60,7 @@ More specifically, when an extension is enabled, the python module specified in
While loading extensions into Omniverse happens automatically, using the python package
in standalone applications requires additional steps. To simplify the build process and
-avoiding the need to understand the `premake `__
+avoid the need to understand the `premake `__
build system used by Omniverse, we directly use the `setuptools `__
python package to build the python module provided by the extensions. This is done by the
``setup.py`` file in the extension directory.
diff --git a/docs/source/overview/developer-guide/index.rst b/docs/source/overview/developer-guide/index.rst
index e77ebc6cc464..59f603fbfad2 100644
--- a/docs/source/overview/developer-guide/index.rst
+++ b/docs/source/overview/developer-guide/index.rst
@@ -13,4 +13,3 @@ using VSCode.
VS Code
repo_structure
development
- template
diff --git a/docs/source/overview/developer-guide/repo_structure.rst b/docs/source/overview/developer-guide/repo_structure.rst
index 22c5cb518208..a201886c0f8d 100644
--- a/docs/source/overview/developer-guide/repo_structure.rst
+++ b/docs/source/overview/developer-guide/repo_structure.rst
@@ -5,7 +5,6 @@ Repository organization
IsaacLab
โโโ .vscode
- โโโ .flake8
โโโ CONTRIBUTING.md
โโโ CONTRIBUTORS.md
โโโ LICENSE
diff --git a/docs/source/overview/developer-guide/template.rst b/docs/source/overview/developer-guide/template.rst
deleted file mode 100644
index 34e66f3d1f9a..000000000000
--- a/docs/source/overview/developer-guide/template.rst
+++ /dev/null
@@ -1,92 +0,0 @@
-.. _template-generator:
-
-Build your Own Project or Task
-==============================
-
-Traditionally, building new projects that utilize Isaac Lab's features required creating your own
-extensions within the Isaac Lab repository. However, this approach can obscure project visibility and
-complicate updates from one version of Isaac Lab to another. To circumvent these challenges,
-we now provide a command-line tool (**template generator**) for creating Isaac Lab-based projects and tasks.
-
-The template generator enables you to create an:
-
-* **External project** (recommended): An isolated project that is not part of the Isaac Lab repository. This approach
- works outside of the core Isaac Lab repository, ensuring that your development efforts remain self-contained. Also,
- it allows your code to be run as an extension in Omniverse.
-
- .. hint::
-
- For the external project, the template generator will initialize a new Git repository in the specified directory.
- You can push the generated content to your own remote repository (e.g. GitHub) and share it with others.
-
-* **Internal task**: A task that is part of the Isaac Lab repository. This approach should only be used to create
- new tasks within the Isaac Lab repository in order to contribute to it.
-
-Running the template generator
-------------------------------
-
-Install Isaac Lab by following the `installation guide <../../setup/installation/index.html>`_.
-We recommend using conda installation as it simplifies calling Python scripts from the terminal.
-
-Then, run the following command to generate a new external project or internal task:
-
-.. tab-set::
- :sync-group: os
-
- .. tab-item:: :icon:`fa-brands fa-linux` Linux
- :sync: linux
-
- .. code-block:: bash
-
- ./isaaclab.sh --new # or "./isaaclab.sh -n"
-
- .. tab-item:: :icon:`fa-brands fa-windows` Windows
- :sync: windows
-
- .. code-block:: batch
-
- isaaclab.bat --new :: or "isaaclab.bat -n"
-
-The generator will guide you in setting up the project/task for your needs by asking you the following questions:
-
-* Type of project/task (external or internal), and project/task path or names according to the selected type.
-* Isaac Lab workflows (see :ref:`feature-workflows`).
-* Reinforcement learning libraries (see :ref:`rl-frameworks`), and algorithms (if the selected libraries support multiple algorithms).
-
-External project usage (once generated)
----------------------------------------
-
-Once the external project is generated, a ``README.md`` file will be created in the specified directory.
-This file will contain instructions on how to install the project and run the tasks.
-
-Here are some general commands to get started with it:
-
-.. note::
-
- If Isaac Lab is not installed in a conda environment or in a (virtual) Python environment, use ``FULL_PATH_TO_ISAACLAB/isaaclab.sh -p``
- (or ``FULL_PATH_TO_ISAACLAB\isaaclab.bat -p`` on Windows) instead of ``python`` to run the commands below.
-
-* Install the project (in editable mode).
-
- .. code:: bash
-
- python -m pip install -e source/
-
-* List the tasks available in the project.
-
- .. warning::
-
- If the task names change, it may be necessary to update the search pattern ``"Template-"``
- (in the ``scripts/list_envs.py`` file) so that they can be listed.
-
- .. code:: bash
-
- python scripts/list_envs.py
-
-* Run a task.
-
- .. code:: bash
-
- python scripts//train.py --task=
-
-For more details, please follow the instructions in the generated project's ``README.md`` file.
diff --git a/docs/source/overview/developer-guide/vs_code.rst b/docs/source/overview/developer-guide/vs_code.rst
index f9ea07b6da35..a19889d1bdb8 100644
--- a/docs/source/overview/developer-guide/vs_code.rst
+++ b/docs/source/overview/developer-guide/vs_code.rst
@@ -52,8 +52,7 @@ If everything executes correctly, it should create the following files:
For more information on VSCode support for Omniverse, please refer to the
following links:
-* `Isaac Sim VSCode support `__
-* `Debugging with VSCode `__
+* `Isaac Sim VSCode support `__
Configuring the python interpreter
@@ -69,10 +68,25 @@ python executable provided by Omniverse. This is specified in the
"python.defaultInterpreterPath": "${workspaceFolder}/_isaac_sim/python.sh",
}
-If you want to use a different python interpreter (for instance, from your conda environment),
+If you want to use a different python interpreter (for instance, from your conda or uv environment),
you need to change the python interpreter used by selecting and activating the python interpreter
of your choice in the bottom left corner of VSCode, or opening the command palette (``Ctrl+Shift+P``)
and selecting ``Python: Select Interpreter``.
For more information on how to set python interpreter for VSCode, please
refer to the `VSCode documentation `_.
+
+
+Setting up formatting and linting
+---------------------------------
+
+We use `ruff `_ as a formatter and linter.
+These are configured in the ``.vscode/settings.json`` file:
+
+.. code-block:: json
+
+ {
+ "ruff.configuration": "${workspaceFolder}/pyproject.toml",
+ }
+
+The ruff linter will show warnings and errors in your code to help you follow Python best practices and the project's coding standards.
diff --git a/docs/source/overview/environments.rst b/docs/source/overview/environments.rst
index 34ebda6d2523..c1cfb7dcb2c4 100644
--- a/docs/source/overview/environments.rst
+++ b/docs/source/overview/environments.rst
@@ -3,7 +3,7 @@
Available Environments
======================
-The following lists comprises of all the RL tasks implementations that are available in Isaac Lab.
+The following lists comprises of all the RL and IL tasks implementations that are available in Isaac Lab.
While we try to keep this list up-to-date, you can always get the latest list of environments by
running the following command:
@@ -13,16 +13,23 @@ running the following command:
.. tab-item:: :icon:`fa-brands fa-linux` Linux
:sync: linux
+ .. note::
+ Use ``--keyword `` (optional) to filter environments by keyword.
+
.. code:: bash
- ./isaaclab.sh -p scripts/environments/list_envs.py
+ ./isaaclab.sh -p scripts/environments/list_envs.py --keyword
.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows
+ .. note::
+ Use ``--keyword `` (optional) to filter environments by keyword.
+
.. code:: batch
- isaaclab.bat -p scripts\environments\list_envs.py
+ isaaclab.bat -p scripts\environments\list_envs.py --keyword
+
We are actively working on adding more environments to the list. If you have any environments that
you would like to add to Isaac Lab, please feel free to open a pull request!
@@ -54,7 +61,7 @@ Classic environments that are based on IsaacGymEnvs implementation of MuJoCo-sty
| | |cartpole-direct-link| | |
+------------------+-----------------------------+-------------------------------------------------------------------------+
| |cartpole| | |cartpole-rgb-link| | Move the cart to keep the pole upwards in the classic cartpole control |
- | | | and perceptive inputs |
+ | | | and perceptive inputs. Requires running with ``--enable_cameras``. |
| | |cartpole-depth-link| | |
| | | |
| | |cartpole-rgb-direct-link| | |
@@ -63,7 +70,7 @@ Classic environments that are based on IsaacGymEnvs implementation of MuJoCo-sty
+------------------+-----------------------------+-------------------------------------------------------------------------+
| |cartpole| | |cartpole-resnet-link| | Move the cart to keep the pole upwards in the classic cartpole control |
| | | based off of features extracted from perceptive inputs with pre-trained |
- | | |cartpole-theia-link| | frozen vision encoders |
+ | | |cartpole-theia-link| | frozen vision encoders. Requires running with ``--enable_cameras``. |
+------------------+-----------------------------+-------------------------------------------------------------------------+
.. |humanoid| image:: ../_static/tasks/classic/humanoid.jpg
@@ -100,44 +107,105 @@ for the lift-cube environment:
.. table::
:widths: 33 37 30
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
- | World | Environment ID | Description |
- +====================+=========================+=============================================================================+
- | |reach-franka| | |reach-franka-link| | Move the end-effector to a sampled target pose with the Franka robot |
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
- | |reach-ur10| | |reach-ur10-link| | Move the end-effector to a sampled target pose with the UR10 robot |
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
- | |lift-cube| | |lift-cube-link| | Pick a cube and bring it to a sampled target position with the Franka robot |
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
- | |stack-cube| | |stack-cube-link| | Stack three cubes (bottom to top: blue, red, green) with the Franka robot |
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
- | |cabi-franka| | |cabi-franka-link| | Grasp the handle of a cabinet's drawer and open it with the Franka robot |
- | | | |
- | | |franka-direct-link| | |
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
- | |cube-allegro| | |cube-allegro-link| | In-hand reorientation of a cube using Allegro hand |
- | | | |
- | | |allegro-direct-link| | |
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
- | |cube-shadow| | |cube-shadow-link| | In-hand reorientation of a cube using Shadow hand |
- | | | |
- | | |cube-shadow-ff-link| | |
- | | | |
- | | |cube-shadow-lstm-link| | |
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
- | |cube-shadow| | |cube-shadow-vis-link| | In-hand reorientation of a cube using Shadow hand using perceptive inputs |
- +--------------------+-------------------------+-----------------------------------------------------------------------------+
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | World | Environment ID | Description |
+ +=========================+==============================+=============================================================================+
+ | |reach-franka| | |reach-franka-link| | Move the end-effector to a sampled target pose with the Franka robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |reach-ur10| | |reach-ur10-link| | Move the end-effector to a sampled target pose with the UR10 robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |deploy-reach-ur10e| | |deploy-reach-ur10e-link| | Move the end-effector to a sampled target pose with the UR10e robot |
+ | | | This policy has been deployed to a real robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |lift-cube| | |lift-cube-link| | Pick a cube and bring it to a sampled target position with the Franka robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |stack-cube| | |stack-cube-link| | Stack three cubes (bottom to top: blue, red, green) with the Franka robot. |
+ | | | Blueprint env used for the NVIDIA Isaac GR00T blueprint for synthetic |
+ | | |stack-cube-bp-link| | manipulation motion generation |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |surface-gripper| | |long-suction-link| | Stack three cubes (bottom to top: blue, red, green) |
+ | | | with the UR10 arm and long surface gripper |
+ | | |short-suction-link| | or short surface gripper. |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |cabi-franka| | |cabi-franka-link| | Grasp the handle of a cabinet's drawer and open it with the Franka robot |
+ | | | |
+ | | |franka-direct-link| | |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |cube-allegro| | |cube-allegro-link| | In-hand reorientation of a cube using Allegro hand |
+ | | | |
+ | | |allegro-direct-link| | |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |cube-shadow| | |cube-shadow-link| | In-hand reorientation of a cube using Shadow hand |
+ | | | |
+ | | |cube-shadow-ff-link| | |
+ | | | |
+ | | |cube-shadow-lstm-link| | |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |cube-shadow| | |cube-shadow-vis-link| | In-hand reorientation of a cube using Shadow hand using perceptive inputs. |
+ | | | Requires running with ``--enable_cameras``. |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |gr1_pick_place| | |gr1_pick_place-link| | Pick up and place an object in a basket with a GR-1 humanoid robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |gr1_pp_waist| | |gr1_pp_waist-link| | Pick up and place an object in a basket with a GR-1 humanoid robot |
+ | | | with waist degrees-of-freedom enables that provides a wider reach space. |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |g1_pick_place| | |g1_pick_place-link| | Pick up and place an object in a basket with a Unitree G1 humanoid robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |g1_pick_place_fixed| | |g1_pick_place_fixed-link| | Pick up and place an object in a basket with a Unitree G1 humanoid robot |
+ | | | with three-fingered hands. Robot is set up with the base fixed in place. |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |g1_pick_place_lm| | |g1_pick_place_lm-link| | Pick up and place an object in a basket with a Unitree G1 humanoid robot |
+ | | | with three-fingered hands and in-place locomanipulation capabilities |
+ | | | enabled (i.e. Robot lower body balances in-place while upper body is |
+ | | | controlled via Inverse Kinematics). |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |kuka-allegro-lift| | |kuka-allegro-lift-link| | Pick up a primitive shape on the table and lift it to target position |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |kuka-allegro-reorient| | |kuka-allegro-reorient-link| | Pick up a primitive shape on the table and orient it to target pose |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |galbot_stack| | |galbot_stack-link| | Stack three cubes (bottom to top: blue, red, green) with the left arm of |
+ | | | a Galbot humanoid robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |agibot_place_mug| | |agibot_place_mug-link| | Pick up and place a mug upright with a Agibot A2D humanoid robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |agibot_place_toy| | |agibot_place_toy-link| | Pick up and place an object in a box with a Agibot A2D humanoid robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |reach_openarm_bi| | |reach_openarm_bi-link| | Move the end-effector to sampled target poses with the OpenArm robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |reach_openarm_uni| | |reach_openarm_uni-link| | Move the end-effector to a sampled target pose with the OpenArm robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |lift_openarm_uni| | |lift_openarm_uni-link| | Pick a cube and bring it to a sampled target position with the OpenArm robot|
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
+ | |cabi_openarm_uni| | |cabi_openarm_uni-link| | Grasp the handle of a cabinet's drawer and open it with the OpenArm robot |
+ +-------------------------+------------------------------+-----------------------------------------------------------------------------+
.. |reach-franka| image:: ../_static/tasks/manipulation/franka_reach.jpg
.. |reach-ur10| image:: ../_static/tasks/manipulation/ur10_reach.jpg
+.. |deploy-reach-ur10e| image:: ../_static/tasks/manipulation/ur10e_reach.jpg
.. |lift-cube| image:: ../_static/tasks/manipulation/franka_lift.jpg
.. |cabi-franka| image:: ../_static/tasks/manipulation/franka_open_drawer.jpg
.. |cube-allegro| image:: ../_static/tasks/manipulation/allegro_cube.jpg
.. |cube-shadow| image:: ../_static/tasks/manipulation/shadow_cube.jpg
.. |stack-cube| image:: ../_static/tasks/manipulation/franka_stack.jpg
+.. |gr1_pick_place| image:: ../_static/tasks/manipulation/gr-1_pick_place.jpg
+.. |g1_pick_place| image:: ../_static/tasks/manipulation/g1_pick_place.jpg
+.. |g1_pick_place_fixed| image:: ../_static/tasks/manipulation/g1_pick_place_fixed_base.jpg
+.. |g1_pick_place_lm| image:: ../_static/tasks/manipulation/g1_pick_place_locomanipulation.jpg
+.. |surface-gripper| image:: ../_static/tasks/manipulation/ur10_stack_surface_gripper.jpg
+.. |gr1_pp_waist| image:: ../_static/tasks/manipulation/gr-1_pick_place_waist.jpg
+.. |galbot_stack| image:: ../_static/tasks/manipulation/galbot_stack_cube.jpg
+.. |agibot_place_mug| image:: ../_static/tasks/manipulation/agibot_place_mug.jpg
+.. |agibot_place_toy| image:: ../_static/tasks/manipulation/agibot_place_toy.jpg
+.. |kuka-allegro-lift| image:: ../_static/tasks/manipulation/kuka_allegro_lift.jpg
+.. |kuka-allegro-reorient| image:: ../_static/tasks/manipulation/kuka_allegro_reorient.jpg
+.. |reach_openarm_bi| image:: ../_static/tasks/manipulation/openarm_bi_reach.jpg
+.. |reach_openarm_uni| image:: ../_static/tasks/manipulation/openarm_uni_reach.jpg
+.. |lift_openarm_uni| image:: ../_static/tasks/manipulation/openarm_uni_lift.jpg
+.. |cabi_openarm_uni| image:: ../_static/tasks/manipulation/openarm_uni_open_drawer.jpg
.. |reach-franka-link| replace:: `Isaac-Reach-Franka-v0 `__
.. |reach-ur10-link| replace:: `Isaac-Reach-UR10-v0 `__
+.. |deploy-reach-ur10e-link| replace:: `Isaac-Deploy-Reach-UR10e-v0 `__
.. |lift-cube-link| replace:: `Isaac-Lift-Cube-Franka-v0 `__
.. |lift-cube-ik-abs-link| replace:: `Isaac-Lift-Cube-Franka-IK-Abs-v0 `__
.. |lift-cube-ik-rel-link| replace:: `Isaac-Lift-Cube-Franka-IK-Rel-v0 `__
@@ -146,11 +214,28 @@ for the lift-cube environment:
.. |cube-allegro-link| replace:: `Isaac-Repose-Cube-Allegro-v0 `__
.. |allegro-direct-link| replace:: `Isaac-Repose-Cube-Allegro-Direct-v0 `__
.. |stack-cube-link| replace:: `Isaac-Stack-Cube-Franka-v0 `__
-
+.. |stack-cube-bp-link| replace:: `Isaac-Stack-Cube-Franka-IK-Rel-Blueprint-v0 `__
+.. |gr1_pick_place-link| replace:: `Isaac-PickPlace-GR1T2-Abs-v0 `__
+.. |g1_pick_place-link| replace:: `Isaac-PickPlace-G1-InspireFTP-Abs-v0 `__
+.. |g1_pick_place_fixed-link| replace:: `Isaac-PickPlace-FixedBaseUpperBodyIK-G1-Abs-v0 `__
+.. |g1_pick_place_lm-link| replace:: `Isaac-PickPlace-Locomanipulation-G1-Abs-v0 `__
+.. |long-suction-link| replace:: `Isaac-Stack-Cube-UR10-Long-Suction-IK-Rel-v0 `__
+.. |short-suction-link| replace:: `Isaac-Stack-Cube-UR10-Short-Suction-IK-Rel-v0 `__
+.. |gr1_pp_waist-link| replace:: `Isaac-PickPlace-GR1T2-WaistEnabled-Abs-v0 `__
+.. |galbot_stack-link| replace:: `Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-RmpFlow-v0 `__
+.. |kuka-allegro-lift-link| replace:: `Isaac-Dexsuite-Kuka-Allegro-Lift-v0 `__
+.. |kuka-allegro-reorient-link| replace:: `Isaac-Dexsuite-Kuka-Allegro-Reorient-v0 `__
.. |cube-shadow-link| replace:: `Isaac-Repose-Cube-Shadow-Direct-v0 `__
.. |cube-shadow-ff-link| replace:: `Isaac-Repose-Cube-Shadow-OpenAI-FF-Direct-v0 `__
.. |cube-shadow-lstm-link| replace:: `Isaac-Repose-Cube-Shadow-OpenAI-LSTM-Direct-v0 `__
.. |cube-shadow-vis-link| replace:: `Isaac-Repose-Cube-Shadow-Vision-Direct-v0 `__
+.. |agibot_place_mug-link| replace:: `Isaac-Place-Mug-Agibot-Left-Arm-RmpFlow-v0 `__
+.. |agibot_place_toy-link| replace:: `Isaac-Place-Toy2Box-Agibot-Right-Arm-RmpFlow-v0 `__
+.. |reach_openarm_bi-link| replace:: `Isaac-Reach-OpenArm-Bi-v0 `__
+.. |reach_openarm_uni-link| replace:: `Isaac-Reach-OpenArm-v0 `__
+.. |lift_openarm_uni-link| replace:: `Isaac-Lift-Cube-OpenArm-v0 `__
+.. |cabi_openarm_uni-link| replace:: `Isaac-Open-Drawer-OpenArm-v0 `__
+
Contact-rich Manipulation
~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -185,6 +270,95 @@ For example:
.. |factory-gear-link| replace:: `Isaac-Factory-GearMesh-Direct-v0 `__
.. |factory-nut-link| replace:: `Isaac-Factory-NutThread-Direct-v0 `__
+AutoMate
+~~~~~~~~
+
+Environments based on 100 diverse assembly tasks, each involving the insertion of a plug into a socket. These tasks share a common configuration and differ by th geometry and properties of the parts.
+
+You can switch between tasks by specifying the corresponding asset ID. Available asset IDs include:
+
+'00004', '00007', '00014', '00015', '00016', '00021', '00028', '00030', '00032', '00042', '00062', '00074', '00077', '00078', '00081', '00083', '00103', '00110', '00117', '00133', '00138', '00141', '00143', '00163', '00175', '00186', '00187', '00190', '00192', '00210', '00211', '00213', '00255', '00256', '00271', '00293', '00296', '00301', '00308', '00318', '00319', '00320', '00329', '00340', '00345', '00346', '00360', '00388', '00410', '00417', '00422', '00426', '00437', '00444', '00446', '00470', '00471', '00480', '00486', '00499', '00506', '00514', '00537', '00553', '00559', '00581', '00597', '00614', '00615', '00638', '00648', '00649', '00652', '00659', '00681', '00686', '00700', '00703', '00726', '00731', '00741', '00755', '00768', '00783', '00831', '00855', '00860', '00863', '01026', '01029', '01036', '01041', '01053', '01079', '01092', '01102', '01125', '01129', '01132', '01136'.
+
+We provide environments for both disassembly and assembly.
+
+.. attention::
+
+ CUDA is recommended for running the AutoMate environments with 570 drivers. If running with Nvidia driver 570 on Linux with architecture x86_64, we follow the below steps to install CUDA 12.8. This allows for computing rewards in AutoMate environments with CUDA. If you have a different operation system or architecture, please refer to the `CUDA installation page `_ for additional instruction.
+
+ .. code-block:: bash
+
+ wget https://developer.download.nvidia.com/compute/cuda/12.8.0/local_installers/cuda_12.8.0_570.86.10_linux.run
+ sudo sh cuda_12.8.0_570.86.10_linux.run --toolkit
+
+ When using conda, cuda toolkit can be installed with:
+
+ .. code-block:: bash
+
+ conda install cudatoolkit
+
+ With 580 drivers and CUDA 13, we are currently unable to enable CUDA for computing the rewards. The code automatically fallbacks to CPU, resulting in slightly slower performance.
+
+* |disassembly-link|: The plug starts inserted in the socket. A low-level controller lifts the plug out and moves it to a random position. This process is purely scripted and does not involve any learned policy. Therefore, it does not require policy training or evaluation. The resulting trajectories serve as demonstrations for the reverse process, i.e., learning to assemble. To run disassembly for a specific task: ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_disassembly_w_id.py --assembly_id=ASSEMBLY_ID --disassembly_dir=DISASSEMBLY_DIR``. All generated trajectories are saved to a local directory ``DISASSEMBLY_DIR``.
+* |assembly-link|: The goal is to insert the plug into the socket. You can use this environment to train a policy via reinforcement learning or evaluate a pre-trained checkpoint.
+
+ * To train an assembly policy, we run the command ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --train``. We can customize the training process using the optional flags: ``--headless`` to run without opening the GUI windows, ``--max_iterations=MAX_ITERATIONS`` to set the number of training iterations, ``--num_envs=NUM_ENVS`` to set the number of parallel environments during training, ``--seed=SEED`` to assign the random seed. The policy checkpoints will be saved automatically during training in the directory ``logs/rl_games/Assembly/test``.
+ * To evaluate an assembly policy, we run the command ``python source/isaaclab_tasks/isaaclab_tasks/direct/automate/run_w_id.py --assembly_id=ASSEMBLY_ID --checkpoint=CHECKPOINT --log_eval``. The evaluation results are stored in ``evaluation_{ASSEMBLY_ID}.h5``.
+
+.. table::
+ :widths: 33 37 30
+
+ +--------------------+-------------------------+-----------------------------------------------------------------------------+
+ | World | Environment ID | Description |
+ +====================+=========================+=============================================================================+
+ | |disassembly| | |disassembly-link| | Lift a plug out of the socket with the Franka robot |
+ +--------------------+-------------------------+-----------------------------------------------------------------------------+
+ | |assembly| | |assembly-link| | Insert a plug into its corresponding socket with the Franka robot |
+ +--------------------+-------------------------+-----------------------------------------------------------------------------+
+
+.. |assembly| image:: ../_static/tasks/automate/00004.jpg
+.. |disassembly| image:: ../_static/tasks/automate/01053_disassembly.jpg
+
+.. |assembly-link| replace:: `Isaac-AutoMate-Assembly-Direct-v0 `__
+.. |disassembly-link| replace:: `Isaac-AutoMate-Disassembly-Direct-v0 `__
+
+FORGE
+~~~~~~~~
+
+FORGE environments extend Factory environments with:
+
+* Force sensing: Add observations for force experienced by the end-effector.
+* Excessive force penalty: Add an option to penalize the agent for excessive contact forces.
+* Dynamics randomization: Randomize controller gains, asset properties (friction, mass), and dead-zone.
+* Success prediction: Add an extra action that predicts task success.
+
+These tasks share the same task configurations and control options. You can switch between them by specifying the task name.
+
+* |forge-peg-link|: Peg insertion with the Franka arm
+* |forge-gear-link|: Gear meshing with the Franka arm
+* |forge-nut-link|: Nut-Bolt fastening with the Franka arm
+
+.. table::
+ :widths: 33 37 30
+
+ +--------------------+-------------------------+-----------------------------------------------------------------------------+
+ | World | Environment ID | Description |
+ +====================+=========================+=============================================================================+
+ | |forge-peg| | |forge-peg-link| | Insert peg into the socket with the Franka robot |
+ +--------------------+-------------------------+-----------------------------------------------------------------------------+
+ | |forge-gear| | |forge-gear-link| | Insert and mesh gear into the base with other gears, using the Franka robot |
+ +--------------------+-------------------------+-----------------------------------------------------------------------------+
+ | |forge-nut| | |forge-nut-link| | Thread the nut onto the first 2 threads of the bolt, using the Franka robot |
+ +--------------------+-------------------------+-----------------------------------------------------------------------------+
+
+.. |forge-peg| image:: ../_static/tasks/factory/peg_insert.jpg
+.. |forge-gear| image:: ../_static/tasks/factory/gear_mesh.jpg
+.. |forge-nut| image:: ../_static/tasks/factory/nut_thread.jpg
+
+.. |forge-peg-link| replace:: `Isaac-Forge-PegInsert-Direct-v0 `__
+.. |forge-gear-link| replace:: `Isaac-Forge-GearMesh-Direct-v0 `__
+.. |forge-nut-link| replace:: `Isaac-Forge-NutThread-Direct-v0 `__
+
+
Locomotion
~~~~~~~~~~
@@ -234,6 +408,12 @@ Environments based on legged locomotion tasks.
+------------------------------+----------------------------------------------+------------------------------------------------------------------------------+
| |velocity-rough-g1| | |velocity-rough-g1-link| | Track a velocity command on rough terrain with the Unitree G1 robot |
+------------------------------+----------------------------------------------+------------------------------------------------------------------------------+
+ | |velocity-flat-digit| | |velocity-flat-digit-link| | Track a velocity command on flat terrain with the Agility Digit robot |
+ +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+
+ | |velocity-rough-digit| | |velocity-rough-digit-link| | Track a velocity command on rough terrain with the Agility Digit robot |
+ +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+
+ | |tracking-loco-manip-digit| | |tracking-loco-manip-digit-link| | Track a root velocity and hand pose command with the Agility Digit robot |
+ +------------------------------+----------------------------------------------+------------------------------------------------------------------------------+
.. |velocity-flat-anymal-b-link| replace:: `Isaac-Velocity-Flat-Anymal-B-v0 `__
.. |velocity-rough-anymal-b-link| replace:: `Isaac-Velocity-Rough-Anymal-B-v0 `__
@@ -264,6 +444,9 @@ Environments based on legged locomotion tasks.
.. |velocity-flat-g1-link| replace:: `Isaac-Velocity-Flat-G1-v0 `__
.. |velocity-rough-g1-link| replace:: `Isaac-Velocity-Rough-G1-v0 `__
+.. |velocity-flat-digit-link| replace:: `Isaac-Velocity-Flat-Digit-v0 `__
+.. |velocity-rough-digit-link| replace:: `Isaac-Velocity-Rough-Digit-v0 `__
+.. |tracking-loco-manip-digit-link| replace:: `Isaac-Tracking-LocoManip-Digit-v0 `__
.. |velocity-flat-anymal-b| image:: ../_static/tasks/locomotion/anymal_b_flat.jpg
.. |velocity-rough-anymal-b| image:: ../_static/tasks/locomotion/anymal_b_rough.jpg
@@ -282,6 +465,9 @@ Environments based on legged locomotion tasks.
.. |velocity-rough-h1| image:: ../_static/tasks/locomotion/h1_rough.jpg
.. |velocity-flat-g1| image:: ../_static/tasks/locomotion/g1_flat.jpg
.. |velocity-rough-g1| image:: ../_static/tasks/locomotion/g1_rough.jpg
+.. |velocity-flat-digit| image:: ../_static/tasks/locomotion/agility_digit_flat.jpg
+.. |velocity-rough-digit| image:: ../_static/tasks/locomotion/agility_digit_rough.jpg
+.. |tracking-loco-manip-digit| image:: ../_static/tasks/locomotion/agility_digit_loco_manip.jpg
Navigation
~~~~~~~~~~
@@ -300,6 +486,28 @@ Navigation
.. |anymal_c_nav| image:: ../_static/tasks/navigation/anymal_c_nav.jpg
+Multirotor
+~~~~~~~~~~
+
+.. note::
+ The multirotor entry provides an environment configuration for flying the ARL robot.
+ See the `drone_arl` folder and the ARL robot config
+ (`ARL_ROBOT_1_CFG`) in the codebase for details.
+
+.. |arl_robot_track_position_state_based-link| replace:: `Isaac-TrackPositionNoObstacles-ARL-Robot-1-v0 `__
+
+.. |arl_robot_track_position_state_based| image:: ../_static/tasks/drone_arl/arl_robot_1_track_position_state_based.jpg
+
+.. table::
+ :widths: 33 37 30
+
+ +----------------------------------------+---------------------------------------------+----------------------------------------------------------------------------------------+
+ | World | Environment ID | Description |
+ +========================================+=============================================+========================================================================================+
+ | |arl_robot_track_position_state_based| | |arl_robot_track_position_state_based-link| | Setpoint position control for the ARL robot using the track_position_state_based task. |
+ +----------------------------------------+---------------------------------------------+----------------------------------------------------------------------------------------+
+
+
Others
~~~~~~
@@ -500,6 +708,10 @@ Environments based on fixed-arm manipulation tasks.
Comprehensive List of Environments
==================================
+For environments that have a different task name listed under ``Inference Task Name``, please use the Inference Task Name
+provided when running ``play.py`` or any inferencing workflows. These tasks provide more suitable configurations for
+inferencing, including reading from an already trained checkpoint and disabling runtime perturbations used for training.
+
.. list-table::
:widths: 33 25 19 25
@@ -519,47 +731,47 @@ Comprehensive List of Environments
-
- Direct
- **rl_games** (PPO), **skrl** (IPPO, PPO, MAPPO)
- * - Isaac-Cartpole-Camera-Showcase-Box-Box-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Box-Box-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Camera-Showcase-Box-Discrete-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Box-Discrete-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Camera-Showcase-Box-MultiDiscrete-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Box-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Camera-Showcase-Dict-Box-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Dict-Box-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Camera-Showcase-Dict-Discrete-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Dict-Discrete-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Camera-Showcase-Dict-MultiDiscrete-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Dict-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Camera-Showcase-Tuple-Box-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Tuple-Box-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Camera-Showcase-Tuple-Discrete-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Tuple-Discrete-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Camera-Showcase-Tuple-MultiDiscrete-Direct-v0
+ * - Isaac-Cartpole-Camera-Showcase-Tuple-MultiDiscrete-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **skrl** (PPO)
- * - Isaac-Cartpole-Depth-Camera-Direct-v0
+ * - Isaac-Cartpole-Depth-Camera-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **rl_games** (PPO), **skrl** (PPO)
- * - Isaac-Cartpole-Depth-v0
+ * - Isaac-Cartpole-Depth-v0 (Requires running with ``--enable_cameras``)
-
- Manager Based
- **rl_games** (PPO)
@@ -567,19 +779,19 @@ Comprehensive List of Environments
-
- Direct
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
- * - Isaac-Cartpole-RGB-Camera-Direct-v0
+ * - Isaac-Cartpole-RGB-Camera-Direct-v0 (Requires running with ``--enable_cameras``)
-
- Direct
- **rl_games** (PPO), **skrl** (PPO)
- * - Isaac-Cartpole-RGB-ResNet18-v0
+ * - Isaac-Cartpole-RGB-ResNet18-v0 (Requires running with ``--enable_cameras``)
-
- Manager Based
- **rl_games** (PPO)
- * - Isaac-Cartpole-RGB-TheiaTiny-v0
+ * - Isaac-Cartpole-RGB-TheiaTiny-v0 (Requires running with ``--enable_cameras``)
-
- Manager Based
- **rl_games** (PPO)
- * - Isaac-Cartpole-RGB-v0
+ * - Isaac-Cartpole-RGB-v0 (Requires running with ``--enable_cameras``)
-
- Manager Based
- **rl_games** (PPO)
@@ -659,6 +871,26 @@ Comprehensive List of Environments
-
- Direct
- **rl_games** (PPO)
+ * - Isaac-AutoMate-Assembly-Direct-v0
+ -
+ - Direct
+ - **rl_games** (PPO)
+ * - Isaac-AutoMate-Disassembly-Direct-v0
+ -
+ - Direct
+ -
+ * - Isaac-Forge-GearMesh-Direct-v0
+ -
+ - Direct
+ - **rl_games** (PPO)
+ * - Isaac-Forge-NutThread-Direct-v0
+ -
+ - Direct
+ - **rl_games** (PPO)
+ * - Isaac-Forge-PegInsert-Direct-v0
+ -
+ - Direct
+ - **rl_games** (PPO)
* - Isaac-Franka-Cabinet-Direct-v0
-
- Direct
@@ -699,6 +931,10 @@ Comprehensive List of Environments
-
- Manager Based
-
+ * - Isaac-Tracking-LocoManip-Digit-v0
+ - Isaac-Tracking-LocoManip-Digit-Play-v0
+ - Manager Based
+ - **rsl_rl** (PPO)
* - Isaac-Navigation-Flat-Anymal-C-v0
- Isaac-Navigation-Flat-Anymal-C-Play-v0
- Manager Based
@@ -739,6 +975,10 @@ Comprehensive List of Environments
- Isaac-Reach-UR10-Play-v0
- Manager Based
- **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO)
+ * - Isaac-Deploy-Reach-UR10e-v0
+ - Isaac-Deploy-Reach-UR10e-Play-v0
+ - Manager Based
+ - **rsl_rl** (PPO)
* - Isaac-Repose-Cube-Allegro-Direct-v0
-
- Direct
@@ -763,8 +1003,8 @@ Comprehensive List of Environments
-
- Direct
- **rl_games** (LSTM)
- * - Isaac-Repose-Cube-Shadow-Vision-Direct-v0
- - Isaac-Repose-Cube-Shadow-Vision-Direct-Play-v0
+ * - Isaac-Repose-Cube-Shadow-Vision-Direct-v0 (Requires running with ``--enable_cameras``)
+ - Isaac-Repose-Cube-Shadow-Vision-Direct-Play-v0 (Requires running with ``--enable_cameras``)
- Direct
- **rsl_rl** (PPO), **rl_games** (VISION)
* - Isaac-Shadow-Hand-Over-Direct-v0
@@ -775,6 +1015,14 @@ Comprehensive List of Environments
-
- Manager Based
-
+ * - Isaac-Dexsuite-Kuka-Allegro-Lift-v0
+ - Isaac-Dexsuite-Kuka-Allegro-Lift-Play-v0
+ - Manager Based
+ - **rl_games** (PPO), **rsl_rl** (PPO)
+ * - Isaac-Dexsuite-Kuka-Allegro-Reorient-v0
+ - Isaac-Dexsuite-Kuka-Allegro-Reorient-Play-v0
+ - Manager Based
+ - **rl_games** (PPO), **rsl_rl** (PPO)
* - Isaac-Stack-Cube-Franka-v0
-
- Manager Based
@@ -787,6 +1035,59 @@ Comprehensive List of Environments
-
- Manager Based
-
+ * - Isaac-PickPlace-G1-InspireFTP-Abs-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Stack-Cube-UR10-Long-Suction-IK-Rel-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Stack-Cube-UR10-Short-Suction-IK-Rel-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-RmpFlow-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Stack-Cube-Galbot-Right-Arm-Suction-RmpFlow-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-v0
+ - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-Play-v0
+ - Manager Based
+ -
+ * - Isaac-Place-Mug-Agibot-Left-Arm-RmpFlow-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Place-Toy2Box-Agibot-Right-Arm-RmpFlow-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-RmpFlow-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Stack-Cube-Galbot-Right-Arm-Suction-RmpFlow-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-v0
+ - Isaac-Stack-Cube-Galbot-Left-Arm-Gripper-Visuomotor-Play-v0
+ - Manager Based
+ -
+ * - Isaac-Place-Mug-Agibot-Left-Arm-RmpFlow-v0
+ -
+ - Manager Based
+ -
+ * - Isaac-Place-Toy2Box-Agibot-Right-Arm-RmpFlow-v0
+ -
+ - Manager Based
+ -
+
* - Isaac-Velocity-Flat-Anymal-B-v0
- Isaac-Velocity-Flat-Anymal-B-Play-v0
- Manager Based
@@ -807,6 +1108,10 @@ Comprehensive List of Environments
- Isaac-Velocity-Flat-Cassie-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
+ * - Isaac-Velocity-Flat-Digit-v0
+ - Isaac-Velocity-Flat-Digit-Play-v0
+ - Manager Based
+ - **rsl_rl** (PPO)
* - Isaac-Velocity-Flat-G1-v0
- Isaac-Velocity-Flat-G1-Play-v0
- Manager Based
@@ -822,7 +1127,7 @@ Comprehensive List of Environments
* - Isaac-Velocity-Flat-Unitree-A1-v0
- Isaac-Velocity-Flat-Unitree-A1-Play-v0
- Manager Based
- - **rsl_rl** (PPO), **skrl** (PPO)
+ - **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
* - Isaac-Velocity-Flat-Unitree-Go1-v0
- Isaac-Velocity-Flat-Unitree-Go1-Play-v0
- Manager Based
@@ -851,6 +1156,10 @@ Comprehensive List of Environments
- Isaac-Velocity-Rough-Cassie-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
+ * - Isaac-Velocity-Rough-Digit-v0
+ - Isaac-Velocity-Rough-Digit-Play-v0
+ - Manager Based
+ - **rsl_rl** (PPO)
* - Isaac-Velocity-Rough-G1-v0
- Isaac-Velocity-Rough-G1-Play-v0
- Manager Based
@@ -862,7 +1171,7 @@ Comprehensive List of Environments
* - Isaac-Velocity-Rough-Unitree-A1-v0
- Isaac-Velocity-Rough-Unitree-A1-Play-v0
- Manager Based
- - **rsl_rl** (PPO), **skrl** (PPO)
+ - **rsl_rl** (PPO), **skrl** (PPO), **sb3** (PPO)
* - Isaac-Velocity-Rough-Unitree-Go1-v0
- Isaac-Velocity-Rough-Unitree-Go1-Play-v0
- Manager Based
@@ -871,3 +1180,19 @@ Comprehensive List of Environments
- Isaac-Velocity-Rough-Unitree-Go2-Play-v0
- Manager Based
- **rsl_rl** (PPO), **skrl** (PPO)
+ * - Isaac-Reach-OpenArm-Bi-v0
+ - Isaac-Reach-OpenArm-Bi-Play-v0
+ - Manager Based
+ - **rsl_rl** (PPO), **rl_games** (PPO)
+ * - Isaac-Reach-OpenArm-v0
+ - Isaac-Reach-OpenArm-Play-v0
+ - Manager Based
+ - **rsl_rl** (PPO), **skrl** (PPO), **rl_games** (PPO)
+ * - Isaac-Lift-Cube-OpenArm-v0
+ - Isaac-Lift-Cube-OpenArm-Play-v0
+ - Manager Based
+ - **rsl_rl** (PPO), **rl_games** (PPO)
+ * - Isaac-Open-Drawer-OpenArm-v0
+ - Isaac-Open-Drawer-OpenArm-Play-v0
+ - Manager Based
+ - **rsl_rl** (PPO), **rl_games** (PPO)
diff --git a/docs/source/overview/imitation-learning/augmented_imitation.rst b/docs/source/overview/imitation-learning/augmented_imitation.rst
new file mode 100644
index 000000000000..b3593f22e622
--- /dev/null
+++ b/docs/source/overview/imitation-learning/augmented_imitation.rst
@@ -0,0 +1,436 @@
+.. _augmented-imitation-learning:
+
+Augmented Imitation Learning
+============================
+
+This section describes how to use Isaac Lab's imitation learning capabilities with the visual augmentation capabilities of `Cosmos `_ models to generate demonstrations at scale to train visuomotor policies robust against visual variations.
+
+Generating Demonstrations
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We use the Isaac Lab Mimic feature that allows the generation of additional demonstrations automatically from a handful of annotated demonstrations.
+
+.. note::
+ This section assumes you already have an annotated dataset of collected demonstrations. If you don't, you can follow the instructions in :ref:`teleoperation-imitation-learning` to collect and annotate your own demonstrations.
+
+In the following example, we will show you how to use Isaac Lab Mimic to generate additional demonstrations that can be used to train a visuomotor policy directly or can be augmented with visual variations using Cosmos (using the ``Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-Mimic-v0`` environment).
+
+.. note::
+ The ``Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-Mimic-v0`` environment is similar to the standard visuomotor environment (``Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Mimic-v0``), but with the addition of segmentation masks, depth maps, and normal maps in the generated dataset. These additional modalities are required to get the best results from the visual augmentation done using Cosmos.
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu --enable_cameras --headless --num_envs 10 --generation_num_trials 1000 \
+ --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/mimic_dataset_1k.hdf5 \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-Mimic-v0 \
+ --rendering_mode performance
+
+The number of demonstrations can be increased or decreased, 1000 demonstrations have been shown to provide good training results for this task.
+
+Additionally, the number of environments in the ``--num_envs`` parameter can be adjusted to speed up data generation.
+The suggested number of 10 can be executed on a moderate laptop CPU.
+On a more powerful desktop machine, use a larger number of environments for a significant speedup of this step.
+
+Cosmos Augmentation
+~~~~~~~~~~~~~~~~~~~
+
+HDF5 to MP4 Conversion
+^^^^^^^^^^^^^^^^^^^^^^
+
+The ``hdf5_to_mp4.py`` script converts camera frames stored in HDF5 demonstration files to MP4 videos. It supports multiple camera modalities including RGB, segmentation, depth and normal maps. This conversion is necessary for visual augmentation using Cosmos as it only works with video files rather than HDF5 data.
+
+.. rubric:: Required Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--input_file``
+ - Path to the input HDF5 file.
+ * - ``--output_dir``
+ - Directory to save the output MP4 files.
+
+.. rubric:: Optional Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--input_keys``
+ - List of input keys to process from the HDF5 file. (default: ["table_cam", "wrist_cam", "table_cam_segmentation", "table_cam_normals", "table_cam_shaded_segmentation", "table_cam_depth"])
+ * - ``--video_height``
+ - Height of the output video in pixels. (default: 704)
+ * - ``--video_width``
+ - Width of the output video in pixels. (default: 1280)
+ * - ``--framerate``
+ - Frames per second for the output video. (default: 30)
+
+.. note::
+ The default input keys cover all camera modalities as per the naming convention followed in the ``Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-Mimic-v0`` environment. We include an additional modality "table_cam_shaded_segmentation" which is not a part of the generated modalities from simulation in the HDF5 data file. Instead, it is automatically generated by this script using a combination of the segmentation and normal maps to get a pseudo-textured segmentation video for better controlling the Cosmos augmentation.
+
+.. note::
+ We recommend using the default values given above for the output video height, width and framerate for the best results with Cosmos augmentation.
+
+Example usage for the cube stacking task:
+
+.. code:: bash
+
+ python scripts/tools/hdf5_to_mp4.py \
+ --input_file datasets/mimic_dataset_1k.hdf5 \
+ --output_dir datasets/mimic_dataset_1k_mp4
+
+.. _running-cosmos:
+
+Running Cosmos for Visual Augmentation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+After converting the demonstrations to MP4 format, you can use a `Cosmos`_ model to visually augment the videos. Follow the Cosmos documentation for details on the augmentation process. Visual augmentation can include changes to lighting, textures, backgrounds, and other visual elements while preserving the essential task-relevant features.
+
+We use the RGB, depth and shaded segmentation videos from the previous step as input to the Cosmos model as seen below:
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/cosmos_inputs.gif
+ :width: 100%
+ :align: center
+ :alt: RGB, depth and segmentation control inputs to Cosmos
+
+We provide an example augmentation output from `Cosmos Transfer1 `_ below:
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/cosmos_output.gif
+ :width: 100%
+ :align: center
+ :alt: Cosmos Transfer1 augmentation output
+
+We recommend using the `Cosmos Transfer1 `_ model for visual augmentation as we found it to produce the best results in the form of a highly diverse dataset with a wide range of visual variations. You can refer to the `installation instructions `_, the `checkpoint download instructions `_ and `this example `_ for reference on how to use Transfer1 for this usecase. We further recommend the following settings to be used with the Transfer1 model for this task:
+
+.. note::
+ This workflow has been tested with commit ``e4055e39ee9c53165e85275bdab84ed20909714a`` of the Cosmos Transfer1 repository, and it is the recommended version to use. After cloning the Cosmos Transfer1 repository, checkout to this specific commit by running ``git checkout e4055e39ee9c53165e85275bdab84ed20909714a``.
+
+.. rubric:: Hyperparameters
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``negative_prompt``
+ - "The video captures a game playing, with bad crappy graphics and cartoonish frames. It represents a recording of old outdated games. The images are very pixelated and of poor CG quality. There are many subtitles in the footage. Overall, the video is unrealistic and appears cg. Plane background."
+ * - ``sigma_max``
+ - 50
+ * - ``control_weight``
+ - "0.3,0.3,0.6,0.7"
+ * - ``hint_key``
+ - "blur,canny,depth,segmentation"
+
+Another crucial aspect to get good augmentations is the set of prompts used to control the Cosmos generation. We provide a script, ``cosmos_prompt_gen.py``, to construct prompts from a set of carefully chosen templates that handle various aspects of the augmentation process.
+
+.. rubric:: Required Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--templates_path``
+ - Path to the file containing templates for the prompts.
+
+.. rubric:: Optional Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--num_prompts``
+ - Number of prompts to generate (default: 1).
+ * - ``--output_path``
+ - Path to the output file to write generated prompts. (default: prompts.txt)
+
+.. code:: bash
+
+ python scripts/tools/cosmos/cosmos_prompt_gen.py \
+ --templates_path scripts/tools/cosmos/transfer1_templates.json \
+ --num_prompts 10 --output_path prompts.txt
+
+In case you want to create your own prompts, we suggest you refer to the following guidelines:
+
+1. Keep the prompts as detailed as possible. It is best to have some instruction on how the generation should handle each visible object/region of interest. For instance, the prompts that we provide cover explicit details for the table, lighting, background, robot arm, cubes, and the general setting.
+
+2. Try to keep the augmentation instructions as realistic and coherent as possible. The more unrealistic or unconventional the prompt is, the worse the model does at retaining key features of the input control video(s).
+
+3. Keep the augmentation instructions in-sync for each aspect. What we mean by this is that the augmentation for all the objects/regions of interest should be coherent and conventional with respect to each other. For example, it is better to have a prompt such as "The table is of old dark wood with faded polish and food stains and the background consists of a suburban home" instead of something like "The table is of old dark wood with faded polish and food stains and the background consists of a spaceship hurtling through space".
+
+4. It is vital to include details on key aspects of the input control video(s) that should be retained or left unchanged. In our prompts, we very clearly mention that the cube colors should be left unchanged such that the bottom cube is blue, the middle is red and the top is green. Note that we not only mention what should be left unchanged but also give details on what form that aspect currently has.
+
+Example command to use the Cosmos Transfer1 model for this usecase:
+
+.. code:: bash
+
+ export CUDA_VISIBLE_DEVICES="${CUDA_VISIBLE_DEVICES:=0}"
+ export CHECKPOINT_DIR="${CHECKPOINT_DIR:=./checkpoints}"
+ export NUM_GPU="${NUM_GPU:=1}"
+ PYTHONPATH=$(pwd) torchrun --nproc_per_node=$NUM_GPU --nnodes=1 --node_rank=0 cosmos_transfer1/diffusion/inference/transfer.py \
+ --checkpoint_dir $CHECKPOINT_DIR \
+ --video_save_folder outputs/cosmos_dataset_1k_mp4 \
+ --controlnet_specs ./controlnet_specs/demo_0.json \
+ --offload_text_encoder_model \
+ --offload_guardrail_models \
+ --num_gpus $NUM_GPU
+
+Example ``./controlnet_specs/demo_0.json`` json file to use with the above command:
+
+.. code:: json
+
+ {
+ "prompt": "A robotic arm is picking up and stacking cubes inside a foggy industrial scrapyard at dawn, surrounded by piles of old robotic parts and twisted metal. The background includes large magnetic cranes, rusted conveyor belts, and flickering yellow floodlights struggling to penetrate the fog. The robot arm is bright teal with a glossy surface and silver stripes on the outer edges; the joints rotate smoothly and the pistons reflect a pale cyan hue. The robot arm is mounted on a table that is light oak wood with a natural grain pattern and a glossy varnish that reflects overhead lights softly; small burn marks dot one corner. The arm is connected to the base mounted on the table. The bottom cube is deep blue, the second cube is bright red, and the top cube is vivid green, maintaining their correct order after stacking. Sunlight pouring in from a large, open window bathes the table and robotic arm in a warm golden light. The shadows are soft, and the scene feels natural and inviting with a slight contrast between light and shadow.",
+ "negative_prompt": "The video captures a game playing, with bad crappy graphics and cartoonish frames. It represents a recording of old outdated games. The images are very pixelated and of poor CG quality. There are many subtitles in the footage. Overall, the video is unrealistic and appears cg. Plane background.",
+ "input_video_path" : "mimic_dataset_1k_mp4/demo_0_table_cam.mp4",
+ "sigma_max": 50,
+ "vis": {
+ "input_control": "mimic_dataset_1k_mp4/demo_0_table_cam.mp4",
+ "control_weight": 0.3
+ },
+ "edge": {
+ "control_weight": 0.3
+ },
+ "depth": {
+ "input_control": "mimic_dataset_1k_mp4/demo_0_table_cam_depth.mp4",
+ "control_weight": 0.6
+ },
+ "seg": {
+ "input_control": "mimic_dataset_1k_mp4/demo_0_table_cam_shaded_segmentation.mp4",
+ "control_weight": 0.7
+ }
+ }
+
+MP4 to HDF5 Conversion
+^^^^^^^^^^^^^^^^^^^^^^
+
+The ``mp4_to_hdf5.py`` script converts the visually augmented MP4 videos back to HDF5 format for training. This step is crucial as it ensures the augmented visual data is in the correct format for training visuomotor policies in Isaac Lab and pairs the videos with the corresponding demonstration data from the original dataset.
+
+.. rubric:: Required Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--input_file``
+ - Path to the input HDF5 file containing the original demonstrations.
+ * - ``--videos_dir``
+ - Directory containing the visually augmented MP4 videos.
+ * - ``--output_file``
+ - Path to save the new HDF5 file with augmented videos.
+
+.. note::
+ The input HDF5 file is used to preserve the non-visual data (such as robot states and actions) while replacing the visual data with the augmented versions.
+
+.. important::
+ The visually augmented MP4 files must follow the naming convention ``demo_{demo_id}_*.mp4``, where:
+
+ - ``demo_id`` matches the demonstration ID from the original MP4 file
+
+ - ``*`` signifies that the file name can be as per user preference starting from this point
+
+ This naming convention is required for the script to correctly pair the augmented videos with their corresponding demonstrations.
+
+Example usage for the cube stacking task:
+
+.. code:: bash
+
+ python scripts/tools/mp4_to_hdf5.py \
+ --input_file datasets/mimic_dataset_1k.hdf5 \
+ --videos_dir datasets/cosmos_dataset_1k_mp4 \
+ --output_file datasets/cosmos_dataset_1k.hdf5
+
+Pre-generated Dataset
+^^^^^^^^^^^^^^^^^^^^^
+
+We provide a pre-generated dataset in HDF5 format containing visually augmented demonstrations for the cube stacking task. This dataset can be used if you do not wish to run Cosmos locally to generate your own augmented data. The dataset is available on `Hugging Face `_ and contains both (as separate dataset files), original and augmented demonstrations, that can be used for training visuomotor policies.
+
+Merging Datasets
+^^^^^^^^^^^^^^^^
+
+The ``merge_hdf5_datasets.py`` script combines multiple HDF5 datasets into a single file. This is useful when you want to combine the original demonstrations with the augmented ones to create a larger, more diverse training dataset.
+
+.. rubric:: Required Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--input_files``
+ - A list of paths to HDF5 files to merge.
+
+.. rubric:: Optional Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--output_file``
+ - File path to merged output. (default: merged_dataset.hdf5)
+
+.. tip::
+ Merging datasets can help improve policy robustness by exposing the model to both original and augmented visual conditions during training.
+
+Example usage for the cube stacking task:
+
+.. code:: bash
+
+ python scripts/tools/merge_hdf5_datasets.py \
+ --input_files datasets/mimic_dataset_1k.hdf5 datasets/cosmos_dataset_1k.hdf5 \
+ --output_file datasets/mimic_cosmos_dataset.hdf5
+
+Model Training and Evaluation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Robomimic Setup
+^^^^^^^^^^^^^^^
+
+As an example, we will train a BC agent implemented in `Robomimic `__ to train a policy. Any other framework or training method could be used.
+
+To install the robomimic framework, use the following commands:
+
+.. code:: bash
+
+ # install the dependencies
+ sudo apt install cmake build-essential
+ # install python module (for robomimic)
+ ./isaaclab.sh -i robomimic
+
+Training an agent
+^^^^^^^^^^^^^^^^^
+
+Using the generated data, we can now train a visuomotor BC agent for ``Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-v0``:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-v0 --algo bc \
+ --dataset ./datasets/mimic_cosmos_dataset.hdf5 \
+ --name bc_rnn_image_franka_stack_mimic_cosmos
+
+.. note::
+ By default the trained models and logs will be saved to ``IssacLab/logs/robomimic``.
+
+Evaluation
+^^^^^^^^^^
+
+The ``robust_eval.py`` script evaluates trained visuomotor policies in simulation. This evaluation helps assess how well the policy generalizes to different visual variations and whether the visually augmented data has improved the policy's robustness.
+
+Below is an explanation of the different settings used for evaluation:
+
+.. rubric:: Evaluation Settings
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``Vanilla``
+ - Exact same setting as that used during Mimic data generation.
+ * - ``Light Intensity``
+ - Light intensity/brightness is varied, all other aspects remain the same.
+ * - ``Light Color``
+ - Light color is varied, all other aspects remain the same.
+ * - ``Light Texture (Background)``
+ - Light texture/background is varied, all other aspects remain the same.
+ * - ``Table Texture``
+ - Table's visual texture is varied, all other aspects remain the same.
+ * - ``Robot Arm Texture``
+ - Robot arm's visual texture is varied, all other aspects remain the same.
+
+.. rubric:: Required Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--task``
+ - Name of the environment.
+ * - ``--input_dir``
+ - Directory containing the model checkpoints to evaluate.
+
+.. rubric:: Optional Arguments
+
+.. list-table::
+ :widths: 30 70
+ :header-rows: 0
+
+ * - ``--start_epoch``
+ - Epoch of the checkpoint to start the evaluation from. (default: 100)
+ * - ``--horizon``
+ - Step horizon of each rollout. (default: 400)
+ * - ``--num_rollouts``
+ - Number of rollouts per model per setting. (default: 15)
+ * - ``--num_seeds``
+ - Number of random seeds to evaluate. (default: 3)
+ * - ``--seeds``
+ - List of specific seeds to use instead of random ones.
+ * - ``--log_dir``
+ - Directory to write results to. (default: /tmp/policy_evaluation_results)
+ * - ``--log_file``
+ - Name of the output file. (default: results)
+ * - ``--norm_factor_min``
+ - Minimum value of the action space normalization factor.
+ * - ``--norm_factor_max``
+ - Maximum value of the action space normalization factor.
+ * - ``--disable_fabric``
+ - Whether to disable fabric and use USD I/O operations.
+ * - ``--enable_pinocchio``
+ - Whether to enable Pinocchio for IK controllers.
+
+.. note::
+ The evaluation results will help you understand if the visual augmentation has improved the policy's performance and robustness. Compare these results with evaluations on the original dataset to measure the impact of augmentation.
+
+Example usage for the cube stacking task:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/robust_eval.py \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-v0 \
+ --input_dir logs/robomimic/Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Cosmos-v0/bc_rnn_image_franka_stack_mimic_cosmos/*/models \
+ --log_dir robust_results/bc_rnn_image_franka_stack_mimic_cosmos \
+ --log_file result \
+ --enable_cameras \
+ --seeds 0 \
+ --num_rollouts 15 \
+ --rendering_mode performance
+
+.. note::
+ This script can take over a day or even longer to run (depending on the hardware being used). This behavior is expected.
+
+We use the above script to compare models trained with 1000 Mimic-generated demonstrations, 2000 Mimic-generated demonstrations and 2000 Cosmos-Mimic-generated demonstrations (1000 original mimic + 1000 Cosmos augmented) respectively. We use the same seeds (0, 1000 and 5000) for all three models and provide the metrics (averaged across best checkpoints for each seed) below:
+
+.. rubric:: Model Comparison
+
+.. list-table::
+ :widths: 25 25 25 25
+ :header-rows: 0
+
+ * - **Evaluation Setting**
+ - **Mimic 1k Baseline**
+ - **Mimic 2k Baseline**
+ - **Cosmos-Mimic 2k**
+ * - ``Vanilla``
+ - 62%
+ - 96.6%
+ - 86.6%
+ * - ``Light Intensity``
+ - 11.1%
+ - 20%
+ - 62.2%
+ * - ``Light Color``
+ - 24.6%
+ - 30%
+ - 77.7%
+ * - ``Light Texture (Background)``
+ - 16.6%
+ - 20%
+ - 68.8%
+ * - ``Table Texture``
+ - 0%
+ - 0%
+ - 20%
+ * - ``Robot Arm Texture``
+ - 0%
+ - 0%
+ - 4.4%
+
+The above trained models' checkpoints can be accessed `here `_ in case you wish to use the models directly.
diff --git a/docs/source/overview/imitation-learning/index.rst b/docs/source/overview/imitation-learning/index.rst
new file mode 100644
index 000000000000..f8f77d031fb0
--- /dev/null
+++ b/docs/source/overview/imitation-learning/index.rst
@@ -0,0 +1,12 @@
+Imitation Learning
+==================
+
+In this section, we show existing scripts for running imitation learning
+with Isaac Lab.
+
+.. toctree::
+ :maxdepth: 1
+
+ teleop_imitation
+ augmented_imitation
+ skillgen
diff --git a/docs/source/overview/imitation-learning/skillgen.rst b/docs/source/overview/imitation-learning/skillgen.rst
new file mode 100644
index 000000000000..b577f82e13ae
--- /dev/null
+++ b/docs/source/overview/imitation-learning/skillgen.rst
@@ -0,0 +1,548 @@
+.. _skillgen:
+
+SkillGen for Automated Demonstration Generation
+===============================================
+
+SkillGen is an advanced demonstration generation system that enhances Isaac Lab Mimic by integrating motion planning. It generates high-quality, adaptive, collision-free robot demonstrations by combining human-provided subtask segments with automated motion planning.
+
+What is SkillGen?
+~~~~~~~~~~~~~~~~~
+
+SkillGen addresses key limitations in traditional demonstration generation:
+
+* **Motion Quality**: Uses cuRobo's GPU-accelerated motion planner to generate smooth, collision-free trajectories
+* **Validity**: Generates kinematically feasible plans between skill segments
+* **Diversity**: Generates varied demonstrations through configurable sampling and planning parameters
+* **Adaptability**: Generates demonstrations that can be adapted to new object placements and scene configurations during data generation
+
+The system works by taking manually annotated human demonstrations, extracting localized subtask skills (see `Subtasks in SkillGen`_), and using cuRobo to plan feasible motions between these skill segments while respecting robot kinematics and collision constraints.
+
+Prerequisites
+~~~~~~~~~~~~~
+
+Before using SkillGen, you must understand:
+
+1. **Teleoperation**: How to control robots and record demonstrations using keyboard, SpaceMouse, or hand tracking
+2. **Isaac Lab Mimic**: The complete workflow including data collection, annotation, generation, and policy training
+
+.. important::
+
+ Review the :ref:`teleoperation-imitation-learning` documentation thoroughly before proceeding with SkillGen.
+
+.. _skillgen-installation:
+
+Installation
+~~~~~~~~~~~~
+
+SkillGen requires Isaac Lab, Isaac Sim, and cuRobo. Follow these steps in your Isaac Lab conda environment.
+
+Step 1: Install and verify Isaac Sim and Isaac Lab
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Follow the official Isaac Sim and Isaac Lab installation guide `here `__.
+
+Step 2: Install cuRobo
+^^^^^^^^^^^^^^^^^^^^^^
+
+cuRobo provides the motion planning capabilities for SkillGen. This installation is tested to work with Isaac Lab's PyTorch and CUDA requirements:
+
+.. code:: bash
+
+ # One line installation of cuRobo (formatted for readability)
+ conda install -c nvidia cuda-toolkit=12.8 -y && \
+ export CUDA_HOME="$CONDA_PREFIX" && \
+ export PATH="$CUDA_HOME/bin:$PATH" && \
+ export LD_LIBRARY_PATH="$CUDA_HOME/lib:$LD_LIBRARY_PATH" && \
+ export TORCH_CUDA_ARCH_LIST="8.0+PTX" && \
+ pip install -e "git+https://github.com/NVlabs/curobo.git@ebb71702f3f70e767f40fd8e050674af0288abe8#egg=nvidia-curobo" --no-build-isolation
+
+.. note::
+ * The commit hash ``ebb71702f3f70e767f40fd8e050674af0288abe8`` is tested with Isaac Lab - using other versions may cause compatibility issues. This commit has the support for quad face mesh triangulation, required for cuRobo to parse usds as collision objects.
+
+ * cuRobo is installed from source and is editable installed. This means that the cuRobo source code will be cloned in the current directory under ``src/nvidia-curobo``. Users can choose their working directory to install cuRobo.
+
+ * ``TORCH_CUDA_ARCH_LIST`` in the above command should match your GPU's CUDA compute capability (e.g., ``8.0`` for A100, ``8.6`` for many RTX 30โseries, ``8.9`` for RTX 4090); the ``+PTX`` suffix embeds PTX for forward compatibility so newer GPUs can JITโcompile when native SASS isnโt included.
+
+.. warning::
+
+ **cuRobo installation may fail if Isaac Sim environment scripts are sourced**
+
+ Sourcing Omniverse Kit/Isaac Sim environment scripts (for example, ``setup_conda_env.sh``) exports ``PYTHONHOME`` and ``PYTHONPATH`` to the Kit runtime and its pre-bundled Python packages. During cuRobo installation this can cause ``conda`` to import Omniverse's bundled libraries (e.g., ``requests``/``urllib3``) before initialization, resulting in a crash (often seen as a ``TypeError`` referencing ``omni.kit.pip_archive``).
+
+ Do one of the following:
+
+ - Install cuRobo from a clean shell that has not sourced any Omniverse/Isaac Sim scripts.
+ - Temporarily reset or ignore inherited Python environment variables (notably ``PYTHONPATH`` and ``PYTHONHOME``) before invoking Conda, so Kit's Python does not shadow your Conda environment.
+ - Use Conda mechanisms that do not rely on shell activation and avoid inheriting the current shell's Python variables.
+
+ After installation completes, you may source Isaac Lab/Isaac Sim scripts again for normal use.
+
+
+
+Step 3: Install Rerun
+^^^^^^^^^^^^^^^^^^^^^
+
+For trajectory visualization during development:
+
+.. code:: bash
+
+ pip install rerun-sdk==0.23
+
+.. note::
+
+ **Rerun Visualization Setup:**
+
+ * Rerun is optional but highly recommended for debugging and validating planned trajectories during development
+ * Enable trajectory visualization by setting ``visualize_plan = True`` in the cuRobo planner configuration
+ * When enabled, cuRobo planner interface will stream planned end-effector trajectories, waypoints, and collision data to Rerun for interactive inspection
+ * Visualization helps identify planning issues, collision problems, and trajectory smoothness before full dataset generation
+ * Can also be ran with ``--headless`` to disable isaacsim visualization but still visualize and debug end effector trajectories
+
+Step 4: Verify Installation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Test that cuRobo works with Isaac Lab:
+
+.. code:: bash
+
+ # This should run without import errors
+ python -c "import curobo; print('cuRobo installed successfully')"
+
+.. tip::
+
+ If you run into ``libstdc++.so.6: version 'GLIBCXX_3.4.30' not found`` error, you can try these commands to fix it:
+
+ .. code:: bash
+
+ conda config --env --set channel_priority strict
+ conda config --env --add channels conda-forge
+ conda install -y -c conda-forge "libstdcxx-ng>=12" "libgcc-ng>=12"
+
+Download the SkillGen Dataset
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We provide a pre-annotated dataset to help you get started quickly with SkillGen.
+
+Dataset Contents
+^^^^^^^^^^^^^^^^
+
+The dataset contains:
+
+* Human demonstrations of Franka arm cube stacking
+* Manually annotated subtask boundaries for each demonstration
+* Compatible with both basic cube stacking and adaptive bin cube stacking tasks
+
+Download and Setup
+^^^^^^^^^^^^^^^^^^
+
+1. Download the pre-annotated dataset by clicking `here `__.
+
+2. Prepare the datasets directory and move the downloaded file:
+
+.. code:: bash
+
+ # Make sure you are in the root directory of your Isaac Lab workspace
+ cd /path/to/your/IsaacLab
+
+ # Create the datasets directory if it does not exist
+ mkdir -p datasets
+
+ # Move the downloaded dataset into the datasets directory
+ mv /path/to/annotated_dataset_skillgen.hdf5 datasets/annotated_dataset_skillgen.hdf5
+
+.. tip::
+
+ A major advantage of SkillGen is that the same annotated dataset can be reused across multiple related tasks (e.g., basic stacking and adaptive bin stacking). This avoids collecting and annotating new data per variant.
+
+.. admonition:: {Optional for the tasks in this tutorial} Collect a fresh dataset (source + annotated)
+
+ If you want to collect a fresh source dataset and then create an annotated dataset for SkillGen, follow these commands. The user is expected to have knowledge of the Isaac Lab Mimic workflow.
+
+ **Important pointers before you begin**
+
+ * Using the provided annotated dataset is the fastest path to get started with SkillGen tasks in this tutorial.
+ * If you create your own dataset, SkillGen requires manual annotation of both subtask start and termination boundaries (no auto-annotation).
+ * Start boundary signals are mandatory for SkillGen; use ``--annotate_subtask_start_signals`` during annotation or data generation will fail.
+ * Keep your subtask definitions (``object_ref``, ``subtask_term_signal``) consistent with the SkillGen environment config.
+
+ **Record demonstrations** (any teleop device is supported; replace ``spacemouse`` if needed):
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/tools/record_demos.py \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
+ --teleop_device spacemouse \
+ --dataset_file ./datasets/dataset_skillgen.hdf5 \
+ --num_demos 10
+
+ **Annotate demonstrations for SkillGen** (writes both term and start boundaries):
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
+ --device cpu \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
+ --input_file ./datasets/dataset_skillgen.hdf5 \
+ --output_file ./datasets/annotated_dataset_skillgen.hdf5 \
+ --annotate_subtask_start_signals
+
+Understanding Dataset Annotation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+SkillGen requires datasets with annotated subtask start and termination boundaries. Auto-annotation is not supported.
+
+Subtasks in SkillGen
+^^^^^^^^^^^^^^^^^^^^
+
+**Technical definition:** A subtask is a contiguous demo segment that achieves a manipulation objective, defined via ``SubTaskConfig``:
+
+* ``object_ref``: the object (or ``None``) used as the spatial reference for this subtask
+* ``subtask_term_signal``: the binary termination signal name (transitions 0 to 1 when the subtask completes)
+* ``subtask_start_signal``: the binary start signal name (transitions 0 to 1 when the subtask begins; required for SkillGen)
+
+The subtask localization process performs:
+
+* detection of signal transition points (0 to 1) to identify subtask boundaries ``[t_start, t_end]``;
+* extraction of the subtask segment between boundaries;
+* computation of end-effector trajectories and key poses in an object- or task-relative frame (using ``object_ref`` if provided);
+
+This converts absolute, scene-specific motions into object-relative skill segments that can be adapted to new object placements and scene configurations during data generation.
+
+Manual Annotation Workflow
+^^^^^^^^^^^^^^^^^^^^^^^^^^
+Contrary to the Isaac Lab Mimic workflow, SkillGen requires manual annotation of subtask start and termination boundaries. For example, for grasping a cube, the start signal is right before the gripper closes and the termination signal is right after the object is grasped. You can adjust the start and termination signals to fit your subtask definition.
+
+.. tip::
+
+ **Manual Annotation Controls:**
+
+ * Press ``N`` to start/continue playback
+ * Press ``B`` to pause
+ * Press ``S`` to mark subtask boundary
+ * Press ``Q`` to skip current demonstration
+
+ When annotating the start and end signals for a skill segment (e.g., grasp, stack, etc.), pause the playback using ``B`` a few steps before the skill, annotate the start signal using ``S``, and then resume playback using ``N``. After the skill is completed, pause again a few steps later to annotate the end signal using ``S``.
+
+Data Generation with SkillGen
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+SkillGen transforms annotated demonstrations into diverse, high-quality datasets using motion planning.
+
+How SkillGen Works
+^^^^^^^^^^^^^^^^^^
+
+The SkillGen pipeline uses your annotated dataset and the environment's Mimic API to synthesize new demonstrations:
+
+1. **Subtask boundary use**: Reads per-subtask start and termination indices from the annotated dataset
+2. **Goal sampling**: Samples target poses per subtask according to task constraints and datagen config
+3. **Trajectory planning**: Plans collision-free motions between subtask segments using cuRobo (when ``--use_skillgen``)
+4. **Trajectory stitching**: Stitches skill segments and planned trajectories into complete demonstrations.
+5. **Success evaluation**: Validates task success terms; only successful trials are written to the output dataset
+
+Usage Parameters
+^^^^^^^^^^^^^^^^
+
+Key parameters for SkillGen data generation:
+
+* ``--use_skillgen``: Enables SkillGen planner (required)
+* ``--generation_num_trials``: Number of demonstrations to generate
+* ``--num_envs``: Parallel environments (tune based on GPU memory)
+* ``--device``: Computation device (cpu/cuda). Use cpu for stable physics
+* ``--headless``: Disable visualization for faster generation
+
+.. _task-basic-cube-stacking:
+
+Task 1: Basic Cube Stacking
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Generate demonstrations for the standard Isaac Lab Mimic cube stacking task. In this task, the Franka robot must:
+
+1. Pick up the red cube and place it on the blue cube
+2. Pick up the green cube and place it on the red cube
+3. Final stack order: blue (bottom), red (middle), green (top).
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/cube_stack_data_gen_skillgen.gif
+ :width: 75%
+ :align: center
+ :alt: Cube stacking task generated with SkillGen
+ :figclass: align-center
+
+ Cube stacking dataset example.
+
+Small-Scale Generation
+^^^^^^^^^^^^^^^^^^^^^^
+
+Start with a small dataset to verify everything works:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu \
+ --num_envs 1 \
+ --generation_num_trials 10 \
+ --input_file ./datasets/annotated_dataset_skillgen.hdf5 \
+ --output_file ./datasets/generated_dataset_small_skillgen_cube_stack.hdf5 \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
+ --use_skillgen
+
+Full-Scale Generation
+^^^^^^^^^^^^^^^^^^^^^
+
+Once satisfied with small-scale results, generate a full training dataset:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu \
+ --headless \
+ --num_envs 1 \
+ --generation_num_trials 1000 \
+ --input_file ./datasets/annotated_dataset_skillgen.hdf5 \
+ --output_file ./datasets/generated_dataset_skillgen_cube_stack.hdf5 \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
+ --use_skillgen
+
+.. note::
+
+ * Use ``--headless`` to disable visualization for faster generation. Rerun visualization can be enabled by setting ``visualize_plan = True`` in the cuRobo planner configuration with ``--headless`` enabled as well for debugging.
+ * Adjust ``--num_envs`` based on your GPU memory (start with 1, increase gradually). The performance gain is not very significant when num_envs is greater than 1. A value of 5 seems to be a sweet spot for most GPUs to balance performance and memory usage between cuRobo instances and simulation environments.
+ * Generation time: ~90 to 120 minutes for one environment with ``--headless`` enabled for 1000 demonstrations on a RTX 6000 Ada GPU. Time depends on the GPU, the number of environments, and the success rate of the demonstrations (which depends on quality of the annotated dataset).
+ * cuRobo planner interface and configurations are described in :ref:`cuRobo-interface-features`.
+
+.. _task-bin-cube-stacking:
+
+Task 2: Adaptive Cube Stacking in a Bin
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+SkillGen can also be used to generate datasets for adaptive tasks. In this example, we generate a dataset for adaptive cube stacking in a narrow bin. The bin is placed at a fixed position and orientation in the workspace and a blue cube is placed at the center of the bin. The robot must generate successful demonstrations for stacking the red and green cubes on the blue cube without colliding with the bin.
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/bin_cube_stack_data_gen_skillgen.gif
+ :width: 75%
+ :align: center
+ :alt: Adaptive bin cube stacking task generated with SkillGen
+ :figclass: align-center
+
+ Adaptive bin stacking data generation example.
+
+Small-Scale Generation
+^^^^^^^^^^^^^^^^^^^^^^
+
+Test the adaptive stacking setup:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu \
+ --num_envs 1 \
+ --generation_num_trials 10 \
+ --input_file ./datasets/annotated_dataset_skillgen.hdf5 \
+ --output_file ./datasets/generated_dataset_small_skillgen_bin_cube_stack.hdf5 \
+ --task Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0 \
+ --use_skillgen
+
+Full-Scale Generation
+^^^^^^^^^^^^^^^^^^^^^
+
+Generate the complete adaptive stacking dataset:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu \
+ --headless \
+ --num_envs 1 \
+ --generation_num_trials 1000 \
+ --input_file ./datasets/annotated_dataset_skillgen.hdf5 \
+ --output_file ./datasets/generated_dataset_skillgen_bin_cube_stack.hdf5 \
+ --task Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0 \
+ --use_skillgen
+
+.. warning::
+
+ Adaptive tasks typically have lower success rates and higher data generation time due to increased complexity. The time taken to generate the dataset is also longer due to lower success rates than vanilla cube stacking and difficult planning problems.
+
+.. note::
+
+ If the pre-annotated dataset is used and the data generation command is run with ``--headless`` enabled, the generation time is typically around ~220 minutes for 1000 demonstrations for a single environment on a RTX 6000 Ada GPU.
+
+.. note::
+
+ **VRAM usage and GPU recommendations**
+
+ Figures measured over 10 generated demonstrations on an RTX 6000 Ada.
+ * Vanilla Cube Stacking: 1 env ~9.3โ9.6 GB steady; 5 envs ~21.8โ22.2 GB steady (briefly higher during initialization).
+ * Adaptive Bin Cube Stacking: 1 env ~9.3โ9.6 GB steady; 5 envs ~22.0โ22.3 GB steady (briefly higher during initialization).
+ * Minimum recommended GPU: โฅ24 GB VRAM for ``--num_envs`` 1โ2; โฅ48 GB VRAM for ``--num_envs`` up to ~5.
+ * To reduce VRAM: prefer ``--headless`` and keep ``--num_envs`` modest. Numbers can vary with scene assets and number of demonstrations.
+
+Learning Policies from SkillGen Data
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Similar to the Isaac Lab Mimic workflow, you can train imitation learning policies using the generated SkillGen datasets with Robomimic.
+
+Basic Cube Stacking Policy
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Train a state-based policy for the basic cube stacking task:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
+ --algo bc \
+ --dataset ./datasets/generated_dataset_skillgen_cube_stack.hdf5
+
+Adaptive Bin Cube Stacking Policy
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Train a policy for the more complex adaptive bin stacking:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
+ --task Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0 \
+ --algo bc \
+ --dataset ./datasets/generated_dataset_skillgen_bin_cube_stack.hdf5
+
+.. note::
+
+ The training script will save the model checkpoints in the model directory under ``IssacLab/logs/robomimic``.
+
+Evaluating Trained Policies
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Test your trained policies:
+
+.. code:: bash
+
+ # Basic cube stacking evaluation
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
+ --device cpu \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Skillgen-v0 \
+ --num_rollouts 50 \
+ --checkpoint /path/to/model_checkpoint.pth
+
+.. code:: bash
+
+ # Adaptive bin cube stacking evaluation
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
+ --device cpu \
+ --task Isaac-Stack-Cube-Bin-Franka-IK-Rel-Mimic-v0 \
+ --num_rollouts 50 \
+ --checkpoint /path/to/model_checkpoint.pth
+
+.. note::
+
+ **Expected Success Rates and Recommendations for Cube Stacking and Bin Cube Stacking Tasks**
+
+ * SkillGen data generation and downstream policy success are sensitive to the task and the quality of dataset annotation, and can show high variance.
+ * For cube stacking and bin cube stacking, data generation success is typically 40% to 70% when the dataset is properly annotated per the instructions.
+ * Behavior Cloning (BC) policy success from 1000 generated demonstrations trained for 2000 epochs (default) is typically 40% to 85% for these tasks, depending on data quality.
+ * Training the policy with 1000 demonstrations and for 2000 epochs takes about 30 to 35 minutes on a RTX 6000 Ada GPU. Training time increases with the number of demonstrations and epochs.
+ * For dataset generation time, see :ref:`task-basic-cube-stacking` and :ref:`task-bin-cube-stacking`.
+ * Recommendation: Train for the default 2000 epochs with about 1000 generated demonstrations, and evaluate multiple checkpoints saved after the 1000th epoch to select the best-performing policy.
+
+.. _cuRobo-interface-features:
+
+cuRobo Interface Features
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This section summarizes the cuRobo planner interface and features. The SkillGen pipeline uses the cuRobo planner to generate collision-free motions between subtask segments. However, the user can use cuRobo as a standalone motion planner for your own tasks. The user can also implement their own motion planner by subclassing the base motion planner and implementing the same API.
+
+Base Motion Planner (Extensible)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+* Location: ``isaaclab_mimic/motion_planners/base_motion_planner.py``
+* Purpose: Uniform interface for all motion planners used by SkillGen
+* Extensibility: New planners can be added by subclassing and implementing the same API; SkillGen consumes the API without code changes
+
+cuRobo Planner (GPU, collision-aware)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+* Location: ``isaaclab_mimic/motion_planners/curobo``
+* Multi-phase planning:
+
+ * Retreat โ Contact โ Approach phases per subtask
+ * Configurable collision filtering in contact phases
+ * For SkillGen, retreat and approach phases are collision-free. The transit phase is collision-checked.
+
+* World synchronization:
+
+ * Updates robot state, attached objects, and collision spheres from the Isaac Lab scene each trial
+ * Dynamic attach/detach of objects during grasp/place
+
+* Collision representation:
+
+ * Contact-aware sphere sets with per-phase enables/filters
+
+* Outputs:
+
+ * Time-parameterized, collision-checked trajectories for stitching
+
+* Tests:
+
+ * ``source/isaaclab_mimic/test/test_curobo_planner_cube_stack.py``
+ * ``source/isaaclab_mimic/test/test_curobo_planner_franka.py``
+ * ``source/isaaclab_mimic/test/test_generate_dataset_skillgen.py``
+
+.. list-table::
+ :widths: 50 50
+ :header-rows: 0
+
+ * - .. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/cube_stack_end_to_end_curobo.gif
+ :height: 260px
+ :align: center
+ :alt: cuRobo planner test on cube stack using Franka Panda robot
+
+ Cube stack planner test.
+ - .. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/obstacle_avoidance_curobo.gif
+ :height: 260px
+ :align: center
+ :alt: cuRobo planner test on obstacle avoidance using Franka Panda robot
+
+ Franka planner test.
+
+These tests can also serve as a reference for how to use cuRobo as a standalone motion planner.
+
+.. note::
+
+ For detailed cuRobo config creation and parameters, please see the file ``isaaclab_mimic/motion_planners/curobo/curobo_planner_config.py``.
+
+Generation Pipeline Integration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When ``--use_skillgen`` is enabled in ``generate_dataset.py``, the following pipeline is executed:
+
+1. **Randomize subtask boundaries**: Randomize per-demo start and termination indices for each subtask using task-configured offset ranges.
+
+2. **Build per-subtask trajectories**:
+ For each end-effector and subtask:
+
+ - Select a source demonstration segment (strategy-driven; respects coordination/sequential constraints)
+ - Transform the segment to the current scene (object-relative or coordination delta; optional first-pose interpolation)
+ - Wrap the transformed segment into a waypoint trajectory
+
+3. **Transition between subtasks**:
+ - Plan a collision-aware transition with cuRobo to the subtask's first waypoint (world sync, optional attach/detach), execute the planned waypoints, then resume the subtask trajectory
+
+4. **Execute with constraints**:
+ - Execute waypoints step-by-step across end-effectors while enforcing subtask constraints (sequential, coordination with synchronous steps); optionally update planner visualization if enabled
+
+5. **Record and export**:
+ - Accumulate states/observations/actions, set the episode success flag, and export the episode (the outer pipeline filters/consumes successes)
+
+Visualization and Debugging
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Users can visualize the planned trajectories and debug for collisions using Rerun-based plan visualizer. This can be enabled by setting ``visualize_plan = True`` in the cuRobo planner configuration. Note that rerun needs to be installed to visualize the planned trajectories. Refer to Step 3 in :ref:`skillgen-installation` for installation instructions.
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/rerun_cube_stack.gif
+ :width: 80%
+ :align: center
+ :alt: Rerun visualization of planned trajectories and collisions
+ :figclass: align-center
+
+ Rerun integration: planned trajectories with collision spheres.
+
+.. note::
+
+ Check cuRobo usage license in ``docs/licenses/dependencies/cuRobo-license.txt``
diff --git a/docs/source/overview/imitation-learning/teleop_imitation.rst b/docs/source/overview/imitation-learning/teleop_imitation.rst
new file mode 100644
index 000000000000..14017e65b5da
--- /dev/null
+++ b/docs/source/overview/imitation-learning/teleop_imitation.rst
@@ -0,0 +1,1070 @@
+.. _teleoperation-imitation-learning:
+
+Teleoperation and Imitation Learning with Isaac Lab Mimic
+=========================================================
+
+
+Teleoperation
+~~~~~~~~~~~~~
+
+We provide interfaces for providing commands in SE(2) and SE(3) space
+for robot control. In case of SE(2) teleoperation, the returned command
+is the linear x-y velocity and yaw rate, while in SE(3), the returned
+command is a 6-D vector representing the change in pose.
+
+.. note::
+
+ Presently, Isaac Lab Mimic is only supported in Linux.
+
+To play inverse kinematics (IK) control with a keyboard device:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_envs 1 --teleop_device keyboard
+
+For smoother operation and off-axis operation, we recommend using a SpaceMouse as the input device. Providing smoother demonstrations will make it easier for the policy to clone the behavior. To use a SpaceMouse, simply change the teleop device accordingly:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_envs 1 --teleop_device spacemouse
+
+.. note::
+
+ If the SpaceMouse is not detected, you may need to grant additional user permissions by running ``sudo chmod 666 /dev/hidraw<#>`` where ``<#>`` corresponds to the device index
+ of the connected SpaceMouse.
+
+ To determine the device index, list all ``hidraw`` devices by running ``ls -l /dev/hidraw*``.
+ Identify the device corresponding to the SpaceMouse by running ``cat /sys/class/hidraw/hidraw<#>/device/uevent`` on each of the devices listed
+ from the prior step.
+
+ We recommend using local deployment of Isaac Lab to use the SpaceMouse. If using container deployment (:ref:`deployment-docker`), you must manually mount the SpaceMouse to the ``isaac-lab-base`` container by
+ adding a ``devices`` attribute with the path to the device in your ``docker-compose.yaml`` file:
+
+ .. code:: yaml
+
+ devices:
+ - /dev/hidraw<#>:/dev/hidraw<#>
+
+ where ``<#>`` is the device index of the connected SpaceMouse.
+
+ If you are using the IsaacLab + CloudXR container deployment (:ref:`cloudxr-teleoperation`), you can add the ``devices`` attribute under the ``services -> isaac-lab-base`` section of the
+ ``docker/docker-compose.cloudxr-runtime.patch.yaml`` file.
+
+ Isaac Lab is only compatible with the SpaceMouse Wireless and SpaceMouse Compact models from 3Dconnexion.
+
+
+For tasks that benefit from the use of an extended reality (XR) device with hand tracking, Isaac Lab supports using NVIDIA CloudXR to immersively stream the scene to compatible XR devices for teleoperation. Note that when using hand tracking we recommend using the absolute variant of the task (``Isaac-Stack-Cube-Franka-IK-Abs-v0``), which requires the ``handtracking`` device:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py --task Isaac-Stack-Cube-Franka-IK-Abs-v0 --teleop_device handtracking --device cpu
+
+.. note::
+
+ See :ref:`cloudxr-teleoperation` to learn how to use CloudXR and experience teleoperation with Isaac Lab.
+
+
+The script prints the teleoperation events configured. For keyboard,
+these are as follows:
+
+.. code:: text
+
+ Keyboard Controller for SE(3): Se3Keyboard
+ Reset all commands: R
+ Toggle gripper (open/close): K
+ Move arm along x-axis: W/S
+ Move arm along y-axis: A/D
+ Move arm along z-axis: Q/E
+ Rotate arm along x-axis: Z/X
+ Rotate arm along y-axis: T/G
+ Rotate arm along z-axis: C/V
+
+For SpaceMouse, these are as follows:
+
+.. code:: text
+
+ SpaceMouse Controller for SE(3): Se3SpaceMouse
+ Reset all commands: Right click
+ Toggle gripper (open/close): Click the left button on the SpaceMouse
+ Move arm along x/y-axis: Tilt the SpaceMouse
+ Move arm along z-axis: Push or pull the SpaceMouse
+ Rotate arm: Twist the SpaceMouse
+
+The next section describes how teleoperation devices can be used for data collection for imitation learning.
+
+
+Imitation Learning with Isaac Lab Mimic
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Using the teleoperation devices, it is also possible to collect data for
+learning from demonstrations (LfD). For this, we provide scripts to collect data into the open HDF5 format.
+
+Collecting demonstrations
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To collect demonstrations with teleoperation for the environment ``Isaac-Stack-Cube-Franka-IK-Rel-v0``, use the following commands:
+
+.. code:: bash
+
+ # step a: create folder for datasets
+ mkdir -p datasets
+ # step b: collect data with a selected teleoperation device. Replace with your preferred input device.
+ # Available options: spacemouse, keyboard, handtracking
+ ./isaaclab.sh -p scripts/tools/record_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --device cpu --teleop_device --dataset_file ./datasets/dataset.hdf5 --num_demos 10
+ # step a: replay the collected dataset
+ ./isaaclab.sh -p scripts/tools/replay_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --device cpu --dataset_file ./datasets/dataset.hdf5
+
+
+.. note::
+
+ The order of the stacked cubes should be blue (bottom), red (middle), green (top).
+
+.. tip::
+
+ When using an XR device, we suggest collecting demonstrations with the ``Isaac-Stack-Cube-Frank-IK-Abs-v0`` version of the task and ``--teleop_device handtracking``, which controls the end effector using the absolute position of the hand.
+
+About 10 successful demonstrations are required in order for the following steps to succeed.
+
+Here are some tips to perform demonstrations that lead to successful policy training:
+
+* Keep demonstrations short. Shorter demonstrations mean fewer decisions for the policy, making training easier.
+* Take a direct path. Do not follow along arbitrary axis, but move straight toward the goal.
+* Do not pause. Perform smooth, continuous motions instead. It is not obvious for a policy why and when to pause, hence continuous motions are easier to learn.
+
+If, while performing a demonstration, a mistake is made, or the current demonstration should not be recorded for some other reason, press the ``R`` key to discard the current demonstration, and reset to a new starting position.
+
+.. note::
+ Non-determinism may be observed during replay as physics in IsaacLab are not determimnistically reproducible when using ``env.reset``.
+
+Pre-recorded demonstrations
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+We provide a pre-recorded ``dataset.hdf5`` containing 10 human demonstrations for ``Isaac-Stack-Cube-Franka-IK-Rel-v0``
+here: `[Franka Dataset] `__.
+This dataset may be downloaded and used in the remaining tutorial steps if you do not wish to collect your own demonstrations.
+
+.. note::
+ Use of the pre-recorded dataset is optional.
+
+.. _generating-additional-demonstrations:
+
+Generating additional demonstrations with Isaac Lab Mimic
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Additional demonstrations can be generated using Isaac Lab Mimic.
+
+Isaac Lab Mimic is a feature in Isaac Lab that allows generation of additional demonstrations automatically, allowing a policy to learn successfully even from just a handful of manual demonstrations.
+
+In the following example, we will show how to use Isaac Lab Mimic to generate additional demonstrations that can be used to train either a state-based policy
+(using the ``Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0`` environment) or visuomotor policy (using the ``Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Mimic-v0`` environment).
+
+.. note::
+ The following commands are run using CPU mode as a small number of envs are used which are I/O bound rather than compute bound.
+
+.. important::
+
+ All commands in the following sections must keep a consistent policy type. For example, if choosing to use a state-based policy, then all commands used should be from the "State-based policy" tab.
+
+In order to use Isaac Lab Mimic with the recorded dataset, first annotate the subtasks in the recording:
+
+.. tab-set::
+ :sync-group: policy_type
+
+ .. tab-item:: State-based policy
+ :sync: state
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
+ --device cpu --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 --auto \
+ --input_file ./datasets/dataset.hdf5 --output_file ./datasets/annotated_dataset.hdf5
+
+ .. tab-item:: Visuomotor policy
+ :sync: visuomotor
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
+ --device cpu --enable_cameras --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-Mimic-v0 --auto \
+ --input_file ./datasets/dataset.hdf5 --output_file ./datasets/annotated_dataset.hdf5
+
+
+Then, use Isaac Lab Mimic to generate some additional demonstrations:
+
+.. tab-set::
+ :sync-group: policy_type
+
+ .. tab-item:: State-based policy
+ :sync: state
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu --num_envs 10 --generation_num_trials 10 \
+ --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset_small.hdf5
+
+ .. tab-item:: Visuomotor policy
+ :sync: visuomotor
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu --enable_cameras --num_envs 10 --generation_num_trials 10 \
+ --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset_small.hdf5
+
+.. note::
+
+ The output_file of the ``annotate_demos.py`` script is the input_file to the ``generate_dataset.py`` script
+
+Inspect the output of generated data (filename: ``generated_dataset_small.hdf5``), and if satisfactory, generate the full dataset:
+
+.. tab-set::
+ :sync-group: policy_type
+
+ .. tab-item:: State-based policy
+ :sync: state
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu --headless --num_envs 10 --generation_num_trials 1000 \
+ --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset.hdf5
+
+ .. tab-item:: Visuomotor policy
+ :sync: visuomotor
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu --enable_cameras --headless --num_envs 10 --generation_num_trials 1000 \
+ --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset.hdf5
+
+
+The number of demonstrations can be increased or decreased, 1000 demonstrations have been shown to provide good training results for this task.
+
+Additionally, the number of environments in the ``--num_envs`` parameter can be adjusted to speed up data generation.
+The suggested number of 10 can be executed on a moderate laptop GPU.
+On a more powerful desktop machine, use a larger number of environments for a significant speedup of this step.
+
+Robomimic setup
+^^^^^^^^^^^^^^^
+
+As an example, we will train a BC agent implemented in `Robomimic `__ to train a policy. Any other framework or training method could be used.
+
+To install the robomimic framework, use the following commands:
+
+.. code:: bash
+
+ # install the dependencies
+ sudo apt install cmake build-essential
+ # install python module (for robomimic)
+ ./isaaclab.sh -i robomimic
+
+Training an agent
+^^^^^^^^^^^^^^^^^
+
+Using the Mimic generated data we can now train a state-based BC agent for ``Isaac-Stack-Cube-Franka-IK-Rel-v0``, or a visuomotor BC agent for ``Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-v0``:
+
+.. tab-set::
+ :sync-group: policy_type
+
+ .. tab-item:: State-based policy
+ :sync: state
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --algo bc \
+ --dataset ./datasets/generated_dataset.hdf5
+
+ .. tab-item:: Visuomotor policy
+ :sync: visuomotor
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
+ --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-v0 --algo bc \
+ --dataset ./datasets/generated_dataset.hdf5
+
+.. note::
+ By default the trained models and logs will be saved to ``IssacLab/logs/robomimic``.
+
+Visualizing results
+^^^^^^^^^^^^^^^^^^^
+
+.. tip::
+
+ **Important: Testing Multiple Checkpoint Epochs**
+
+ When evaluating policy performance, it is common for different training epochs to yield significantly different results.
+ If you don't see the expected performance, **always test policies from various epochs** (not just the final checkpoint)
+ to find the best-performing model. Model performance can vary substantially across training, and the final epoch
+ is not always optimal.
+
+By inferencing using the generated model, we can visualize the results of the policy:
+
+.. tab-set::
+ :sync-group: policy_type
+
+ .. tab-item:: State-based policy
+ :sync: state
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
+ --device cpu --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 \
+ --checkpoint /PATH/TO/desired_model_checkpoint.pth
+
+ .. tab-item:: Visuomotor policy
+ :sync: visuomotor
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
+ --device cpu --enable_cameras --task Isaac-Stack-Cube-Franka-IK-Rel-Visuomotor-v0 --num_rollouts 50 \
+ --checkpoint /PATH/TO/desired_model_checkpoint.pth
+
+.. tip::
+
+ **If you don't see expected performance results:** Test policies from multiple checkpoint epochs, not just the final one.
+ Policy performance can vary significantly across training epochs, and intermediate checkpoints often outperform the final model.
+
+.. note::
+
+ **Expected Success Rates and Timings for Franka Cube Stack Task**
+
+ * Data generation success rate: ~50% (for both state + visuomotor)
+ * Data generation time: ~30 mins for state, ~4 hours for visuomotor (varies based on num envs the user runs)
+ * BC RNN training time: 1000 epochs + ~30 mins (for state), 600 epochs + ~6 hours (for visuomotor)
+ * BC RNN policy success rate: ~40-60% (for both state + visuomotor)
+ * **Recommendation:** Evaluate checkpoints from various epochs throughout training to identify the best-performing model
+
+
+Demo 1: Data Generation and Policy Training for a Humanoid Robot
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/gr-1_steering_wheel_pick_place.gif
+ :width: 100%
+ :align: center
+ :alt: GR-1 humanoid robot performing a pick and place task
+ :figclass: align-center
+
+
+Isaac Lab Mimic supports data generation for robots with multiple end effectors. In the following demonstration, we will show how to generate data
+to train a Fourier GR-1 humanoid robot to perform a pick and place task.
+
+Optional: Collect and annotate demonstrations
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Collect human demonstrations
+""""""""""""""""""""""""""""
+.. note::
+
+ Data collection for the GR-1 humanoid robot environment requires use of an Apple Vision Pro headset. If you do not have access to
+ an Apple Vision Pro, you may skip this step and continue on to the next step: `Generate the dataset`_.
+ A pre-recorded annotated dataset is provided in the next step.
+
+.. tip::
+ The GR1 scene utilizes the wrist poses from the Apple Vision Pro (AVP) as setpoints for a differential IK controller (Pink-IK).
+ The differential IK controller requires the user's wrist pose to be close to the robot's initial or current pose for optimal performance.
+ Rapid movements of the user's wrist may cause it to deviate significantly from the goal state, which could prevent the IK controller from finding the optimal solution.
+ This may result in a mismatch between the user's wrist and the robot's wrist.
+ You can increase the gain of all the `Pink-IK controller's FrameTasks `__ to track the AVP wrist poses with lower latency.
+ However, this may lead to more jerky motion.
+ Separately, the finger joints of the robot are retargeted to the user's finger joints using the `dex-retargeting `_ library.
+
+Set up the CloudXR Runtime and Apple Vision Pro for teleoperation by following the steps in :ref:`cloudxr-teleoperation`.
+CPU simulation is used in the following steps for better XR performance when running a single environment.
+
+Collect a set of human demonstrations.
+A success demo requires the object to be placed in the bin and for the robot's right arm to be retracted to the starting position.
+
+The Isaac Lab Mimic Env GR-1 humanoid robot is set up such that the left hand has a single subtask, while the right hand has two subtasks.
+The first subtask involves the right hand remaining idle while the left hand picks up and moves the object to the position where the right hand will grasp it.
+This setup allows Isaac Lab Mimic to interpolate the right hand's trajectory accurately by using the object's pose, especially when poses are randomized during data generation.
+Therefore, avoid moving the right hand while the left hand picks up the object and brings it to a stable position.
+
+
+.. |good_demo| image:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/gr-1_steering_wheel_pick_place_good_demo.gif
+ :width: 49%
+ :alt: GR-1 humanoid robot performing a good pick and place demonstration
+
+.. |bad_demo| image:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/gr-1_steering_wheel_pick_place_bad_demo.gif
+ :width: 49%
+ :alt: GR-1 humanoid robot performing a bad pick and place demonstration
+
+|good_demo| |bad_demo|
+
+.. centered:: Left: A good human demonstration with smooth and steady motion. Right: A bad demonstration with jerky and exaggerated motion.
+
+
+Collect five demonstrations by running the following command:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/tools/record_demos.py \
+ --device cpu \
+ --task Isaac-PickPlace-GR1T2-Abs-v0 \
+ --teleop_device handtracking \
+ --dataset_file ./datasets/dataset_gr1.hdf5 \
+ --num_demos 5 --enable_pinocchio
+
+.. note::
+ We also provide a GR-1 pick and place task with waist degrees-of-freedom enabled ``Isaac-PickPlace-GR1T2-WaistEnabled-Abs-v0`` (see :ref:`environments` for details on the available environments, including the GR1 Waist Enabled variant). The same command above applies but with the task name changed to ``Isaac-PickPlace-GR1T2-WaistEnabled-Abs-v0``.
+
+.. tip::
+ If a demo fails during data collection, the environment can be reset using the teleoperation controls panel in the XR teleop client
+ on the Apple Vision Pro or via voice control by saying "reset". See :ref:`teleoperate-apple-vision-pro` for more details.
+
+ The robot uses simplified collision meshes for physics calculations that differ from the detailed visual meshes displayed in the simulation. Due to this difference, you may occasionally observe visual artifacts where parts of the robot appear to penetrate other objects or itself, even though proper collision handling is occurring in the physics simulation.
+
+You can replay the collected demonstrations by running the following command:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/tools/replay_demos.py \
+ --device cpu \
+ --task Isaac-PickPlace-GR1T2-Abs-v0 \
+ --dataset_file ./datasets/dataset_gr1.hdf5 --enable_pinocchio
+
+.. note::
+ Non-determinism may be observed during replay as physics in IsaacLab are not determimnistically reproducible when using ``env.reset``.
+
+
+Annotate the demonstrations
+"""""""""""""""""""""""""""
+
+Unlike the prior Franka stacking task, the GR-1 pick and place task uses manual annotation to define subtasks.
+
+The pick and place task has one subtask for the left arm (pick) and two subtasks for the right arm (idle, place).
+Annotations denote the end of a subtask. For the pick and place task, this means there are no annotations for the left arm and one annotation for the right arm (the end of the final subtask is always implicit).
+
+Each demo requires a single annotation between the first and second subtask of the right arm. This annotation ("S" button press) should be done when the right robot arm finishes the "idle" subtask and begins to
+move towards the target object. An example of a correct annotation is shown below:
+
+.. figure:: ../../_static/tasks/manipulation/gr-1_pick_place_annotation.jpg
+ :width: 100%
+ :align: center
+
+Annotate the demonstrations by running the following command:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
+ --device cpu \
+ --task Isaac-PickPlace-GR1T2-Abs-Mimic-v0 \
+ --input_file ./datasets/dataset_gr1.hdf5 \
+ --output_file ./datasets/dataset_annotated_gr1.hdf5 --enable_pinocchio
+
+.. note::
+
+ The script prints the keyboard commands for manual annotation and the current subtask being annotated:
+
+ .. code:: text
+
+ Annotating episode #0 (demo_0)
+ Playing the episode for subtask annotations for eef "right".
+ Subtask signals to annotate:
+ - Termination: ['idle_right']
+
+ Press "N" to begin.
+ Press "B" to pause.
+ Press "S" to annotate subtask signals.
+ Press "Q" to skip the episode.
+
+.. tip::
+
+ If the object does not get placed in the bin during annotation, you can press "N" to replay the episode and annotate again. Or you can press "Q" to skip the episode and annotate the next one.
+
+Generate the dataset
+^^^^^^^^^^^^^^^^^^^^
+
+If you skipped the prior collection and annotation step, download the pre-recorded annotated dataset ``dataset_annotated_gr1.hdf5`` from
+here: `[Annotated GR1 Dataset] `_.
+Place the file under ``IsaacLab/datasets`` and run the following command to generate a new dataset with 1000 demonstrations.
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu --headless --num_envs 20 --generation_num_trials 1000 --enable_pinocchio \
+ --input_file ./datasets/dataset_annotated_gr1.hdf5 --output_file ./datasets/generated_dataset_gr1.hdf5
+
+Train a policy
+^^^^^^^^^^^^^^
+
+Use `Robomimic `__ to train a policy for the generated dataset.
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
+ --task Isaac-PickPlace-GR1T2-Abs-v0 --algo bc \
+ --normalize_training_actions \
+ --dataset ./datasets/generated_dataset_gr1.hdf5
+
+The training script will normalize the actions in the dataset to the range [-1, 1].
+The normalization parameters are saved in the model directory under ``PATH_TO_MODEL_DIRECTORY/logs/normalization_params.txt``.
+Record the normalization parameters for later use in the visualization step.
+
+.. note::
+ By default the trained models and logs will be saved to ``IssacLab/logs/robomimic``.
+
+Visualize the results
+^^^^^^^^^^^^^^^^^^^^^
+
+Visualize the results of the trained policy by running the following command, using the normalization parameters recorded in the prior training step:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
+ --device cpu \
+ --enable_pinocchio \
+ --task Isaac-PickPlace-GR1T2-Abs-v0 \
+ --num_rollouts 50 \
+ --horizon 400 \
+ --norm_factor_min \
+ --norm_factor_max \
+ --checkpoint /PATH/TO/desired_model_checkpoint.pth
+
+.. note::
+ Change the ``NORM_FACTOR`` in the above command with the values generated in the training step.
+
+.. tip::
+
+ **If you don't see expected performance results:** It is critical to test policies from various checkpoint epochs.
+ Performance can vary significantly between epochs, and the best-performing checkpoint is often not the final one.
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/gr-1_steering_wheel_pick_place_policy.gif
+ :width: 100%
+ :align: center
+ :alt: GR-1 humanoid robot performing a pick and place task
+ :figclass: align-center
+
+ The trained policy performing the pick and place task in Isaac Lab.
+
+.. note::
+
+ **Expected Success Rates and Timings for Pick and Place GR1T2 Task**
+
+ * Success rate for data generation depends on the quality of human demonstrations (how well the user performs them) and dataset annotation quality. Both data generation and downstream policy success are sensitive to these factors and can show high variance. See :ref:`Common Pitfalls when Generating Data ` for tips to improve your dataset.
+ * Data generation success for this task is typically 65-80% over 1000 demonstrations, taking 18-40 minutes depending on GPU hardware and success rate (19 minutes on a RTX ADA 6000 @ 80% success rate).
+ * Behavior Cloning (BC) policy success is typically 75-86% (evaluated on 50 rollouts) when trained on 1000 generated demonstrations for 2000 epochs (default), depending on demonstration quality. Training takes approximately 29 minutes on a RTX ADA 6000.
+ * **Recommendation:** Train for 2000 epochs with 1000 generated demonstrations, and **evaluate multiple checkpoints saved between the 1000th and 2000th epochs** to select the best-performing policy. Testing various epochs is essential for finding optimal performance.
+
+
+Demo 2: Data Generation and Policy Training for Humanoid Robot Locomanipulation with Unitree G1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In this demo, we showcase the integration of locomotion and manipulation capabilities within a single humanoid robot system.
+This locomanipulation environment enables data collection for complex tasks that combine navigation and object manipulation.
+The demonstration follows a multi-step process: first, it generates pick and place tasks similar to Demo 1, then introduces
+a navigation component that uses specialized scripts to generate scenes where the humanoid robot must move from point A to point B.
+The robot picks up an object at the initial location (point A) and places it at the target destination (point B).
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/locomanipulation-g-1_steering_wheel_pick_place.gif
+ :width: 100%
+ :align: center
+ :alt: G1 humanoid robot with locomanipulation performing a pick and place task
+ :figclass: align-center
+
+.. note::
+ **Locomotion policy training**
+
+ The locomotion policy used in this integration example was trained using the `AGILE `__ framework.
+ AGILE is an officially supported humanoid control training pipeline that leverages the manager based environment in Isaac Lab. It will also be
+ seamlessly integrated with other evaluation and deployment tools across Isaac products. This allows teams to rely on a single, maintained stack
+ covering all necessary infrastructure and tooling for policy training, with easy export to real-world deployment. The AGILE repository contains
+ updated pre-trained policies with separate upper and lower body policies for flexibtility. They have been verified in the real world and can be
+ directly deployed. Users can also train their own locomotion or whole-body control policies using the AGILE framework.
+
+Generate the manipulation dataset
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The same data generation and policy training steps from Demo 1.0 can be applied to the G1 humanoid robot with locomanipulation capabilities.
+This demonstration shows how to train a G1 robot to perform pick and place tasks with full-body locomotion and manipulation.
+
+The process follows the same workflow as Demo 1.0, but uses the ``Isaac-PickPlace-Locomanipulation-G1-Abs-v0`` task environment.
+
+Follow the same data collection, annotation, and generation process as demonstrated in Demo 1.0, but adapted for the G1 locomanipulation task.
+
+.. hint::
+
+ If desired, data collection and annotation can be done using the same commands as the prior examples for validation of the dataset.
+
+ The G1 robot with locomanipulation capabilities combines full-body locomotion with manipulation to perform pick and place tasks.
+
+ **Note that the following commands are only for your reference and dataset validation purposes - they are not required for this demo.**
+
+ To collect demonstrations:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/tools/record_demos.py \
+ --device cpu \
+ --task Isaac-PickPlace-Locomanipulation-G1-Abs-v0 \
+ --teleop_device handtracking \
+ --dataset_file ./datasets/dataset_g1_locomanip.hdf5 \
+ --num_demos 5 --enable_pinocchio
+
+ .. note::
+
+ Depending on how the Apple Vision Pro app was initialized, the hands of the operator might be very far up or far down compared to the hands of the G1 robot. If this is the case, you can click **Stop AR** in the AR tab in Isaac Lab, and move the AR Anchor prim. Adjust it down to bring the hands of the operator lower, and up to bring them higher. Click **Start AR** to resume teleoperation session. Make sure to match the hands of the robot before clicking **Play** in the Apple Vision Pro, otherwise there will be an undesired large force generated initially.
+
+ You can replay the collected demonstrations by running:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/tools/replay_demos.py \
+ --device cpu \
+ --task Isaac-PickPlace-Locomanipulation-G1-Abs-v0 \
+ --dataset_file ./datasets/dataset_g1_locomanip.hdf5 --enable_pinocchio
+
+ To annotate the demonstrations:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
+ --device cpu \
+ --task Isaac-Locomanipulation-G1-Abs-Mimic-v0 \
+ --input_file ./datasets/dataset_g1_locomanip.hdf5 \
+ --output_file ./datasets/dataset_annotated_g1_locomanip.hdf5 --enable_pinocchio
+
+
+If you skipped the prior collection and annotation step, download the pre-recorded annotated dataset ``dataset_annotated_g1_locomanip.hdf5`` from
+here: `[Annotated G1 Dataset] `_.
+Place the file under ``IsaacLab/datasets`` and run the following command to generate a new dataset with 1000 demonstrations.
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu --headless --num_envs 20 --generation_num_trials 1000 --enable_pinocchio \
+ --input_file ./datasets/dataset_annotated_g1_locomanip.hdf5 --output_file ./datasets/generated_dataset_g1_locomanip.hdf5
+
+
+Train a manipulation-only policy
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+At this point you can train a policy that only performs manipulation tasks using the generated dataset:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
+ --task Isaac-PickPlace-Locomanipulation-G1-Abs-v0 --algo bc \
+ --normalize_training_actions \
+ --dataset ./datasets/generated_dataset_g1_locomanip.hdf5
+
+Visualize the results
+^^^^^^^^^^^^^^^^^^^^^
+
+Visualize the trained policy performance:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
+ --device cpu \
+ --enable_pinocchio \
+ --task Isaac-PickPlace-Locomanipulation-G1-Abs-v0 \
+ --num_rollouts 50 \
+ --horizon 400 \
+ --norm_factor_min \
+ --norm_factor_max \
+ --checkpoint /PATH/TO/desired_model_checkpoint.pth
+
+.. note::
+ Change the ``NORM_FACTOR`` in the above command with the values generated in the training step.
+
+.. tip::
+
+ **If you don't see expected performance results:** Always test policies from various checkpoint epochs.
+ Different epochs can produce significantly different results, so evaluate multiple checkpoints to find the optimal model.
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/locomanipulation-g-1_steering_wheel_pick_place.gif
+ :width: 100%
+ :align: center
+ :alt: G1 humanoid robot performing a pick and place task
+ :figclass: align-center
+
+ The trained policy performing the pick and place task in Isaac Lab.
+
+.. note::
+
+ **Expected Success Rates and Timings for Locomanipulation Pick and Place Task**
+
+ * Success rate for data generation depends on the quality of human demonstrations (how well the user performs them) and dataset annotation quality. Both data generation and downstream policy success are sensitive to these factors and can show high variance. See :ref:`Common Pitfalls when Generating Data ` for tips to improve your dataset.
+ * Data generation success for this task is typically 65-82% over 1000 demonstrations, taking 18-40 minutes depending on GPU hardware and success rate (18 minutes on a RTX ADA 6000 @ 82% success rate).
+ * Behavior Cloning (BC) policy success is typically 75-85% (evaluated on 50 rollouts) when trained on 1000 generated demonstrations for 2000 epochs (default), depending on demonstration quality. Training takes approximately 40 minutes on a RTX ADA 6000.
+ * **Recommendation:** Train for 2000 epochs with 1000 generated demonstrations, and **evaluate multiple checkpoints saved between the 1000th and 2000th epochs** to select the best-performing policy. Testing various epochs is essential for finding optimal performance.
+
+Generate the dataset with manipulation and point-to-point navigation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To create a comprehensive locomanipulation dataset that combines both manipulation and navigation capabilities, you can generate a navigation dataset using the manipulation dataset from the previous step as input.
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/disjoint_navigation.gif
+ :width: 100%
+ :align: center
+ :alt: G1 humanoid robot combining navigation with locomanipulation
+ :figclass: align-center
+
+ G1 humanoid robot performing locomanipulation with navigation capabilities.
+
+The locomanipulation dataset generation process takes the previously generated manipulation dataset and creates scenarios where the robot must navigate from one location to another while performing manipulation tasks. This creates a more complex dataset that includes both locomotion and manipulation behaviors.
+
+To generate the locomanipulation dataset, use the following command:
+
+.. code:: bash
+
+ ./isaaclab.sh -p \
+ scripts/imitation_learning/locomanipulation_sdg/generate_data.py \
+ --device cpu \
+ --kit_args="--enable isaacsim.replicator.mobility_gen" \
+ --task="Isaac-G1-SteeringWheel-Locomanipulation" \
+ --dataset ./datasets/generated_dataset_g1_locomanip.hdf5 \
+ --num_runs 1 \
+ --lift_step 60 \
+ --navigate_step 130 \
+ --enable_pinocchio \
+ --output_file ./datasets/generated_dataset_g1_locomanipulation_sdg.hdf5 \
+ --enable_cameras
+
+.. note::
+
+ The input dataset (``--dataset``) should be the manipulation dataset generated in the previous step. You can specify any output filename using the ``--output_file_name`` parameter.
+
+The key parameters for locomanipulation dataset generation are:
+
+* ``--lift_step 70``: Number of steps for the lifting phase of the manipulation task. This should mark the point immediately after the robot has grasped the object.
+* ``--navigate_step 120``: Number of steps for the navigation phase between locations. This should make the point where the robot has lifted the object and is ready to walk.
+* ``--output_file``: Name of the output dataset file
+
+This process creates a dataset where the robot performs the manipulation task at different locations, requiring it to navigate between points while maintaining the learned manipulation behaviors. The resulting dataset can be used to train policies that combine both locomotion and manipulation capabilities.
+
+.. note::
+
+ You can visualize the robot trajectory results with the following script command:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/locomanipulation_sdg/plot_navigation_trajectory.py --input_file datasets/generated_dataset_g1_locomanipulation_sdg.hdf5 --output_dir /PATH/TO/DESIRED_OUTPUT_DIR
+
+The data generated from this locomanipulation pipeline can also be used to finetune an imitation learning policy using GR00T N1.5. To do this,
+you may convert the generated dataset to LeRobot format as expected by GR00T N1.5, and then run the finetuning script provided
+in the GR00T N1.5 repository. An example closed-loop policy rollout is shown in the video below:
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/locomanipulation_sdg_disjoint_nav_groot_policy_4x.gif
+ :width: 100%
+ :align: center
+ :alt: Simulation rollout of GR00T N1.5 policy finetuned for locomanipulation
+ :figclass: align-center
+
+ Simulation rollout of GR00T N1.5 policy finetuned for locomanipulation.
+
+The policy shown above uses the camera image, hand poses, hand joint positions, object pose, and base goal pose as inputs.
+The output of the model is the target base velocity, hand poses, and hand joint positions for the next several timesteps.
+
+
+Demo 3: Visuomotor Policy for a Humanoid Robot
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/gr-1_nut_pouring_policy.gif
+ :width: 100%
+ :align: center
+ :alt: GR-1 humanoid robot performing a pouring task
+ :figclass: align-center
+
+Download the Dataset
+^^^^^^^^^^^^^^^^^^^^
+
+Download the pre-generated dataset from `here `__ and place it under ``IsaacLab/datasets/generated_dataset_gr1_nut_pouring.hdf5``
+(**Note: The dataset size is approximately 12GB**). The dataset contains 1000 demonstrations of a humanoid robot performing a pouring/placing task that was
+generated using Isaac Lab Mimic for the ``Isaac-NutPour-GR1T2-Pink-IK-Abs-Mimic-v0`` task.
+
+.. hint::
+
+ If desired, data collection, annotation, and generation can be done using the same commands as the prior examples.
+
+ The robot first picks up the red beaker and pours the contents into the yellow bowl.
+ Then, it drops the red beaker into the blue bin. Lastly, it places the yellow bowl onto the white scale.
+ See the video in the :ref:`visualize-results-demo-2` section below for a visual demonstration of the task.
+
+ **The success criteria for this task requires the red beaker to be placed in the blue bin, the green nut to be in the yellow bowl,
+ and the yellow bowl to be placed on top of the white scale.**
+
+ .. attention::
+ **The following commands are only for your reference and are not required for this demo.**
+
+ To collect demonstrations:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/tools/record_demos.py \
+ --device cpu \
+ --task Isaac-NutPour-GR1T2-Pink-IK-Abs-v0 \
+ --teleop_device handtracking \
+ --dataset_file ./datasets/dataset_gr1_nut_pouring.hdf5 \
+ --num_demos 5 --enable_pinocchio
+
+ Since this is a visuomotor environment, the ``--enable_cameras`` flag must be added to the annotation and data generation commands.
+
+ To annotate the demonstrations:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py \
+ --device cpu \
+ --enable_cameras \
+ --rendering_mode balanced \
+ --task Isaac-NutPour-GR1T2-Pink-IK-Abs-Mimic-v0 \
+ --input_file ./datasets/dataset_gr1_nut_pouring.hdf5 \
+ --output_file ./datasets/dataset_annotated_gr1_nut_pouring.hdf5 --enable_pinocchio
+
+ .. warning::
+ There are multiple right eef annotations for this task. Annotations for subtasks for the same eef cannot have the same action index.
+ Make sure to annotate the right eef subtasks with different action indices.
+
+
+ To generate the dataset:
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py \
+ --device cpu \
+ --headless \
+ --enable_pinocchio \
+ --enable_cameras \
+ --rendering_mode balanced \
+ --task Isaac-NutPour-GR1T2-Pink-IK-Abs-Mimic-v0 \
+ --generation_num_trials 1000 \
+ --num_envs 5 \
+ --input_file ./datasets/dataset_annotated_gr1_nut_pouring.hdf5 \
+ --output_file ./datasets/generated_dataset_gr1_nut_pouring.hdf5
+
+
+Train a policy
+^^^^^^^^^^^^^^
+
+Use `Robomimic `__ to train a visuomotor BC agent for the task.
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py \
+ --task Isaac-NutPour-GR1T2-Pink-IK-Abs-v0 --algo bc \
+ --normalize_training_actions \
+ --dataset ./datasets/generated_dataset_gr1_nut_pouring.hdf5
+
+The training script will normalize the actions in the dataset to the range [-1, 1].
+The normalization parameters are saved in the model directory under ``PATH_TO_MODEL_DIRECTORY/logs/normalization_params.txt``.
+Record the normalization parameters for later use in the visualization step.
+
+.. note::
+ By default the trained models and logs will be saved to ``IsaacLab/logs/robomimic``.
+
+You can also post-train a `GR00T `__ foundation model to deploy a Vision-Language-Action policy for the task.
+
+Please refer to the `IsaacLabEvalTasks `__ repository for more details.
+
+.. _visualize-results-demo-2:
+
+Visualize the results
+^^^^^^^^^^^^^^^^^^^^^
+
+Visualize the results of the trained policy by running the following command, using the normalization parameters recorded in the prior training step:
+
+.. code:: bash
+
+ ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py \
+ --device cpu \
+ --enable_pinocchio \
+ --enable_cameras \
+ --rendering_mode balanced \
+ --task Isaac-NutPour-GR1T2-Pink-IK-Abs-v0 \
+ --num_rollouts 50 \
+ --horizon 350 \
+ --norm_factor_min \
+ --norm_factor_max \
+ --checkpoint /PATH/TO/desired_model_checkpoint.pth
+
+.. note::
+ Change the ``NORM_FACTOR`` in the above command with the values generated in the training step.
+
+.. tip::
+
+ **If you don't see expected performance results:** Test policies from various checkpoint epochs, not just the final one.
+ Policy performance can vary substantially across training, and intermediate checkpoints often yield better results.
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/gr-1_nut_pouring_policy.gif
+ :width: 100%
+ :align: center
+ :alt: GR-1 humanoid robot performing a pouring task
+ :figclass: align-center
+
+ The trained visuomotor policy performing the pouring task in Isaac Lab.
+
+.. note::
+
+ **Expected Success Rates and Timings for Visuomotor Nut Pour GR1T2 Task**
+
+ * Success rate for data generation depends on the quality of human demonstrations (how well the user performs them) and dataset annotation quality. Both data generation and downstream policy success are sensitive to these factors and can show high variance. See :ref:`Common Pitfalls when Generating Data ` for tips to improve your dataset.
+ * Data generation for 1000 demonstrations takes approximately 10 hours on a RTX ADA 6000.
+ * Behavior Cloning (BC) policy success is typically 50-60% (evaluated on 50 rollouts) when trained on 1000 generated demonstrations for 600 epochs (default). Training takes approximately 15 hours on a RTX ADA 6000.
+ * **Recommendation:** Train for 600 epochs with 1000 generated demonstrations, and **evaluate multiple checkpoints saved between the 300th and 600th epochs** to select the best-performing policy. Testing various epochs is critical for achieving optimal performance.
+
+.. _common-pitfalls-generating-data:
+
+Common Pitfalls when Generating Data
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Demonstrations are too long:**
+
+* Longer time horizon is harder to learn for a policy
+* Start close to the first object and minimize motions
+
+**Demonstrations are not smooth:**
+
+* Irregular motion is hard for policy to decipher
+* Better teleop devices result in better data (i.e. SpaceMouse is better than Keyboard)
+
+**Pauses in demonstrations:**
+
+* Pauses are difficult to learn
+* Keep the human motions smooth and fluid
+
+**Excessive number of subtasks:**
+
+* Minimize the number of defined subtasks for completing a given task
+* Less subtacks results in less stitching of trajectories, yielding higher data generation success rate
+
+**Lack of action noise:**
+
+* Action noise makes policies more robust
+
+**Recording cropped too tight:**
+
+* If recording stops on the frame the success term triggers, it may not re-trigger during replay
+* Allow for some buffer at the end of recording
+
+**Non-deterministic replay:**
+
+* Physics in IsaacLab are not deterministically reproducible when using ``env.reset`` so demonstrations may fail on replay
+* Collect more human demos than needed, use the ones that succeed during annotation
+* All data in Isaac Lab Mimic generated HDF5 file represent a successful demo and can be used for training (even if non-determinism causes failure when replayed)
+
+
+Creating Your Own Isaac Lab Mimic Compatible Environments
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+How it works
+^^^^^^^^^^^^
+
+Isaac Lab Mimic works by splitting the input demonstrations into subtasks. Subtasks are user-defined segments in the demonstrations that are common to all demonstrations. Examples for subtasks are "grasp an object", "move end effector to some pre-defined position", "release object" etc.. Note that most subtasks are defined with respect to some object that the robot interacts with.
+
+Subtasks need to be defined, and then annotated for each input demonstration. Annotation can either happen algorithmically by defining heuristics for subtask detection, as was done in the example above, or it can be done manually.
+
+With subtasks defined and annotated, Isaac Lab Mimic utilizes a small number of helper methods to then transform the subtask segments, and generate new demonstrations by stitching them together to match the new task at hand.
+
+For each thusly generated candidate demonstration, Isaac Lab Mimic uses a boolean success criteria to determine whether the demonstration succeeded in performing the task, and if so, add it to the output dataset. Success rate of candidate demonstrations can be as high as 70% in simple cases, and as low as <1%, depending on the difficulty of the task, and the complexity of the robot itself.
+
+Configuration and subtask definition
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Subtasks, among other configuration settings for Isaac Lab Mimic, are defined in a Mimic compatible environment configuration class that is created by extending the existing environment config with additional Mimic required parameters.
+
+All Mimic required config parameters are specified in the :class:`~isaaclab.envs.MimicEnvCfg` class.
+
+The config class :class:`~isaaclab_mimic.envs.FrankaCubeStackIKRelMimicEnvCfg` serves as an example of creating a Mimic compatible environment config class for the Franka stacking task that was used in the examples above.
+
+The ``DataGenConfig`` member contains various parameters that influence how data is generated. It is initially sufficient to just set the ``name`` parameter, and revise the rest later.
+
+Subtasks are a list of :class:`~isaaclab.envs.SubTaskConfig` objects, of which the most important members are:
+
+* ``object_ref`` is the object that is being interacted with. This will be used to adjust motions relative to this object during data generation. Can be ``None`` if the current subtask does not involve any object.
+* ``subtask_term_signal`` is the ID of the signal indicating whether the subtask is active or not.
+
+For multi end-effector environments, subtask ordering between end-effectors can be enforced by specifying subtask constraints. These constraints are defined in the :class:`~isaaclab.envs.SubTaskConstraintConfig` class.
+
+Subtask annotation
+^^^^^^^^^^^^^^^^^^
+
+Once the subtasks are defined, they need to be annotated in the source data. There are two methods to annotate source demonstrations for subtask boundaries: Manual annotation or using heuristics.
+
+It is often easiest to perform manual annotations, since the number of input demonstrations is usually very small. To perform manual annotations, use the ``annotate_demos.py`` script without the ``--auto`` flag. Then press ``B`` to pause, ``N`` to continue, and ``S`` to annotate a subtask boundary.
+
+For more accurate boundaries, or to speed up repeated processing of a given task for experiments, heuristics can be implemented to perform the same task. Heuristics are observations in the environment. An example how to add subtask terms can be found in ``source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/stack_env_cfg.py``, where they are added as an observation group called ``SubtaskCfg``. This example is using prebuilt heuristics, but custom heuristics are easily implemented.
+
+
+Helpers for demonstration generation
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Helpers needed for Isaac Lab Mimic are defined in the environment. All tasks that are to be used with Isaac Lab Mimic are derived from the :class:`~isaaclab.envs.ManagerBasedRLMimicEnv` base class, and must implement the following functions:
+
+* ``get_robot_eef_pose``: Returns the current robot end effector pose in the same frame as used by the robot end effector controller.
+
+* ``target_eef_pose_to_action``: Takes a target pose and a gripper action for the end effector controller and returns an action which achieves the target pose.
+
+* ``action_to_target_eef_pose``: Takes an action and returns a target pose for the end effector controller.
+
+* ``actions_to_gripper_actions``: Takes a sequence of actions and returns the gripper actuation part of the actions.
+
+* ``get_object_poses``: Returns the pose of each object in the scene that is used for data generation.
+
+* ``get_subtask_term_signals``: Returns a dictionary of binary flags for each subtask in a task. The flag of true is set when the subtask has been completed and false otherwise.
+
+The class :class:`~isaaclab_mimic.envs.FrankaCubeStackIKRelMimicEnv` shows an example of creating a Mimic compatible environment from an existing Isaac Lab environment.
+
+Registering the environment
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Once both Mimic compatible environment and environment config classes have been created, a new Mimic compatible environment can be registered using ``gym.register``. For the Franka stacking task in the examples above, the Mimic environment is registered as ``Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0``.
+
+The registered environment is now ready to be used with Isaac Lab Mimic.
+
+
+Tips for Successful Data Generation with Isaac Lab Mimic
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Splitting subtasks
+^^^^^^^^^^^^^^^^^^
+
+A general rule of thumb is to split the task into as few subtasks as possible, while still being able to complete the task. Isaac Lab Mimic data generation uses linear interpolation to bridge and stitch together subtask segments.
+More subtasks result in more stitching of trajectories which can result in less smooth motions and more failed demonstrations. For this reason, it is often best to annoatate subtask boundaries where the robot's motion is unlikely to collide with other objects.
+
+For example, in the scenario below, there is a subtask partition after the robot's left arm grasps the object. On the left, the subtask annotation is marked immediately after the grasp, while on the right, the annotation is marked after the robot has grasped and lifted the object.
+In the left case, the interpolation causes the robot's left arm to collide with the table and it's motion lags while on the right the motion is continuous and smooth.
+
+.. figure:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/lagging_subtask.gif
+ :width: 99%
+ :align: center
+ :alt: Subtask splitting example
+ :figclass: align-center
+
+.. centered:: Motion lag/collision caused by poor subtask splitting (left)
+
+
+Selecting number of interpolation steps
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The number of interpolation steps between subtask segments can be specified in the :class:`~isaaclab.envs.SubTaskConfig` class. Once transformed, the subtask segments don't start/end at the same spot, thus to create a continuous motion, Isaac Lab Mimic
+will apply linear interpolation between the last point of the previous subtask and the first point of the next subtask.
+
+The number of interpolation steps can be tuned to control the smoothness of the generated demonstrations during this stitching process.
+The appropriate number of interpolation steps depends on the speed of the robot and the complexity of the task. A complex task with a large object reset distribution will have larger gaps between subtask segments and require more interpolation steps to create a smooth motion.
+Alternatively, a task with small gaps between subtask segments should use a small number of interpolation steps to avoid unnecessary motion lag caused by too many steps.
+
+An example of how the number of interpolation steps can affect the generated demonstrations is shown below.
+In the example, an interpolation is applied to the right arm of the robot to bridge the gap between the left arm's grasp and the right arm's placement. With 0 steps, the right arm exhibits a jerky jump in motion while with 20 steps, the motion is laggy. With 5 steps, the motion is
+smooth and natural.
+
+.. |0_interp_steps| image:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/0_interpolation_steps.gif
+ :width: 32%
+ :alt: GR-1 robot with 0 interpolation steps
+
+.. |5_interp_steps| image:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/5_interpolation_steps.gif
+ :width: 32%
+ :alt: GR-1 robot with 5 interpolation steps
+
+.. |20_interp_steps| image:: https://download.isaacsim.omniverse.nvidia.com/isaaclab/images/20_interpolation_steps.gif
+ :width: 32%
+ :alt: GR-1 robot with 20 interpolation steps
+
+|0_interp_steps| |5_interp_steps| |20_interp_steps|
+
+.. centered:: Left: 0 steps. Middle: 5 steps. Right: 20 steps.
diff --git a/docs/source/overview/own-project/index.rst b/docs/source/overview/own-project/index.rst
new file mode 100644
index 000000000000..36ef4443f5b1
--- /dev/null
+++ b/docs/source/overview/own-project/index.rst
@@ -0,0 +1,14 @@
+.. _own-project:
+
+Build your Own Project or Task
+==============================
+
+To get started, first create a new project or task with the template generator :ref:`template-generator`.
+For more detailed information on how your project is structured, see :ref:`project-structure`.
+
+.. toctree::
+ :maxdepth: 1
+ :titlesonly:
+
+ template
+ project_structure
diff --git a/docs/source/overview/own-project/project_structure.rst b/docs/source/overview/own-project/project_structure.rst
new file mode 100644
index 000000000000..a0e17f0344d4
--- /dev/null
+++ b/docs/source/overview/own-project/project_structure.rst
@@ -0,0 +1,44 @@
+.. _project-structure:
+
+
+Project Structure
+=================
+
+There are four nested structures you need to be aware of when working in the direct workflow with an Isaac Lab template
+project: the **Project**, the **Extension**, the **Modules**, and the **Task**.
+
+.. figure:: ../../_static/setup/walkthrough_project_setup.svg
+ :align: center
+ :figwidth: 100%
+ :alt: The structure of the isaac lab template project.
+
+The **Project** is the root directory of the generated template. It contains the source and scripts directories, as well as
+a ``README.md`` file. When we created the template, we named the project *IsaacLabTutorial* and this defined the root directory
+of a git repository. If you examine the project root with hidden files visible you will see a number of files defining
+the behavior of the project with respect to git. The ``scripts`` directory contains the ``train.py`` and ``play.py`` scripts for the
+various RL libraries you chose when generating the template, while the source directory contains the python packages for the project.
+
+The **Extension** is the name of the python package we installed via pip. By default, the template generates a project
+with a single extension of the same name. A project can have multiple extensions, and so they are kept in a common ``source``
+directory. Traditional python packages are defined by the presence of a ``pyproject.toml`` file that describes the package
+metadata, but packages using Isaac Lab must also be Isaac Sim extensions and so require a ``config`` directory and an accompanying
+``extension.toml`` file that describes the metadata needed by the Isaac Sim extension manager. Finally, because the template
+is intended to be installed via pip, it needs a ``setup.py`` file to complete the setup procedure using the ``extension.toml``
+config. A project can have multiple extensions, as evidenced by the Isaac Lab repository itself!
+
+The **Modules** are what actually gets loaded by Isaac Lab to run training (the meat of the code). By default, the template
+generates an extension with a single module that is named the same as the project. The structure of the various sub-modules
+in the extension is what determines the ``entry_point`` for an environment in Isaac Lab. This is why our template project needed
+to be installed before we could call ``train.py``: the path to the necessary components to run the task needed to be exposed
+to python for Isaac Lab to find them.
+
+Finally, the **Task** is the heart of the direct workflow. By default, the template generates a single task with the same name
+as the project. The environment and configuration files are stored here, as well as placeholder, RL library dependent ``agents``.
+Critically, note the contents of the ``__init__.py``! Specifically, the ``gym.register`` function needs to be called at least once
+before an environment and task can be used with the Isaac Lab ``train.py`` and ``play.py`` scripts.
+This function should be included in one of the module ``__init__.py`` files so it is called at installation. The path to
+this init file is what defines the entry point for the task!
+
+For the template, ``gym.register`` is called within ``isaac_lab_tutorial/source/isaac_lab_tutorial/isaac_lab_tutorial/tasks/direct/isaac_lab_tutorial/__init__.py``.
+The repeated name is a consequence of needing default names for the template, but now we can see the structure of the project.
+**Project**/source/**Extension**/**Module**/tasks/direct/**Task**/__init__.py
diff --git a/docs/source/overview/own-project/template.rst b/docs/source/overview/own-project/template.rst
new file mode 100644
index 000000000000..cb52effde62c
--- /dev/null
+++ b/docs/source/overview/own-project/template.rst
@@ -0,0 +1,230 @@
+.. _template-generator:
+
+
+Create new project or task
+==========================
+
+Traditionally, building new projects that utilize Isaac Lab's features required creating your own
+extensions within the Isaac Lab repository. However, this approach can obscure project visibility and
+complicate updates from one version of Isaac Lab to another. To circumvent these challenges,
+we now provide a command-line tool (**template generator**) for creating Isaac Lab-based projects and tasks.
+
+The template generator enables you to create an:
+
+* **External project** (recommended): An isolated project that is not part of the Isaac Lab repository. This approach
+ works outside of the core Isaac Lab repository, ensuring that your development efforts remain self-contained. Also,
+ it allows your code to be run as an extension in Omniverse.
+
+ .. hint::
+
+ For the external project, the template generator will initialize a new Git repository in the specified directory.
+ You can push the generated content to your own remote repository (e.g. GitHub) and share it with others.
+
+* **Internal task**: A task that is part of the Isaac Lab repository. This approach should only be used to create
+ new tasks within the Isaac Lab repository in order to contribute to it.
+
+ .. warning::
+
+ Pip installations of Isaac Lab do not support *Internal* templates.
+ If ``isaaclab`` is loaded from ``site-packages`` or ``dist-packages``, the *Internal* option is disabled
+ and the *External* template will be used instead.
+
+Running the template generator
+------------------------------
+
+Install Isaac Lab by following the `installation guide <../../setup/installation/index.html>`_.
+We recommend using conda or uv installation as it simplifies calling Python scripts from the terminal.
+
+Then, run the following command to generate a new external project or internal task:
+
+.. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ ./isaaclab.sh --new # or "./isaaclab.sh -n"
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ isaaclab.bat --new :: or "isaaclab.bat -n"
+
+The generator will guide you in setting up the project/task for your needs by asking you the following questions:
+
+* Type of project/task (external or internal), and project/task path or names according to the selected type.
+* Isaac Lab workflows (see :ref:`feature-workflows`).
+* Reinforcement learning libraries (see :ref:`rl-frameworks`), and algorithms (if the selected libraries support multiple algorithms).
+
+External project usage (once generated)
+---------------------------------------
+
+Once the external project is generated, a ``README.md`` file will be created in the specified directory.
+This file will contain instructions on how to install the project and run the tasks.
+
+Here are some general commands to get started with it:
+
+.. note::
+
+ If Isaac Lab is not installed in a conda environment or in a (virtual) Python environment, use ``FULL_PATH_TO_ISAACLAB/isaaclab.sh -p``
+ (or ``FULL_PATH_TO_ISAACLAB\isaaclab.bat -p`` on Windows) instead of ``python`` to run the commands below.
+
+* Install the project (in editable mode).
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ python -m pip install -e source/
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ python -m pip install -e source\
+
+* List the tasks available in the project.
+
+ .. warning::
+
+ If the task names change, it may be necessary to update the search pattern ``"Template-"``
+ (in the ``scripts/list_envs.py`` file) so that they can be listed.
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ python scripts/list_envs.py
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ python scripts\list_envs.py
+
+* Run a task.
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ python scripts//train.py --task=
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ python scripts\\train.py --task=
+
+For more details, please follow the instructions in the generated project's ``README.md`` file.
+
+Internal task usage (once generated)
+---------------------------------------
+
+Once the internal task is generated, it will be available along with the rest of the Isaac Lab tasks.
+
+Here are some general commands to get started with it:
+
+.. note::
+
+ If Isaac Lab is not installed in a conda environment or in a (virtual) Python environment, use ``./isaaclab.sh -p``
+ (or ``isaaclab.bat -p`` on Windows) instead of ``python`` to run the commands below.
+
+* List the tasks available in Isaac Lab.
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ python scripts/environments/list_envs.py
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ python scripts\environments\list_envs.py
+
+* Run a task.
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ python scripts/reinforcement_learning//train.py --task=
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ python scripts\reinforcement_learning\\train.py --task=
+
+* Run a task with dummy agents.
+
+ These include dummy agents that output zero or random agents. They are useful to ensure that the environments are configured correctly.
+
+ * Zero-action agent
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ python scripts/zero_agent.py --task=
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ python scripts\zero_agent.py --task=
+
+ * Random-action agent
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code-block:: bash
+
+ python scripts/random_agent.py --task=
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code-block:: batch
+
+ python scripts\random_agent.py --task=
diff --git a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst
index b48fb494b9ca..9ffd47b401e2 100644
--- a/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst
+++ b/docs/source/overview/reinforcement-learning/rl_existing_scripts.rst
@@ -8,6 +8,12 @@ from the environments into the respective libraries function argument and return
RL-Games
--------
+.. attention::
+
+ When using RL-Games with the Ray workflow for distributed training or hyperparameter tuning,
+ please be aware that due to security risks associated with Ray, this workflow is not intended
+ for use outside of a strictly controlled network environment.
+
- Training an agent with
`RL-Games `__ on ``Isaac-Ant-v0``:
@@ -65,7 +71,7 @@ RSL-RL
# run script for training
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Reach-Franka-v0 --headless
# run script for playing with 32 environments
- ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --load_run run_folder_name --checkpoint model.pt
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt
# run script for playing a pre-trained checkpoint with 32 environments
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --use_pretrained_checkpoint
# run script for recording video of a trained agent (requires installing `ffmpeg`)
@@ -81,12 +87,46 @@ RSL-RL
:: run script for training
isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Reach-Franka-v0 --headless
:: run script for playing with 32 environments
- isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --load_run run_folder_name --checkpoint model.pt
+ isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --load_run run_folder_name --checkpoint /PATH/TO/model.pt
:: run script for playing a pre-trained checkpoint with 32 environments
isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --num_envs 32 --use_pretrained_checkpoint
:: run script for recording video of a trained agent (requires installing `ffmpeg`)
isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Reach-Franka-v0 --headless --video --video_length 200
+- Training and distilling an agent with
+ `RSL-RL `__ on ``Isaac-Velocity-Flat-Anymal-D-v0``:
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code:: bash
+
+ # install python module (for rsl-rl)
+ ./isaaclab.sh -i rsl_rl
+ # run script for rl training of the teacher agent
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless
+ # run script for distilling the teacher agent into a student agent
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name
+ # run script for playing the student with 64 environments
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/play.py --task Isaac-Velocity-Flat-Anymal-D-v0 --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code:: batch
+
+ :: install python module (for rsl-rl)
+ isaaclab.bat -i rsl_rl
+ :: run script for rl training of the teacher agent
+ isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless
+ :: run script for distilling the teacher agent into a student agent
+ isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --headless --agent rsl_rl_distillation_cfg_entry_point --load_run teacher_run_folder_name
+ :: run script for playing the student with 64 environments
+ isaaclab.bat -p scripts\reinforcement_learning\rsl_rl\play.py --task Isaac-Velocity-Flat-Anymal-D-v0 --num_envs 64 --agent rsl_rl_distillation_cfg_entry_point
+
SKRL
----
@@ -136,14 +176,19 @@ SKRL
.. warning::
- It is recommended to `install JAX `_ manually before proceeding to install skrl and its dependencies, as JAX installs its CPU version by default. For example, ``pip install -U "jax[cuda12]"`` can be used to install JAX for CUDA 12.
+ It is recommended to `install JAX `_ manually before proceeding to install skrl and its dependencies, as JAX installs its CPU version by default.
Visit the **skrl** `installation `_ page for more details.
Note that JAX GPU support is only available on Linux.
+ JAX 0.6.0 or higher (built on CuDNN v9.8) is incompatible with Isaac Lab's PyTorch 2.7 (built on CuDNN v9.7), and therefore not supported.
+ To install a compatible version of JAX for CUDA 12 use ``pip install "jax[cuda12]<0.6.0" "flax<0.10.7"``, for example.
+
.. code:: bash
# install python module (for skrl)
./isaaclab.sh -i skrl
+ # install jax<0.6.0 for torch 2.7
+ ./isaaclab.sh -p -m pip install "jax[cuda12]<0.6.0" "flax<0.10.7"
# install skrl dependencies for JAX
./isaaclab.sh -p -m pip install skrl["jax"]
# run script for training
@@ -187,7 +232,7 @@ Stable-Baselines3
- Training an agent with
`Stable-Baselines3 `__
- on ``Isaac-Cartpole-v0``:
+ on ``Isaac-Velocity-Flat-Unitree-A1-v0``:
.. tab-set::
:sync-group: os
@@ -200,14 +245,13 @@ Stable-Baselines3
# install python module (for stable-baselines3)
./isaaclab.sh -i sb3
# run script for training
- # note: we set the device to cpu since SB3 doesn't optimize for GPU anyway
- ./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --headless --device cpu
+ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --headless
# run script for playing with 32 environments
- ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Cartpole-v0 --num_envs 32 --checkpoint /PATH/TO/model.zip
+ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --num_envs 32 --checkpoint /PATH/TO/model.zip
# run script for playing a pre-trained checkpoint with 32 environments
- ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Cartpole-v0 --num_envs 32 --use_pretrained_checkpoint
+ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --num_envs 32 --use_pretrained_checkpoint
# run script for recording video of a trained agent (requires installing `ffmpeg`)
- ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Cartpole-v0 --headless --video --video_length 200
+ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --headless --video --video_length 200
.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows
@@ -217,14 +261,13 @@ Stable-Baselines3
:: install python module (for stable-baselines3)
isaaclab.bat -i sb3
:: run script for training
- :: note: we set the device to cpu since SB3 doesn't optimize for GPU anyway
- isaaclab.bat -p scripts\reinforcement_learning\sb3\train.py --task Isaac-Cartpole-v0 --headless --device cpu
+ isaaclab.bat -p scripts\reinforcement_learning\sb3\train.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --headless
:: run script for playing with 32 environments
- isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Cartpole-v0 --num_envs 32 --checkpoint /PATH/TO/model.zip
+ isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --num_envs 32 --checkpoint /PATH/TO/model.zip
:: run script for playing a pre-trained checkpoint with 32 environments
- isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Cartpole-v0 --num_envs 32 --use_pretrained_checkpoint
+ isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --num_envs 32 --use_pretrained_checkpoint
:: run script for recording video of a trained agent (requires installing `ffmpeg`)
- isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Cartpole-v0 --headless --video --video_length 200
+ isaaclab.bat -p scripts\reinforcement_learning\sb3\play.py --task Isaac-Velocity-Flat-Unitree-A1-v0 --headless --video --video_length 200
All the scripts above log the training progress to `Tensorboard`_ in the ``logs`` directory in the root of
the repository. The logs directory follows the pattern ``logs///``, where ````
diff --git a/docs/source/overview/reinforcement-learning/rl_frameworks.rst b/docs/source/overview/reinforcement-learning/rl_frameworks.rst
index 80d41412aacd..5f9d25e06e05 100644
--- a/docs/source/overview/reinforcement-learning/rl_frameworks.rst
+++ b/docs/source/overview/reinforcement-learning/rl_frameworks.rst
@@ -27,7 +27,7 @@ Feature Comparison
- Stable Baselines3
* - Algorithms Included
- PPO, SAC, A2C
- - PPO
+ - PPO, Distillation
- `Extensive List `__
- `Extensive List `__
* - Vectorized Training
@@ -37,7 +37,7 @@ Feature Comparison
- No
* - Distributed Training
- Yes
- - No
+ - Yes
- Yes
- No
* - ML Frameworks Supported
@@ -71,17 +71,26 @@ Training Performance
--------------------
We performed training with each RL library on the same ``Isaac-Humanoid-v0`` environment
-with ``--headless`` on a single RTX 4090 GPU
-and logged the total training time for 65.5M steps for each RL library.
+with ``--headless`` on a single NVIDIA GeForce RTX 4090 and logged the total training time
+for 65.5M steps (4096 environments x 32 rollout steps x 500 iterations).
+--------------------+-----------------+
| RL Library | Time in seconds |
+====================+=================+
-| RL-Games | 203 |
+| RL-Games | 201 |
+--------------------+-----------------+
-| SKRL | 204 |
+| SKRL | 201 |
+--------------------+-----------------+
-| RSL RL | 207 |
+| RSL RL | 198 |
+--------------------+-----------------+
-| Stable-Baselines3 | 6320 |
+| Stable-Baselines3 | 287 |
+--------------------+-----------------+
+
+Training commands (check for the *'Training time: XXX seconds'* line in the terminal output):
+
+.. code:: bash
+
+ python scripts/reinforcement_learning/rl_games/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless
+ python scripts/reinforcement_learning/skrl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless
+ python scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless
+ python scripts/reinforcement_learning/sb3/train.py --task Isaac-Humanoid-v0 --max_iterations 500 --headless
diff --git a/docs/source/overview/showroom.rst b/docs/source/overview/showroom.rst
index 7005ef650c7e..bb2248375749 100644
--- a/docs/source/overview/showroom.rst
+++ b/docs/source/overview/showroom.rst
@@ -8,7 +8,8 @@ interfaces within a code in a minimal way.
A few quick showroom scripts to run and checkout:
-- Spawn different quadrupeds and make robots stand using position commands:
+
+- Spawn different arms and apply random joint position commands:
.. tab-set::
:sync-group: os
@@ -18,20 +19,21 @@ A few quick showroom scripts to run and checkout:
.. code:: bash
- ./isaaclab.sh -p scripts/demos/quadrupeds.py
+ ./isaaclab.sh -p scripts/demos/arms.py
.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows
.. code:: batch
- isaaclab.bat -p scripts\demos\quadrupeds.py
+ isaaclab.bat -p scripts\demos\arms.py
- .. image:: ../_static/demos/quadrupeds.jpg
+ .. image:: ../_static/demos/arms.jpg
:width: 100%
- :alt: Quadrupeds in Isaac Lab
+ :alt: Arms in Isaac Lab
-- Spawn different arms and apply random joint position commands:
+
+- Spawn different biped robots:
.. tab-set::
:sync-group: os
@@ -41,18 +43,83 @@ A few quick showroom scripts to run and checkout:
.. code:: bash
- ./isaaclab.sh -p scripts/demos/arms.py
+ ./isaaclab.sh -p scripts/demos/bipeds.py
.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows
.. code:: batch
- isaaclab.bat -p scripts\demos\arms.py
+ isaaclab.bat -p scripts\demos\bipeds.py
- .. image:: ../_static/demos/arms.jpg
+ .. image:: ../_static/demos/bipeds.jpg
:width: 100%
- :alt: Arms in Isaac Lab
+ :alt: Biped robots in Isaac Lab
+
+
+- Spawn different deformable (soft) bodies and let them fall from a height:
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/demos/deformables.py
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code:: batch
+
+ isaaclab.bat -p scripts\demos\deformables.py
+
+ .. image:: ../_static/demos/deformables.jpg
+ :width: 100%
+ :alt: Deformable primitive-shaped objects in Isaac Lab
+
+
+- Interactive inference of trained H1 rough terrain locomotion policy:
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/demos/h1_locomotion.py
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code:: batch
+
+ isaaclab.bat -p scripts\demos\h1_locomotion.py
+
+ .. image:: ../_static/demos/h1_locomotion.jpg
+ :width: 100%
+ :alt: H1 locomotion in Isaac Lab
+
+ This is an interactive demo that can be run using the mouse and keyboard.
+ To enter third-person perspective, click on a humanoid character in the scene.
+ Once entered into third-person view, the humanoid can be controlled by keyboard using:
+
+ * ``UP``: go forward
+ * ``LEFT``: turn left
+ * ``RIGHT``: turn right
+ * ``DOWN``: stop
+ * ``C``: switch between third-person and perspective views
+ * ``ESC``: exit current third-person view
+
+ If a misclick happens outside of the humanoid bodies when selecting a humanoid,
+ a message is printed to console indicating the error, such as
+ ``The selected prim was not a H1 robot`` or
+ ``Multiple prims are selected. Please only select one!``.
+
- Spawn different hands and command them to open and close:
@@ -77,7 +144,8 @@ A few quick showroom scripts to run and checkout:
:width: 100%
:alt: Dexterous hands in Isaac Lab
-- Spawn different deformable (soft) bodies and let them fall from a height:
+
+- Define multiple markers that are useful for visualizations:
.. tab-set::
:sync-group: os
@@ -87,18 +155,19 @@ A few quick showroom scripts to run and checkout:
.. code:: bash
- ./isaaclab.sh -p scripts/demos/deformables.py
+ ./isaaclab.sh -p scripts/demos/markers.py
.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows
.. code:: batch
- isaaclab.bat -p scripts\demos\deformables.py
+ isaaclab.bat -p scripts\demos\markers.py
- .. image:: ../_static/demos/deformables.jpg
+ .. image:: ../_static/demos/markers.jpg
:width: 100%
- :alt: Deformable primitive-shaped objects in Isaac Lab
+ :alt: Markers in Isaac Lab
+
- Use the interactive scene and spawn varying assets in individual environments:
@@ -123,6 +192,101 @@ A few quick showroom scripts to run and checkout:
:width: 100%
:alt: Multiple assets managed through the same simulation handles
+
+- Use the RigidObjectCollection spawn and view manipulation to demonstrate bin-packing example:
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/demos/bin_packing.py
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code:: batch
+
+ isaaclab.bat -p scripts\demos\bin_packing.py
+
+ .. image:: ../_static/demos/bin_packing.jpg
+ :width: 100%
+ :alt: Spawning random number of random asset per env_id using combination of MultiAssetSpawner and RigidObjectCollection
+
+
+
+- Use the interactive scene and spawn a simple parallel robot for pick and place:
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/demos/pick_and_place.py
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code:: batch
+
+ isaaclab.bat -p scripts\demos\pick_and_place.py
+
+ .. image:: ../_static/demos/pick_and_place.jpg
+ :width: 100%
+ :alt: User controlled pick and place with a parallel robot
+
+ This is an interactive demo that can be run using the mouse and keyboard.
+ Your goal is pick up the purple cube and to drop it on the red sphere!
+ Use the following controls to interact with the simulation:
+
+ * Hold the ``A`` key to have the gripper track the cube position.
+ * Hold the ``D`` key to have the gripper track the target position
+ * Press the ``W`` or ``S`` keys to move the gantry UP or DOWN respectively
+ * Press ``Q`` or ``E`` to OPEN or CLOSE the gripper respectively
+
+
+
+- Teleoperate a Franka Panda robot using Haply haptic device with force feedback:
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/demos/haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code:: batch
+
+ isaaclab.bat -p scripts\demos\haply_teleoperation.py --websocket_uri ws://localhost:10001 --pos_sensitivity 1.65
+
+ .. image:: ../_static/demos/haply_teleop_franka.jpg
+ :width: 100%
+ :alt: Haply teleoperation with force feedback
+
+ This demo requires Haply Inverse3 and VerseGrip devices.
+ The goal of this demo is to pick up the cube or touch it with the end-effector.
+ The Haply devices provide:
+
+ * 3 dimensional position tracking for end-effector control
+ * Directional force feedback for contact sensing
+ * Button inputs for gripper and end-effector rotation control
+
+ See :ref:`haply-teleoperation` for detailed setup instructions.
+
+
+
- Create and spawn procedurally generated terrains with different configurations:
.. tab-set::
@@ -146,7 +310,9 @@ A few quick showroom scripts to run and checkout:
:width: 100%
:alt: Procedural Terrains in Isaac Lab
-- Define multiple markers that are useful for visualizations:
+
+
+- Spawn a quadcopter in the default environment:
.. tab-set::
:sync-group: os
@@ -156,20 +322,21 @@ A few quick showroom scripts to run and checkout:
.. code:: bash
- ./isaaclab.sh -p scripts/demos/markers.py
+ ./isaaclab.sh -p scripts/demos/quadcopter.py
.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows
.. code:: batch
- isaaclab.bat -p scripts\demos\markers.py
+ isaaclab.bat -p scripts\demos\quadcopter.py
- .. image:: ../_static/demos/markers.jpg
+ .. image:: ../_static/demos/quadcopter.jpg
:width: 100%
- :alt: Markers in Isaac Lab
+ :alt: Quadcopter in Isaac Lab
-- Interactive inference of trained H1 rough terrain locomotion policy:
+
+- Spawn different quadrupeds and make robots stand using position commands:
.. tab-set::
:sync-group: os
@@ -179,15 +346,39 @@ A few quick showroom scripts to run and checkout:
.. code:: bash
- ./isaaclab.sh -p scripts/demos/h1_locomotion.py
+ ./isaaclab.sh -p scripts/demos/quadrupeds.py
.. tab-item:: :icon:`fa-brands fa-windows` Windows
:sync: windows
.. code:: batch
- isaaclab.bat -p scripts\demos\h1_locomotion.py
+ isaaclab.bat -p scripts\demos\quadrupeds.py
- .. image:: ../_static/demos/h1_locomotion.jpg
+ .. image:: ../_static/demos/quadrupeds.jpg
:width: 100%
- :alt: H1 locomotion in Isaac Lab
+ :alt: Quadrupeds in Isaac Lab
+
+
+- Spawn a multi-mesh ray caster that uses Warp kernels for raycasting
+
+ .. tab-set::
+ :sync-group: os
+
+ .. tab-item:: :icon:`fa-brands fa-linux` Linux
+ :sync: linux
+
+ .. code:: bash
+
+ ./isaaclab.sh -p scripts/demos/sensors/multi_mesh_raycaster.py --num_envs 16 --asset_type objects
+
+ .. tab-item:: :icon:`fa-brands fa-windows` Windows
+ :sync: windows
+
+ .. code:: batch
+
+ isaaclab.bat -p scripts\demos\sensors\multi_mesh_raycaster.py --num_envs 16 --asset_type objects
+
+ .. image:: ../_static/demos/multi-mesh-raycast.jpg
+ :width: 100%
+ :alt: Multi-mesh raycaster in Isaac Lab
diff --git a/docs/source/overview/teleop_imitation.rst b/docs/source/overview/teleop_imitation.rst
deleted file mode 100644
index a1f0db04bbe7..000000000000
--- a/docs/source/overview/teleop_imitation.rst
+++ /dev/null
@@ -1,288 +0,0 @@
-Teleoperation and Imitation Learning
-====================================
-
-
-Teleoperation
-~~~~~~~~~~~~~
-
-We provide interfaces for providing commands in SE(2) and SE(3) space
-for robot control. In case of SE(2) teleoperation, the returned command
-is the linear x-y velocity and yaw rate, while in SE(3), the returned
-command is a 6-D vector representing the change in pose.
-
-To play inverse kinematics (IK) control with a keyboard device:
-
-.. code:: bash
-
- ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py --task Isaac-Lift-Cube-Franka-IK-Rel-v0 --num_envs 1 --teleop_device keyboard
-
-For smoother operation and off-axis operation, we recommend using a SpaceMouse as the input device. Providing smoother demonstrations will make it easier for the policy to clone the behavior. To use a SpaceMouse, simply change the teleop device accordingly:
-
-.. code:: bash
-
- ./isaaclab.sh -p scripts/environments/teleoperation/teleop_se3_agent.py --task Isaac-Lift-Cube-Franka-IK-Rel-v0 --num_envs 1 --teleop_device spacemouse
-
-.. note::
-
- If the SpaceMouse is not detected, you may need to grant additional user permissions by running ``sudo chmod 666 /dev/hidraw<#>`` where ``<#>`` corresponds to the device index
- of the connected SpaceMouse.
-
- To determine the device index, list all ``hidraw`` devices by running ``ls -l /dev/hidraw*``.
- Identify the device corresponding to the SpaceMouse by running ``cat /sys/class/hidraw/hidraw<#>/device/uevent`` on each of the devices listed
- from the prior step.
-
- Only compatible with the SpaceMouse Wireless and SpaceMouse Compact models from 3Dconnexion.
-
-The script prints the teleoperation events configured. For keyboard,
-these are as follows:
-
-.. code:: text
-
- Keyboard Controller for SE(3): Se3Keyboard
- Reset all commands: R
- Toggle gripper (open/close): K
- Move arm along x-axis: W/S
- Move arm along y-axis: A/D
- Move arm along z-axis: Q/E
- Rotate arm along x-axis: Z/X
- Rotate arm along y-axis: T/G
- Rotate arm along z-axis: C/V
-
-For SpaceMouse, these are as follows:
-
-.. code:: text
-
- SpaceMouse Controller for SE(3): Se3SpaceMouse
- Reset all commands: Right click
- Toggle gripper (open/close): Click the left button on the SpaceMouse
- Move arm along x/y-axis: Tilt the SpaceMouse
- Move arm along z-axis: Push or pull the SpaceMouse
- Rotate arm: Twist the SpaceMouse
-
-The next section describes how teleoperation devices can be used for data collection for imitation learning.
-
-
-Imitation Learning
-~~~~~~~~~~~~~~~~~~
-
-Using the teleoperation devices, it is also possible to collect data for
-learning from demonstrations (LfD). For this, we provide scripts to collect data into the open HDF5 format.
-
-Collecting demonstrations
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-To collect demonstrations with teleoperation for the environment ``Isaac-Stack-Cube-Franka-IK-Rel-v0``, use the following commands:
-
-.. code:: bash
-
- # step a: create folder for datasets
- mkdir -p datasets
- # step b: collect data with a selected teleoperation device. Replace with your preferred input device.
- # Available options: spacemouse, keyboard
- ./isaaclab.sh -p scripts/tools/record_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --teleop_device --dataset_file ./datasets/dataset.hdf5 --num_demos 10
- # step a: replay the collected dataset
- ./isaaclab.sh -p scripts/tools/replay_demos.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --dataset_file ./datasets/dataset.hdf5
-
-
-.. note::
-
- The order of the stacked cubes should be blue (bottom), red (middle), green (top).
-
-About 10 successful demonstrations are required in order for the following steps to succeed.
-
-Here are some tips to perform demonstrations that lead to successful policy training:
-
-* Keep demonstrations short. Shorter demonstrations mean fewer decisions for the policy, making training easier.
-* Take a direct path. Do not follow along arbitrary axis, but move straight toward the goal.
-* Do not pause. Perform smooth, continuous motions instead. It is not obvious for a policy why and when to pause, hence continuous motions are easier to learn.
-
-If, while performing a demonstration, a mistake is made, or the current demonstration should not be recorded for some other reason, press the ``R`` key to discard the current demonstration, and reset to a new starting position.
-
-.. note::
- Non-determinism may be observed during replay as physics in IsaacLab are not determimnistically reproducible when using ``env.reset``.
-
-Pre-recorded demonstrations
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-We provide a pre-recorded ``dataset.hdf5`` containing 10 human demonstrations for ``Isaac-Stack-Cube-Franka-IK-Rel-v0`` `here `_.
-This dataset may be downloaded and used in the remaining tutorial steps if you do not wish to collect your own demonstrations.
-
-.. note::
- Use of the pre-recorded dataset is optional.
-
-Generating additional demonstrations
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Additional demonstrations can be generated using Isaac Lab Mimic.
-
-Isaac Lab Mimic is a feature in Isaac Lab that allows generation of additional demonstrations automatically, allowing a policy to learn successfully even from just a handful of manual demonstrations.
-
-In order to use Isaac Lab Mimic with the recorded dataset, first annotate the subtasks in the recording:
-
-.. code:: bash
-
- ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/annotate_demos.py --input_file ./datasets/dataset.hdf5 --output_file ./datasets/annotated_dataset.hdf5 --task Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0 --auto
-
-Then, use Isaac Lab Mimic to generate some additional demonstrations:
-
-.. code:: bash
-
- ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset_small.hdf5 --num_envs 10 --generation_num_trials 10
-
-.. note::
-
- The output_file of the ``annotate_demos.py`` script is the input_file to the ``generate_dataset.py`` script
-
-.. note::
-
- Isaac Lab is designed to work with manipulators with grippers. The gripper commands in the demonstrations are extracted separately and temporally replayed during the generation of additional demonstrations.
-
-Inspect the output of generated data (filename: ``generated_dataset_small.hdf5``), and if satisfactory, generate the full dataset:
-
-.. code:: bash
-
- ./isaaclab.sh -p scripts/imitation_learning/isaaclab_mimic/generate_dataset.py --input_file ./datasets/annotated_dataset.hdf5 --output_file ./datasets/generated_dataset.hdf5 --num_envs 10 --generation_num_trials 1000 --headless
-
-The number of demonstrations can be increased or decreased, 1000 demonstrations have been shown to provide good training results for this task.
-
-Additionally, the number of environments in the ``--num_envs`` parameter can be adjusted to speed up data generation. The suggested number of 10 can be executed even on a laptop GPU. On a more powerful desktop machine, set it to 100 or higher for significant speedup of this step.
-
-Robomimic setup
-^^^^^^^^^^^^^^^
-
-As an example, we will train a BC agent implemented in `Robomimic `__ to train a policy. Any other framework or training method could be used.
-
-To install the robomimic framework, use the following commands:
-
-.. code:: bash
-
- # install the dependencies
- sudo apt install cmake build-essential
- # install python module (for robomimic)
- ./isaaclab.sh -i robomimic
-
-Training an agent
-^^^^^^^^^^^^^^^^^
-
-We can now train a BC agent for ``Isaac-Stack-Cube-Franka-IK-Rel-v0`` using the Mimic generated data:
-
-.. code:: bash
-
- ./isaaclab.sh -p scripts/imitation_learning/robomimic/train.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --algo bc --dataset ./datasets/generated_dataset.hdf5
-
-By default, the training script will save a model checkpoint every 100 epochs. The trained models and logs will be saved to logs/robomimic/Isaac-Stack-Cube-Franka-IK-Rel-v0/bc
-
-Visualizing results
-^^^^^^^^^^^^^^^^^^^
-
-By inferencing using the generated model, we can visualize the results of the policy in the same environment:
-
-.. code:: bash
-
- ./isaaclab.sh -p scripts/imitation_learning/robomimic/play.py --task Isaac-Stack-Cube-Franka-IK-Rel-v0 --num_rollouts 50 --checkpoint /PATH/TO/desired_model_checkpoint.pth
-
-
-Common Pitfalls when Generating Data
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-**Demonstrations are too long:**
-
-* Longer time horizon is harder to learn for a policy
-* Start close to the first object and minimize motions
-
-**Demonstrations are not smooth:**
-
-* Irregular motion is hard for policy to decipher
-* Better teleop devices result in better data (i.e. SpaceMouse is better than Keyboard)
-
-**Pauses in demonstrations:**
-
-* Pauses are difficult to learn
-* Keep the human motions smooth and fluid
-
-**Excessive number of subtasks:**
-
-* Minimize the number of defined subtasks for completing a given task
-* Less subtacks results in less stitching of trajectories, yielding higher data generation success rate
-
-**Lack of action noise:**
-
-* Action noise makes policies more robust
-
-**Recording cropped too tight:**
-
-* If recording stops on the frame the success term triggers, it may not re-trigger during replay
-* Allow for some buffer at the end of recording
-
-**Non-deterministic replay:**
-
-* Physics in IsaacLab are not deterministically reproducible when using ``env.reset`` so demonstrations may fail on replay
-* Collect more human demos than needed, use the ones that succeed during annotation
-* All data in Isaac Lab Mimic generated HDF5 file represent a successful demo and can be used for training (even if non-determinism causes failure when replayed)
-
-
-Creating Your Own Isaac Lab Mimic Compatible Environments
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-How it works
-^^^^^^^^^^^^
-
-Isaac Lab Mimic works by splitting the input demonstrations into subtasks. Subtasks are user-defined segments in the demonstrations that are common to all demonstrations. Examples for subtasks are "grasp an object", "move end effector to some pre-defined position", "release object" etc.. Note that most subtasks are defined with respect to some object that the robot interacts with.
-
-Subtasks need to be defined, and then annotated for each input demonstration. Annotation can either happen algorithmically by defining heuristics for subtask detection, as was done in the example above, or it can be done manually.
-
-With subtasks defined and annotated, Isaac Lab Mimic utilizes a small number of helper methods to then transform the subtask segments, and generate new demonstrations by stitching them together to match the new task at hand.
-
-For each thusly generated candidate demonstration, Isaac Lab Mimic uses a boolean success criteria to determine whether the demonstration succeeded in performing the task, and if so, add it to the output dataset. Success rate of candidate demonstrations can be as high as 70% in simple cases, and as low as <1%, depending on the difficulty of the task, and the complexity of the robot itself.
-
-Configuration and subtask definition
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Subtasks, among other configuration settings for Isaac Lab Mimic, are defined in a Mimic compatible environment configuration class that is created by extending the existing environment config with additional Mimic required parameters.
-
-All Mimic required config parameters are specified in the :class:`~isaaclab.envs.MimicEnvCfg` class.
-
-The config class :class:`~isaaclab_mimic.envs.FrankaCubeStackIKRelMimicEnvCfg` serves as an example of creating a Mimic compatible environment config class for the Franka stacking task that was used in the examples above.
-
-The ``DataGenConfig`` member contains various parameters that influence how data is generated. It is initially sufficient to just set the ``name`` parameter, and revise the rest later.
-
-Subtasks are a list of ``SubTaskConfig`` objects, of which the most important members are:
-
-* ``object_ref`` is the object that is being interacted with. This will be used to adjust motions relative to this object during data generation. Can be ``None`` if the current subtask does not involve any object.
-* ``subtask_term_signal`` is the ID of the signal indicating whether the subtask is active or not.
-
-Subtask annotation
-^^^^^^^^^^^^^^^^^^
-
-Once the subtasks are defined, they need to be annotated in the source data. There are two methods to annotate source demonstrations for subtask boundaries: Manual annotation or using heuristics.
-
-It is often easiest to perform manual annotations, since the number of input demonstrations is usually very small. To perform manual annotations, use the ``annotate_demos.py`` script without the ``--auto`` flag. Then press ``B`` to pause, ``N`` to continue, and ``S`` to annotate a subtask boundary.
-
-For more accurate boundaries, or to speed up repeated processing of a given task for experiments, heuristics can be implemented to perform the same task. Heuristics are observations in the environment. An example how to add subtask terms can be found in ``source/isaaclab_tasks/isaaclab_tasks/manager_based/manipulation/stack/stack_env_cfg.py``, where they are added as an observation group called ``SubtaskCfg``. This example is using prebuilt heuristics, but custom heuristics are easily implemented.
-
-
-Helpers for demonstration generation
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Helpers needed for Isaac Lab Mimic are defined in the environment. All tasks that are to be used with Isaac Lab Mimic are derived from the :class:`~isaaclab.envs.ManagerBasedRLMimicEnv` base class, and must implement the following functions:
-
-* ``get_robot_eef_pose``: Returns the current robot end effector pose in the same frame as used by the robot end effector controller.
-
-* ``target_eef_pose_to_action``: Takes a target pose and a gripper action for the end effector controller and returns an action which achieves the target pose.
-
-* ``action_to_target_eef_pose``: Takes an action and returns a target pose for the end effector controller.
-
-* ``actions_to_gripper_actions``: Takes a sequence of actions and returns the gripper actuation part of the actions.
-
-* ``get_object_poses``: Returns the pose of each object in the scene that is used for data generation.
-
-* ``get_subtask_term_signals``: Returns a dictionary of binary flags for each subtask in a task. The flag of true is set when the subtask has been completed and false otherwise.
-
-The class :class:`~isaaclab_mimic.envs.FrankaCubeStackIKRelMimicEnv` shows an example of creating a Mimic compatible environment from an existing Isaac Lab environment.
-
-Registering the environment
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Once both Mimic compatible environment and environment config classes have been created, a new Mimic compatible environment can be registered using ``gym.register``. For the Franka stacking task in the examples above, the Mimic environment is registered as ``Isaac-Stack-Cube-Franka-IK-Rel-Mimic-v0``.
-
-The registered environment is now ready to be used with Isaac Lab Mimic.
diff --git a/docs/source/policy_deployment/00_hover/hover_policy.rst b/docs/source/policy_deployment/00_hover/hover_policy.rst
new file mode 100644
index 000000000000..b7efd80a15e9
--- /dev/null
+++ b/docs/source/policy_deployment/00_hover/hover_policy.rst
@@ -0,0 +1,194 @@
+Training & Deploying HOVER Policy
+=================================
+
+This tutorial shows you an example of how to train and deploy HOVER which is a whole-body control (WBC) policy for humanoid robots in the Isaac Lab simulation environment.
+It uses the `HOVER`_ repository, which provides an Isaac Lab extension for training neural whole-body control policy for humanoids, as described in the `HOVER Paper`_ and `OMNIH2O Paper`_ papers.
+For video demonstrations and more details about the project, please visit the `HOVER Project Website`_ and the `OMNIH2O Project Website`_.
+
+.. figure:: ../../_static/policy_deployment/00_hover/hover_training_robots.png
+ :align: center
+ :figwidth: 100%
+ :alt: visualization of training the policy
+
+Installation
+------------
+
+.. note::
+
+ This tutorial is for linux only.
+
+ HOVER supports Isaac Lab 2.0 and Isaac Sim 4.5. Please ensure you have the correct version of Isaac Lab and Isaac Sim installed to run the HOVER workflow.
+
+
+1. Install Isaac Lab following the instructions in the `Isaac Lab Installation Guide`_.
+
+2. Define the following environment variable to specify the path to your Isaac Lab installation:
+
+.. code-block:: bash
+
+ # Set the ISAACLAB_PATH environment variable to point to your Isaac Lab installation directory
+ export ISAACLAB_PATH=
+
+3. Clone the `HOVER`_ repository and its submodules in your workspace.
+
+.. code-block:: bash
+
+ git clone --recurse-submodules https://github.com/NVlabs/HOVER.git
+
+4. Install the dependencies.
+
+.. code-block:: bash
+
+ cd HOVER
+ ./install_deps.sh
+
+
+Training the Policy
+-------------------
+
+Dataset
+~~~~~~~
+Refer to the `HOVER Dataset`_ repository for the steps to obtain and process data for training the policy.
+
+
+Training the teacher policy
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Execute the following command from the ``HOVER`` directory to train the teacher policy.
+
+.. code-block:: bash
+
+ ${ISAACLAB_PATH:?}/isaaclab.sh -p scripts/rsl_rl/train_teacher_policy.py \
+ --num_envs 1024 \
+ --reference_motion_path neural_wbc/data/data/motions/stable_punch.pkl \
+ --headless
+
+The teacher policy is trained for 10000000 iterations, or until the user interrupts the training.
+The resulting checkpoint is stored in ``neural_wbc/data/data/policy/h1:teacher/`` and the filename is ``model_.pt``.
+
+Training the student policy
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Execute the following command from the ``HOVER`` directory to train the student policy using teacher policy checkpoint.
+
+.. code-block:: bash
+
+ ${ISAACLAB_PATH:?}/isaaclab.sh -p scripts/rsl_rl/train_student_policy.py \
+ --num_envs 1024 \
+ --reference_motion_path neural_wbc/data/data/motions/stable_punch.pkl \
+ --teacher_policy.resume_path neural_wbc/data/data/policy/h1:teacher \
+ --teacher_policy.checkpoint model_.pt \
+ --headless
+
+This assumes that you have already trained the teacher policy as there is no provided teacher policy in the repo.
+
+Please refer to these sections on the HOVER repository for more details about training configurations:
+ - `General Remarks for Training`_
+ - `Generalist vs Specialist Policy`_
+
+Testing the trained policy
+--------------------------
+
+Play teacher policy
+~~~~~~~~~~~~~~~~~~~
+Execute the following command from the ``HOVER`` directory to play the trained teacher policy checkpoint.
+
+.. code-block:: bash
+
+ ${ISAACLAB_PATH:?}/isaaclab.sh -p scripts/rsl_rl/play.py \
+ --num_envs 10 \
+ --reference_motion_path neural_wbc/data/data/motions/stable_punch.pkl \
+ --teacher_policy.resume_path neural_wbc/data/data/policy/h1:teacher \
+ --teacher_policy.checkpoint model_.pt
+
+Play student policy
+~~~~~~~~~~~~~~~~~~~
+Execute the following command from the ``HOVER`` directory to play the trained student policy checkpoint.
+
+.. code-block:: bash
+
+ ${ISAACLAB_PATH:?}/isaaclab.sh -p scripts/rsl_rl/play.py \
+ --num_envs 10 \
+ --reference_motion_path neural_wbc/data/data/motions/stable_punch.pkl \
+ --student_player \
+ --student_path neural_wbc/data/data/policy/h1:student \
+ --student_checkpoint model_.pt
+
+
+Evaluate the trained policy
+---------------------------
+Evaluate the trained policy checkpoint in the Isaac Lab environment.
+The evaluation iterates through all the reference motions included in the dataset specified by the ``--reference_motion_path`` option and exits when all motions are evaluated. Randomization is turned off during evaluation.
+
+Refer to the `HOVER Evaluation`_ repository for more details about the evaluation pipeline and the metrics used.
+
+The evaluation script, ``scripts/rsl_rl/eval.py``, uses the same arguments as the play script, ``scripts/rsl_rl/play.py``. You can use it for both teacher and student policies.
+
+.. code-block:: bash
+
+ ${ISAACLAB_PATH}/isaaclab.sh -p scripts/rsl_rl/eval.py \
+ --num_envs 10 \
+ --teacher_policy.resume_path neural_wbc/data/data/policy/h1:teacher \
+ --teacher_policy.checkpoint model_.pt
+
+
+Validation of the policy
+------------------------
+The trained policy in Isaac Lab can be validated in another simulation environment or on the real robot.
+
+.. figure:: ../../_static/policy_deployment/00_hover/hover_stable_wave.png
+ :align: center
+ :width: 100%
+
+ Stable Wave - Mujoco (left) & Real Robot (right)
+
+Sim-to-Sim Validation
+~~~~~~~~~~~~~~~~~~~~~
+Use the provided `Mujoco Environment`_ for conducting sim-to-sim validation of the trained policy. To run the evaluation of Sim2Sim,
+
+.. code-block:: bash
+
+ ${ISAACLAB_PATH:?}/isaaclab.sh -p neural_wbc/inference_env/scripts/eval.py \
+ --num_envs 1 \
+ --headless \
+ --student_path neural_wbc/data/data/policy/h1:student/ \
+ --student_checkpoint model_.pt
+
+Please be aware that the mujoco_wrapper only supports one environment at a time. For reference, it will take up to 5h to evaluate 8k reference motions. The inference_env is designed for maximum versatility.
+
+
+Sim-to-Real Deployment
+~~~~~~~~~~~~~~~~~~~~~~
+For sim-to-real deployment, we provide a `Hardware Environment`_ for `Unitree H1 Robot`_.
+Detailed steps of setting up a Sim-to-Real deployment workflow is explained at `README of Sim2Real deployment`_.
+
+To deploy the trained policy on the H1 robot,
+
+.. code-block:: bash
+
+ ${ISAACLAB_PATH:?}/isaaclab.sh -p neural_wbc/inference_env/scripts/s2r_player.py \
+ --student_path neural_wbc/data/data/policy/h1:student/ \
+ --student_checkpoint model_.pt \
+ --reference_motion_path neural_wbc/data/data/motions/.pkl \
+ --robot unitree_h1 \
+ --max_iterations 5000 \
+ --num_envs 1 \
+ --headless
+
+.. note::
+
+ The sim-to-real deployment wrapper currently only supports the Unitree H1 robot. It can be extended to other robots by implementing the corresponding hardware wrapper interface.
+
+
+.. _Isaac Lab Installation Guide: https://isaac-sim.github.io/IsaacLab/v2.0.0/source/setup/installation/index.html
+.. _HOVER: https://github.com/NVlabs/HOVER
+.. _HOVER Dataset: https://github.com/NVlabs/HOVER/?tab=readme-ov-file#data-processing
+.. _HOVER Evaluation: https://github.com/NVlabs/HOVER/?tab=readme-ov-file#evaluation
+.. _General Remarks for Training: https://github.com/NVlabs/HOVER/?tab=readme-ov-file#general-remarks-for-training
+.. _Generalist vs Specialist Policy: https://github.com/NVlabs/HOVER/?tab=readme-ov-file#generalist-vs-specialist-policy
+.. _HOVER Paper: https://arxiv.org/abs/2410.21229
+.. _HOVER Project Website: https://omni.human2humanoid.com/
+.. _OMNIH2O Paper: https://arxiv.org/abs/2410.21229
+.. _OMNIH2O Project Website: https://hover-versatile-humanoid.github.io/
+.. _README of Sim2Real deployment: https://github.com/NVlabs/HOVER/blob/main/neural_wbc/hw_wrappers/README.md
+.. _Hardware Environment: https://github.com/NVlabs/HOVER/blob/main/neural_wbc/hw_wrappers/README.md
+.. _Mujoco Environment: https://github.com/NVlabs/HOVER/tree/main/neural_wbc/mujoco_wrapper
+.. _Unitree H1 Robot: https://unitree.com/h1
diff --git a/docs/source/policy_deployment/01_io_descriptors/io_descriptors_101.rst b/docs/source/policy_deployment/01_io_descriptors/io_descriptors_101.rst
new file mode 100644
index 000000000000..d31de818399a
--- /dev/null
+++ b/docs/source/policy_deployment/01_io_descriptors/io_descriptors_101.rst
@@ -0,0 +1,281 @@
+IO Descriptors 101
+==================
+
+.. currentmodule:: isaaclab
+
+In this tutorial, we will learn about IO descriptors, what they are, how to export them, and how to add them to
+your environments. We will use the Anymal-D robot as an example to demonstrate how to export IO descriptors from
+an environment, and use our own terms to demonstrate how to attach IO descriptors to custom action and observation terms.
+
+
+What are IO Descriptors?
+------------------------
+
+Before we dive into IO descriptors, let's first understand what they are and how they can be useful.
+
+IO descriptors are a way to describe the inputs and outputs of a policy trained using the ManagerBasedRLEnv in Isaac
+Lab. In other words, they describe the action and observation terms of a policy. This description is used to generate
+a YAML file that can be loaded in an external tool to run the policies without having to manually input the
+configuration of the action and observation terms.
+
+In addition to this the IO Descriptors provide the following information:
+- The parameters of all the joints in the articulation.
+- Some simulation parameters including the simulation time step, and the policy time step.
+- For some action and observation terms, it provides the joint names or body names in the same order as they appear in the action/observation terms.
+- For both the observation and action terms, it provides the terms in the exact same order as they appear in the managers. Making it easy to reconstruct them from the YAML file.
+
+Here is an example of what the action part of the YAML generated from the IO descriptors looks like for the Anymal-D robot:
+
+.. literalinclude:: ../../_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_anymal_d_v0_IO_descriptors.yaml
+ :language: yaml
+ :lines: 1-39
+
+Here is an example of what a portion of the observation part of the YAML generated from the IO descriptors looks like for the Anymal-D robot:
+
+.. literalinclude:: ../../_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_anymal_d_v0_IO_descriptors.yaml
+ :language: yaml
+ :lines: 158-199
+
+.. literalinclude:: ../../_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_anymal_d_v0_IO_descriptors.yaml
+ :language: yaml
+ :lines: 236-279
+
+Something to note here is that both the action and observation terms are returned as list of dictionaries, and not a dictionary of dictionaries.
+This is done to ensure the order of the terms is preserved. Hence, to retrieve the action or observation term, the users need to look for the
+``name`` key in the dictionaries.
+
+For example, in the following snippet, we are looking at the ``projected_gravity`` observation term. The ``name`` key is used to identify the term.
+The ``full_path`` key is used to provide an explicit path to the function in Isaac Lab's source code that is used to compute this term. Some flags
+like ``mdp_type`` and ``observation_type`` are also provided, these don't have any functional impact. They are here to inform the user that this is the
+category this term belongs to.
+
+.. literalinclude:: ../../_static/policy_deployment/01_io_descriptors/isaac_velocity_flat_anymal_d_v0_IO_descriptors.yaml
+ :language: yaml
+ :lines: 200-219
+ :emphasize-lines: 9, 11
+
+
+Exporting IO Descriptors from an Environment
+--------------------------------------------
+
+In this section, we will cover how to export IO descriptors from an environment.
+Keep in mind that this feature is only available to the manager based RL environments.
+
+If a policy has already been trained using a given configuration, then the IO descriptors can be exported using:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/environments/export_io_descriptors.py --task --output_dir
+
+For example, if we want to export the IO descriptors for the Anymal-D robot, we can run:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/environments/export_io_descriptors.py --task Isaac-Velocity-Flat-Anymal-D-v0 --output_dir ./io_descriptors
+
+When training a policy, it is also possible to request the IO descriptors to be exported at the beginning of the training.
+This can be done by setting the ``export_io_descriptors`` flag in the command line.
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --export_io_descriptors
+ ./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --export_io_descriptors
+ ./isaaclab.sh -p scripts/reinforcement_learning/rl_games/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --export_io_descriptors
+ ./isaaclab.sh -p scripts/reinforcement_learning/skrl/train.py --task Isaac-Velocity-Flat-Anymal-D-v0 --export_io_descriptors
+
+
+Attaching IO Descriptors to Custom Observation Terms
+----------------------------------------------------
+
+In this section, we will cover how to attach IO descriptors to custom observation terms.
+
+Let's take a look at how we can attach an IO descriptor to a simple observation term:
+
+.. code-block:: python
+
+ @generic_io_descriptor(
+ units="m/s", axes=["X", "Y", "Z"], observation_type="RootState", on_inspect=[record_shape, record_dtype]
+ )
+ def base_lin_vel(env: ManagerBasedEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor:
+ """Root linear velocity in the asset's root frame."""
+ # extract the used quantities (to enable type-hinting)
+ asset: RigidObject = env.scene[asset_cfg.name]
+ return asset.data.root_lin_vel_b
+
+Here, we are defining a custom observation term called ``base_lin_vel`` that computes the root linear velocity of the robot.
+We are also attaching an IO descriptor to this term. The IO descriptor is defined using the ``@generic_io_descriptor`` decorator.
+
+The ``@generic_io_descriptor`` decorator is a special decorator that is used to attach an IO descriptor to a custom observation term.
+It takes arbitrary arguments that are used to describe the observation term, in this case we provide extra information that could be
+useful for the end user:
+
+- ``units``: The units of the observation term.
+- ``axes``: The axes of the observation term.
+- ``observation_type``: The type of the observation term.
+
+You'll also notice that there is an ``on_inspect`` argument that is provided. This is a list of functions that are used to inspect the observation term.
+In this case, we are using the ``record_shape`` and ``record_dtype`` functions to record the shape and dtype of the output of the observation term.
+
+These functions are defined like so:
+
+.. code-block:: python
+
+ def record_shape(output: torch.Tensor, descriptor: GenericObservationIODescriptor, **kwargs) -> None:
+ """Record the shape of the output tensor.
+
+ Args:
+ output: The output tensor.
+ descriptor: The descriptor to record the shape to.
+ **kwargs: Additional keyword arguments.
+ """
+ descriptor.shape = (output.shape[-1],)
+
+
+ def record_dtype(output: torch.Tensor, descriptor: GenericObservationIODescriptor, **kwargs) -> None:
+ """Record the dtype of the output tensor.
+
+ Args:
+ output: The output tensor.
+ descriptor: The descriptor to record the dtype to.
+ **kwargs: Additional keyword arguments.
+ """
+ descriptor.dtype = str(output.dtype)
+
+They always take the output tensor of the observation term as the first argument, and the descriptor as the second argument.
+In the ``kwargs`` all the inputs of the observation term are provided. In addition to the ``on_inspect`` functions, the decorator
+will also call call some functions in the background to collect the ``name``, the ``description``, and the ``full_path`` of the
+observation term. Note that adding this decorator does not change the signature of the observation term, so it can be used safely
+with the observation manager!
+
+Let us now take a look at a more complex example: getting the relative joint positions of the robot.
+
+.. code-block:: python
+
+ @generic_io_descriptor(
+ observation_type="JointState",
+ on_inspect=[record_joint_names, record_dtype, record_shape, record_joint_pos_offsets],
+ units="rad",
+ )
+ def joint_pos_rel(env: ManagerBasedEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor:
+ """The joint positions of the asset w.r.t. the default joint positions.
+
+ Note: Only the joints configured in :attr:`asset_cfg.joint_ids` will have their positions returned.
+ """
+ # extract the used quantities (to enable type-hinting)
+ asset: Articulation = env.scene[asset_cfg.name]
+ return asset.data.joint_pos[:, asset_cfg.joint_ids] - asset.data.default_joint_pos[:, asset_cfg.joint_ids]
+
+Similarly to the previous example, we are adding an IO descriptor to a custom observation term with a set of functions that probe the observation term.
+
+To get the name of the joints we can write the following function:
+
+.. code-block:: python
+
+ def record_joint_names(output: torch.Tensor, descriptor: GenericObservationIODescriptor, **kwargs) -> None:
+ """Record the joint names of the output tensor.
+
+ Expects the `asset_cfg` keyword argument to be set.
+
+ Args:
+ output: The output tensor.
+ descriptor: The descriptor to record the joint names to.
+ **kwargs: Additional keyword arguments.
+ """
+ asset: Articulation = kwargs["env"].scene[kwargs["asset_cfg"].name]
+ joint_ids = kwargs["asset_cfg"].joint_ids
+ if joint_ids == slice(None, None, None):
+ joint_ids = list(range(len(asset.joint_names)))
+ descriptor.joint_names = [asset.joint_names[i] for i in joint_ids]
+
+Note that we can access all the inputs of the observation term in the ``kwargs`` dictionary. Hence we can access the ``asset_cfg``, which contains the
+configuration of the articulation that the observation term is computed on.
+
+To get the offsets, we can write the following function:
+
+.. code-block:: python
+
+ def record_joint_pos_offsets(output: torch.Tensor, descriptor: GenericObservationIODescriptor, **kwargs):
+ """Record the joint position offsets of the output tensor.
+
+ Expects the `asset_cfg` keyword argument to be set.
+
+ Args:
+ output: The output tensor.
+ descriptor: The descriptor to record the joint position offsets to.
+ **kwargs: Additional keyword arguments.
+ """
+ asset: Articulation = kwargs["env"].scene[kwargs["asset_cfg"].name]
+ ids = kwargs["asset_cfg"].joint_ids
+ # Get the offsets of the joints for the first robot in the scene.
+ # This assumes that all robots have the same joint offsets.
+ descriptor.joint_pos_offsets = asset.data.default_joint_pos[:, ids][0]
+
+With this in mind, you should now be able to attach an IO descriptor to your own custom observation terms! However, before
+we close this tutorial, let's take a look at how we can attach an IO descriptor to a custom action term.
+
+
+Attaching IO Descriptors to Custom Action Terms
+-----------------------------------------------
+
+In this section, we will cover how to attach IO descriptors to custom action terms. Action terms are classes that
+inherit from the :class:`managers.ActionTerm` class. To add an IO descriptor to an action term, we need to expand
+upon its :meth:`~managers.ActionTerm.IO_descriptor` property.
+
+By default, the :meth:`~managers.ActionTerm.IO_descriptor` property returns the base descriptor and fills the following fields:
+- ``name``: The name of the action term.
+- ``full_path``: The full path of the action term.
+- ``description``: The description of the action term.
+- ``export``: Whether to export the action term.
+
+.. code-block:: python
+
+ @property
+ def IO_descriptor(self) -> GenericActionIODescriptor:
+ """The IO descriptor for the action term."""
+ self._IO_descriptor.name = re.sub(r"([a-z])([A-Z])", r"\1_\2", self.__class__.__name__).lower()
+ self._IO_descriptor.full_path = f"{self.__class__.__module__}.{self.__class__.__name__}"
+ self._IO_descriptor.description = " ".join(self.__class__.__doc__.split())
+ self._IO_descriptor.export = self.export_IO_descriptor
+ return self._IO_descriptor
+
+To add more information to the descriptor, we need to override the :meth:`~managers.ActionTerm.IO_descriptor` property.
+Let's take a look at an example on how to add the joint names, scale, offset, and clip to the descriptor.
+
+.. code-block:: python
+
+ @property
+ def IO_descriptor(self) -> GenericActionIODescriptor:
+ """The IO descriptor of the action term.
+
+ This descriptor is used to describe the action term of the joint action.
+ It adds the following information to the base descriptor:
+ - joint_names: The names of the joints.
+ - scale: The scale of the action term.
+ - offset: The offset of the action term.
+ - clip: The clip of the action term.
+
+ Returns:
+ The IO descriptor of the action term.
+ """
+ super().IO_descriptor
+ self._IO_descriptor.shape = (self.action_dim,)
+ self._IO_descriptor.dtype = str(self.raw_actions.dtype)
+ self._IO_descriptor.action_type = "JointAction"
+ self._IO_descriptor.joint_names = self._joint_names
+ self._IO_descriptor.scale = self._scale
+ # This seems to be always [4xNum_joints] IDK why. Need to check.
+ if isinstance(self._offset, torch.Tensor):
+ self._IO_descriptor.offset = self._offset[0].detach().cpu().numpy().tolist()
+ else:
+ self._IO_descriptor.offset = self._offset
+ # FIXME: This is not correct. Add list support.
+ if self.cfg.clip is not None:
+ if isinstance(self._clip, torch.Tensor):
+ self._IO_descriptor.clip = self._clip[0].detach().cpu().numpy().tolist()
+ else:
+ self._IO_descriptor.clip = self._clip
+ else:
+ self._IO_descriptor.clip = None
+ return self._IO_descriptor
+
+This is it! You should now be able to attach an IO descriptor to your own custom action terms which concludes this tutorial.
diff --git a/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst b/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst
new file mode 100644
index 000000000000..885b7fb6733a
--- /dev/null
+++ b/docs/source/policy_deployment/02_gear_assembly/gear_assembly_policy.rst
@@ -0,0 +1,605 @@
+.. _walkthrough_sim_to_real:
+
+Training a Gear Insertion Policy and ROS Deployment
+====================================================
+
+This tutorial walks you through how to train a gear insertion assembly reinforcement learning (RL) policy that transfers from simulation to a real robot. The workflow consists of two main stages:
+
+1. **Simulation Training in Isaac Lab**: Train the policy in a high-fidelity physics simulation with domain randomization
+2. **Real Robot Deployment with Isaac ROS**: Deploy the trained policy on real hardware using Isaac ROS and a custom ROS inference node
+
+This walkthrough covers the key principles and best practices for sim-to-real transfer using Isaac Lab, illustrated with a real-world example:
+
+- the Gear Assembly task for the UR10e robot with the Robotiq 2F-140 gripper or 2F-85 gripper
+
+**Task Details:**
+
+The gear assembly policy operates as follows:
+
+1. **Initial State**: The policy assumes the gear is already grasped by the gripper at the start of the episode
+2. **Input Observations**: The policy receives the pose of the gear shaft (position and orientation) in which the gear should be inserted, obtained from a separate perception pipeline
+3. **Policy Output**: The policy outputs delta joint positions (incremental changes to joint angles) to control the robot arm and perform the insertion
+4. **Generalization**: The trained policy generalizes across 3 different gear sizes without requiring retraining for each size
+
+
+.. figure:: ../../_static/policy_deployment/02_gear_assembly/gear_assembly_sim_real.webm
+ :align: center
+ :figwidth: 100%
+ :alt: Comparison of gear assembly in simulation versus real hardware
+
+ Sim-to-real transfer: Gear assembly policy trained in Isaac Lab (left) successfully deployed on real UR10e robot (right).
+
+This environment has been successfully deployed on real UR10e robots without an IsaacLab dependency.
+
+**Scope of This Tutorial:**
+
+This tutorial focuses exclusively on the **training part** of the sim-to-real transfer workflow in Isaac Lab. For the complete deployment workflow on the real robot, including the exact steps to set up the vision pipeline, robot interface and the ROS inference node to run your trained policy on real hardware, please refer to the `Isaac ROS Documentation `_.
+
+Overview
+--------
+
+Successful sim-to-real transfer requires addressing three fundamental aspects:
+
+1. **Input Consistency**: Ensuring the observations your policy receives in simulation match those available on the real robot
+2. **System Response Consistency**: Ensuring the robot and environment respond to actions in simulation the same way they do in reality
+3. **Output Consistency**: Ensuring any post-processing applied to policy outputs in Isaac Lab is also applied during real-world inference
+
+When all three aspects are properly addressed, policies trained purely in simulation can achieve robust performance on real hardware without any real-world training data.
+
+**Debugging Tip**: When your policy fails on the real robot, the best approach to debug is to set up the real robot with the same initial observations as in simulation, then compare how the controller/system respond. This isolates whether the problem is from observation mismatch (Input Consistency) or physics/controller mismatch (System Response Consistency).
+
+Part 1: Input Consistency
+--------------------------
+
+The observations your policy receives must be consistent between simulation and reality. This means:
+
+1. The observation space should only include information available from real sensors
+2. Sensor noise and delays should be modeled appropriately
+
+Using Real-Robot-Available Observations
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Your simulation environment should only use observations that are available on the real robot and not use "privileged" information that wouldn't be available in deployment.
+
+
+Observation Specification: Isaac-Deploy-GearAssembly-UR10e-2F140-v0
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The Gear Assembly environment uses both proprioceptive and exteroceptive (vision) observations:
+
+.. list-table:: Gear Assembly Environment Observations
+ :widths: 25 25 25 25
+ :header-rows: 1
+
+ * - Observation
+ - Dimension
+ - Real-World Source
+ - Noise in Training
+ * - ``joint_pos``
+ - 6 (UR10e arm joints)
+ - UR10e controller
+ - None (proprioceptive)
+ * - ``joint_vel``
+ - 6 (UR10e arm joints)
+ - UR10e controller
+ - None (proprioceptive)
+ * - ``gear_shaft_pos``
+ - 3 (x, y, z position)
+ - FoundationPose + RealSense depth
+ - ยฑ0.005 m (5mm, estimated error from FoundationPose + RealSense depth pipeline)
+ * - ``gear_shaft_quat``
+ - 4 (quaternion orientation)
+ - FoundationPose + RealSense depth
+ - ยฑ0.01 per component (~5ยฐ angular error, estimated error from FoundationPose + RealSense depth pipeline)
+
+**Implementation:**
+
+.. code-block:: python
+
+ from isaaclab.utils.noise import AdditiveUniformNoiseCfg as Unoise
+
+ @configclass
+ class PolicyCfg(ObsGroup):
+ """Observations for policy group."""
+
+ # Robot joint states - NO noise for proprioceptive observations
+ joint_pos = ObsTerm(
+ func=mdp.joint_pos,
+ params={"asset_cfg": SceneEntityCfg("robot", joint_names=["shoulder_pan_joint", ...])},
+ )
+
+ joint_vel = ObsTerm(
+ func=mdp.joint_vel,
+ params={"asset_cfg": SceneEntityCfg("robot", joint_names=["shoulder_pan_joint", ...])},
+ )
+
+ # Gear shaft pose from FoundationPose perception
+ # ADD noise for exteroceptive (vision-based) observations
+ # Calibrated to match FoundationPose + RealSense D435 error
+ # Typical error: 3-8mm position, 3-7ยฐ orientation
+ gear_shaft_pos = ObsTerm(
+ func=mdp.gear_shaft_pos_w,
+ params={"asset_cfg": SceneEntityCfg("factory_gear_base")},
+ noise=Unoise(n_min=-0.005, n_max=0.005), # ยฑ5mm
+ )
+
+ # Quaternion noise: small uniform noise on each component
+ # Results in ~5ยฐ orientation error
+ gear_shaft_quat = ObsTerm(
+ func=mdp.gear_shaft_quat_w,
+ params={"asset_cfg": SceneEntityCfg("factory_gear_base")},
+ noise=Unoise(n_min=-0.01, n_max=0.01),
+ )
+
+ def __post_init__(self):
+ self.enable_corruption = True # Enable for perception observations only
+ self.concatenate_terms = True
+
+**Why No Noise for Proprioceptive Observations?**
+
+Empirically, we found that policies trained without noise on proprioceptive observations (joint positions and velocities) transfer well to real hardware. The UR10e controller provides sufficiently accurate joint state feedback that modeling sensor noise doesn't improve sim-to-real transfer for these tasks.
+
+
+Part 2: System Response Consistency
+------------------------------------
+
+Once your observations are consistent, you need to ensure the simulated robot and environment respond to actions the same way the real system does. In this use case, this involves three main aspects:
+
+1. Physics simulation parameters (friction, contact properties)
+2. Actuator modeling (PD controller gains, effort limits)
+3. Domain randomization
+
+Physics Parameter Tuning
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Accurate physics simulation is critical for contact-rich tasks. Key parameters include:
+
+- Friction coefficients (static and dynamic)
+- Contact solver parameters
+- Material properties
+- Rigid body properties
+
+**Example: Gear Assembly Physics Configuration**
+
+The Gear Assembly task requires accurate contact modeling for insertion. Here's how friction is configured:
+
+.. code-block:: python
+
+ # From joint_pos_env_cfg.py in Isaac-Deploy-GearAssembly-UR10e-2F140-v0
+
+ @configclass
+ class EventCfg:
+ """Configuration for events including physics randomization."""
+
+ # Randomize friction for gear objects
+ small_gear_physics_material = EventTerm(
+ func=mdp.randomize_rigid_body_material,
+ mode="startup",
+ params={
+ "asset_cfg": SceneEntityCfg("factory_gear_small", body_names=".*"),
+ "static_friction_range": (0.75, 0.75), # Calibrated to real gear material
+ "dynamic_friction_range": (0.75, 0.75),
+ "restitution_range": (0.0, 0.0), # No bounce
+ "num_buckets": 16,
+ },
+ )
+
+ # Similar configuration for gripper fingers
+ robot_physics_material = EventTerm(
+ func=mdp.randomize_rigid_body_material,
+ mode="startup",
+ params={
+ "asset_cfg": SceneEntityCfg("robot", body_names=".*finger"),
+ "static_friction_range": (0.75, 0.75), # Calibrated to real gripper
+ "dynamic_friction_range": (0.75, 0.75),
+ "restitution_range": (0.0, 0.0),
+ "num_buckets": 16,
+ },
+ )
+
+These friction values (0.75) were determined through iterative visual comparison:
+
+1. Record videos of the gear being grasped and manipulated on real hardware
+2. Start training in simulation and observe the live simulation viewer
+3. Look for physics issues (penetration, unrealistic slipping, poor contact)
+4. Adjust friction coefficients and solver parameters and retry
+5. Compare the gear's behavior in the gripper visually between sim and real
+6. Repeat adjustments until behavior matches (no need to wait for full policy training)
+7. Once physics looks good, train in headless mode with video recording:
+
+ .. code-block:: bash
+
+ python scripts/reinforcement_learning/rsl_rl/train.py \
+ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \
+ --headless \
+ --video --video_length 800 --video_interval 5000
+
+8. Review the recorded videos and compare with real hardware videos to verify physics behavior
+
+**Contact Solver Configuration**
+
+Contact-rich manipulation requires careful solver tuning. These parameters were calibrated through the same iterative visual comparison process as the friction coefficients:
+
+.. code-block:: python
+
+ # Robot rigid body properties
+ rigid_props=sim_utils.RigidBodyPropertiesCfg(
+ disable_gravity=True, # Robot is mounted, no gravity
+ max_depenetration_velocity=5.0, # Control interpenetration resolution
+ linear_damping=0.0, # No artificial damping
+ angular_damping=0.0,
+ max_linear_velocity=1000.0,
+ max_angular_velocity=3666.0,
+ enable_gyroscopic_forces=True, # Important for accurate dynamics
+ solver_position_iteration_count=4, # Balance accuracy vs performance
+ solver_velocity_iteration_count=1,
+ max_contact_impulse=1e32, # Allow large contact forces
+ ),
+
+**Important**: The ``solver_position_iteration_count`` is a critical parameter for contact-rich tasks. Increasing this value improves collision simulation stability and reduces penetration issues, but it also increases simulation and training time. For the gear assembly task, we use ``solver_position_iteration_count=4`` as a balance between physics accuracy and computational performance. If you observe penetration or unstable contacts, try increasing to 8 or 16, but expect slower training.
+
+.. code-block:: python
+
+ # Articulation properties
+ articulation_props=sim_utils.ArticulationRootPropertiesCfg(
+ enabled_self_collisions=False,
+ solver_position_iteration_count=4,
+ solver_velocity_iteration_count=1,
+ ),
+
+ # Contact properties
+ collision_props=sim_utils.CollisionPropertiesCfg(
+ contact_offset=0.005, # 5mm contact detection distance
+ rest_offset=0.0, # Objects touch at 0 distance
+ ),
+
+Actuator Modeling
+~~~~~~~~~~~~~~~~~
+
+Accurate actuator modeling ensures the simulated robot moves like the real one. This includes:
+
+- PD controller gains (stiffness and damping)
+- Effort and velocity limits
+- Joint friction
+
+**Controller Choice: Impedance Control**
+
+For the UR10e deployment, we use an impedance controller interface. Using a simpler controller like impedance control reduces the chances of variation between simulation and reality compared to more complex controllers (e.g., operational space control, hybrid force-position control). Simpler controllers:
+
+- Have fewer parameters that can mismatch between sim and real
+- Are easier to model accurately in simulation
+- Have more predictable behavior that's easier to replicate
+- Reduce the controller complexity as a source of sim-real gap
+
+**Example: UR10e Actuator Configuration**
+
+.. code-block:: python
+
+ # Default UR10e actuator configuration
+ actuators = {
+ "arm": ImplicitActuatorCfg(
+ joint_names_expr=["shoulder_pan_joint", "shoulder_lift_joint",
+ "elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"],
+ effort_limit=87.0, # From UR10e specifications
+ velocity_limit=2.0, # From UR10e specifications
+ stiffness=800.0, # Calibrated to match real behavior
+ damping=40.0, # Calibrated to match real behavior
+ ),
+ }
+
+**Domain Randomization of Actuator Parameters**
+
+To account for variations in real robot behavior, randomize actuator gains during training:
+
+.. code-block:: python
+
+ # From EventCfg in the Gear Assembly environment
+ robot_joint_stiffness_and_damping = EventTerm(
+ func=mdp.randomize_actuator_gains,
+ mode="reset",
+ params={
+ "asset_cfg": SceneEntityCfg("robot", joint_names=["shoulder_.*", "elbow_.*", "wrist_.*"]),
+ "stiffness_distribution_params": (0.75, 1.5), # 75% to 150% of nominal
+ "damping_distribution_params": (0.3, 3.0), # 30% to 300% of nominal
+ "operation": "scale",
+ "distribution": "log_uniform",
+ },
+ )
+
+
+**Joint Friction Randomization**
+
+Real robots have friction in their joints that varies with position, velocity, and temperature. For the UR10e with impedance controller interface, we observed significant stiction (static friction) causing the controller to not reach target joint positions.
+
+**Characterizing Real Robot Behavior:**
+
+To quantify this behavior, we plotted the step response of the impedance controller on the real robot and observed contact offsets of approximately 0.25 degrees from the commanded setpoint. This steady-state error is caused by joint friction opposing the controller's commanded motion. Based on these measurements, we added joint friction modeling in simulation to replicate this behavior:
+
+.. code-block:: python
+
+ joint_friction = EventTerm(
+ func=mdp.randomize_joint_parameters,
+ mode="reset",
+ params={
+ "asset_cfg": SceneEntityCfg("robot", joint_names=["shoulder_.*", "elbow_.*", "wrist_.*"]),
+ "friction_distribution_params": (0.3, 0.7), # Add 0.3 to 0.7 Nm friction
+ "operation": "add",
+ "distribution": "uniform",
+ },
+ )
+
+**Why Joint Friction Matters**: Without modeling joint friction in simulation, the policy learns to expect that commanded joint positions are always reached. On the real robot, stiction prevents small movements and causes steady-state errors. By adding friction during training, the policy learns to account for these effects and commands appropriately larger motions to overcome friction.
+
+**Compensating for Stiction with Action Scaling:**
+
+To help the policy overcome stiction on the real robot, we also increased the output action scaling. The Isaac ROS documentation notes that a higher action scale (0.0325 vs 0.025) is needed to overcome the higher static friction (stiction) compared to the 2F-85 gripper. This increased scaling ensures the policy commands are large enough to overcome the friction forces observed in the step response analysis.
+
+Action Space Design
+~~~~~~~~~~~~~~~~~~~
+
+Your action space should match what the real robot controller can execute. For this task we found that **incremental joint position control** is the most reliable approach.
+
+**Example: Gear Assembly Action Configuration**
+
+.. code-block:: python
+
+ # For contact-rich manipulation, smaller action scale for more precise control
+ self.joint_action_scale = 0.025 # ยฑ2.5 degrees per step
+
+ self.actions.arm_action = mdp.RelativeJointPositionActionCfg(
+ asset_name="robot",
+ joint_names=["shoulder_pan_joint", "shoulder_lift_joint", "elbow_joint",
+ "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"],
+ scale=self.joint_action_scale,
+ use_zero_offset=True,
+ )
+
+The action scale is a critical hyperparameter that should be tuned based on:
+
+- Task precision requirements (smaller for contact-rich tasks)
+- Control frequency (higher frequency allows larger steps)
+
+Domain Randomization Strategy
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Domain randomization should cover the range of conditions in which you want the real robot to perform. Increasing randomization ranges makes it harder for the policy to learn, but allows for larger variations in inputs and system parameters. The key is to balance training difficulty with robustness: randomize enough to cover real-world variations, but not so much that the policy cannot learn effectively.
+
+**Pose Randomization**
+
+For manipulation tasks, randomize object poses to ensure the policy works across the workspace:
+
+.. code-block:: python
+
+ # From Gear Assembly environment
+ randomize_gears_and_base_pose = EventTerm(
+ func=gear_assembly_events.randomize_gears_and_base_pose,
+ mode="reset",
+ params={
+ "pose_range": {
+ "x": [-0.1, 0.1], # ยฑ10cm
+ "y": [-0.25, 0.25], # ยฑ25cm
+ "z": [-0.1, 0.1], # ยฑ10cm
+ "roll": [-math.pi/90, math.pi/90], # ยฑ2 degrees
+ "pitch": [-math.pi/90, math.pi/90], # ยฑ2 degrees
+ "yaw": [-math.pi/6, math.pi/6], # ยฑ30 degrees
+ },
+ "gear_pos_range": {
+ "x": [-0.02, 0.02], # ยฑ2cm relative to base
+ "y": [-0.02, 0.02],
+ "z": [0.0575, 0.0775], # 5.75-7.75cm above base
+ },
+ "rot_randomization_range": {
+ "roll": [-math.pi/36, math.pi/36], # ยฑ5 degrees
+ "pitch": [-math.pi/36, math.pi/36],
+ "yaw": [-math.pi/36, math.pi/36],
+ },
+ },
+ )
+
+**Initial State Randomization**
+
+Randomizing the robot's initial configuration helps the policy handle different starting conditions:
+
+.. code-block:: python
+
+ set_robot_to_grasp_pose = EventTerm(
+ func=gear_assembly_events.set_robot_to_grasp_pose,
+ mode="reset",
+ params={
+ "robot_asset_cfg": SceneEntityCfg("robot"),
+ "rot_offset": [0.0, math.sqrt(2)/2, math.sqrt(2)/2, 0.0], # Base gripper orientation
+ "pos_randomization_range": {
+ "x": [-0.0, 0.0],
+ "y": [-0.005, 0.005], # ยฑ5mm variation
+ "z": [-0.003, 0.003], # ยฑ3mm variation
+ },
+ "gripper_type": "2f_140",
+ },
+ )
+
+Part 3: Training the Policy in Isaac Lab
+-----------------------------------------
+
+Now that we've covered the key principles for sim-to-real transfer, let's train the gear assembly policy in Isaac Lab.
+
+Step 1: Visualize the Environment
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+First, launch the training with a small number of environments and visualization enabled to verify that the environment is set up correctly:
+
+.. code-block:: bash
+
+ # Launch training with visualization
+ python scripts/reinforcement_learning/rsl_rl/train.py \
+ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \
+ --num_envs 4
+
+.. note::
+
+ For the Robotiq 2F-85 gripper, use ``--task Isaac-Deploy-GearAssembly-UR10e-2F85-v0`` instead.
+
+This will open the Isaac Sim viewer where you can observe the training process in real-time.
+
+.. figure:: ../../_static/policy_deployment/02_gear_assembly/sim_real_gear_assembly_train.jpg
+ :align: center
+ :figwidth: 100%
+ :alt: Gear assembly training visualization in Isaac Lab
+
+ Training visualization showing multiple parallel environments with robots grasping gears.
+
+**What to Expect:**
+
+In the early stages of training, you should see the robots moving around with the gears grasped by the grippers, but they won't be successfully inserting the gears yet. This is expected behavior as the policy is still learning. The robots will move the grasped gear in various directions. Once you've verified the environment looks correct, stop the training (Ctrl+C) and proceed to full-scale training.
+
+Step 2: Full-Scale Training with Video Recording
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Now launch the full training run with more parallel environments in headless mode for faster training. We'll also enable video recording to monitor progress:
+
+.. code-block:: bash
+
+ # Full training with video recording
+ python scripts/reinforcement_learning/rsl_rl/train.py \
+ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \
+ --headless \
+ --num_envs 256 \
+ --video --video_length 800 --video_interval 5000
+
+This command will:
+
+- Run 256 parallel environments for efficient training
+- Run in headless mode (no visualization) for maximum performance
+- Record videos every 5000 steps to monitor training progress
+- Save videos with 800 frames each
+
+Training typically takes ~12-24 hours for a robust insertion policy. The videos will be saved in the ``logs`` directory and can be reviewed to assess policy performance during training.
+
+.. note::
+
+ **GPU Memory Considerations**: The default configuration uses 256 parallel environments, which should work on most modern GPUs (e.g., RTX 3090, RTX 4090, A100). For better sim-to-real transfer performance, you can increase ``solver_position_iteration_count`` from 4 to 196 in ``gear_assembly_env_cfg.py`` and ``joint_pos_env_cfg.py`` for more realistic contact simulation, but this requires a larger GPU (e.g., RTX PRO 6000 with 40GB+ VRAM). Higher solver iteration counts reduce penetration and improve contact stability but significantly increase GPU memory usage.
+
+
+**Monitoring Training Progress with TensorBoard:**
+
+You can monitor training metrics in real-time using TensorBoard. Open a new terminal and run:
+
+.. code-block:: bash
+
+ ./isaaclab.sh -p -m tensorboard.main --logdir
+
+Replace ```` with the path to your training logs (e.g., ``logs/rsl_rl/gear_assembly_ur10e/2025-11-19_19-31-01``). TensorBoard will display plots showing rewards, episode lengths, and other metrics. Verify that the rewards are increasing over iterations to ensure the policy is learning successfully.
+
+
+Step 3: Deploy on Real Robot
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Once training is complete, follow the `Isaac ROS inference documentation `_ to deploy your policy.
+
+The Isaac ROS deployment pipeline directly uses the trained model checkpoint (``.pt`` file) along with the ``agent.yaml`` and ``env.yaml`` configuration files generated during training. No additional export step is required.
+
+The deployment pipeline uses Isaac ROS and a custom ROS inference node to run the policy on real hardware. The pipeline includes:
+
+1. **Perception**: Camera-based pose estimation (FoundationPose, Segment Anything)
+2. **Motion Planning**: cuMotion for collision-free trajectories
+3. **Policy Inference**: Your trained policy running at control frequency in a custom ROS inference node
+4. **Robot Control**: Low-level controller executing commands
+
+
+Troubleshooting
+---------------
+
+This section covers common errors you may encounter during training and their solutions.
+
+PhysX Collision Stack Overflow
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+**Error Message:**
+
+.. code-block:: text
+
+ PhysX error: PxGpuDynamicsMemoryConfig::collisionStackSize buffer overflow detected,
+ please increase its size to at least 269452544 in the scene desc!
+ Contacts have been dropped.
+
+**Cause:** This error occurs when the GPU collision detection buffer is too small for the number of contacts being simulated. This is common in contact-rich environments like gear assembly.
+
+**Solution:** Increase the ``gpu_collision_stack_size`` parameter in ``gear_assembly_env_cfg.py``:
+
+.. code-block:: python
+
+ # In GearAssemblyEnvCfg class
+ sim: SimulationCfg = SimulationCfg(
+ physx=PhysxCfg(
+ gpu_collision_stack_size=2**31, # Increase this value if you see overflow errors
+ gpu_max_rigid_contact_count=2**23,
+ gpu_max_rigid_patch_count=2**23,
+ ),
+ )
+
+The error message will suggest a minimum size. Set ``gpu_collision_stack_size`` to at least the recommended value (e.g., if the error says "at least 269452544", set it to ``2**28`` or ``2**29``). Note that increasing this value increases GPU memory usage.
+
+CUDA Out of Memory
+~~~~~~~~~~~~~~~~~~
+
+**Error Message:**
+
+.. code-block:: text
+
+ torch.OutOfMemoryError: CUDA out of memory.
+
+**Cause:** The GPU does not have enough memory to run the requested number of parallel environments with the current simulation parameters.
+
+**Solutions (in order of preference):**
+
+1. **Reduce the number of parallel environments:**
+
+ .. code-block:: bash
+
+ python scripts/reinforcement_learning/rsl_rl/train.py \
+ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \
+ --headless \
+ --num_envs 128 # Reduce from 256 to 128, 64, etc.
+
+ **Trade-off:** Using fewer environments will reduce sample diversity per training iteration and may slow down training convergence. You may need to train for more iterations to achieve the same performance. However, the final policy quality should be similar.
+
+2. **If using increased solver iteration counts** (values higher than the default 4):
+
+ In both ``gear_assembly_env_cfg.py`` and ``joint_pos_env_cfg.py``, reduce ``solver_position_iteration_count`` back to the default value of 4, or use intermediate values like 8 or 16:
+
+ .. code-block:: python
+
+ rigid_props=sim_utils.RigidBodyPropertiesCfg(
+ solver_position_iteration_count=4, # Use default value
+ # ... other parameters
+ ),
+
+ articulation_props=sim_utils.ArticulationRootPropertiesCfg(
+ solver_position_iteration_count=4, # Use default value
+ # ... other parameters
+ ),
+
+ **Trade-off:** Lower solver iteration counts may result in less realistic contact dynamics and more penetration issues. The default value of 4 provides a good balance for most use cases.
+
+3. **Disable video recording during training:**
+
+ Remove the ``--video`` flags to save GPU memory:
+
+ .. code-block:: bash
+
+ python scripts/reinforcement_learning/rsl_rl/train.py \
+ --task Isaac-Deploy-GearAssembly-UR10e-2F140-v0 \
+ --headless \
+ --num_envs 256
+
+ You can always evaluate the trained policy later with visualization.
+
+
+Further Resources
+-----------------
+
+- `IndustReal: Transferring Contact-Rich Assembly Tasks from Simulation to Reality `_
+- `FORGE: Force-Guided Exploration for Robust Contact-Rich Manipulation under Uncertainty `_
+- Sim-to-Real Policy Transfer for Whole Body Controllers: :ref:`sim2real` - Shows how to train and deploy a whole body controller for legged robots using Isaac Lab with the Newton backend
+- `Isaac ROS Manipulation Documentation `_
+- `Isaac ROS Gear Assembly Tutorial `_
+- RL Training Tutorial: :ref:`tutorial-run-rl-training`
diff --git a/docs/source/policy_deployment/index.rst b/docs/source/policy_deployment/index.rst
new file mode 100644
index 000000000000..3ee100f22174
--- /dev/null
+++ b/docs/source/policy_deployment/index.rst
@@ -0,0 +1,13 @@
+Sim2Real Deployment of Policies Trained in Isaac Lab
+====================================================
+
+Welcome to the Policy Deployment Guide! This section provides examples of training policies in Isaac Lab and deploying them to both simulation and real robots.
+
+Below, youโll find detailed examples of various policies for training and deploying them, along with essential configuration details.
+
+.. toctree::
+ :maxdepth: 1
+
+ 00_hover/hover_policy
+ 01_io_descriptors/io_descriptors_101
+ 02_gear_assembly/gear_assembly_policy
diff --git a/docs/source/refs/additional_resources.rst b/docs/source/refs/additional_resources.rst
index 7c0ca785fda0..16913b36d2ee 100644
--- a/docs/source/refs/additional_resources.rst
+++ b/docs/source/refs/additional_resources.rst
@@ -27,6 +27,8 @@ Simulation Features
At the heart of Isaac Lab is Isaac Sim, which is itself a feature rich tool that is useful for robotics in general, and not only for RL. The stronger your understanding of the simulation, the readily you will be able to exploit its capabilities for your own projects and applications. These resources are dedicated to informing you about the other features of the simulation that may be useful to you given your specific interest in Isaac Lab!
+* `Simulation Performance Guide `_ is a best practice guide for obtaining the best simulation performance from OmniPhysics.
+
* `Deploying Policies in Isaac Sim `_ is an Isaac Sim tutorial on how to use trained policies within the simulation.
* `Supercharge Robotics Workflows with AI and Simulation Using NVIDIA Isaac Sim 4.0 and NVIDIA Isaac Lab