forked from leggedrobotics/legged_gym
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit ae614c0
Showing
114 changed files
with
15,276 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
*.dae filter=lfs diff=lfs merge=lfs -text | ||
*.obj filter=lfs diff=lfs merge=lfs -text | ||
*.obj text !filter !merge !diff | ||
*.dae text !filter !merge !diff |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
# These are some examples of commonly ignored file patterns. | ||
# You should customize this list as applicable to your project. | ||
# Learn more about .gitignore: | ||
# https://www.atlassian.com/git/tutorials/saving-changes/gitignore | ||
|
||
# Node artifact files | ||
node_modules/ | ||
dist/ | ||
|
||
# Compiled Java class files | ||
*.class | ||
|
||
# Compiled Python bytecode | ||
*.py[cod] | ||
|
||
# Log files | ||
*.log | ||
|
||
# Package files | ||
*.jar | ||
|
||
# Maven | ||
target/ | ||
dist/ | ||
|
||
# JetBrains IDE | ||
.idea/ | ||
|
||
# Unit test reports | ||
TEST*.xml | ||
|
||
# Generated by MacOS | ||
.DS_Store | ||
|
||
# Generated by Windows | ||
Thumbs.db | ||
|
||
# Applications | ||
*.app | ||
*.exe | ||
*.war | ||
|
||
# Large media files | ||
*.mp4 | ||
*.tiff | ||
*.avi | ||
*.flv | ||
*.mov | ||
*.wmv | ||
|
||
# VS Code | ||
.vscode | ||
# logs | ||
logs | ||
runs | ||
|
||
# other | ||
*.egg-info | ||
__pycache__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
Copyright (c) 2021, ETH Zurich, Nikita Rudin | ||
Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES | ||
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. | ||
|
||
See licenses/assets for license information for assets included in this repository. | ||
See licenses/dependencies for license information of dependencies of this package. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
# Isaac Gym Environments for Legged Robots # | ||
This repository provides the environment used to train ANYmal (and other robots) to walk on rough terrain using NVIDIA's Isaac Gym. | ||
It includes all components needed for sim-to-real transfer: actuator network, friction & mass randomization, noisy observations and random pushes during training. | ||
**Maintainer**: Nikita Rudin | ||
**Affiliation**: Robotic Systems Lab, ETH Zurich | ||
**Contact**: [email protected] | ||
|
||
### Useful Links ### | ||
Project website: https://leggedrobotics.github.io/legged_gym/ | ||
Paper: https://arxiv.org/abs/2109.11978 | ||
|
||
### Installation ### | ||
1. Create a new python virtual env with python 3.6, 3.7 or 3.8 (3.8 recommended) | ||
2. Install pytorch 1.10 with cuda-11.3: | ||
- `pip3 install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html` | ||
3. Install Isaac Gym | ||
- Download and install Isaac Gym Preview 3 (Preview 2 will not work!) from https://developer.nvidia.com/isaac-gym | ||
- `cd isaacgym_lib/python && pip install -e .` | ||
- Try running an example `python examples/1080_balls_of_solitude.py` | ||
- For troubleshooting check docs `isaacgym/docs/index.html`) | ||
4. Install rsl_rl (PPO implementation) | ||
- Clone https://bitbucket.org/leggedrobotics/rsl_rl/src/master/ | ||
- `cd rsl_rl && git checkout develop && pip install -e .` | ||
5. Install legged_gym | ||
- Clone this repository | ||
- `cd legged_gym && git checkout develop && pip install -e .` | ||
|
||
### CODE STRUCTURE ### | ||
1. Each environment is defined by an env file (`legged_robot.py`) and a config file (`legged_robot_config.py`). The config file contains two classes: one conatianing all the environment parameters (`LeggedRobotCfg`) and one for the training parameters (`LeggedRobotCfgPPo`). | ||
2. Both env and config classes use inheritance. | ||
3. Each non-zero reward scale specified in `cfg` will add a function with a corresponding name to the list of elements which will be summed to get the total reward. | ||
4. Tasks must be registered using `task_registry.register(name, EnvClass, EnvConfig, TrainConfig)`. This is done in `envs/__init__.py`, but can also be done from outside of this repository. | ||
|
||
### Usage ### | ||
1. Train: | ||
```python issacgym_anymal/scripts/train.py --task=anymal_c_flat``` | ||
- To run on CPU add following arguments: `--sim_device=cpu`, `--rl_device=cpu` (sim on CPU and rl on GPU is possible). | ||
- To run headless (no rendering) add `--headless`. | ||
- **Important**: To improve performance, once the training starts press `v` to stop the rendering. You can then enable it later to check the progress. | ||
- The trained policy is saved in `issacgym_anymal/logs/<experiment_name>/<date_time>_<run_name>/model_<iteration>.pt`. Where `<experiment_name>` and `<run_name>` are defined in the train config. | ||
- The following command line arguments override the values set in the config files: | ||
- --task TASK: Task name. | ||
- --resume: Resume training from a checkpoint | ||
- --experiment_name EXPERIMENT_NAME: Name of the experiment to run or load. | ||
- --run_name RUN_NAME: Name of the run. | ||
- --load_run LOAD_RUN: Name of the run to load when resume=True. If -1: will load the last run. | ||
- --checkpoint CHECKPOINT: Saved model checkpoint number. If -1: will load the last checkpoint. | ||
- --num_envs NUM_ENVS: Number of environments to create. | ||
- --seed SEED: Random seed. | ||
- --max_iterations MAX_ITERATIONS: Maximum number of training iterations. | ||
2. Play a trained policy: | ||
```python issacgym_anymal/scripts/play.py --task=anymal_c_flat``` | ||
- By default the loaded policy is the last model of the last run of the experiment folder. | ||
- Other runs/model iteration can be selected by setting `load_run` and `checkpoint` in the train config. | ||
|
||
### Adding a new environment ### | ||
The base environment `legged_robot` implements a rough terrain locomotion task. The corresponding cfg does not specify a robot asset (URDF/ MJCF) and no reward scales. | ||
|
||
1. Add a new folder to `envs/` with `'<your_env>_config.py`, which inherit from an existing environment cfgs | ||
2. If adding a new robot: | ||
- Add the corresponding assets to `resourses/`. | ||
- In `cfg` set the asset path, define body names, default_joint_positions and PD gains. Specify the desired `train_cfg` and the name of the environment (python class). | ||
- In `train_cfg` set `experiment_name` and `run_name` | ||
3. (If needed) implement your environment in <your_env>.py, inherit from an existing environment, overwrite the desired functions and/or add your reward functions. | ||
4. Register your env in `isaacgym_anymal/envs/__init__.py`. | ||
5. Modify/Tune other parameters in your `cfg`, `cfg_train` as needed. To remove a reward set its scale to zero. Do not modify parameters of other envs! | ||
|
||
|
||
### Troubleshooting ### | ||
1. If you get the following error: `ImportError: libpython3.8m.so.1.0: cannot open shared object file: No such file or directory`, do: `sudo apt install libpython3.8` | ||
|
||
### Known Issues ### | ||
1. The contact forces reported by `net_contact_force_tensor` are unreliable when simulating on GPU with a triangle mesh terrain. A workaround is to use force sensors, but the force are propagated through the sensors of consecutive bodies resulting in an undesireable behaviour. However, for a legged robot it is possible to add sensors to the feet/end effector only and get the expected results. When using the force sensors make sure to exclude gravity from trhe reported forces with `sensor_options.enable_forward_dynamics_forces`. Example: | ||
``` | ||
sensor_pose = gymapi.Transform() | ||
for name in feet_names: | ||
sensor_options = gymapi.ForceSensorProperties() | ||
sensor_options.enable_forward_dynamics_forces = False # for example gravity | ||
sensor_options.enable_constraint_solver_forces = True # for example contacts | ||
sensor_options.use_world_frame = True # report forces in world frame (easier to get vertical components) | ||
index = self.gym.find_asset_rigid_body_index(robot_asset, name) | ||
self.gym.create_asset_force_sensor(robot_asset, index, sensor_pose, sensor_options) | ||
(...) | ||
sensor_tensor = self.gym.acquire_force_sensor_tensor(self.sim) | ||
self.gym.refresh_force_sensor_tensor(self.sim) | ||
force_sensor_readings = gymtorch.wrap_tensor(sensor_tensor) | ||
self.sensor_forces = force_sensor_readings.view(self.num_envs, 4, 6)[..., :3] | ||
(...) | ||
self.gym.refresh_force_sensor_tensor(self.sim) | ||
contact = self.sensor_forces[:, :, 2] > 1. | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
# SPDX-FileCopyrightText: Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
# SPDX-License-Identifier: BSD-3-Clause | ||
# | ||
# 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. | ||
# | ||
# Copyright (c) 2021 ETH Zurich, Nikita Rudin | ||
|
||
import os | ||
|
||
LEGGED_GYM_ROOT_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) | ||
LEGGED_GYM_ENVS_DIR = os.path.join(LEGGED_GYM_ROOT_DIR, 'legged_gym', 'envs') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# SPDX-FileCopyrightText: Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
# SPDX-License-Identifier: BSD-3-Clause | ||
# | ||
# 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. | ||
# | ||
# Copyright (c) 2021 ETH Zurich, Nikita Rudin | ||
|
||
from legged_gym import LEGGED_GYM_ROOT_DIR, LEGGED_GYM_ENVS_DIR | ||
from legged_gym.envs.a1.a1_config import A1RoughCfg, A1RoughCfgPPO | ||
from .base.legged_robot import LeggedRobot | ||
from .anymal_c.anymal import Anymal | ||
from .anymal_c.mixed_terrains.anymal_c_rough_config import AnymalCRoughCfg, AnymalCRoughCfgPPO | ||
from .anymal_c.flat.anymal_c_flat_config import AnymalCFlatCfg, AnymalCFlatCfgPPO | ||
from .anymal_b.anymal_b_config import AnymalBRoughCfg, AnymalBRoughCfgPPO | ||
from .cassie.cassie import Cassie | ||
from .cassie.cassie_config import CassieRoughCfg, CassieRoughCfgPPO | ||
from .a1.a1_config import A1RoughCfg, A1RoughCfgPPO | ||
|
||
|
||
import os | ||
|
||
from legged_gym.utils.task_registry import task_registry | ||
|
||
task_registry.register( "anymal_c_rough", Anymal, AnymalCRoughCfg(), AnymalCRoughCfgPPO() ) | ||
task_registry.register( "anymal_c_flat", Anymal, AnymalCFlatCfg(), AnymalCFlatCfgPPO() ) | ||
task_registry.register( "anymal_b", Anymal, AnymalBRoughCfg(), AnymalBRoughCfgPPO() ) | ||
task_registry.register( "a1", LeggedRobot, A1RoughCfg(), A1RoughCfgPPO() ) | ||
task_registry.register( "cassie", Cassie, CassieRoughCfg(), CassieRoughCfgPPO() ) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
# SPDX-FileCopyrightText: Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | ||
# SPDX-License-Identifier: BSD-3-Clause | ||
# | ||
# 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. | ||
# | ||
# Copyright (c) 2021 ETH Zurich, Nikita Rudin | ||
|
||
from legged_gym.envs.base.legged_robot_config import LeggedRobotCfg, LeggedRobotCfgPPO | ||
|
||
class A1RoughCfg( LeggedRobotCfg ): | ||
class init_state( LeggedRobotCfg.init_state ): | ||
pos = [0.0, 0.0, 0.42] # x,y,z [m] | ||
default_joint_angles = { # = target angles [rad] when action = 0.0 | ||
'FL_hip_joint': 0.1, # [rad] | ||
'RL_hip_joint': 0.1, # [rad] | ||
'FR_hip_joint': -0.1 , # [rad] | ||
'RR_hip_joint': -0.1, # [rad] | ||
|
||
'FL_thigh_joint': 0.8, # [rad] | ||
'RL_thigh_joint': 1., # [rad] | ||
'FR_thigh_joint': 0.8, # [rad] | ||
'RR_thigh_joint': 1., # [rad] | ||
|
||
'FL_calf_joint': -1.5, # [rad] | ||
'RL_calf_joint': -1.5, # [rad] | ||
'FR_calf_joint': -1.5, # [rad] | ||
'RR_calf_joint': -1.5, # [rad] | ||
} | ||
|
||
class control( LeggedRobotCfg.control ): | ||
# PD Drive parameters: | ||
control_type = 'P' | ||
stiffness = {'joint': 20.} # [N*m/rad] | ||
damping = {'joint': 0.5} # [N*m*s/rad] | ||
# action scale: target angle = actionScale * action + defaultAngle | ||
action_scale = 0.25 | ||
# decimation: Number of control action updates @ sim DT per policy DT | ||
decimation = 4 | ||
|
||
class asset( LeggedRobotCfg.asset ): | ||
file = '{LEGGED_GYM_ROOT_DIR}/resources/robots/a1/urdf/a1.urdf' | ||
foot_name = "foot" | ||
penalize_contacts_on = ["thigh", "calf"] | ||
terminate_after_contacts_on = ["base"] | ||
self_collisions = 1 # 1 to disable, 0 to enable...bitwise filter | ||
|
||
class rewards( LeggedRobotCfg.rewards ): | ||
soft_dof_pos_limit = 0.9 | ||
base_height_target = 0.25 | ||
class scales( LeggedRobotCfg.rewards.scales ): | ||
torques = -0.0002 | ||
dof_pos_limits = -10.0 | ||
|
||
class A1RoughCfgPPO( LeggedRobotCfgPPO ): | ||
class algorithm( LeggedRobotCfgPPO.algorithm ): | ||
entropy_coef = 0.01 | ||
class runner( LeggedRobotCfgPPO.runner ): | ||
run_name = '' | ||
experiment_name = 'rough_a1' | ||
|
||
|
Oops, something went wrong.