- Create a new python virtual env with python 3.6, 3.7 or 3.8 (3.8 recommended)
- 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
- Install Isaac Gym
- Download and install Isaac Gym Preview 3 (Preview 2 will not work!) from https://developer.nvidia.com/isaac-gym
cd isaacgym/python && pip install -e .- Try running an example
cd examples && python 1080_balls_of_solitude.py - For troubleshooting check docs
isaacgym/docs/index.html)
- Each environment is defined in an config file (
$ROBOT_$TERRAIN_config.py) inconfigs, such asd1_flat_config.py. Taskd1_flat_config.pyas an example. The config file contains:D1Flatclass: containing reward functions and env settings.D1FlatCfgclass: containing all the environment parameters for training.D1FlatCfg_Playclass: containing all the environment parameters for playing.D1FlatCfgPPOclass: containing all the training parameters.
- Both env and config classes use inheritance.
- Each non-zero reward scale specified in
cfgwill add a function with a corresponding name to the list of elements which will be summed to get the total reward. - Tasks must be registered using
task_registry.register(name, EnvClass, EnvConfig, TrainConfig). This is done in$ROBOT/__init__.py, but can also be done from outside of this repository.
- Train:
python scripts/train.py --task=d1_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
vto stop the rendering. You can then enable it later to check the progress. - The trained policy is saved in
./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.
- To run on CPU add following arguments:
- Play a trained policy:
python scripts/simple_play.py --task=d1_flat_play- 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_runandcheckpointin the train config. - Export policy file is saved in
./model.ptand./policy.onnx
- 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. It is also possible that you need to doexport LD_LIBRARY_PATH=/path/to/libpython/directory/export LD_LIBRARY_PATH=/path/to/conda/envs/your_env/lib(for conda user. Replace /path/to/ to the corresponding path.).
- The contact forces reported by
net_contact_force_tensorare 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 undesirable 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 the reported forces withsensor_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.
The project uses some code from the following open-source code repositories:
If you have any more questions, please create an issue in this repository.