├── Leatherback_Project ├── isaaclab_assets │ └── isaaclab_assets │ │ └── robots │ │ └── leatherback.py └── isaaclab_tasks │ └── isaaclab_tasks │ └── direct │ └── leatherback │ ├── __init__.py │ ├── __pycache__ │ ├── __init__.cpython-310.pyc │ ├── leatherback_1.cpython-310.pyc │ ├── leatherback_env.cpython-310.pyc │ └── waypoint.cpython-310.pyc │ ├── agents │ ├── __init__.py │ ├── __pycache__ │ │ └── __init__.cpython-310.pyc │ └── skrl_ppo_cfg.yaml │ ├── custom_assets │ └── leatherback_simple_better.usd │ ├── leatherback_env.py │ └── waypoint.py └── README.md /Leatherback_Project/isaaclab_assets/isaaclab_assets/robots/leatherback.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022-2024, The Isaac Lab Project Developers. 2 | # All rights reserved. 3 | # 4 | # SPDX-License-Identifier: BSD-3-Clause 5 | 6 | """Configuration for the leatherback robot.""" 7 | 8 | import os 9 | import isaaclab.sim as sim_utils 10 | from isaaclab.actuators import ImplicitActuatorCfg 11 | from isaaclab.assets import ArticulationCfg 12 | 13 | # Get absolute path to workspace root 14 | WORKSPACE_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../../../")) 15 | 16 | # USD path with proper resolution for cross-platform compatibility 17 | USD_PATH = os.path.join(WORKSPACE_ROOT, "source", "isaaclab_tasks", "isaaclab_tasks", "direct", "leatherback", "custom_assets", "leatherback_simple_better.usd") 18 | 19 | LEATHERBACK_CFG = ArticulationCfg( 20 | spawn=sim_utils.UsdFileCfg( 21 | usd_path=USD_PATH, 22 | rigid_props=sim_utils.RigidBodyPropertiesCfg( 23 | rigid_body_enabled=True, 24 | max_linear_velocity=1000.0, 25 | max_angular_velocity=1000.0, 26 | max_depenetration_velocity=100.0, 27 | enable_gyroscopic_forces=True, 28 | ), 29 | articulation_props=sim_utils.ArticulationRootPropertiesCfg( 30 | enabled_self_collisions=False, 31 | solver_position_iteration_count=4, 32 | solver_velocity_iteration_count=0, 33 | sleep_threshold=0.005, 34 | stabilization_threshold=0.001, 35 | ), 36 | ), 37 | init_state=ArticulationCfg.InitialStateCfg( 38 | pos=(0.0, 0.0, 0.05), 39 | joint_pos={ 40 | "Wheel__Knuckle__Front_Left": 0.0, 41 | "Wheel__Knuckle__Front_Right": 0.0, 42 | "Wheel__Upright__Rear_Right": 0.0, 43 | "Wheel__Upright__Rear_Left": 0.0, 44 | "Knuckle__Upright__Front_Right": 0.0, 45 | "Knuckle__Upright__Front_Left": 0.0, 46 | }, 47 | ), 48 | actuators={ 49 | "throttle": ImplicitActuatorCfg( 50 | joint_names_expr=["Wheel.*"], 51 | effort_limit=40000.0, 52 | velocity_limit=100.0, 53 | stiffness=0.0, 54 | damping=100000.0, 55 | ), 56 | "steering": ImplicitActuatorCfg( 57 | joint_names_expr=["Knuckle__Upright__Front.*"], 58 | effort_limit=40000.0, 59 | velocity_limit=100.0, 60 | stiffness=1000.0, 61 | damping=0.0, 62 | ), 63 | }, 64 | ) 65 | -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022-2025, The Isaac Lab Project Developers. 2 | # All rights reserved. 3 | # 4 | # SPDX-License-Identifier: BSD-3-Clause 5 | 6 | """ 7 | Leatherback driving environment. 8 | """ 9 | 10 | import gymnasium as gym 11 | 12 | from . import agents 13 | 14 | ## 15 | # Register Gym environments. 16 | ## 17 | 18 | gym.register( 19 | id="Isaac-Leatherback-Direct-v0", 20 | entry_point=f"{__name__}.leatherback_env:LeatherbackEnv", 21 | disable_env_checker=True, 22 | kwargs={ 23 | "env_cfg_entry_point": f"{__name__}.leatherback_env:LeatherbackEnvCfg", 24 | "skrl_cfg_entry_point": f"{agents.__name__}:skrl_ppo_cfg.yaml", 25 | }, 26 | ) 27 | -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Genozen/Leatherback_tutorial/df8b135cb7c0bb36260a7ca61162c080955381db/Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__pycache__/leatherback_1.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Genozen/Leatherback_tutorial/df8b135cb7c0bb36260a7ca61162c080955381db/Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__pycache__/leatherback_1.cpython-310.pyc -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__pycache__/leatherback_env.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Genozen/Leatherback_tutorial/df8b135cb7c0bb36260a7ca61162c080955381db/Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__pycache__/leatherback_env.cpython-310.pyc -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__pycache__/waypoint.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Genozen/Leatherback_tutorial/df8b135cb7c0bb36260a7ca61162c080955381db/Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/__pycache__/waypoint.cpython-310.pyc -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/agents/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2022-2025, The Isaac Lab Project Developers. 2 | # All rights reserved. 3 | # 4 | # SPDX-License-Identifier: BSD-3-Clause 5 | -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/agents/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Genozen/Leatherback_tutorial/df8b135cb7c0bb36260a7ca61162c080955381db/Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/agents/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/agents/skrl_ppo_cfg.yaml: -------------------------------------------------------------------------------- 1 | seed: 42 2 | 3 | 4 | # Models are instantiated using skrl's model instantiator utility 5 | # https://skrl.readthedocs.io/en/latest/api/utils/model_instantiators.html 6 | models: 7 | separate: False 8 | policy: # see gaussian_model parameters 9 | class: GaussianMixin 10 | clip_actions: False 11 | clip_log_std: True 12 | min_log_std: -20.0 13 | max_log_std: 2.0 14 | initial_log_std: 0.0 15 | network: 16 | - name: net 17 | input: STATES 18 | layers: [32, 32] 19 | activations: elu 20 | output: ACTIONS 21 | value: # see deterministic_model parameters 22 | class: DeterministicMixin 23 | clip_actions: False 24 | network: 25 | - name: net 26 | input: STATES 27 | layers: [32, 32] 28 | activations: elu 29 | output: ONE 30 | 31 | 32 | # Rollout memory 33 | # https://skrl.readthedocs.io/en/latest/api/memories/random.html 34 | memory: 35 | class: RandomMemory 36 | memory_size: -1 # automatically determined (same as agent:rollouts) 37 | 38 | 39 | # PPO agent configuration (field names are from PPO_DEFAULT_CONFIG) 40 | # https://skrl.readthedocs.io/en/latest/api/agents/ppo.html 41 | agent: 42 | class: PPO 43 | rollouts: 32 44 | learning_epochs: 8 45 | mini_batches: 8 46 | discount_factor: 0.99 47 | lambda: 0.95 48 | learning_rate: 5.0e-04 49 | learning_rate_scheduler: KLAdaptiveLR 50 | learning_rate_scheduler_kwargs: 51 | kl_threshold: 0.008 52 | state_preprocessor: RunningStandardScaler 53 | state_preprocessor_kwargs: null 54 | value_preprocessor: RunningStandardScaler 55 | value_preprocessor_kwargs: null 56 | random_timesteps: 0 57 | learning_starts: 0 58 | grad_norm_clip: 1.0 59 | ratio_clip: 0.2 60 | value_clip: 0.2 61 | clip_predicted_values: True 62 | entropy_loss_scale: 0.0 63 | value_loss_scale: 2.0 64 | kl_threshold: 0.0 65 | rewards_shaper_scale: 0.1 66 | time_limit_bootstrap: False 67 | # logging and checkpoint 68 | experiment: 69 | directory: "leatherback_direct" 70 | experiment_name: "" 71 | write_interval: auto 72 | checkpoint_interval: auto 73 | 74 | 75 | # Sequential trainer 76 | # https://skrl.readthedocs.io/en/latest/api/trainers/sequential.html 77 | trainer: 78 | class: SequentialTrainer 79 | timesteps: 9600 80 | environment_info: log 81 | -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/custom_assets/leatherback_simple_better.usd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Genozen/Leatherback_tutorial/df8b135cb7c0bb36260a7ca61162c080955381db/Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/custom_assets/leatherback_simple_better.usd -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/leatherback_env.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import torch 4 | from collections.abc import Sequence 5 | import isaaclab.sim as sim_utils 6 | from isaaclab.assets import Articulation, ArticulationCfg 7 | from isaaclab.envs import DirectRLEnv, DirectRLEnvCfg 8 | from isaaclab.scene import InteractiveSceneCfg 9 | from isaaclab.sim import SimulationCfg 10 | from isaaclab.sim.spawners.from_files import GroundPlaneCfg, spawn_ground_plane 11 | from isaaclab.utils import configclass 12 | from .waypoint import WAYPOINT_CFG 13 | from isaaclab_assets.robots.leatherback import LEATHERBACK_CFG 14 | from isaaclab.markers import VisualizationMarkers 15 | 16 | @configclass 17 | class LeatherbackEnvCfg(DirectRLEnvCfg): 18 | decimation = 4 19 | episode_length_s = 20.0 20 | action_space = 2 21 | observation_space = 8 22 | state_space = 0 23 | sim: SimulationCfg = SimulationCfg(dt=1 / 60, render_interval=decimation) 24 | robot_cfg: ArticulationCfg = LEATHERBACK_CFG.replace(prim_path="/World/envs/env_.*/Robot") 25 | waypoint_cfg = WAYPOINT_CFG 26 | 27 | throttle_dof_name = [ 28 | "Wheel__Knuckle__Front_Left", 29 | "Wheel__Knuckle__Front_Right", 30 | "Wheel__Upright__Rear_Right", 31 | "Wheel__Upright__Rear_Left" 32 | ] 33 | steering_dof_name = [ 34 | "Knuckle__Upright__Front_Right", 35 | "Knuckle__Upright__Front_Left", 36 | ] 37 | 38 | env_spacing = 32.0 39 | scene: InteractiveSceneCfg = InteractiveSceneCfg(num_envs=4096, env_spacing=env_spacing, replicate_physics=True) 40 | 41 | class LeatherbackEnv(DirectRLEnv): 42 | cfg: LeatherbackEnvCfg 43 | 44 | def __init__(self, cfg: LeatherbackEnvCfg, render_mode: str | None = None, **kwargs): 45 | super().__init__(cfg, render_mode, **kwargs) 46 | self._throttle_dof_idx, _ = self.leatherback.find_joints(self.cfg.throttle_dof_name) 47 | self._steering_dof_idx, _ = self.leatherback.find_joints(self.cfg.steering_dof_name) 48 | self._throttle_state = torch.zeros((self.num_envs,4), device=self.device, dtype=torch.float32) 49 | self._steering_state = torch.zeros((self.num_envs,2), device=self.device, dtype=torch.float32) 50 | self._goal_reached = torch.zeros((self.num_envs), device=self.device, dtype=torch.int32) 51 | self.task_completed = torch.zeros((self.num_envs), device=self.device, dtype=torch.bool) 52 | self._num_goals = 10 53 | self._target_positions = torch.zeros((self.num_envs, self._num_goals, 2), device=self.device, dtype=torch.float32) 54 | self._markers_pos = torch.zeros((self.num_envs, self._num_goals, 3), device=self.device, dtype=torch.float32) 55 | self.env_spacing = self.cfg.env_spacing 56 | self.course_length_coefficient = 2.5 57 | self.course_width_coefficient = 2.0 58 | self.position_tolerance = 0.15 59 | self.goal_reached_bonus = 10.0 60 | self.position_progress_weight = 1.0 61 | self.heading_coefficient = 0.25 62 | self.heading_progress_weight = 0.05 63 | self._target_index = torch.zeros((self.num_envs), device=self.device, dtype=torch.int32) 64 | 65 | def _setup_scene(self): 66 | # Create a large ground plane without grid 67 | spawn_ground_plane( 68 | prim_path="/World/ground", 69 | cfg=GroundPlaneCfg( 70 | size=(500.0, 500.0), # Much larger ground plane (500m x 500m) 71 | color=(0.2, 0.2, 0.2), # Dark gray color 72 | physics_material=sim_utils.RigidBodyMaterialCfg( 73 | friction_combine_mode="multiply", 74 | restitution_combine_mode="multiply", 75 | static_friction=1.0, 76 | dynamic_friction=1.0, 77 | restitution=0.0, 78 | ), 79 | ), 80 | ) 81 | 82 | # Setup rest of the scene 83 | self.leatherback = Articulation(self.cfg.robot_cfg) 84 | self.waypoints = VisualizationMarkers(self.cfg.waypoint_cfg) 85 | self.object_state = [] 86 | 87 | self.scene.clone_environments(copy_from_source=False) 88 | self.scene.filter_collisions(global_prim_paths=[]) 89 | self.scene.articulations["leatherback"] = self.leatherback 90 | 91 | # Add lighting 92 | light_cfg = sim_utils.DomeLightCfg(intensity=2000.0, color=(0.75, 0.75, 0.75)) 93 | light_cfg.func("/World/Light", light_cfg) 94 | 95 | def _pre_physics_step(self, actions: torch.Tensor) -> None: 96 | throttle_scale = 10 97 | throttle_max = 50 98 | steering_scale = 0.1 99 | steering_max = 0.75 100 | 101 | self._throttle_action = actions[:, 0].repeat_interleave(4).reshape((-1, 4)) * throttle_scale 102 | self.throttle_action = torch.clamp(self._throttle_action, -throttle_max, throttle_max) 103 | self._throttle_state = self._throttle_action 104 | 105 | self._steering_action = actions[:, 1].repeat_interleave(2).reshape((-1, 2)) * steering_scale 106 | self._steering_action = torch.clamp(self._steering_action, -steering_max, steering_max) 107 | self._steering_state = self._steering_action 108 | 109 | def _apply_action(self) -> None: 110 | self.leatherback.set_joint_velocity_target(self._throttle_action, joint_ids=self._throttle_dof_idx) 111 | self.leatherback.set_joint_position_target(self._steering_state, joint_ids=self._steering_dof_idx) 112 | 113 | def _get_observations(self) -> dict: 114 | current_target_positions = self._target_positions[self.leatherback._ALL_INDICES, self._target_index] 115 | self._position_error_vector = current_target_positions - self.leatherback.data.root_pos_w[:, :2] 116 | self._previous_position_error = self._position_error.clone() 117 | self._position_error = torch.norm(self._position_error_vector, dim=-1) 118 | 119 | heading = self.leatherback.data.heading_w 120 | target_heading_w = torch.atan2( 121 | self._target_positions[self.leatherback._ALL_INDICES, self._target_index, 1] - self.leatherback.data.root_link_pos_w[:, 1], 122 | self._target_positions[self.leatherback._ALL_INDICES, self._target_index, 0] - self.leatherback.data.root_link_pos_w[:, 0], 123 | ) 124 | self.target_heading_error = torch.atan2(torch.sin(target_heading_w - heading), torch.cos(target_heading_w - heading)) 125 | 126 | obs = torch.cat( 127 | ( 128 | self._position_error.unsqueeze(dim=1), 129 | torch.cos(self.target_heading_error).unsqueeze(dim=1), 130 | torch.sin(self.target_heading_error).unsqueeze(dim=1), 131 | self.leatherback.data.root_lin_vel_b[:, 0].unsqueeze(dim=1), 132 | self.leatherback.data.root_lin_vel_b[:, 1].unsqueeze(dim=1), 133 | self.leatherback.data.root_ang_vel_w[:, 2].unsqueeze(dim=1), 134 | self._throttle_state[:, 0].unsqueeze(dim=1), 135 | self._steering_state[:, 0].unsqueeze(dim=1), 136 | ), 137 | dim=-1, 138 | ) 139 | 140 | if torch.any(obs.isnan()): 141 | raise ValueError("Observations cannot be NAN") 142 | 143 | return {"policy": obs} 144 | 145 | def _get_rewards(self) -> torch.Tensor: 146 | position_progress_rew = self._previous_position_error - self._position_error 147 | target_heading_rew = torch.exp(-torch.abs(self.target_heading_error) / self.heading_coefficient) 148 | goal_reached = self._position_error < self.position_tolerance 149 | self._target_index = self._target_index + goal_reached 150 | self.task_completed = self._target_index > (self._num_goals -1) 151 | self._target_index = self._target_index % self._num_goals 152 | 153 | composite_reward = ( 154 | position_progress_rew * self.position_progress_weight + 155 | target_heading_rew * self.heading_progress_weight + 156 | goal_reached * self.goal_reached_bonus 157 | ) 158 | 159 | one_hot_encoded = torch.nn.functional.one_hot(self._target_index.long(), num_classes=self._num_goals) 160 | marker_indices = one_hot_encoded.view(-1).tolist() 161 | self.waypoints.visualize(marker_indices=marker_indices) 162 | 163 | if torch.any(composite_reward.isnan()): 164 | raise ValueError("Rewards cannot be NAN") 165 | 166 | return composite_reward 167 | 168 | def _get_dones(self) -> tuple[torch.Tensor, torch.Tensor]: 169 | task_failed = self.episode_length_buf > self.max_episode_length 170 | return task_failed, self.task_completed 171 | 172 | def _reset_idx(self, env_ids: Sequence[int] | None): 173 | if env_ids is None: 174 | env_ids = self.leatherback._ALL_INDICES 175 | super()._reset_idx(env_ids) 176 | 177 | num_reset = len(env_ids) 178 | default_state = self.leatherback.data.default_root_state[env_ids] 179 | leatherback_pose = default_state[:, :7] 180 | leatherback_velocities = default_state[:, 7:] 181 | joint_positions = self.leatherback.data.default_joint_pos[env_ids] 182 | joint_velocities = self.leatherback.data.default_joint_vel[env_ids] 183 | 184 | leatherback_pose[:, :3] += self.scene.env_origins[env_ids] 185 | leatherback_pose[:, 0] -= self.env_spacing / 2 186 | leatherback_pose[:, 1] += 2.0 * torch.rand((num_reset), dtype=torch.float32, device=self.device) * self.course_width_coefficient 187 | 188 | angles = torch.pi / 6.0 * torch.rand((num_reset), dtype=torch.float32, device=self.device) 189 | leatherback_pose[:, 3] = torch.cos(angles * 0.5) 190 | leatherback_pose[:, 6] = torch.sin(angles * 0.5) 191 | 192 | self.leatherback.write_root_pose_to_sim(leatherback_pose, env_ids) 193 | self.leatherback.write_root_velocity_to_sim(leatherback_velocities, env_ids) 194 | self.leatherback.write_joint_state_to_sim(joint_positions, joint_velocities, None, env_ids) 195 | 196 | self._target_positions[env_ids, :, :] = 0.0 197 | self._markers_pos[env_ids, :, :] = 0.0 198 | 199 | spacing = 2 / self._num_goals 200 | target_positions = torch.arange(-0.8, 1.1, spacing, device=self.device) * self.env_spacing / self.course_length_coefficient 201 | self._target_positions[env_ids, :len(target_positions), 0] = target_positions 202 | self._target_positions[env_ids, :, 1] = torch.rand((num_reset, self._num_goals), dtype=torch.float32, device=self.device) + self.course_length_coefficient 203 | self._target_positions[env_ids, :] += self.scene.env_origins[env_ids, :2].unsqueeze(1) 204 | 205 | self._target_index[env_ids] = 0 206 | self._markers_pos[env_ids, :, :2] = self._target_positions[env_ids] 207 | visualize_pos = self._markers_pos.view(-1, 3) 208 | self.waypoints.visualize(translations=visualize_pos) 209 | 210 | current_target_positions = self._target_positions[self.leatherback._ALL_INDICES, self._target_index] 211 | self._position_error_vector = current_target_positions[:, :2] - self.leatherback.data.root_pos_w[:, :2] 212 | self._position_error = torch.norm(self._position_error_vector, dim=-1) 213 | self._previous_position_error = self._position_error.clone() 214 | 215 | heading = self.leatherback.data.heading_w[:] 216 | target_heading_w = torch.atan2( 217 | self._target_positions[:, 0, 1] - self.leatherback.data.root_pos_w[:, 1], 218 | self._target_positions[:, 0, 0] - self.leatherback.data.root_pos_w[:, 0], 219 | ) 220 | self._heading_error = torch.atan2(torch.sin(target_heading_w - heading), torch.cos(target_heading_w - heading)) 221 | self._previous_heading_error = self._heading_error.clone() -------------------------------------------------------------------------------- /Leatherback_Project/isaaclab_tasks/isaaclab_tasks/direct/leatherback/waypoint.py: -------------------------------------------------------------------------------- 1 | import isaaclab.sim as sim_utils 2 | from isaaclab.markers import VisualizationMarkersCfg 3 | 4 | ## 5 | # configuration 6 | ## 7 | 8 | WAYPOINT_CFG = VisualizationMarkersCfg( 9 | prim_path="/World/Visuals/Cones", 10 | markers={ 11 | "marker0": sim_utils.SphereCfg( # Current target (red) 12 | radius=0.1, 13 | visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(1.0, 0.0, 0.0)), 14 | ), 15 | "marker1": sim_utils.SphereCfg( # Future targets (green) 16 | radius=0.1, 17 | visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.0, 1.0, 0.0)), 18 | ), 19 | } 20 | ) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Leatherback Tutorial for Isaac Lab Study Group 2 | ``` 3 | Credit: 4 | Strainflow (Eric) 5 | Antoine Richard: https://github.com/AntoineRichard/ 6 | Papachuck: https://github.com/renanmb 7 | 8 | Maintainer: 9 | Genozen https://github.com/Genozen 10 | 11 | Licensing: BSD-3-Clause 12 | 13 | 03/14/2025 14 | ``` 15 | 16 | 17 | ## Documentation 18 | https://lycheeai.notion.site/Leatherback-Community-Project-1b828763942b818c903be4648e53f23d?pvs=4 19 | 20 | Specifications:
21 | `Isaac Sim = 4.5.0`
22 | `Isaac Lab = 2.0`
23 | `CUDA = 12.`
24 | `Linux/Windows`
25 | For more specifications checkout: https://isaac-sim.github.io/IsaacLab/main/source/setup/installation/pip_installation.html#
26 | 27 | 28 | ## Quick Commands 29 | Linux 30 | ``` 31 | # training 32 | python scripts/reinforcement_learning/skrl/train.py --task Isaac-Leatherback-Direct-v0 --num_envs 32 33 | python scripts/reinforcement_learning/skrl/train.py --task Isaac-Leatherback-Direct-v0 --num_envs 4096 --headless 34 | 35 | # playing 36 | python scripts/reinforcement_learning/skrl/play.py --task Isaac-Leatherback-Direct-v0 --num_envs 32 37 | ``` 38 | 39 | Windows 40 | ``` 41 | # training 42 | python scripts\reinforcement_learning\skrl\train.py --task Isaac-Leatherback-Direct-v0 --num_envs 32 43 | python scripts\reinforcement_learning\skrl\train.py --task Isaac-Leatherback-Direct-v0 --num_envs 4096 --headless 44 | 45 | # playing 46 | python scripts\reinforcement_learning\skrl\play.py --task Isaac-Leatherback-Direct-v0 --num_envs 32 47 | ``` 48 | --------------------------------------------------------------------------------