diff --git a/docs/source/_static/css/environment-browser.js b/docs/source/_static/css/environment-browser.js index 255b9ed34a42..98977f8ad7fb 100644 --- a/docs/source/_static/css/environment-browser.js +++ b/docs/source/_static/css/environment-browser.js @@ -21,13 +21,13 @@ ["Isaac-Fourbar-Pole-Swingup", "rsl_rl", "newton_kamino", "", ""], ["Isaac-Humanoid", "rl_games,rsl_rl,skrl,sb3", "isaacsim_physx,newton_mjwarp", "", ""], ["Isaac-Humanoid-Direct", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", ""], - ["Isaac-Lift-Cloth-Franka", "rsl_rl", "newton_mjwarp_vbd_proxy,ovphysx", "", ""], - ["Isaac-Lift-Cloth-Franka-Camera", "rsl_rl", "newton_mjwarp_vbd_proxy,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", ""], + ["Isaac-Lift-Cloth-Franka", "rsl_rl", "newton_mjwarp_vbd_proxy", "", "ik,joint"], + ["Isaac-Lift-Cloth-Franka-Camera", "rsl_rl", "newton_mjwarp_vbd_proxy", "isaacsim_rtx,newton_renderer,ovrtx", "ik,joint"], ["Isaac-Lift-Franka", "rsl_rl", "isaacsim_physx,newton_mjwarp", "", "cube,shapes"], ["Isaac-Lift-KukaAllegro", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "cube,shapes"], ["Isaac-Lift-KukaAllegro-Camera", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", "albedo128,albedo256,albedo64,cube,depth128,depth256,depth64,duo_camera,raycaster_depth128,raycaster_depth256,raycaster_depth64,rgb128,rgb256,rgb64,semantic_segmentation128,semantic_segmentation256,semantic_segmentation64,shapes,simple_shading_constant_diffuse128,simple_shading_constant_diffuse256,simple_shading_constant_diffuse64,simple_shading_diffuse_mdl128,simple_shading_diffuse_mdl256,simple_shading_diffuse_mdl64,simple_shading_full_mdl128,simple_shading_full_mdl256,simple_shading_full_mdl64,single_camera"], - ["Isaac-Lift-Soft-Franka", "rsl_rl", "isaacsim_physx,newton_mjwarp_vbd_proxy,ovphysx", "", ""], - ["Isaac-Lift-Soft-Franka-Camera", "rsl_rl", "isaacsim_physx,newton_mjwarp_vbd_proxy,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", ""], + ["Isaac-Lift-Soft-Franka", "rsl_rl", "isaacsim_physx,newton_mjwarp_vbd_proxy", "", "ik,joint"], + ["Isaac-Lift-Soft-Franka-Camera", "rsl_rl", "isaacsim_physx,newton_mjwarp_vbd_proxy", "isaacsim_rtx,newton_renderer,ovrtx", "ik,joint"], ["Isaac-Open-Drawer-Franka", "rl_games,rsl_rl,skrl", "", "", ""], ["Isaac-Open-Drawer-Franka-Direct", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", ""], ["Isaac-Pendulum-Direct", "rl_games,skrl", "", "", ""], @@ -150,7 +150,7 @@ populateSelect(fields.physics, task.physics, [fields.physics.value, "newton_mjwarp", "isaacsim_physx", "ovphysx", "newton_kamino"]); const preferredRenderer = fields.physics.value.startsWith("newton") ? "newton_renderer" : "isaacsim_rtx"; populateSelect(fields.renderer, task.renderer, [fields.renderer.value, preferredRenderer, "ovrtx"]); - populateSelect(fields.presets, task.presets, [fields.presets.value, "rgb", "cube", "single_camera"]); + populateSelect(fields.presets, task.presets, [fields.presets.value, "joint", "ik", "rgb", "cube", "single_camera"]); }; const currentCommand = () => { diff --git a/docs/source/overview/core-concepts/physical-backends/newton/using-vbd-solver.rst b/docs/source/overview/core-concepts/physical-backends/newton/using-vbd-solver.rst index 6f5b46bcb912..a5e302b1a91c 100644 --- a/docs/source/overview/core-concepts/physical-backends/newton/using-vbd-solver.rst +++ b/docs/source/overview/core-concepts/physical-backends/newton/using-vbd-solver.rst @@ -188,6 +188,8 @@ Core Solve - Description * - ``iterations`` - Default: ``10``. Number of VBD iterations per substep. Increasing this value improves deformation and contact convergence, especially for stiff materials or rigid gripper contacts, but increases runtime. + * - ``rigid_body_particle_contact_buffer_size`` + - Default: ``256``. Per-body capacity for particle, edge, and face soft contacts. Increase it if Newton reports a per-body contact buffer overflow. * - ``integrate_with_external_rigid_solver`` - Default: ``False``. Set to ``True`` only when a manual manager integrates rigid bodies in the shared model. Proxy-coupled entries use partitioned model views and leave this ``False``. @@ -272,7 +274,7 @@ The core Franka soft-body task demonstrates the proxy configuration: .. literalinclude:: ../../../../../../source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py :language: python :start-at: newton_mjwarp_vbd_proxy: NewtonCfg - :end-before: isaacsim_physx: PhysxCfg = PhysxCfg() + :end-before: isaacsim_physx: PhysxCfg = PhysxCfg( :dedent: 4 What the selectors do: @@ -298,6 +300,10 @@ What the selectors do: VBD. Only the ``panda_hand`` and the two fingers are exposed as proxies, so VBD sees three rigid proxies regardless of the number of arm links. +Full-surface rigid-soft contact includes edge and triangle-interior contacts. +Analytic proxy shapes support it directly, while mesh and convex proxy shapes +require a volume SDF. + .. important:: The coupler currently rejects diff --git a/docs/source/overview/environments.rst b/docs/source/overview/environments.rst index 090a963d50a8..0564271a6584 100644 --- a/docs/source/overview/environments.rst +++ b/docs/source/overview/environments.rst @@ -247,24 +247,24 @@ for the lift-cube environment: | |lift-cube| | |lift-cube-link| | Pick a cube and bring it to a sampled target position with the Franka robot | | +-------------------------+------------------------------+-----------------------------------------------------------------------------+-----------------------------------------+ | |lift-soft-franka| | |lift-soft-franka-link| | Pick a deformable soft body and bring it to a sampled target position with | **physics=** ``isaacsim_physx``, | - | | | the Franka robot | ``newton_mjwarp_vbd_proxy``, | - | | | | ``ovphysx`` | + | | | the Franka robot | ``newton_mjwarp_vbd_proxy`` | + | | | | **presets=** ``ik``, ``joint`` | +-------------------------+------------------------------+-----------------------------------------------------------------------------+-----------------------------------------+ | |lift-soft-franka| | |lift-soft-franka-cam-link| | Camera (vision) variant of the soft-body lift task using RGB observations | **physics=** ``isaacsim_physx``, | - | | | | ``newton_mjwarp_vbd_proxy``, | - | | | | ``ovphysx`` | + | | | | ``newton_mjwarp_vbd_proxy`` | | | | | **renderer=** ``isaacsim_rtx``, | | | | | ``newton_renderer``, ``ovrtx`` | + | | | | **presets=** ``ik``, ``joint`` | +-------------------------+------------------------------+-----------------------------------------------------------------------------+-----------------------------------------+ | |lift-cloth-franka| | |lift-cloth-franka-link| | Lift a deformable cloth from a table with the Franka robot | **physics=** | - | | | | ``newton_mjwarp_vbd_proxy``, | - | | | | ``ovphysx`` | + | | | | ``newton_mjwarp_vbd_proxy`` | + | | | | **presets=** ``ik``, ``joint`` | +-------------------------+------------------------------+-----------------------------------------------------------------------------+-----------------------------------------+ | |lift-cloth-franka| | |lift-cloth-franka-cam-link| | Camera (vision) variant of the cloth lift task using RGB observations | **physics=** | - | | | | ``newton_mjwarp_vbd_proxy``, | - | | | | ``ovphysx`` | + | | | | ``newton_mjwarp_vbd_proxy`` | | | | | **renderer=** ``isaacsim_rtx``, | | | | | ``newton_renderer``, ``ovrtx`` | + | | | | **presets=** ``ik``, ``joint`` | +-------------------------+------------------------------+-----------------------------------------------------------------------------+-----------------------------------------+ | |stack-cube| | |stack-cube-link| | Stack three cubes (bottom to top: blue, red, green) with the Franka robot. | **physics=** ``isaacsim_physx``, | | | | Blueprint env used for the NVIDIA Isaac GR00T blueprint for synthetic | ``newton_mjwarp`` | @@ -1113,12 +1113,14 @@ including disabling runtime perturbations used for training. * - Isaac-Lift-Cloth-Franka - Manager Based - **rsl_rl** (PPO) - - **physics=** ``newton_mjwarp_vbd_proxy``, ``ovphysx`` + - | **physics=** ``newton_mjwarp_vbd_proxy`` + | **presets=** ``ik``, ``joint`` * - Isaac-Lift-Cloth-Franka-Camera - Manager Based - **rsl_rl** (PPO) - - | **physics=** ``newton_mjwarp_vbd_proxy``, ``ovphysx`` + - | **physics=** ``newton_mjwarp_vbd_proxy`` | **renderer=** ``isaacsim_rtx``, ``newton_renderer``, ``ovrtx`` + | **presets=** ``ik``, ``joint`` * - Isaac-Lift-Franka - Manager Based - **rsl_rl** (PPO) @@ -1138,12 +1140,14 @@ including disabling runtime perturbations used for training. * - Isaac-Lift-Soft-Franka - Manager Based - **rsl_rl** (PPO) - - **physics=** ``isaacsim_physx``, ``newton_mjwarp_vbd_proxy``, ``ovphysx`` + - | **physics=** ``isaacsim_physx``, ``newton_mjwarp_vbd_proxy`` + | **presets=** ``ik``, ``joint`` * - Isaac-Lift-Soft-Franka-Camera - Manager Based - **rsl_rl** (PPO) - - | **physics=** ``isaacsim_physx``, ``newton_mjwarp_vbd_proxy``, ``ovphysx`` + - | **physics=** ``isaacsim_physx``, ``newton_mjwarp_vbd_proxy`` | **renderer=** ``isaacsim_rtx``, ``newton_renderer``, ``ovrtx`` + | **presets=** ``ik``, ``joint`` * - Isaac-Open-Drawer-Franka - Manager Based - **rl_games** (PPO), **rsl_rl** (PPO), **skrl** (PPO) diff --git a/scripts/environments/state_machine/lift_franka_soft.py b/scripts/environments/state_machine/lift_franka_soft.py index 814fe6d9a140..7a03c5e49230 100644 --- a/scripts/environments/state_machine/lift_franka_soft.py +++ b/scripts/environments/state_machine/lift_franka_soft.py @@ -11,60 +11,40 @@ .. code-block:: bash + # Kitless run with the Newton OpenGL viewer (default). uv run python scripts/environments/state_machine/lift_franka_soft.py -""" + # Headless. + uv run python scripts/environments/state_machine/lift_franka_soft.py --viz none -"""Launch Omniverse Toolkit first.""" +""" import argparse - -from isaaclab.app import AppLauncher - -# add argparse arguments -parser = argparse.ArgumentParser(description="Pick and lift a deformable with a robotic arm.") -parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") -parser.add_argument("--task", type=str, default="Isaac-Lift-Soft-Franka", help="The task to run.") -parser.add_argument("--video", action="store_true", default=False, help="Record a video of the rollout.") -parser.add_argument("--video_length", type=int, default=500, help="Length of the recorded video (in env steps).") -parser.add_argument( - "--video_folder", - type=str, - default="videos/lift_franka_soft", - help="Directory to write recorded videos into.", -) -# append AppLauncher cli args -AppLauncher.add_app_launcher_args(parser) -# parse the arguments -args_cli = parser.parse_args() - -if args_cli.video: - args_cli.enable_cameras = True - -# launch omniverse app -app_launcher = AppLauncher(args_cli) -simulation_app = app_launcher.app - -# disable metrics assembler due to scene graph instancing -from isaaclab.sim.utils import disable_extension - -disable_extension("omni.usd.metrics.assembler.ui") - -"""Rest everything else.""" - -import os +import sys from collections.abc import Sequence import gymnasium as gym import torch import warp as wp +from isaaclab.app import add_launcher_args, launch_simulation from isaaclab.assets.deformable_object.deformable_object_data import DeformableObjectData -from isaaclab.envs.utils.video_recorder_cfg import VideoRecorderCfg from isaaclab.visualizers import VisualizerCfg import isaaclab_tasks # noqa: F401 -from isaaclab_tasks.utils.parse_cfg import parse_env_cfg +from isaaclab_tasks.core.lift.config.franka_soft.franka_soft_env_cfg import ActionsCfg +from isaaclab_tasks.utils import resolve_task_config, setup_preset_cli + +# add argparse arguments +parser = argparse.ArgumentParser(description="Pick and lift a deformable with a robotic arm.") +parser.add_argument("--num_envs", type=int, default=1, help="Number of environments to simulate.") +parser.add_argument("--num_steps", type=int, default=1000, help="Number of environment steps to run.") +parser.add_argument("--task", type=str, default="Isaac-Lift-Soft-Franka", help="The task to run.") +add_launcher_args(parser) +# the task runs on Newton, so default to the kitless viewer +parser.set_defaults(visualizer=["newton"]) +args_cli, hydra_args = setup_preset_cli(parser) +sys.argv = [sys.argv[0]] + hydra_args # initialize warp wp.init() @@ -186,7 +166,7 @@ class PickSmWaitTime: REST = wp.constant(0.2) APPROACH_ABOVE_OBJECT = wp.constant(1.0) - APPROACH_OBJECT = wp.constant(1.0) + APPROACH_OBJECT = wp.constant(1.5) GRASP_OBJECT = wp.constant(1.0) LIFT_OBJECT = wp.constant(1.5) OPEN_GRIPPER = wp.constant(0.0) @@ -281,88 +261,77 @@ def compute(self, ee_pose: torch.Tensor, object_pose: torch.Tensor, des_object_p def main(): - # parse configuration - env_cfg = parse_env_cfg( - args_cli.task, - device=args_cli.device, - num_envs=args_cli.num_envs, - ) - env_cfg.sim.default_visualizer_cfg = VisualizerCfg(eye=(2.1, 1.0, 1.3)) - - # attach internal video recorder when --video is requested - if args_cli.video: - video_folder = os.path.abspath(args_cli.video_folder) - env_cfg.video_recorders = [ - VideoRecorderCfg( - source="visualizer", - output_dir=video_folder, - video_length=args_cli.video_length, - video_interval=0, - ) - ] - print(f"[INFO] Recording video to {video_folder} (length={args_cli.video_length} steps)") - - env = gym.make(args_cli.task, cfg=env_cfg) - - # reset environment at start - env.reset() - - # create action buffers (position + quaternion) - actions = torch.zeros(env.unwrapped.action_space.shape, device=env.unwrapped.device) - actions[:, 3] = 1.0 - # desired rotation after grasping - desired_orientation = torch.zeros((env.unwrapped.num_envs, 4), device=env.unwrapped.device) - desired_orientation[:, 0] = 1.0 - - # Top-down approach: identity quaternion (wxyz, w=1) aligns panda_hand with the Franka root, - # giving the canonical top-down grasp pose. The bar lies along world-X, so the gripper - # closes across its short side without any wrist twist. - object_grasp_orientation = torch.zeros((env.unwrapped.num_envs, 4), device=env.unwrapped.device) - object_grasp_orientation[:, 0] = 1.0 - # Grasp at the deformable's centre of mass. - object_local_grasp_position = torch.tensor([0.0, 0.0, 0.0], device=env.unwrapped.device) - - # create state machine - pick_sm = PickAndLiftSm(env_cfg.sim.dt * env_cfg.decimation, env.unwrapped.num_envs, env.unwrapped.device) - - while simulation_app.is_running(): - # run everything in inference mode - with torch.inference_mode(): - # step environment - dones = env.step(actions)[-2] - - # observations - # -- end-effector frame - ee_frame_sensor = env.unwrapped.scene["ee_frame"] - tcp_rest_position = ( - ee_frame_sensor.data.target_pos_w.torch[..., 0, :].clone() - env.unwrapped.scene.env_origins - ) - tcp_rest_orientation = ee_frame_sensor.data.target_quat_w.torch[..., 0, :].clone() - # -- object frame - object_data: DeformableObjectData = env.unwrapped.scene["deformable"].data - object_position = object_data.root_pos_w.torch - env.unwrapped.scene.env_origins - object_position += object_local_grasp_position - - # -- target object frame - desired_position = env.unwrapped.command_manager.get_command("deformable_pose")[..., :3] - - # advance state machine - actions = pick_sm.compute( - torch.cat([tcp_rest_position, tcp_rest_orientation], dim=-1), - torch.cat([object_position, object_grasp_orientation], dim=-1), - torch.cat([desired_position, desired_orientation], dim=-1), - ) - - # reset state machine - if dones.any(): - pick_sm.reset_idx(dones.nonzero(as_tuple=False).squeeze(-1)) - - # close the environment - env.close() + # parse configuration via Hydra, so presets can be selected on the CLI (e.g. presets=isaacsim_physx) + env_cfg, _ = resolve_task_config(args_cli.task, "") + env_cfg.sim.device = args_cli.device + env_cfg.scene.num_envs = args_cli.num_envs + # the state machine emits absolute end-effector poses, so pick the IK action preset; the env + # defaults to relative joint targets, which RL trains on. + env_cfg.actions = ActionsCfg().ik + env_cfg.viewer.eye = (1.3, 0.6, 0.5) + env_cfg.viewer.lookat = (0.5, 0.0, 0.05) + env_cfg.sim.default_visualizer_cfg = VisualizerCfg(eye=env_cfg.viewer.eye, lookat=env_cfg.viewer.lookat) + + with launch_simulation(env_cfg, args_cli): + env = gym.make(args_cli.task, cfg=env_cfg) + + # reset environment at start + env.reset() + + # create action buffers (position + quaternion) + actions = torch.zeros(env.unwrapped.action_space.shape, device=env.unwrapped.device) + actions[:, 3] = 1.0 + # desired rotation after grasping + desired_orientation = torch.zeros((env.unwrapped.num_envs, 4), device=env.unwrapped.device) + desired_orientation[:, 0] = 1.0 + + # Top-down approach: identity quaternion (wxyz, w=1) aligns panda_hand with the Franka root, + # giving the canonical top-down grasp pose. The bar lies along world-X, so the gripper + # closes across its short side without any wrist twist. + object_grasp_orientation = torch.zeros((env.unwrapped.num_envs, 4), device=env.unwrapped.device) + object_grasp_orientation[:, 0] = 1.0 + # Grasp 1 cm below the deformable's centre of mass, so the fingers close around its lower half. + object_local_grasp_position = torch.tensor([0.0, 0.0, -0.01], device=env.unwrapped.device) + + # create state machine + pick_sm = PickAndLiftSm(env_cfg.sim.dt * env_cfg.decimation, env.unwrapped.num_envs, env.unwrapped.device) + + for _ in range(args_cli.num_steps): + # run everything in inference mode + with torch.inference_mode(): + # step environment + _, _, terminated, time_outs, _ = env.step(actions) + dones = terminated | time_outs + + # reset state machine + if dones.any(): + pick_sm.reset_idx(dones.nonzero(as_tuple=False).squeeze(-1)) + + # observations + # -- end-effector frame + ee_frame_sensor = env.unwrapped.scene["ee_frame"] + tcp_rest_position = ( + ee_frame_sensor.data.target_pos_w.torch[..., 0, :].clone() - env.unwrapped.scene.env_origins + ) + tcp_rest_orientation = ee_frame_sensor.data.target_quat_w.torch[..., 0, :].clone() + # -- object frame + object_data: DeformableObjectData = env.unwrapped.scene["deformable"].data + object_position = object_data.root_pos_w.torch - env.unwrapped.scene.env_origins + object_position += object_local_grasp_position + + # -- target object frame + desired_position = env.unwrapped.command_manager.get_command("deformable_pose")[..., :3] + + # advance state machine + actions = pick_sm.compute( + torch.cat([tcp_rest_position, tcp_rest_orientation], dim=-1), + torch.cat([object_position, object_grasp_orientation], dim=-1), + torch.cat([desired_position, desired_orientation], dim=-1), + ) + + # close the environment + env.close() if __name__ == "__main__": - # run the main function main() - # close sim app - simulation_app.close() diff --git a/source/isaaclab/changelog.d/mym-lift-soft.rst b/source/isaaclab/changelog.d/mym-lift-soft.rst new file mode 100644 index 000000000000..d8ab17c3bc13 --- /dev/null +++ b/source/isaaclab/changelog.d/mym-lift-soft.rst @@ -0,0 +1,6 @@ +Added +^^^^^ + +* Added :class:`~isaaclab.sim.spawners.meshes.MeshRectangleCfg` to spawn 2D surface deformable meshes. +* Added :attr:`~isaaclab.sim.spawners.meshes.MeshCuboidCfg.edge_refinement` to control cuboid surface + mesh refinement. diff --git a/source/isaaclab/isaaclab/sim/spawners/meshes/meshes.py b/source/isaaclab/isaaclab/sim/spawners/meshes/meshes.py index 22e851b6aed3..38876a1378eb 100644 --- a/source/isaaclab/isaaclab/sim/spawners/meshes/meshes.py +++ b/source/isaaclab/isaaclab/sim/spawners/meshes/meshes.py @@ -105,9 +105,17 @@ def spawn_mesh_cuboid( Raises: ValueError: If a prim already exists at the given path. + ValueError: If :attr:`~isaaclab.sim.MeshCuboidCfg.edge_refinement` is less than ``1.0``. """ + if cfg.edge_refinement < 1.0: + raise ValueError(f"Cuboid mesh edge refinement must be at least 1.0, got {cfg.edge_refinement}.") + # create a trimesh box box = trimesh.creation.box(cfg.size) + if cfg.edge_refinement > 1.0: + max_edge = float(np.linalg.norm(box.bounding_box.extents)) / cfg.edge_refinement + vertices, faces = trimesh.remesh.subdivide_to_size(box.vertices, box.faces, max_edge=max_edge) + box = trimesh.Trimesh(vertices=vertices, faces=faces, process=False) # obtain stage handle stage = get_current_stage() diff --git a/source/isaaclab/isaaclab/sim/spawners/meshes/meshes_cfg.py b/source/isaaclab/isaaclab/sim/spawners/meshes/meshes_cfg.py index bc7955c675b6..ba3152dc31f8 100644 --- a/source/isaaclab/isaaclab/sim/spawners/meshes/meshes_cfg.py +++ b/source/isaaclab/isaaclab/sim/spawners/meshes/meshes_cfg.py @@ -99,7 +99,14 @@ class MeshCuboidCfg(MeshCfg): func: Callable | str = "{DIR}.meshes:spawn_mesh_cuboid" size: tuple[float, float, float] = MISSING - """Size of the cuboid (in m).""" + """Size of the cuboid [m].""" + + edge_refinement: float = 1.0 + """Surface edge refinement factor relative to the bounding-box diagonal. + + The maximum edge length is the diagonal divided by this value. The factor must be at least + ``1.0``. Defaults to ``1.0``, which leaves the base mesh unchanged. + """ @configclass diff --git a/source/isaaclab/test/sim/test_spawn_meshes.py b/source/isaaclab/test/sim/test_spawn_meshes.py index a9ad5158c2f3..8dd2f5f35f6c 100644 --- a/source/isaaclab/test/sim/test_spawn_meshes.py +++ b/source/isaaclab/test/sim/test_spawn_meshes.py @@ -13,6 +13,7 @@ """Rest everything follows.""" +import numpy as np import pytest import isaaclab.sim as sim_utils @@ -102,6 +103,25 @@ def test_spawn_cuboid(sim): # Check properties prim = sim.stage.GetPrimAtPath("/World/Cube/geometry/mesh") assert prim.GetPrimTypeInfo().GetTypeName() == "Mesh" + assert len(prim.GetAttribute("points").Get()) == 8 + assert len(prim.GetAttribute("faceVertexCounts").Get()) == 12 + + +def test_spawn_cuboid_with_edge_refinement(sim): + """Test cuboid surface edge refinement.""" + size = (1.0, 2.0, 3.0) + edge_refinement = 3.0 + cfg = sim_utils.MeshCuboidCfg(size=size, edge_refinement=edge_refinement) + cfg.func("/World/RefinedCube", cfg) + + prim = sim.stage.GetPrimAtPath("/World/RefinedCube/geometry/mesh") + points = np.asarray(prim.GetAttribute("points").Get()) + faces = np.asarray(prim.GetAttribute("faceVertexIndices").Get()).reshape(-1, 3) + edges = points[faces[:, [0, 1, 1, 2, 2, 0]]].reshape(-1, 2, 3) + + assert len(points) > 8 + assert len(faces) > 12 + assert np.linalg.norm(edges[:, 0] - edges[:, 1], axis=1).max() <= np.linalg.norm(size) / edge_refinement def test_spawn_sphere(sim): diff --git a/source/isaaclab_contrib/changelog.d/mym-lift-soft.minor.rst b/source/isaaclab_contrib/changelog.d/mym-lift-soft.minor.rst new file mode 100644 index 000000000000..c1f1ab4b3c78 --- /dev/null +++ b/source/isaaclab_contrib/changelog.d/mym-lift-soft.minor.rst @@ -0,0 +1,6 @@ +Added +^^^^^ + +* Added :attr:`~isaaclab_contrib.deformable.VBDSolverCfg.rigid_body_particle_contact_buffer_size` + to size each body's particle, edge, and face soft-contact list. Contacts past the buffer are + dropped from the body's reaction list, which can inject energy. diff --git a/source/isaaclab_contrib/isaaclab_contrib/deformable/newton_manager_cfg.py b/source/isaaclab_contrib/isaaclab_contrib/deformable/newton_manager_cfg.py index 70d04ed2f7fd..7bcbbe1c5b50 100644 --- a/source/isaaclab_contrib/isaaclab_contrib/deformable/newton_manager_cfg.py +++ b/source/isaaclab_contrib/isaaclab_contrib/deformable/newton_manager_cfg.py @@ -118,6 +118,16 @@ class VBDSolverCfg(NewtonModelSolverCfg): rigid_contact_k_start: float = 1.0e2 """Initial stiffness seed for all rigid body contacts [N/m].""" + rigid_body_particle_contact_buffer_size: int = 256 + """Per-body capacity of the particle, edge, and face soft-contact list. + + Contacts past this count are dropped from the body's reaction list: the particles are still + pushed but the body does not recoil, injecting energy. Newton prints ``Per-body particle + contact buffer overflowed N > size`` on overflow; raise this above the observed ``N``. Only + used when VBD integrates the rigid bodies itself, i.e. + :attr:`integrate_with_external_rigid_solver` is ``False``. + """ + @configclass class CoupledMJWarpVBDSolverCfg(NewtonModelSolverCfg): diff --git a/source/isaaclab_newton/changelog.d/mym-lift-soft.minor.rst b/source/isaaclab_newton/changelog.d/mym-lift-soft.minor.rst new file mode 100644 index 000000000000..23ca66ec52b0 --- /dev/null +++ b/source/isaaclab_newton/changelog.d/mym-lift-soft.minor.rst @@ -0,0 +1,11 @@ +Added +^^^^^ + +* Added :attr:`~isaaclab_newton.physics.NewtonCollisionPipelineCfg.enable_rigid_soft_full_surface_contact` + to generate edge and triangle-interior soft contacts against full-surface-capable rigid colliders. + Analytic shapes work directly; mesh and convex colliders require a volume SDF. + +Fixed +^^^^^ + +* Fixed articulation target bindings for the Newton 1.5 control API. diff --git a/source/isaaclab_newton/isaaclab_newton/physics/newton_collision_cfg.py b/source/isaaclab_newton/isaaclab_newton/physics/newton_collision_cfg.py index 9e75d3153308..c24f7e0d536e 100644 --- a/source/isaaclab_newton/isaaclab_newton/physics/newton_collision_cfg.py +++ b/source/isaaclab_newton/isaaclab_newton/physics/newton_collision_cfg.py @@ -150,6 +150,17 @@ class NewtonCollisionPipelineCfg: Defaults to ``0.01`` (same as Newton's default). """ + enable_rigid_soft_full_surface_contact: bool = False + """Whether to generate soft contacts against full-surface-capable rigid colliders. + + When ``True``, Newton adds edge and triangle-interior soft contacts (in addition to the + per-vertex particle contacts) so rigid features that pass between soft vertices are caught. + Analytic shapes (boxes, capsules, spheres) are full-surface-capable without an SDF; any + participating mesh/convex collider must carry a volume SDF. + + Defaults to ``False`` (same as Newton's default). + """ + requires_grad: bool | None = None """Whether to enable gradient computation for collision. diff --git a/source/isaaclab_newton/isaaclab_newton/physics/newton_manager_cfg.py b/source/isaaclab_newton/isaaclab_newton/physics/newton_manager_cfg.py index acba9fa64adc..8249d04bd096 100644 --- a/source/isaaclab_newton/isaaclab_newton/physics/newton_manager_cfg.py +++ b/source/isaaclab_newton/isaaclab_newton/physics/newton_manager_cfg.py @@ -169,6 +169,13 @@ class NewtonCfg(PhysicsCfg): :class:`NewtonShapeCfg` for the declared fields. """ + simplify_meshes: bool = True + """Whether Newton replication simplifies mesh colliders to convex hulls. + + Keep this enabled for most rigid-body scenes. Disable it when exact triangle + meshes are intentional, for example thin or hollow MPM colliders. + """ + load_visual_shapes: bool | None = None """Whether Newton replication imports visual-only geometry from USD. diff --git a/source/isaaclab_ovphysx/changelog.d/mym-lift-soft.skip b/source/isaaclab_ovphysx/changelog.d/mym-lift-soft.skip new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/source/isaaclab_ovphysx/test/tasks/test_lift_franka_soft_deformable.py b/source/isaaclab_ovphysx/test/tasks/test_lift_franka_soft_deformable.py deleted file mode 100644 index acde2b54cc9a..000000000000 --- a/source/isaaclab_ovphysx/test/tasks/test_lift_franka_soft_deformable.py +++ /dev/null @@ -1,145 +0,0 @@ -# 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 - -"""Task-level smoke tests for OVPhysX volume and surface deformables.""" - -from __future__ import annotations - -import gymnasium as gym -import ovphysx.types # noqa: F401 -import pytest -import torch -import warp as wp -from isaaclab_ovphysx import tensor_types as TT # noqa: E402 - -from isaaclab.sim import SimulationContext # noqa: E402 - -import isaaclab_tasks # noqa: F401, E402 -from isaaclab_tasks.core.lift.config.franka_soft.franka_cloth_env_cfg import FrankaClothEnvCfg # noqa: E402 -from isaaclab_tasks.core.lift.config.franka_soft.franka_soft_env_cfg import FrankaSoftEnvCfg # noqa: E402 -from isaaclab_tasks.utils.hydra import resolve_presets # noqa: E402 - -wp.init() - -_NUM_ENVS = 2 - - -def _configure_deformable_lift_ovphysx_smoke( - cfg_cls: type[FrankaSoftEnvCfg], -) -> FrankaSoftEnvCfg: - """Build a minimal multi-environment OvPhysX deformable-lift task.""" - cfg = resolve_presets(cfg_cls(), ("ovphysx",)) - cfg.sim.device = "cuda:0" - cfg.scene.num_envs = _NUM_ENVS - - # Keep these smokes focused on the stock task deformable and shared MDP data - # path while avoiding unrelated external props. - cfg.scene.table = None - cfg.scene.sky_light = None - cfg.scene.ground = None - cfg.commands.deformable_pose.debug_vis = False - cfg.ui_window_class_type = None - return cfg - - -@pytest.mark.skipif(not torch.cuda.is_available(), reason="OVPhysX deformables require CUDA") -@pytest.mark.isaacsim_ci -def test_lift_franka_soft_task_reads_and_steps_volume_deformable(): - """Reset and step finite soft-lift observations and deformable state.""" - env = None - try: - cfg = _configure_deformable_lift_ovphysx_smoke(FrankaSoftEnvCfg) - env = gym.make("Isaac-Lift-Soft-Franka", cfg=cfg) - env.unwrapped.sim._app_control_on_stop_handle = None - - obs, _ = env.reset() - policy_obs = obs["policy"] - assert policy_obs.shape[0] == _NUM_ENVS - assert torch.isfinite(policy_obs).all() - - deformable = env.unwrapped.scene["deformable"] - assert deformable.is_initialized - assert deformable.num_instances == _NUM_ENVS - assert deformable.max_sim_vertices_per_body > 0 - assert torch.isfinite(deformable.data.nodal_state_w.torch).all() - - ee_frame = env.unwrapped.scene["ee_frame"] - assert torch.isfinite(ee_frame.data.target_pos_w.torch).all() - - targets = deformable.data.nodal_kinematic_target - assert targets is not None - expected_targets = targets.torch.clone() - updated_targets = expected_targets[:1].clone() - updated_targets[..., 3] = 1.0 - updated_targets[:, :, :3] = deformable.data.nodal_pos_w.torch[:1] + torch.tensor( - [0.0, 0.0, 0.03], device=env.unwrapped.device - ) - updated_targets[:, :, 3] = 0.0 - deformable.write_nodal_kinematic_target_to_sim_index( - updated_targets, env_ids=torch.tensor([0], device=env.unwrapped.device) - ) - expected_targets[0] = updated_targets[0] - readback_targets = wp.to_torch(deformable.root_view.get_attribute(TT.DEFORMABLE_SIM_KINEMATIC_TARGET)) - torch.testing.assert_close(readback_targets, expected_targets, rtol=1e-5, atol=1e-5) - - arm_action = env.unwrapped.action_manager.get_term("arm_action") - ee_pos_curr, ee_quat_curr = arm_action._compute_frame_pose() - actions = torch.zeros(env.action_space.shape, device=env.unwrapped.device) - actions[:, :3] = ee_pos_curr - actions[:, 3:7] = ee_quat_curr - for _ in range(3): - obs, reward, terminated, time_out, _ = env.step(actions) - assert torch.isfinite(obs["policy"]).all() - assert torch.isfinite(reward).all() - assert torch.isfinite(deformable.data.nodal_state_w.torch).all() - assert torch.isfinite(deformable.data.root_pos_w.torch).all() - assert torch.isfinite(ee_frame.data.target_pos_w.torch).all() - assert not terminated.any() - assert not time_out.any() - finally: - try: - if env is not None: - env.close() - finally: - SimulationContext.clear_instance() - - -@pytest.mark.skipif(not torch.cuda.is_available(), reason="OVPhysX deformables require CUDA") -@pytest.mark.isaacsim_ci -def test_lift_franka_cloth_task_reads_and_steps_surface_deformable(): - """Reset and step finite cloth-lift observations and deformable state.""" - env = None - try: - cfg = _configure_deformable_lift_ovphysx_smoke(FrankaClothEnvCfg) - env = gym.make("Isaac-Lift-Cloth-Franka", cfg=cfg) - env.unwrapped.sim._app_control_on_stop_handle = None - - obs, _ = env.reset() - assert obs["policy"].shape[0] == _NUM_ENVS - assert torch.isfinite(obs["policy"]).all() - - deformable = env.unwrapped.scene["deformable"] - assert deformable.is_initialized - assert deformable.num_instances == _NUM_ENVS - assert deformable.max_sim_vertices_per_body > 0 - assert deformable.data.nodal_kinematic_target is None - assert torch.isfinite(deformable.data.nodal_state_w.torch).all() - assert torch.isfinite(deformable.data.root_pos_w.torch).all() - - actions = torch.zeros(env.action_space.shape, device=env.unwrapped.device) - for _ in range(3): - obs, reward, terminated, time_out, _ = env.step(actions) - assert torch.isfinite(obs["policy"]).all() - assert torch.isfinite(reward).all() - assert torch.isfinite(deformable.data.nodal_state_w.torch).all() - assert torch.isfinite(deformable.data.root_pos_w.torch).all() - assert not terminated.any() - assert not time_out.any() - finally: - try: - if env is not None: - env.close() - finally: - SimulationContext.clear_instance() diff --git a/source/isaaclab_physx/changelog.d/mym-lift-soft.rst b/source/isaaclab_physx/changelog.d/mym-lift-soft.rst new file mode 100644 index 000000000000..9e220f411d06 --- /dev/null +++ b/source/isaaclab_physx/changelog.d/mym-lift-soft.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Fixed Newton 1.5 actuator target bindings on the PhysX backend. diff --git a/source/isaaclab_tasks/changelog.d/mym-lift-soft.major.rst b/source/isaaclab_tasks/changelog.d/mym-lift-soft.major.rst new file mode 100644 index 000000000000..95b5d20ca26a --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/mym-lift-soft.major.rst @@ -0,0 +1,35 @@ +Added +^^^^^ + +* Added a deformable COM pose command, dense deformable rewards with success logging, a gravity + curriculum, and ``joint`` and ``ik`` action presets to the Franka soft-beam and cloth lift tasks. + +Changed +^^^^^^^ + +* **Breaking:** Changed the default action space to relative joint-position control. Use + ``presets=ik`` for task-space inverse-kinematics control; integrations using the cloth + environments' previous absolute joint targets must update their actions. +* **Breaking:** Changed the non-camera ``rsl_rl`` experiment name from ``franka_deformable`` to + ``franka_soft``. Update log and checkpoint paths that refer to ``logs/rsl_rl/franka_deformable``. +* Re-tuned the robot, scenes, contact handling, control rate, and ``rsl_rl`` configuration for + gravity-based training. + +Removed +^^^^^^^ + +* **Breaking:** Removed :func:`~isaaclab_tasks.core.lift.mdp.deformable_lifted`. Use + :func:`~isaaclab_tasks.core.lift.mdp.deformable_lifting` and set the required ``std``. +* **Breaking:** Removed :func:`~isaaclab_tasks.core.lift.mdp.deformable_com_goal_distance`. Use + :class:`~isaaclab_tasks.core.lift.mdp.DeformableComGoalDistance` and set the required + ``success_threshold``. +* **Breaking:** Removed :func:`~isaaclab_tasks.core.lift.mdp.deformable_outside_table_bounds`. Use + :func:`~isaaclab_tasks.core.lift.mdp.deformable_outside_bounds` and set the required ``z_bounds``. +* **Breaking:** Removed :func:`~isaaclab_tasks.core.lift.mdp.deformable_com_below_minimum`. Use + :func:`~isaaclab_tasks.core.lift.mdp.deformable_outside_bounds` with appropriate ``z_bounds`` for + workspace termination. +* **Breaking:** Removed the state-machine demo's video arguments. Use ``--num_steps`` to control + the finite demo and an external capture workflow to record it. +* **Breaking:** Removed the unsupported ``ovphysx`` preset from the Franka soft-beam and cloth lift + environments. Use ``isaacsim_physx`` for the soft-beam task or + ``newton_mjwarp_vbd_proxy`` for either task. diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/__init__.py index 6525270394a5..244d4d45718e 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/__init__.py @@ -27,7 +27,7 @@ disable_env_checker=True, kwargs={ "env_cfg_entry_point": f"{__name__}.franka_cloth_env_cfg:FrankaClothEnvCfg", - "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaDeformablePPORunnerCfg", + "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:FrankaClothPPORunnerCfg", }, ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/agents/rsl_rl_ppo_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/agents/rsl_rl_ppo_cfg.py index b884b0f16152..3923c2515a1d 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/agents/rsl_rl_ppo_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/agents/rsl_rl_ppo_cfg.py @@ -9,7 +9,6 @@ RslRlCNNModelCfg, RslRlMLPModelCfg, RslRlOnPolicyRunnerCfg, - RslRlPpoActorCriticCfg, RslRlPpoAlgorithmCfg, ) @@ -32,24 +31,36 @@ @configclass class FrankaDeformablePPORunnerCfg(RslRlOnPolicyRunnerCfg): num_steps_per_env = 24 - max_iterations = 50000 + max_iterations = 3000 save_interval = 50 - experiment_name = "franka_deformable" - policy = RslRlPpoActorCriticCfg( - init_noise_std=1.0, - actor_obs_normalization=False, - critic_obs_normalization=False, - actor_hidden_dims=[256, 128, 64], - critic_hidden_dims=[256, 128, 64], + experiment_name = "franka_soft" + obs_groups = { + "actor": ["policy"], + "critic": ["policy"], + } + actor = RslRlMLPModelCfg( + hidden_dims=[256, 128, 64], + activation="elu", + obs_normalization=True, + distribution_cfg=RslRlMLPModelCfg.GaussianDistributionCfg(init_std=1.0), + ) + critic = RslRlMLPModelCfg( + hidden_dims=[256, 128, 64], activation="elu", + obs_normalization=True, ) - algorithm = ALGO_CFG + algorithm = ALGO_CFG.replace(learning_rate=1.0e-3) + + +@configclass +class FrankaClothPPORunnerCfg(FrankaDeformablePPORunnerCfg): + experiment_name = "lift_cloth" @configclass class FrankaDeformableCameraPPORunnerCfg(RslRlOnPolicyRunnerCfg): num_steps_per_env = 24 - max_iterations = 50000 + max_iterations = 5000 save_interval = 50 experiment_name = "franka_deformable_camera" obs_groups = { diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_cloth_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_cloth_env_cfg.py index ff2123deec25..52efa6ce6cd3 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_cloth_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_cloth_env_cfg.py @@ -7,17 +7,15 @@ from __future__ import annotations -from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg, NewtonShapeCfg +from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg, NewtonCollisionPipelineCfg from isaaclab_newton.sim.schemas import NewtonDeformableBodyPropertiesCfg from isaaclab_newton.sim.spawners.materials import NewtonSurfaceDeformableBodyMaterialCfg -from isaaclab_ovphysx.physics import OvPhysxCfg -from isaaclab_physx.sim.schemas import PhysxDeformableBodyPropertiesCfg -from isaaclab_physx.sim.spawners.materials import PhysxSurfaceDeformableBodyMaterialCfg import isaaclab.sim as sim_utils -from isaaclab.assets import AssetBaseCfg +from isaaclab.assets import AssetBaseCfg, RigidObjectCfg from isaaclab.assets.deformable_object import DeformableObjectCfg from isaaclab.managers import EventTermCfg as EventTerm +from isaaclab.managers import RewardTermCfg as RewTerm from isaaclab.managers import SceneEntityCfg from isaaclab.sensors import CameraCfg from isaaclab.utils.configclass import configclass @@ -25,11 +23,12 @@ from isaaclab_contrib.coupling import CouplerEntryCfg, CouplerProxyCfg, CouplerProxyMappingCfg from isaaclab_contrib.deformable.newton_manager_cfg import NewtonModelCfg, VBDSolverCfg -from isaaclab_tasks.core.lift import mdp from isaaclab_tasks.utils import PresetCfg +from ... import mdp from .franka_soft_env_cfg import ( FRANKA_CAMERA_CFG, + TABLE_SPAWN_CFG, FrankaCameraObservationsCfg, FrankaSoftEnvCfg, _FrankaSoftSceneCfg, @@ -37,39 +36,32 @@ from .franka_soft_env_cfg import ( EventCfg as FrankaSoftEventCfg, ) +from .franka_soft_env_cfg import ( + RewardsCfg as FrankaSoftRewardsCfg, +) ## # Scene definition ## -ROBOT_SHAPE_MATERIAL_MU = 100.0 -"""Franka collision-shape friction coefficient [dimensionless] used for Newton cloth contact.""" - -ROBOT_SHAPE_MATERIAL_BODY_NAMES = ".*" -"""Franka body-name regex receiving :data:`ROBOT_SHAPE_MATERIAL_MU`.""" - @configclass class PhysicsCfg(PresetCfg): - # Newton physics: MJWarp rigid + VBD soft, coupled through lagged proxies newton_mjwarp_vbd_proxy: NewtonCfg = NewtonCfg( solver_cfg=CouplerProxyCfg( entries=[ CouplerEntryCfg( name="rigid", solver_cfg=MJWarpSolverCfg( - njmax=40, - nconmax=20, cone="elliptic", ls_iterations=20, integrator="implicitfast", - ccd_iterations=100, ), - bodies=[r"/World/envs/env_.*/Robot"], + bodies=[r"/World/envs/env_.*/Robot", r"/World/envs/env_.*/Support(Neg|Pos)Y"], ), CouplerEntryCfg( name="soft", - solver_cfg=VBDSolverCfg(iterations=10), + solver_cfg=VBDSolverCfg(iterations=10, rigid_body_particle_contact_buffer_size=1024), all_particles=True, include_static_shapes=True, ), @@ -79,75 +71,59 @@ class PhysicsCfg(PresetCfg): source="rigid", destination="soft", bodies=[ - r"/World/envs/env_.*/Robot/panda_hand", - r"/World/envs/env_.*/Robot/panda_(left|right)finger", + r"/World/envs/env_.*/Robot/Geometry/.*panda_hand", + r"/World/envs/env_.*/Robot/Geometry/.*panda_(left|right)finger", + r"/World/envs/env_.*/Support(Neg|Pos)Y", ], collide_interval=1, + collision_pipeline=NewtonCollisionPipelineCfg( + enable_rigid_soft_full_surface_contact=True, + ), ) ], iterations=1, - model_cfg=NewtonModelCfg( - soft_contact_ke=1e3, - soft_contact_kd=1e-5, - soft_contact_mu=0.5, - ), + model_cfg=NewtonModelCfg(soft_contact_ke=8e3, soft_contact_mu=10.0), ), - default_shape_cfg=NewtonShapeCfg(ke=1e3, kd=1e-5, mu=1e-4), - num_substeps=10, - use_cuda_graph=True, + num_substeps=2, ) - ovphysx: OvPhysxCfg = OvPhysxCfg() - default = newton_mjwarp_vbd_proxy +SUPPORT_SPAWN_CFG = sim_utils.CuboidCfg( + size=(0.1, 0.02, 0.15), + rigid_props=sim_utils.RigidBodyPropertiesCfg(kinematic_enabled=True, disable_gravity=True), + mass_props=sim_utils.MassPropertiesCfg(mass=1.0), + collision_props=sim_utils.CollisionPropertiesCfg(), + physics_material=sim_utils.RigidBodyMaterialCfg(static_friction=0.1, dynamic_friction=0.1), + visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.2, 0.2, 0.25)), +) + + @configclass class DeformableCfg(PresetCfg): """Preset config for the deformable object, matching the Newton example.""" newton_mjwarp_vbd_proxy: DeformableObjectCfg = DeformableObjectCfg( prim_path="{ENV_REGEX_NS}/Deformable", - init_state=DeformableObjectCfg.InitialStateCfg(pos=(0.4, 0.0, 0.2)), + init_state=DeformableObjectCfg.InitialStateCfg(pos=(0.4, 0.0, 0.102), rot=(0.70710678, 0.0, 0.0, 0.70710678)), spawn=sim_utils.MeshRectangleCfg( size=(0.2, 0.2), - resolution=(30, 30), + resolution=(8, 8), deformable_props=NewtonDeformableBodyPropertiesCfg(), visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.95, 0.85, 0.1)), physics_material=NewtonSurfaceDeformableBodyMaterialCfg( - density=50.0, - particle_radius=0.005, + density=10.0, + particle_radius=0.002, tri_ke=5e2, tri_ka=5e2, tri_kd=1e-3, - edge_ke=2.0, + edge_ke=0.5, edge_kd=1e-3, ), ), ) - ovphysx: DeformableObjectCfg = DeformableObjectCfg( - prim_path="{ENV_REGEX_NS}/Deformable", - init_state=DeformableObjectCfg.InitialStateCfg(pos=(0.4, 0.0, 0.2)), - spawn=sim_utils.MeshRectangleCfg( - size=(0.2, 0.2), - resolution=(30, 30), - deformable_props=PhysxDeformableBodyPropertiesCfg(), - visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.95, 0.85, 0.1)), - physics_material=PhysxSurfaceDeformableBodyMaterialCfg( - density=50.0, - youngs_modulus=2000.0, - poissons_ratio=0.25, - surface_thickness=0.005, - surface_stretch_stiffness=0.8, - surface_shear_stiffness=0.7, - surface_bend_stiffness=0.6, - elasticity_damping=0.03, - bend_damping=0.04, - ), - ), - ) - default = newton_mjwarp_vbd_proxy @@ -157,24 +133,27 @@ class FrankaClothSceneCfg(_FrankaSoftSceneCfg): deformable: DeformableCfg = DeformableCfg() - # Static collidable cube the cloth drops onto (sits on the table top at z = 0). - cube: AssetBaseCfg = AssetBaseCfg( - prim_path="{ENV_REGEX_NS}/Cube", - init_state=AssetBaseCfg.InitialStateCfg(pos=(0.45, 0.0, 0.04)), - spawn=sim_utils.CuboidCfg( - size=(0.03, 0.01, 0.08), - collision_props=sim_utils.CollisionPropertiesCfg(), - visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.2, 0.2, 0.25)), + # Low-friction table so the cloth slides freely instead of sticking. Effective cloth-table + # friction is sqrt(soft_contact_mu * shape_mu); this sets shape_mu without touching the global + # soft_contact_mu that governs the gripper's hold on the cloth. + table: AssetBaseCfg = AssetBaseCfg( + prim_path="{ENV_REGEX_NS}/Table", + init_state=AssetBaseCfg.InitialStateCfg(pos=[0.5, 0.0, -0.525]), + spawn=TABLE_SPAWN_CFG.replace( + physics_material=sim_utils.RigidBodyMaterialCfg(static_friction=0.1, dynamic_friction=0.1), ), ) - def __post_init__(self) -> None: - super().__post_init__() - - # increase franka gripper stiffness - self.robot.actuators["panda_hand"].effort_limit_sim = 500.0 - self.robot.actuators["panda_hand"].stiffness = 2000.0 - self.robot.actuators["panda_hand"].damping = 100.0 + support_neg_y: RigidObjectCfg = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/SupportNegY", + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, -0.02, 0.075)), + spawn=SUPPORT_SPAWN_CFG, + ) + support_pos_y: RigidObjectCfg = RigidObjectCfg( + prim_path="{ENV_REGEX_NS}/SupportPosY", + init_state=RigidObjectCfg.InitialStateCfg(pos=(0.4, 0.02, 0.075)), + spawn=SUPPORT_SPAWN_CFG, + ) @configclass @@ -182,11 +161,9 @@ class FrankaClothScenePresetCfg(PresetCfg): """Preset config for the Franka surface deformable scene.""" newton_mjwarp_vbd_proxy: FrankaClothSceneCfg = FrankaClothSceneCfg( - num_envs=128, env_spacing=2.5, replicate_physics=True + num_envs=2048, env_spacing=2.0, replicate_physics=True ) - ovphysx: FrankaClothSceneCfg = FrankaClothSceneCfg(num_envs=128, env_spacing=2.5, replicate_physics=True) - default = newton_mjwarp_vbd_proxy @@ -198,87 +175,54 @@ class FrankaClothCameraSceneCfg(FrankaClothSceneCfg): @configclass -class ActionsCfg: - """7-dim arm joint position + 1-dim binary gripper.""" - - arm_action = mdp.JointPositionActionCfg( - asset_name="robot", joint_names=["panda_joint.*"], scale=0.1, use_default_offset=True - ) - gripper_action = mdp.BinaryJointPositionActionCfg( - asset_name="robot", - joint_names=["panda_finger.*"], - open_command_expr={"panda_finger_.*": 0.05}, - close_command_expr={"panda_finger_.*": 0.0}, - ) - - -@configclass -class EventCfg(FrankaSoftEventCfg): +class FrankaClothEventCfg(FrankaSoftEventCfg): """Reset and startup events for the Franka cloth environment.""" - robot_physics_material = EventTerm( - func=mdp.randomize_rigid_body_material, - mode="startup", + reset_deformable = EventTerm( + func=mdp.reset_deformable_over_support, + mode="reset", params={ - "asset_cfg": SceneEntityCfg("robot", body_names=ROBOT_SHAPE_MATERIAL_BODY_NAMES), - "static_friction_range": (ROBOT_SHAPE_MATERIAL_MU, ROBOT_SHAPE_MATERIAL_MU), - "dynamic_friction_range": (ROBOT_SHAPE_MATERIAL_MU, ROBOT_SHAPE_MATERIAL_MU), - "restitution_range": (0.0, 0.0), - "num_buckets": 1, + "position_range": {"x": (-0.1, 0.1), "y": (-0.25, 0.25), "z": (0.0, 0.0)}, + "clear_gap_range": (0.008, 0.03), + "asset_cfg": SceneEntityCfg("deformable"), + "support_cfg": (SceneEntityCfg("support_neg_y"), SceneEntityCfg("support_pos_y")), }, ) -def _make_ovphysx_event_cfg() -> EventCfg: - """Create cloth events that select all robot shapes on OvPhysX.""" - cfg = EventCfg() - cfg.robot_physics_material.params["asset_cfg"] = SceneEntityCfg("robot") - return cfg +## +# Environment configuration +## @configclass -class EventPresetCfg(PresetCfg): - """Preset config for Franka cloth startup and reset events.""" - - newton_mjwarp_vbd_proxy: EventCfg = EventCfg() - ovphysx: EventCfg = _make_ovphysx_event_cfg() - - default = newton_mjwarp_vbd_proxy +class FrankaClothRewardsCfg(FrankaSoftRewardsCfg): + """Rewards for the Franka cloth environment.""" + reaching_deformable = RewTerm( + func=mdp.deformable_ee_distance, + params={"std": 0.1, "asset_cfg": SceneEntityCfg("deformable")}, + weight=5.0, + ) -## -# Environment configuration -## + lifting_deformable = RewTerm( + func=mdp.deformable_lifting, + params={"std": 0.1, "minimal_height": 0.11, "asset_cfg": SceneEntityCfg("deformable")}, + weight=5.0, + ) @configclass class FrankaClothEnvCfg(FrankaSoftEnvCfg): """Manager-based RL environment: Franka Panda lifting a surface deformable.""" - # Scene settings scene: FrankaClothScenePresetCfg = FrankaClothScenePresetCfg() - # Basic settings - actions: ActionsCfg = ActionsCfg() - # MDP settings - events: EventPresetCfg = EventPresetCfg() + events: FrankaClothEventCfg = FrankaClothEventCfg() + rewards: FrankaClothRewardsCfg = FrankaClothRewardsCfg() def __post_init__(self) -> None: - # general settings - self.decimation = 1 - self.episode_length_s = 5.0 - - # simulation settings - self.sim.dt = 1 / 60.0 - self.sim.render_interval = self.decimation - - # Hint for the viewport camera when running interactively with --viz kit. - # Using default_visualizer_cfg rather than visualizer_cfgs avoids forcing - # Kit viewport creation in kitless/headless contexts. - from isaaclab_visualizers.kit import KitVisualizerCfg - - self.sim.default_visualizer_cfg = KitVisualizerCfg( - origin_type="asset", origin_track_path="robot", origin_env_index=0, eye=(1.25, -1.5, 0.6) - ) + super().__post_init__() + # override the soft-beam physics with the cloth presets self.sim.physics = PhysicsCfg() diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py index 610ca1bae507..59dd518f0117 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/config/franka_soft/franka_soft_env_cfg.py @@ -3,25 +3,29 @@ # # SPDX-License-Identifier: BSD-3-Clause -"""Configuration for the Franka deformable lifting environment.""" +"""Configuration for the Franka deformable (soft beam) lifting environment.""" from __future__ import annotations -from isaaclab_newton.physics import MJWarpSolverCfg, NewtonCfg, NewtonShapeCfg +from isaaclab_newton.physics import ( + MJWarpSolverCfg, + NewtonCfg, + NewtonCollisionPipelineCfg, +) from isaaclab_newton.sim.schemas import NewtonDeformableBodyPropertiesCfg from isaaclab_newton.sim.spawners.materials import NewtonDeformableBodyMaterialCfg -from isaaclab_ovphysx.physics import OvPhysxCfg from isaaclab_physx.physics import PhysxCfg -from isaaclab_physx.sim.schemas import PhysxDeformableBodyPropertiesCfg +from isaaclab_physx.sim.schemas import PhysxCollisionCfg, PhysxDeformableBodyPropertiesCfg from isaaclab_physx.sim.spawners.materials import PhysxDeformableBodyMaterialCfg import isaaclab.sim as sim_utils +from isaaclab.actuators import ImplicitActuatorCfg from isaaclab.assets import ArticulationCfg, AssetBaseCfg from isaaclab.assets.deformable_object import DeformableObjectCfg -from isaaclab.controllers.differential_ik_cfg import DifferentialIKControllerCfg +from isaaclab.controllers import DifferentialIKControllerCfg from isaaclab.envs import ManagerBasedRLEnvCfg from isaaclab.envs import mdp as env_mdp -from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg +from isaaclab.managers import CurriculumTermCfg as CurrTerm from isaaclab.managers import EventTermCfg as EventTerm from isaaclab.managers import ObservationGroupCfg as ObsGroup from isaaclab.managers import ObservationTermCfg as ObsTerm @@ -33,9 +37,10 @@ from isaaclab.scene import InteractiveSceneCfg from isaaclab.sensors import CameraCfg, FrameTransformerCfg from isaaclab.sensors.frame_transformer.frame_transformer_cfg import OffsetCfg -from isaaclab.sim.spawners.from_files.from_files_cfg import GroundPlaneCfg, UsdFileCfg +from isaaclab.sim.spawners.from_files.from_files_cfg import GroundPlaneCfg from isaaclab.utils.assets import ISAAC_NUCLEUS_DIR from isaaclab.utils.configclass import configclass +from isaaclab.visualizers import VisualizerCfg from isaaclab_contrib.coupling import ( CouplerEntryCfg, @@ -47,15 +52,16 @@ VBDSolverCfg, ) -from isaaclab_tasks.core.lift import mdp from isaaclab_tasks.utils import PresetCfg from isaaclab_tasks.utils.presets import MultiBackendRendererCfg +from ... import mdp + ## # Pre-defined configs ## -from isaaclab_assets.robots.franka import FRANKA_PANDA_CFG # isort:skip +from isaaclab_assets.robots.franka import FRANKA_PANDA_MENAGERIE_CFG # isort:skip ## @@ -64,8 +70,16 @@ # Shared volume material parameters. The Newton config below uses the equivalent Lame parameters. -YOUNGS_MODULUS = 8e4 -POISSONS_RATIO = 0.25 +YOUNGS_MODULUS = 2e5 +POISSONS_RATIO = 0.3 + +# Table collider whose top surface sits at z = 0. Spawned invisible: the command term's success +# visualizer draws it instead, tinted by whether the goal is reached. +TABLE_SPAWN_CFG = sim_utils.CuboidCfg( + size=(1.3, 0.9, 1.05), + collision_props=sim_utils.CollisionPropertiesCfg(), + visible=False, +) FRANKA_CAMERA_CFG = CameraCfg( @@ -91,14 +105,15 @@ class DeformableCfg(PresetCfg): prim_path="{ENV_REGEX_NS}/Deformable", init_state=DeformableObjectCfg.InitialStateCfg(pos=(0.5, 0.0, 0.05)), spawn=sim_utils.MeshCuboidCfg( - size=(0.3, 0.05, 0.05), + size=(0.3, 0.04, 0.04), + edge_refinement=3.0, deformable_props=NewtonDeformableBodyPropertiesCfg(), - visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.95, 0.85, 0.1)), + visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.45, 0.45, 0.85)), physics_material=NewtonDeformableBodyMaterialCfg( - density=300.0, + density=1000.0, k_mu=YOUNGS_MODULUS / (2.0 * (1.0 + POISSONS_RATIO)), k_lambda=(YOUNGS_MODULUS * POISSONS_RATIO / ((1.0 + POISSONS_RATIO) * (1.0 - 2.0 * POISSONS_RATIO))), - particle_radius=0.01, + particle_radius=0.0025, ), ), ) @@ -107,22 +122,22 @@ class DeformableCfg(PresetCfg): prim_path="{ENV_REGEX_NS}/Deformable", init_state=DeformableObjectCfg.InitialStateCfg(pos=(0.5, 0.0, 0.05)), spawn=sim_utils.MeshCuboidCfg( - size=(0.3, 0.05, 0.05), + size=(0.3, 0.04, 0.04), + edge_refinement=3.0, deformable_props=PhysxDeformableBodyPropertiesCfg(), - visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.95, 0.85, 0.1)), + collision_props=[PhysxCollisionCfg(rest_offset=0.0025, contact_offset=0.01)], + visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.45, 0.45, 0.85)), physics_material=PhysxDeformableBodyMaterialCfg( - density=300.0, + density=1000.0, youngs_modulus=YOUNGS_MODULUS, poissons_ratio=POISSONS_RATIO, static_friction=10.0, - dynamic_friction=5.0, + dynamic_friction=10.0, ), ), ) isaacsim_physx = physx - ovphysx: DeformableObjectCfg = physx - default = newton_mjwarp_vbd_proxy @@ -142,7 +157,7 @@ class PhysicsCfg(PresetCfg): ), CouplerEntryCfg( name="soft", - solver_cfg=VBDSolverCfg(iterations=10), + solver_cfg=VBDSolverCfg(iterations=10, rigid_body_particle_contact_buffer_size=256), all_particles=True, include_static_shapes=True, ), @@ -152,26 +167,27 @@ class PhysicsCfg(PresetCfg): source="rigid", destination="soft", bodies=[ - r"/World/envs/env_.*/Robot/panda_hand", - r"/World/envs/env_.*/Robot/panda_(left|right)finger", + r"/World/envs/env_.*/Robot/Geometry/.*panda_hand", + r"/World/envs/env_.*/Robot/Geometry/.*panda_(left|right)finger", ], - collide_interval=5, + collide_interval=1, + collision_pipeline=NewtonCollisionPipelineCfg( + enable_rigid_soft_full_surface_contact=True, + ), ) ], iterations=1, - model_cfg=NewtonModelCfg( - soft_contact_ke=1e4, - soft_contact_kd=1e-5, - soft_contact_mu=5.0, - ), + model_cfg=NewtonModelCfg(soft_contact_ke=8.0e3, soft_contact_mu=10.0), ), - default_shape_cfg=NewtonShapeCfg(ke=4e4, kd=1e-5, mu=5.0), - num_substeps=10, + num_substeps=2, + ) + + isaacsim_physx: PhysxCfg = PhysxCfg( + friction_offset_threshold=0.005, + friction_correlation_distance=0.01, ) - isaacsim_physx: PhysxCfg = PhysxCfg() - ovphysx: OvPhysxCfg = OvPhysxCfg() - physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx, ovphysx=ovphysx) + physx: PhysxAutoCfg = PhysxAutoCfg(isaacsim_physx=isaacsim_physx) default = newton_mjwarp_vbd_proxy @@ -185,15 +201,18 @@ class PhysicsCfg(PresetCfg): class _FrankaSoftSceneCfg(InteractiveSceneCfg): """Scene for the Franka deformable environment.""" - robot: ArticulationCfg = FRANKA_PANDA_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") + robot: ArticulationCfg = FRANKA_PANDA_MENAGERIE_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") # end-effector frame for reward shaping ee_frame: FrameTransformerCfg = FrameTransformerCfg( - prim_path="/World/envs/env_.*/Robot/panda_link0", + prim_path="/World/envs/env_.*/Robot/Geometry/panda_link0", debug_vis=False, target_frames=[ FrameTransformerCfg.FrameCfg( - prim_path="/World/envs/env_.*/Robot/panda_hand", + prim_path=( + "/World/envs/env_.*/Robot/Geometry/panda_link0/panda_link1/panda_link2/panda_link3/" + "panda_link4/panda_link5/panda_link6/panda_link7/panda_hand" + ), name="end_effector", offset=OffsetCfg(pos=[0.0, 0.0, 0.1034]), ), @@ -202,13 +221,13 @@ class _FrankaSoftSceneCfg(InteractiveSceneCfg): deformable: DeformableCfg = DeformableCfg() - # static table matching the Newton example: half-extents (0.4, 0.4, 0.1) → top at z = 0.2 - # NOTE: SeattleLabTable USD has its origin on the top surface, so the deformable object - # sits directly on it when placed at z = 0.05. + # static table collider with its top surface at z = 0. Kept invisible: the success + # visualizer renders the visible table, colored by whether the goal is reached + # (see CommandsCfg). table: AssetBaseCfg = AssetBaseCfg( prim_path="{ENV_REGEX_NS}/Table", - init_state=AssetBaseCfg.InitialStateCfg(pos=[0.5, 0.0, 0.0], rot=[0.0, 0.0, 0.707, 0.707]), - spawn=UsdFileCfg(usd_path=f"{ISAAC_NUCLEUS_DIR}/Props/Mounts/SeattleLabTable/table_instanceable.usd"), + init_state=AssetBaseCfg.InitialStateCfg(pos=[0.5, 0.0, -0.525]), + spawn=TABLE_SPAWN_CFG, ) # ground plane @@ -228,14 +247,49 @@ class _FrankaSoftSceneCfg(InteractiveSceneCfg): ) def __post_init__(self) -> None: - # disable gravity on the arm so the low-PD actuators do not need to fight gravity sag, - # which is the dominant source of steady-state IK tracking error. - self.robot.spawn.rigid_props.disable_gravity = True - - # increase franka gripper stiffness - self.robot.actuators["panda_hand"].effort_limit_sim = 500.0 - self.robot.actuators["panda_hand"].stiffness = 1000.0 - self.robot.actuators["panda_hand"].damping = 100.0 + self.robot.actuators = { + # inspired by libfranka's joint_impedance_control.cpp + "panda_arm": ImplicitActuatorCfg( + joint_names_expr=["panda_joint[1-7]"], + effort_limit_sim={"panda_joint[1-4]": 87.0, "panda_joint[5-7]": 12.0}, + velocity_limit_sim={"panda_joint[1-4]": 2.175, "panda_joint[5-7]": 2.61}, + stiffness={ + "panda_joint[1-4]": 600.0, + "panda_joint5": 250.0, + "panda_joint6": 150.0, + "panda_joint7": 50.0, + }, + damping={ + "panda_joint[1-4]": 50.0, + "panda_joint5": 30.0, + "panda_joint6": 25.0, + "panda_joint7": 15.0, + }, + armature={ + "panda_joint[1-2]": 0.6057, + "panda_joint[3-4]": 0.4625, + "panda_joint[5-7]": 0.2055, + }, + ), + "panda_hand": ImplicitActuatorCfg( + joint_names_expr=["panda_finger_joint1"], + effort_limit_sim=70.0, + velocity_limit=0.2, + velocity_limit_sim=2.0, + stiffness=350.0, + damping=175.0, + armature=0.1, + ), + "panda_finger2_passive": ImplicitActuatorCfg( + joint_names_expr=["panda_finger_joint2"], + effort_limit_sim=1.0, + velocity_limit=0.2, + velocity_limit_sim=2.0, + stiffness=0.0, + damping=0.0, + armature=0.1, + ), + } @configclass @@ -254,12 +308,12 @@ class _FrankaSoftCameraSceneCfg(_FrankaSoftSceneCfg): class CommandsCfg: """Commands for the deformable goal pose (xyz + identity quat in robot root frame).""" - deformable_pose = mdp.UniformPoseCommandCfg( + deformable_pose = mdp.DeformableUniformPoseCommandCfg( asset_name="robot", - body_name="panda_hand", + object_name="deformable", resampling_time_range=(5.0, 5.0), debug_vis=True, - ranges=mdp.UniformPoseCommandCfg.Ranges( + ranges=mdp.DeformableUniformPoseCommandCfg.Ranges( pos_x=(0.4, 0.6), pos_y=(-0.25, 0.25), pos_z=(0.25, 0.5), @@ -267,16 +321,16 @@ class CommandsCfg: pitch=(0.0, 0.0), yaw=(0.0, 0.0), ), - # Render the goal as a transparent colored sphere (a point) instead of a coordinate frame. - goal_pose_visualizer_cfg=VisualizationMarkersCfg( - prim_path="/Visuals/Command/goal_pose", + # the invisible table is drawn by these markers, tinted green once the goal is reached + success_vis_asset_name="table", + success_visualizer_cfg=VisualizationMarkersCfg( + prim_path="/Visuals/SuccessMarkers", markers={ - "sphere": sim_utils.SphereCfg( - radius=0.03, - visual_material=sim_utils.PreviewSurfaceCfg( - diffuse_color=(0.1, 0.9, 0.2), - opacity=0.4, - ), + "failure": TABLE_SPAWN_CFG.replace( + visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.8, 0.5, 0.5)), visible=True + ), + "success": TABLE_SPAWN_CFG.replace( + visual_material=sim_utils.PreviewSurfaceCfg(diffuse_color=(0.5, 0.8, 0.5)), visible=True ), }, ), @@ -284,10 +338,21 @@ class CommandsCfg: @configclass -class ActionsCfg: +class _JointActionsCfg: + """7-dim relative joint-position arm targets + 1-dim limit-rescaled gripper.""" + + arm_action = mdp.RelativeJointPositionActionCfg(asset_name="robot", joint_names=["panda_joint.*"], scale=0.03) + + gripper_action = mdp.JointPositionToLimitsActionCfg( + asset_name="robot", joint_names=["panda_finger_joint1"], rescale_to_limits=True + ) + + +@configclass +class _IkActionsCfg: """7-dim absolute end-effector pose (xyz + quaternion) via differential IK + 1-dim binary gripper.""" - arm_action = DifferentialInverseKinematicsActionCfg( + arm_action = mdp.DifferentialInverseKinematicsActionCfg( asset_name="robot", joint_names=["panda_joint.*"], body_name="panda_hand", @@ -297,19 +362,31 @@ class ActionsCfg: ik_method="dls", ik_params={"lambda_val": 0.6}, ), - body_offset=DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), + body_offset=mdp.DifferentialInverseKinematicsActionCfg.OffsetCfg(pos=[0.0, 0.0, 0.107]), ) + gripper_action = mdp.BinaryJointPositionActionCfg( asset_name="robot", - joint_names=["panda_finger.*"], - open_command_expr={"panda_finger_.*": 0.05}, - close_command_expr={"panda_finger_.*": 0.0}, + joint_names=["panda_finger_joint1"], + open_command_expr={"panda_finger_joint1": 0.04}, + close_command_expr={"panda_finger_joint1": 0.015}, ) +@configclass +class ActionsCfg(PresetCfg): + """Action-space presets: joint-space for RL, task-space IK for scripted end-effector control.""" + + joint: _JointActionsCfg = _JointActionsCfg() + + ik: _IkActionsCfg = _IkActionsCfg() + + default = joint + + @configclass class ObservationsCfg: - """Policy observations: joint state, deformable COM in robot frame, target, last action.""" + """Policy observations: relative joint state, sampled deformable points, target command, and last action.""" @configclass class PolicyCfg(ObsGroup): @@ -384,94 +461,134 @@ class BaseImageCfg(ObsGroup): class EventCfg: """Reset events: robot to default joint config, deformable with small position randomization.""" - reset_robot_joints = EventTerm( + reset_robot_arm_joints = EventTerm( func=mdp.reset_joints_by_scale, mode="reset", - params={"position_range": (0.9, 1.1), "velocity_range": (0.0, 0.0)}, + params={ + "position_range": (0.9, 1.1), + "velocity_range": (0.0, 0.0), + "asset_cfg": SceneEntityCfg("robot", joint_names="panda_joint.*"), + }, + ) + + reset_robot_gripper_joints = EventTerm( + func=mdp.reset_joints_shared_offset, + mode="reset", + params={ + "position_range": (-0.02, 0.0), + "asset_cfg": SceneEntityCfg("robot", joint_names="panda_finger_joint.*"), + }, ) reset_deformable = EventTerm( func=mdp.reset_nodal_state_uniform, mode="reset", params={ - "position_range": {"x": (-0.05, 0.05), "y": (-0.05, 0.05), "z": (0.0, 0.0)}, + "position_range": {"x": (-0.15, 0.1), "y": (-0.2, 0.2), "z": (0.0, 0.0)}, "velocity_range": {}, "asset_cfg": SceneEntityCfg("deformable"), }, ) + variable_gravity = EventTerm( + func=mdp.randomize_physics_scene_gravity, + mode="reset", + params={ + "gravity_distribution_params": ([0.0, 0.0, -9.81], [0.0, 0.0, -9.81]), + "operation": "abs", + }, + ) + @configclass class RewardsCfg: """Lift-to-target reward for a deformable object.""" reaching_deformable = RewTerm( - func=mdp.deformable_ee_distance, + func=mdp.deformable_com_ee_distance, params={"std": 0.1, "asset_cfg": SceneEntityCfg("deformable")}, weight=5.0, ) + lifting_deformable = RewTerm( - func=mdp.deformable_lifted, - params={"minimal_height": 0.04, "asset_cfg": SceneEntityCfg("deformable")}, + func=mdp.deformable_lifting, + params={"std": 0.1, "minimal_height": 0.02, "asset_cfg": SceneEntityCfg("deformable")}, weight=5.0, ) + deformable_goal_tracking = RewTerm( - func=mdp.deformable_com_goal_distance, + func=mdp.DeformableComGoalDistance, params={ "std": 0.3, - "minimal_height": 0.075, + "minimal_height": 0.0, "command_name": "deformable_pose", + "success_threshold": 0.05, "asset_cfg": SceneEntityCfg("deformable"), }, - weight=16.0, + weight=2.0, ) - deformable_goal_tracking_fine_grained = RewTerm( - func=mdp.deformable_com_goal_distance, + + success_bonus = RewTerm( + func=mdp.deformable_com_goal_reached, params={ - "std": 0.05, - "minimal_height": 0.075, + "minimal_height": 0.0, "command_name": "deformable_pose", + "success_threshold": 0.05, "asset_cfg": SceneEntityCfg("deformable"), }, - weight=5.0, + weight=20.0, + ) + + action_rate = RewTerm(func=mdp.action_rate_l2, weight=-1e-3) + + +@configclass +class CurriculumCfg: + """Ramp the action-rate penalty once the policy has learned to lift (matches rigid recipe).""" + + action_rate = CurrTerm( + func=mdp.modify_reward_weight, params={"term_name": "action_rate", "weight": -1e-1, "num_steps": 15000} ) - action_rate = RewTerm(func=mdp.action_rate_l2, weight=-1e-2) - gripper_close = RewTerm( - func=mdp.gripper_close_action, - params={"action_name": "gripper_action"}, - weight=-1.0, + # Since we use 24 steps per env, 10000 steps correspond to 10000/24 = 416.67 learning iterations + gravity = CurrTerm( + func=mdp.gravity_range_linear, + params={ + "event_name": "variable_gravity", + "start_gravity_z": -0.0001, + "end_gravity_z": -9.81, + "start_step": 0, + "end_step": 10000, + }, ) - joint_vel = RewTerm(func=mdp.joint_vel_l2, weight=-1e-2) - joint_torque = RewTerm(func=mdp.joint_torques_l2, weight=-1e-4) - joint_acc = RewTerm(func=mdp.joint_acc_l2, weight=-1e-4) @configclass class TerminationsCfg: - """Time out + table bounds/drop termination.""" + """Time out + workspace bounds termination.""" time_out = DoneTerm(func=mdp.time_out, time_out=True) - deformable_outside_table = DoneTerm( - func=mdp.deformable_outside_table_bounds, + deformable_out_of_bounds = DoneTerm( + func=mdp.deformable_outside_bounds, params={ "x_bounds": (0.0, 1.0), "y_bounds": (-0.5, 0.5), + "z_bounds": (-0.02, 1.0), "asset_cfg": SceneEntityCfg("deformable"), }, ) - deformable_dropped = DoneTerm( - func=mdp.deformable_com_below_minimum, - params={"minimum_height": -0.1, "asset_cfg": SceneEntityCfg("deformable")}, - ) - ee_below_table = DoneTerm( func=mdp.ee_below_minimum, params={"minimum_height": 0.0, "ee_frame_cfg": SceneEntityCfg("ee_frame")}, ) + joint_vel_out_of_limit = DoneTerm( + func=mdp.joint_vel_out_of_sim_limit, + params={"asset_cfg": SceneEntityCfg("robot")}, + ) + ## # Environment configuration @@ -481,15 +598,13 @@ class TerminationsCfg: @configclass class FrankaSoftSceneCfg(PresetCfg): newton_mjwarp_vbd_proxy: _FrankaSoftSceneCfg = _FrankaSoftSceneCfg( - num_envs=128, env_spacing=2.5, replicate_physics=True + num_envs=2048, env_spacing=2.0, replicate_physics=True ) # PhysX does not support replicating physics for deformable objects - physx: _FrankaSoftSceneCfg = _FrankaSoftSceneCfg(num_envs=128, env_spacing=2.5, replicate_physics=False) + physx: _FrankaSoftSceneCfg = _FrankaSoftSceneCfg(num_envs=2048, env_spacing=2.0, replicate_physics=False) isaacsim_physx = physx - ovphysx: _FrankaSoftSceneCfg = _FrankaSoftSceneCfg(num_envs=128, env_spacing=2.5, replicate_physics=True) - default = newton_mjwarp_vbd_proxy @@ -498,16 +613,22 @@ class FrankaSoftCameraSceneCfg(PresetCfg): """Scene presets for visual Franka soft lifting.""" newton_mjwarp_vbd_proxy: _FrankaSoftCameraSceneCfg = _FrankaSoftCameraSceneCfg( - num_envs=128, env_spacing=2.5, replicate_physics=True + num_envs=128, env_spacing=2.0, replicate_physics=True ) - physx: _FrankaSoftCameraSceneCfg = _FrankaSoftCameraSceneCfg(num_envs=128, env_spacing=2.5, replicate_physics=False) + physx: _FrankaSoftCameraSceneCfg = _FrankaSoftCameraSceneCfg(num_envs=128, env_spacing=2.0, replicate_physics=False) isaacsim_physx = physx default = newton_mjwarp_vbd_proxy +@configclass +class _FrankaSoftVisualizerCfg(VisualizerCfg): + window_width: int = 1920 + window_height: int = 1080 + + @configclass class FrankaSoftEnvCfg(ManagerBasedRLEnvCfg): - """Manager-based RL environment: Franka Panda lifting a volume deformable.""" + """Manager-based RL environment: Franka Panda lifting a soft beam to a target pose.""" # Scene settings scene: FrankaSoftSceneCfg = FrankaSoftSceneCfg() @@ -519,18 +640,30 @@ class FrankaSoftEnvCfg(ManagerBasedRLEnvCfg): rewards: RewardsCfg = RewardsCfg() terminations: TerminationsCfg = TerminationsCfg() events: EventCfg = EventCfg() + curriculum: CurriculumCfg = CurriculumCfg() def __post_init__(self) -> None: # general settings - self.decimation = 1 + self.decimation = 4 self.episode_length_s = 5.0 # simulation settings - self.sim.dt = 1 / 60.0 + self.sim.dt = 1.0 / 120 self.sim.render_interval = self.decimation - self.sim.gravity = (0.0, 0.0, 0.0) self.sim.physics = PhysicsCfg() + self.viewer.eye = (0.75, 0.25, 0.65) + self.viewer.lookat = (0.0, 0.75, 0.4) + self.sim.default_visualizer_cfg = _FrankaSoftVisualizerCfg( + eye=self.viewer.eye, + lookat=self.viewer.lookat, + ) + + def play_mode(self): + super().play_mode() + if self.curriculum is not None: + self.curriculum.gravity = None + @configclass class FrankaSoftCameraEnvCfg(FrankaSoftEnvCfg): diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/__init__.pyi b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/__init__.pyi index 93cb88f1efd8..53e0a536e5ec 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/__init__.pyi +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/__init__.pyi @@ -17,6 +17,15 @@ __all__ = [ "reset_to_target", "get_reset_state", "set_reset_state", + "joint_vel_out_of_sim_limit", + "deformable_outside_bounds", + "deformable_lifting", + "deformable_com_goal_reached", + "deformable_com_ee_distance", + "DeformableComGoalDistance", + "reset_deformable_over_support", + "gravity_range_linear", + "DeformableUniformPoseCommandCfg", "ObjectUniformPoseCommandCfg", "DifficultyScheduler", "initial_final_interpolate_fn", @@ -29,9 +38,7 @@ __all__ = [ "vision_camera", "contacts", "contact_count", - "deformable_com_goal_distance", "deformable_ee_distance", - "deformable_lifted", "gripper_close_action", "object_ee_distance", "orientation_command_error_tanh", @@ -40,20 +47,19 @@ __all__ = [ "position_command_progress", "success_reward", "abnormal_robot_state", - "deformable_com_below_minimum", - "deformable_outside_table_bounds", "ee_below_minimum", "object_reached_goal", "out_of_bound", ] -from .commands import ObjectUniformPoseCommandCfg -from .curriculums import DifficultyScheduler, initial_final_interpolate_fn +from .commands import DeformableUniformPoseCommandCfg, ObjectUniformPoseCommandCfg +from .curriculums import DifficultyScheduler, gravity_range_linear, initial_final_interpolate_fn from .events import ( SuccessMonitor, conditional_reset, grasp_travel_distance, mesh_clearance, + reset_deformable_over_support, reset_joints_shared_offset, reset_to_target, slab_clearance, @@ -70,11 +76,13 @@ from .observations import ( vision_camera, ) from .rewards import ( + DeformableComGoalDistance, contacts, contact_count, - deformable_com_goal_distance, + deformable_com_ee_distance, + deformable_com_goal_reached, + deformable_lifting, deformable_ee_distance, - deformable_lifted, gripper_close_action, object_ee_distance, orientation_command_error_tanh, @@ -84,10 +92,10 @@ from .rewards import ( success_reward, ) from .terminations import ( + deformable_outside_bounds, abnormal_robot_state, - deformable_com_below_minimum, - deformable_outside_table_bounds, ee_below_minimum, + joint_vel_out_of_sim_limit, object_reached_goal, out_of_bound, ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/__init__.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/__init__.py index 83f55101029b..e14e0f6d52c5 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/__init__.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/__init__.py @@ -3,4 +3,6 @@ # # SPDX-License-Identifier: BSD-3-Clause -from .pose_commands_cfg import * # noqa: F401, F403 +from isaaclab.utils.module import lazy_export + +lazy_export() diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/__init__.pyi b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/__init__.pyi index 50695b343506..0a9bc6289bb3 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/__init__.pyi +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/__init__.pyi @@ -4,7 +4,8 @@ # SPDX-License-Identifier: BSD-3-Clause __all__ = [ + "DeformableUniformPoseCommandCfg", "ObjectUniformPoseCommandCfg", ] -from .pose_commands_cfg import ObjectUniformPoseCommandCfg +from .pose_commands_cfg import DeformableUniformPoseCommandCfg, ObjectUniformPoseCommandCfg diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/pose_commands.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/pose_commands.py index b0165e452ee3..a21173c8f3e9 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/pose_commands.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/pose_commands.py @@ -13,15 +13,16 @@ import torch +from isaaclab.assets import AssetBaseCfg from isaaclab.managers import CommandTerm from isaaclab.utils.leapp import POSE7_ELEMENT_NAMES from isaaclab.utils.math import combine_frame_transforms, compute_pose_error, quat_from_euler_xyz, quat_unique if TYPE_CHECKING: - from isaaclab.assets import Articulation, RigidObject + from isaaclab.assets import Articulation, DeformableObject, RigidObject from isaaclab.envs import ManagerBasedEnv - from . import pose_commands_cfg as dex_cmd_cfgs + from .pose_commands_cfg import DeformableUniformPoseCommandCfg, ObjectUniformPoseCommandCfg class ObjectUniformPoseCommand(CommandTerm): @@ -49,10 +50,10 @@ class ObjectUniformPoseCommand(CommandTerm): and optional visualization settings. """ - cfg: dex_cmd_cfgs.ObjectUniformPoseCommandCfg + cfg: ObjectUniformPoseCommandCfg """Configuration for the command generator.""" - def __init__(self, cfg: dex_cmd_cfgs.ObjectUniformPoseCommandCfg, env: ManagerBasedEnv): + def __init__(self, cfg: ObjectUniformPoseCommandCfg, env: ManagerBasedEnv): """Initialize the command generator class. Args: @@ -65,10 +66,16 @@ def __init__(self, cfg: dex_cmd_cfgs.ObjectUniformPoseCommandCfg, env: ManagerBa # extract the robot and body index for which the command is generated self.robot: Articulation = env.scene[cfg.asset_name] self.object: RigidObject = env.scene[cfg.object_name] + self.success_vis_asset: RigidObject | AssetBaseCfg | None if cfg.success_vis_asset_name in env.scene.keys(): - self.success_vis_asset: RigidObject = env.scene[cfg.success_vis_asset_name] + self.success_vis_asset = env.scene[cfg.success_vis_asset_name] else: self.success_vis_asset = None + if isinstance(self.success_vis_asset, AssetBaseCfg): + offset = torch.tensor(self.success_vis_asset.init_state.pos, device=self.device) + self._static_success_vis_pos_w = env.scene.env_origins + offset + else: + self._static_success_vis_pos_w = None # create buffers # -- commands: (x, y, z, qx, qy, qz, qw) in root frame @@ -134,9 +141,13 @@ def _update_metrics(self): self.metrics["orientation_error"] = torch.linalg.norm(rot_error, dim=-1) success_id &= self.metrics["orientation_error"] < 0.5 if self.success_vis_asset is not None: - self.success_visualizer.visualize( - self.success_vis_asset.data.root_pos_w.torch, marker_indices=success_id.int() - ) + self.success_visualizer.visualize(self._get_success_vis_pos_w(), marker_indices=success_id.int()) + + def _get_success_vis_pos_w(self) -> torch.Tensor: + """Return the success visualization positions in the world frame.""" + if self._static_success_vis_pos_w is not None: + return self._static_success_vis_pos_w + return self.success_vis_asset.data.root_pos_w.torch def _resample_command(self, env_ids: Sequence[int]): # sample new pose targets @@ -194,3 +205,40 @@ def _debug_vis_callback(self, event): self.goal_visualizer.visualize(self.pose_command_w[:, :3], marker_indices=success_id + 1) # -- current object position self.curr_visualizer.visualize(obj_pos, marker_indices=success_id + 1) + + +class DeformableUniformPoseCommand(ObjectUniformPoseCommand): + """Uniform position command for a deformable object, tracked by its center of mass. + + Deformable objects expose no root orientation, so the target is tracked with the COM + (:attr:`~isaaclab.assets.DeformableObject.data.root_pos_w`) and only ``position_only`` + commands are supported. + """ + + cfg: DeformableUniformPoseCommandCfg + """Configuration for the command generator.""" + + object: DeformableObject + """The deformable object tracked by the command.""" + + def __init__(self, cfg: DeformableUniformPoseCommandCfg, env: ManagerBasedEnv): + if not cfg.position_only: + raise ValueError("DeformableUniformPoseCommand only supports position_only commands.") + super().__init__(cfg, env) + + def _update_metrics(self): + # transform command from base frame to simulation world frame + self.pose_command_w[:, :3], self.pose_command_w[:, 3:] = combine_frame_transforms( + self.robot.data.root_pos_w.torch, + self.robot.data.root_quat_w.torch, + self.pose_command_b[:, :3], + self.pose_command_b[:, 3:], + ) + com_w = self.object.data.root_pos_w.torch + self.metrics["position_error"] = torch.linalg.norm(self.pose_command_w[:, :3] - com_w, dim=-1) + + if self.success_vis_asset is None: + return + # same success radius as the goal markers of the base class + success_id = (self.metrics["position_error"] < 0.05).int() + self.success_visualizer.visualize(self._get_success_vis_pos_w(), marker_indices=success_id) diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/pose_commands_cfg.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/pose_commands_cfg.py index b43523c45738..5836818e4627 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/pose_commands_cfg.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/commands/pose_commands_cfg.py @@ -13,7 +13,7 @@ from isaaclab.utils.configclass import configclass if TYPE_CHECKING: - from .pose_commands import ObjectUniformPoseCommand + from .pose_commands import DeformableUniformPoseCommand, ObjectUniformPoseCommand ALIGN_MARKER_CFG = VisualizationMarkersCfg( markers={ @@ -94,3 +94,10 @@ class Ranges: prim_path="/Visuals/SuccessMarkers", markers={} ) """The configuration for the success visualization marker. User needs to add the markers""" + + +@configclass +class DeformableUniformPoseCommandCfg(ObjectUniformPoseCommandCfg): + """Configuration for the deformable uniform pose command generator.""" + + class_type: type["DeformableUniformPoseCommand"] | str = "{DIR}.pose_commands:DeformableUniformPoseCommand" diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/curriculums.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/curriculums.py index 5bc6129e1986..8a3884fad20c 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/curriculums.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/curriculums.py @@ -83,3 +83,26 @@ def __call__( # Python float: downstream ADR terms compare and interpolate host-side self.difficulty_frac = (torch.mean(self.current_adr_difficulties) / max(max_difficulty, 1)).item() return self.difficulty_frac + + +def gravity_range_linear( + env: ManagerBasedRLEnv, + _env_ids: Sequence[int], + event_name: str, + start_gravity_z: float, + end_gravity_z: float, + start_step: int, + end_step: int, +) -> dict[str, float]: + """Linearly ramp an event's deterministic vertical gravity [m/s^2].""" + if end_step <= start_step: + raise ValueError("end_step must be greater than start_step.") + + alpha = (env.common_step_counter - start_step) / (end_step - start_step) + alpha = min(max(alpha, 0.0), 1.0) + gravity_z = start_gravity_z + alpha * (end_gravity_z - start_gravity_z) + gravity = [0.0, 0.0, gravity_z] + event_cfg = env.event_manager.get_term_cfg(event_name) + event_cfg.params["gravity_distribution_params"] = (gravity, gravity.copy()) + env.event_manager.set_term_cfg(event_name, event_cfg) + return {"gravity_z": gravity_z} diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/events.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/events.py index cc4f86a2a3ef..ce7e843b00ad 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/events.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/events.py @@ -31,7 +31,7 @@ if TYPE_CHECKING: from collections.abc import Sequence - from isaaclab.assets import Articulation + from isaaclab.assets import Articulation, DeformableObject, RigidObject from isaaclab.envs import ManagerBasedEnv, ManagerBasedRLEnv from .events_cfg import GraspTravelDistanceCfg, MeshClearanceCfg, SlabClearanceCfg, SuccessMonitorCfg @@ -897,3 +897,51 @@ def __call__(self, env: ManagerBasedEnv, env_ids: torch.Tensor) -> torch.Tensor: device=env.device, ) return wp.to_torch(out_min) >= self.cfg.min_clearance + + +def reset_deformable_over_support( + env: ManagerBasedEnv, + env_ids: torch.Tensor, + position_range: dict[str, tuple[float, float]], + clear_gap_range: tuple[float, float], + support_cfg: tuple[SceneEntityCfg, SceneEntityCfg], + asset_cfg: SceneEntityCfg = SceneEntityCfg("deformable"), +) -> None: + """Reset a deformable object and move its supports with it. + + Args: + env: The environment instance. + env_ids: The environment indices to reset. + position_range: Deformable displacement bounds [m] keyed by ``x``, ``y``, ``z``. The planar + displacement is shared with the supports. + clear_gap_range: Clear gap bounds [m] for a support pair. + support_cfg: Negative-Y and positive-Y support pair. + asset_cfg: Scene entity of the deformable object to reset. + """ + deformable: DeformableObject = env.scene[asset_cfg.name] + supports: tuple[RigidObject, RigidObject] = (env.scene[support_cfg[0].name], env.scene[support_cfg[1].name]) + + ranges = torch.tensor([position_range.get(key, (0.0, 0.0)) for key in ("x", "y", "z")], device=deformable.device) + offset = sample_uniform(ranges[:, 0], ranges[:, 1], (len(env_ids), 3), device=deformable.device) + + nodal_state = deformable.data.default_nodal_state_w.torch[env_ids].clone() + nodal_state[..., :3] += offset.unsqueeze(1) + deformable.write_nodal_state_to_sim_index(nodal_state, env_ids=env_ids) + + root_poses = [support.data.default_root_pose.torch[env_ids].clone() for support in supports] + for root_pose in root_poses: + root_pose[:, :3] += env.scene.env_origins[env_ids] + root_pose[:, :2] += offset[:, :2] + + gap = sample_uniform(*clear_gap_range, (len(env_ids),), device=supports[0].device) + center_y = 0.5 * (root_poses[0][:, 1] + root_poses[1][:, 1]) + thickness_neg = supports[0].cfg.spawn.size[1] + thickness_pos = supports[1].cfg.spawn.size[1] + root_poses[0][:, 1] = center_y - 0.5 * (gap + thickness_neg) + root_poses[1][:, 1] = center_y + 0.5 * (gap + thickness_pos) + + for support, root_pose in zip(supports, root_poses): + support.write_root_pose_to_sim_index(root_pose=root_pose, env_ids=env_ids) + support.write_root_velocity_to_sim_index( + root_velocity=torch.zeros_like(support.data.default_root_vel.torch[env_ids]), env_ids=env_ids + ) diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/observations.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/observations.py index a7b253906b0b..69b280ee3ae3 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/observations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/observations.py @@ -9,7 +9,6 @@ from typing import TYPE_CHECKING import torch -import warp as wp from isaaclab.managers import ManagerTermBase, SceneEntityCfg from isaaclab.utils.math import quat_apply, quat_apply_inverse, quat_inv, quat_mul, subtract_frame_transforms @@ -269,8 +268,8 @@ def deformable_com_in_robot_root_frame( """Position of the deformable object's COM in the robot's root frame [m].""" asset: DeformableObject = env.scene[asset_cfg.name] robot: Articulation = env.scene[robot_cfg.name] - com_w = wp.to_torch(asset.data.root_pos_w) - com_b, _ = subtract_frame_transforms(wp.to_torch(robot.data.root_pos_w), wp.to_torch(robot.data.root_quat_w), com_w) + com_w = asset.data.root_pos_w.torch + com_b, _ = subtract_frame_transforms(robot.data.root_pos_w.torch, robot.data.root_quat_w.torch, com_w) return com_b diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/rewards.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/rewards.py index 54cdff0fa54b..7d148153f871 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/rewards.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/rewards.py @@ -10,9 +10,8 @@ from typing import TYPE_CHECKING import torch -import warp as wp -from isaaclab.managers import ManagerTermBase, SceneEntityCfg +from isaaclab.managers import ManagerTermBase, RewardTermCfg, SceneEntityCfg from isaaclab.utils import math as math_utils from isaaclab.utils.math import combine_frame_transforms, compute_pose_error @@ -370,15 +369,17 @@ def __call__( return self._progress(quat_distance, gate, min_improvement, command) -def deformable_lifted( +def deformable_lifting( env: ManagerBasedRLEnv, + std: float, minimal_height: float, asset_cfg: SceneEntityCfg = SceneEntityCfg("deformable"), ) -> torch.Tensor: - """Reward if the deformable COM is above a minimum height.""" + """Reward lifting the deformable COM above ``minimal_height`` [m] with a tanh kernel (``std`` [m]).""" asset: DeformableObject = env.scene[asset_cfg.name] - com_z = wp.to_torch(asset.data.root_pos_w)[:, 2] - return torch.where(com_z > minimal_height, 1.0, 0.0) + com_z = asset.data.root_pos_w.torch[:, 2] + height = (com_z - minimal_height).clamp(min=0.0) + return torch.tanh(height / std) def deformable_ee_distance( @@ -387,33 +388,85 @@ def deformable_ee_distance( asset_cfg: SceneEntityCfg = SceneEntityCfg("deformable"), ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), ) -> torch.Tensor: - """Reward reaching the deformable's nearest nodal point with the end-effector.""" + """Reward end-effector proximity to the nearest deformable node with a tanh kernel (``std`` [m]).""" asset: DeformableObject = env.scene[asset_cfg.name] ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] - nodal_pos_w = wp.to_torch(asset.data.nodal_pos_w) - ee_w = wp.to_torch(ee_frame.data.target_pos_w)[..., 0, :] + nodal_pos_w = asset.data.nodal_pos_w.torch + ee_w = ee_frame.data.target_pos_w.torch[..., 0, :] distance = torch.linalg.norm(nodal_pos_w - ee_w.unsqueeze(1), dim=2).min(dim=1).values return 1.0 - torch.tanh(distance / std) -def deformable_com_goal_distance( +def deformable_com_ee_distance( env: ManagerBasedRLEnv, std: float, - minimal_height: float, - command_name: str, - robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), asset_cfg: SceneEntityCfg = SceneEntityCfg("deformable"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), ) -> torch.Tensor: - """Reward tracking of the goal position by the deformable's COM.""" + """Reward end-effector proximity to the deformable COM with a tanh kernel (``std`` [m]).""" + asset: DeformableObject = env.scene[asset_cfg.name] + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + com_w = asset.data.root_pos_w.torch + ee_w = ee_frame.data.target_pos_w.torch[..., 0, :] + distance = torch.linalg.norm(com_w - ee_w, dim=1) + return 1.0 - torch.tanh(distance / std) + + +def _deformable_com_goal_metrics( + env: ManagerBasedRLEnv, + minimal_height: float, + command_name: str, + robot_cfg: SceneEntityCfg, + asset_cfg: SceneEntityCfg, +) -> tuple[torch.Tensor, torch.Tensor]: + """Compute deformable COM goal distance and lifted state.""" robot: Articulation = env.scene[robot_cfg.name] asset: DeformableObject = env.scene[asset_cfg.name] command = env.command_manager.get_command(command_name) - des_pos_w, _ = combine_frame_transforms( - wp.to_torch(robot.data.root_pos_w), wp.to_torch(robot.data.root_quat_w), command[:, :3] - ) - com_w = wp.to_torch(asset.data.root_pos_w) - distance = torch.linalg.norm(des_pos_w - com_w, dim=1) - return (com_w[:, 2] > minimal_height) * (1.0 - torch.tanh(distance / std)) + des_pos_w, _ = combine_frame_transforms(robot.data.root_pos_w.torch, robot.data.root_quat_w.torch, command[:, :3]) + com_w = asset.data.root_pos_w.torch + return torch.linalg.norm(des_pos_w - com_w, dim=1), com_w[:, 2] > minimal_height + + +class DeformableComGoalDistance(ManagerTermBase): + """Reward deformable COM goal tracking and log episode success.""" + + def __init__(self, cfg: RewardTermCfg, env: ManagerBasedRLEnv): + super().__init__(cfg, env) + self._succeeded = torch.zeros(env.num_envs, dtype=torch.bool, device=env.device) + + def reset(self, env_ids: Sequence[int] | None = None) -> None: + if env_ids is None: + env_ids = slice(None) + self._env.extras.setdefault("log", {})["Metrics/success_rate"] = self._succeeded[env_ids].float().mean().item() + self._succeeded[env_ids] = False + + def __call__( + self, + env: ManagerBasedRLEnv, + std: float, + minimal_height: float, + command_name: str, + success_threshold: float, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + asset_cfg: SceneEntityCfg = SceneEntityCfg("deformable"), + ) -> torch.Tensor: + distance, is_lifted = _deformable_com_goal_metrics(env, minimal_height, command_name, robot_cfg, asset_cfg) + self._succeeded |= is_lifted & (distance < success_threshold) + return is_lifted.float() * (1.0 - torch.tanh(distance / std)) + + +def deformable_com_goal_reached( + env: ManagerBasedRLEnv, + minimal_height: float, + command_name: str, + success_threshold: float, + robot_cfg: SceneEntityCfg = SceneEntityCfg("robot"), + asset_cfg: SceneEntityCfg = SceneEntityCfg("deformable"), +) -> torch.Tensor: + """Reward the deformable COM for reaching the lifted goal.""" + distance, is_lifted = _deformable_com_goal_metrics(env, minimal_height, command_name, robot_cfg, asset_cfg) + return (is_lifted & (distance < success_threshold)).float() def gripper_close_action(env: ManagerBasedRLEnv, action_name: str = "gripper_action") -> torch.Tensor: diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/terminations.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/terminations.py index 166bd9e805db..add6bdfd4287 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/terminations.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/terminations.py @@ -88,36 +88,52 @@ def object_reached_goal( return torch.linalg.norm(des_pos_w - object.data.root_pos_w.torch[:, :3], dim=1) < threshold -def deformable_com_below_minimum( +def ee_below_minimum( env: ManagerBasedRLEnv, minimum_height: float, - asset_cfg: SceneEntityCfg = SceneEntityCfg("deformable"), + ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), ) -> torch.Tensor: - """Return whether the deformable object's COM is below the minimum height [m].""" - asset: DeformableObject = env.scene[asset_cfg.name] - return wp.to_torch(asset.data.root_pos_w)[:, 2] < minimum_height + """Return whether the end-effector is below the minimum environment-frame height [m].""" + ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] + ee_z = wp.to_torch(ee_frame.data.target_pos_w)[..., 0, 2] - env.scene.env_origins[:, 2] + return ee_z < minimum_height -def deformable_outside_table_bounds( +def deformable_outside_bounds( env: ManagerBasedRLEnv, x_bounds: tuple[float, float], y_bounds: tuple[float, float], + z_bounds: tuple[float, float], asset_cfg: SceneEntityCfg = SceneEntityCfg("deformable"), ) -> torch.Tensor: - """Return whether any deformable node left the table footprint [m].""" + """Terminate if any deformable nodal point leaves the allowed workspace box. + + Covers both leaving the table footprint (x, y) and being dropped off it (z). + + Args: + env: The environment instance. + x_bounds: Allowed x-position range in the environment frame [m]. + y_bounds: Allowed y-position range in the environment frame [m]. + z_bounds: Allowed z-position range in the environment frame [m]. + asset_cfg: The deformable object entity. + + Returns: + Boolean tensor with shape ``(num_envs,)``. + """ asset: DeformableObject = env.scene[asset_cfg.name] - nodal_pos = wp.to_torch(asset.data.nodal_pos_w) - env.scene.env_origins.unsqueeze(1) - outside_x = (nodal_pos[..., 0] < x_bounds[0]) | (nodal_pos[..., 0] > x_bounds[1]) - outside_y = (nodal_pos[..., 1] < y_bounds[0]) | (nodal_pos[..., 1] > y_bounds[1]) - return torch.any(outside_x | outside_y, dim=1) + nodal_pos = asset.data.nodal_pos_w.torch - env.scene.env_origins.unsqueeze(1) + lower = torch.tensor([x_bounds[0], y_bounds[0], z_bounds[0]], device=nodal_pos.device) + upper = torch.tensor([x_bounds[1], y_bounds[1], z_bounds[1]], device=nodal_pos.device) + return ((nodal_pos < lower) | (nodal_pos > upper)).flatten(1).any(dim=1) -def ee_below_minimum( - env: ManagerBasedRLEnv, - minimum_height: float, - ee_frame_cfg: SceneEntityCfg = SceneEntityCfg("ee_frame"), +def joint_vel_out_of_sim_limit( + env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot") ) -> torch.Tensor: - """Return whether the end-effector is below the minimum environment-frame height [m].""" - ee_frame: FrameTransformer = env.scene[ee_frame_cfg.name] - ee_z = wp.to_torch(ee_frame.data.target_pos_w)[..., 0, 2] - env.scene.env_origins[:, 2] - return ee_z < minimum_height + """Terminate when joint velocities exceed actuator simulator limits [m/s or rad/s, depending on joint type].""" + asset: Articulation = env.scene[asset_cfg.name] + joint_ids = asset_cfg.joint_ids if asset_cfg.joint_ids is not None else slice(None) + limits = torch.full_like(asset.data.joint_vel.torch, torch.inf) + for actuator in asset.actuators.values(): + limits[:, actuator.joint_indices] = actuator.velocity_limit_sim + return torch.any(torch.abs(asset.data.joint_vel.torch[:, joint_ids]) > limits[:, joint_ids], dim=1) diff --git a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/utils.py b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/utils.py index 83d13fd70285..907f347f2689 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/utils.py +++ b/source/isaaclab_tasks/isaaclab_tasks/core/lift/mdp/utils.py @@ -12,16 +12,13 @@ import numpy as np import torch -import trimesh -from trimesh.sample import sample_surface - -from pxr import UsdGeom, UsdPhysics import isaaclab.sim as sim_utils from isaaclab import cloner -from isaaclab.utils.mesh import PRIMITIVE_MESH_TYPES, create_trimesh_from_geom_mesh, create_trimesh_from_geom_shape if TYPE_CHECKING: + import trimesh + from isaaclab.envs import ManagerBasedEnv # ---- module-scope caches ---- @@ -47,6 +44,11 @@ def sample_object_point_cloud(num_envs: int, num_points: int, prim_path: str, de Returns: torch.Tensor: Shape (num_envs, num_points, 3) on `device`. """ + import trimesh + from trimesh.sample import sample_surface + + from pxr import UsdGeom + points = torch.zeros((num_envs, num_points, 3), dtype=torch.float32, device=device) xform_cache = UsdGeom.XformCache() # Obtain stage handle @@ -186,6 +188,8 @@ def sample_object_point_cloud(num_envs: int, num_points: int, prim_path: str, de def _triangulate_faces(prim) -> np.ndarray: """Convert a USD Mesh prim into triangulated face indices (N, 3).""" + from pxr import UsdGeom + mesh = UsdGeom.Mesh(prim) counts = mesh.GetFaceVertexCountsAttr().Get() indices = mesh.GetFaceVertexIndicesAttr().Get() @@ -200,6 +204,10 @@ def _triangulate_faces(prim) -> np.ndarray: def create_primitive_mesh(prim): """Create a trimesh mesh from a USD primitive (Cube, Sphere, Cylinder, etc.).""" + import trimesh + + from pxr import UsdGeom + prim_type = prim.GetTypeName() if prim_type == "Cube": size = UsdGeom.Cube(prim).GetSizeAttr().Get() @@ -270,6 +278,12 @@ def farthest_point_sampling( def collect_collision_meshes(root_prim, owner_frame_fn: Callable) -> dict[int, trimesh.Trimesh]: """Collect collision meshes under ``root_prim``, grouped in caller-selected frames.""" + import trimesh + + from pxr import UsdPhysics + + from isaaclab.utils.mesh import PRIMITIVE_MESH_TYPES, create_trimesh_from_geom_mesh, create_trimesh_from_geom_shape + mesh_types = PRIMITIVE_MESH_TYPES + ["Mesh"] mesh_prims = sim_utils.get_all_matching_child_prims( root_prim.GetPath(), diff --git a/source/isaaclab_tasks/test/core/test_franka_deformable_ovphysx_cfg.py b/source/isaaclab_tasks/test/core/test_franka_deformable_ovphysx_cfg.py deleted file mode 100644 index 7ae19992fda8..000000000000 --- a/source/isaaclab_tasks/test/core/test_franka_deformable_ovphysx_cfg.py +++ /dev/null @@ -1,78 +0,0 @@ -# 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 - -"""Sim-free regression tests for the Franka deformable OvPhysX presets.""" - -import pytest -from isaaclab_ovphysx.physics import OvPhysxCfg -from isaaclab_physx.sim.schemas import PhysxDeformableBodyPropertiesCfg -from isaaclab_physx.sim.spawners.materials import ( - PhysxDeformableBodyMaterialCfg, - PhysxSurfaceDeformableBodyMaterialCfg, -) - -from isaaclab_tasks.core.lift.config.franka_soft.franka_cloth_env_cfg import ( - FrankaClothCameraEnvCfg, - FrankaClothEnvCfg, -) -from isaaclab_tasks.core.lift.config.franka_soft.franka_soft_env_cfg import FrankaSoftCameraEnvCfg, FrankaSoftEnvCfg -from isaaclab_tasks.utils.hydra import resolve_presets - - -def test_soft_task_ovphysx_preset_selects_complete_authored_scene(): - """Test that the soft-task OvPhysX preset selects a fully authored scene.""" - cfg = resolve_presets(FrankaSoftEnvCfg(), ("ovphysx",)) - - assert isinstance(cfg.sim.physics, OvPhysxCfg) - assert cfg.scene.replicate_physics is True - assert isinstance(cfg.scene.deformable.spawn.deformable_props, PhysxDeformableBodyPropertiesCfg) - assert isinstance(cfg.scene.deformable.spawn.physics_material, PhysxDeformableBodyMaterialCfg) - - -def test_cloth_task_ovphysx_preset_selects_complete_authored_scene(): - """Test that the cloth-task OvPhysX preset selects a fully authored scene.""" - cfg = resolve_presets(FrankaClothEnvCfg(), ("ovphysx",)) - - assert isinstance(cfg.sim.physics, OvPhysxCfg) - assert cfg.scene.replicate_physics is True - assert isinstance(cfg.scene.deformable.spawn.deformable_props, PhysxDeformableBodyPropertiesCfg) - assert isinstance(cfg.scene.deformable.spawn.physics_material, PhysxSurfaceDeformableBodyMaterialCfg) - assert cfg.events.robot_physics_material.params["asset_cfg"].body_names is None - - -@pytest.mark.parametrize( - ("env_cfg_type", "material_type"), - [ - (FrankaSoftCameraEnvCfg, PhysxDeformableBodyMaterialCfg), - (FrankaClothCameraEnvCfg, PhysxSurfaceDeformableBodyMaterialCfg), - ], -) -def test_camera_task_ovphysx_preset_selects_complete_authored_scene(env_cfg_type, material_type): - """Test that each camera-task OvPhysX preset selects a fully authored scene.""" - cfg = resolve_presets(env_cfg_type(), ("ovphysx",)) - - assert isinstance(cfg.sim.physics, OvPhysxCfg) - assert cfg.scene.replicate_physics is True - assert isinstance(cfg.scene.deformable.spawn.deformable_props, PhysxDeformableBodyPropertiesCfg) - assert isinstance(cfg.scene.deformable.spawn.physics_material, material_type) - - -def test_cloth_rendering_variant_applies_deterministic_overrides(): - """Test that the rendering test applies overrides after preset resolution.""" - from rendering_test_utils import _configure_franka_camera_test_env_cfg - - expected_range = { - "x": (0.0, 0.0), - "y": (0.0, 0.0), - "z": (0.0, 0.0), - } - - cfg = resolve_presets(FrankaClothCameraEnvCfg(), ("ovphysx",)) - _configure_franka_camera_test_env_cfg(cfg, "rgb") - - assert cfg.scene.num_envs == 4 - assert cfg.scene.replicate_physics is True - assert cfg.scene.base_camera.data_types == ["rgb"] - assert cfg.events.reset_deformable.params["position_range"] == expected_range diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-albedo.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-albedo.png index 42e69d19b19d..a0d55a494943 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-albedo.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-albedo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:acb2d13fde971a265e03879f4513cb8c3b092a57a19dd8e70b009c4f5ad93175 -size 3505 +oid sha256:681ad4705a9dd09a7edb0158035e46cc33600e23f6966959ca899349158d8f4c +size 2525 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-depth.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-depth.png index 711ef0911810..bf4ace0da15b 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-depth.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-depth.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:273294b5c95dce4ad856c8634eef70f8bb1daf5421b517c64e58b0eda89d348f -size 5580 +oid sha256:f1d5c2b8910af5f60967d290479a1eb3e1f6729ec9c6a2fa0fa8fc39f5f04546 +size 5285 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-distance_to_camera.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-distance_to_camera.png index 67f0362b3c45..5b154c0cbaca 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-distance_to_camera.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-distance_to_camera.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44152261cc3b4f1c4006d4fd0e00d8c6e41508d368f2aa49b20b045ef0c59912 -size 8370 +oid sha256:518744fd846c0baffc6f0466310197e400b232ea34520a08c33003f391b5b8cb +size 8203 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-distance_to_image_plane.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-distance_to_image_plane.png index 711ef0911810..bf4ace0da15b 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-distance_to_image_plane.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-distance_to_image_plane.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:273294b5c95dce4ad856c8634eef70f8bb1daf5421b517c64e58b0eda89d348f -size 5580 +oid sha256:f1d5c2b8910af5f60967d290479a1eb3e1f6729ec9c6a2fa0fa8fc39f5f04546 +size 5285 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-motion_vectors.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-motion_vectors.png index 7f6b210c807f..ebe0b24f0ea6 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-motion_vectors.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-motion_vectors.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e0c479c30692fcd9c68fd95bb7d8e5cccf05bb15ae95833d9ed552a9e2dca5b6 -size 87598 +oid sha256:78cfa9736ee67be69e3182917c07612b38e6eee27d880bcf90388f90f4a35e5b +size 85214 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-normals.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-normals.png index 05e0ef9e7cbc..ec3b5a55aced 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-normals.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-normals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b501587dc19e6406cb6c7fa16d5f3fed4e009d731916669bbefc7d952f48208 -size 11359 +oid sha256:a0e132c5026079c35f3b0ee298cb2ac2fd9c3c68635b2e0c8df88332de44745d +size 8806 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-rgb.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-rgb.png index d7c0c239db61..fc061d1be687 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-rgb.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-rgb.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:933c55a54cb7f18d3bb5bde9caed8911bcfd0e3ae148da8b3d3d6152f5d83f38 -size 70675 +oid sha256:7054ffdb4aca4dd14b0f05ad6e23c57f5f2c91660a56eb9b48292d2cb281f6ad +size 55101 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-rgba.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-rgba.png index 76d5ae1e0284..6e614aac9e7f 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-rgba.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-rgba.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d363a645d2c73c54d51d1486202605e22c92db20322fcb6d9dd5521af245f693 -size 80253 +oid sha256:c8ba61103ea9d8d850ce4f6ee032ff778be62d6943356325e33a0c4f68880f94 +size 62423 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-semantic_segmentation.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-semantic_segmentation.png index 5aa8e401d7dd..fdd565b19e7b 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-semantic_segmentation.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-semantic_segmentation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8bc3af754282d7c728d11b0ddc6caae572ab9d0e15cf032d0eb58a447537dee5 -size 1795 +oid sha256:7bde1ea2df2fef5ae08af2d1dff169da63dd5e0bac5f60643a5714eb169831ce +size 1815 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_constant_diffuse.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_constant_diffuse.png index c6f0b41a3b59..6fcf68d86e1d 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_constant_diffuse.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_constant_diffuse.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b573053a24aa706f9c7292baaacb476fef99a3a3e07dcbd9ea8d26effc19f5c -size 6588 +oid sha256:4f17971f2ccb96537c92f875bf27598765efccf57fee1a5e49c14e09131167c0 +size 6553 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png index ac26cc85df3b..ca939f94c9e8 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_diffuse_mdl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:df9cf746fa55b6b48406f222e0e5bcaaef1af87ed159a3ccf2f59afa0d653814 -size 12433 +oid sha256:5782d982f92d628780cd87124aa942fbcfbcf8a0e1ed3256dc94be8826f01c1a +size 6145 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_full_mdl.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_full_mdl.png index 2c2a4f41dcd7..b966803325a4 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_full_mdl.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-isaacsim_rtx_renderer-simple_shading_full_mdl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d042aa5ee1a0b833cf17a27dc401e48180a05ad4f21c5db58201873f23e8ecf1 -size 19129 +oid sha256:334fff329af13a16d0590a5480276ef45dae000c16376522cae6d9fd79ac17ff +size 6580 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-depth.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-depth.png index ad9ed5fe66ce..14324ecc430a 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-depth.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-depth.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:53f79be8a4c780c25627697f9f7f294d327cb0f74f39afc770cce7ea0ccc8f81 -size 5507 +oid sha256:9d78060e399b6ed318487ef0899d851d14d2a8beace199f74460d43fb547eb29 +size 5386 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-distance_to_camera.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-distance_to_camera.png index 3ab9641f9b7f..a53f1d9abb1b 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-distance_to_camera.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-distance_to_camera.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:111f7ad5e04354eea1c229bff1b5a3728e0d6a13bc599d2383d747c2c5aae5f8 -size 8338 +oid sha256:f6efa234f0f9b6e0abaf05782388a5addeb69fdf63d4d93b7653d22fa58587f4 +size 6925 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-distance_to_image_plane.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-distance_to_image_plane.png index ad9ed5fe66ce..14324ecc430a 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-distance_to_image_plane.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-distance_to_image_plane.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:53f79be8a4c780c25627697f9f7f294d327cb0f74f39afc770cce7ea0ccc8f81 -size 5507 +oid sha256:9d78060e399b6ed318487ef0899d851d14d2a8beace199f74460d43fb547eb29 +size 5386 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-instance_segmentation.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-instance_segmentation.png index 7ec7b523b8f0..eef2164f0b29 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-instance_segmentation.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-instance_segmentation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21c754c059727aa7578cf1b3fb3e83cd350856930cdf3d5f9398515020d7dc81 -size 1845 +oid sha256:7eec0aa7af51af6ee009f0635fe8f482d41e62629ecc6b169efbec2722c0cb51 +size 1962 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-normals.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-normals.png index 47e1232d5ebb..d17d2161f593 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-normals.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-normals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a52da32686e6ad15d069b5b28b2bf3d00ad4afd6249f1920ca8c2462555ad91 -size 11399 +oid sha256:fe815122a2f987c2d15a1f319ea74f9fd007ad14ea06313fcb564cf398b3684a +size 8772 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-rgb.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-rgb.png index 1d78148011ca..fedd4ab70d0b 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-rgb.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-rgb.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:926fb780e5cfeebd3f2e2c1705eabe97b2f1a7678fc861348dbaced80e8179f1 -size 17088 +oid sha256:a6a9c1ef5b2f85b96162bcdee9a346b9afc25fca2d2ee35e2a6b8a1001de0300 +size 7511 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-rgba.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-rgba.png index 25dc2f46709b..78435d860243 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-rgba.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-rgba.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bc8478c22e935e7fda9b5cb9f62f8061ea231a07c369f22403439c45a5126bc0 -size 18559 +oid sha256:4da1644ee16cc8bd7e4224776875939fdbaed12f5281cf076fa5d01193fb4c08 +size 8420 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-semantic_segmentation.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-semantic_segmentation.png index 7ec7b523b8f0..eef2164f0b29 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-semantic_segmentation.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-newton_renderer-semantic_segmentation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21c754c059727aa7578cf1b3fb3e83cd350856930cdf3d5f9398515020d7dc81 -size 1845 +oid sha256:7eec0aa7af51af6ee009f0635fe8f482d41e62629ecc6b169efbec2722c0cb51 +size 1962 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-depth.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-depth.png index cd7f90fbb1bc..2ff032805f99 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-depth.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-depth.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0e1470a382cd4fc96051181f778f5286c037bd53bbae434a728cd2efa72921f5 -size 5511 +oid sha256:b479fa2fb74850c5c06ad8b1753b5fa9086f2aacd1c2a2b248a072e98771087e +size 5102 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-distance_to_camera.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-distance_to_camera.png index 3624db05566c..5dd08e8452f2 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-distance_to_camera.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-distance_to_camera.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5baf09216fd1510ae05cd29daceaf05a169bffa1a63e808123aae1c257d00bef -size 8368 +oid sha256:c81aae6e761eac2272d2cb868f3c92867a104b26a3c8dbaf21999679b02b8fce +size 6997 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-distance_to_image_plane.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-distance_to_image_plane.png index cd7f90fbb1bc..2ff032805f99 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-distance_to_image_plane.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-distance_to_image_plane.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0e1470a382cd4fc96051181f778f5286c037bd53bbae434a728cd2efa72921f5 -size 5511 +oid sha256:b479fa2fb74850c5c06ad8b1753b5fa9086f2aacd1c2a2b248a072e98771087e +size 5102 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-normals.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-normals.png index 6fc53f9e12dc..0d9fb7292754 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-normals.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-normals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ac7ee649988dc1ed594e94a6d7986e737ba637f4ce7ed7ff50a53e5b4188299 -size 11440 +oid sha256:0dfcbc04a5ed96bc60ec30f50ba9b476ba401c5e715eafdf9033758ba22abd7b +size 8655 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-rgb.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-rgb.png index a062ad8ae346..330bf5b2b9ee 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-rgb.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-rgb.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6eacfd3505b68deebbe923144e96b77a6284012604ef7d406a83bfa35cab4f41 -size 67633 +oid sha256:d5572f40e5955966d92945f009920804bffb5abc11124ef0996aa86f23c6c470 +size 56733 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-rgba.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-rgba.png index 995301b52bce..e0db87533b00 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-rgba.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-rgba.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44db7d91cdef095f28406e6a8b6354c8eaeee1fa0cb4ac2621bfebd0fb5f5149 -size 76484 +oid sha256:5018e97c85552722cebecae9fefb3657cca12e498e18d276b5d3c7fa56c32e3c +size 64085 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-semantic_segmentation.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-semantic_segmentation.png index 666f7312cbd9..49f741965276 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-semantic_segmentation.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-semantic_segmentation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c656767dd7d45fd1431f8f06cee1356c2589c7976c8040a6c1f23cd515ee801e -size 1846 +oid sha256:c13851c1bc005f70fbf99c32007595bb6a2710b9a9616db16efdd80b43f9bc0a +size 1821 diff --git a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-simple_shading_constant_diffuse.png b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-simple_shading_constant_diffuse.png index 11c51c6c8179..f9157ba21b8c 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-simple_shading_constant_diffuse.png +++ b/source/isaaclab_tasks/test/golden_images/franka_cloth/newton-ovrtx_renderer-simple_shading_constant_diffuse.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:253b0714539cb939c98a7cc5c181c786031eb4eabe745302e2b7ce085c416ee8 -size 6697 +oid sha256:034c2954607dc208770ea613ea53f043a7589a5395e7ba1a8c717d13ea1c88ac +size 6279 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-depth.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-depth.png index 530f28274995..bbf5fc512301 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-depth.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-depth.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2d3828c079618552d3a132e25f554ac27106ffdd64b6f499c6543b54c770b138 -size 6081 +oid sha256:4dbe26a2857bb1c229b4446226e19d7c1dc7210d8a7f39cae1c5cf501bc239cd +size 5123 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-distance_to_camera.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-distance_to_camera.png index 7de7b3325c1d..1b27fb1d228b 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-distance_to_camera.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-distance_to_camera.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:918fd2530ed68d70529028ef60867cd56b2a8efd26be84ee8488f72bd23f3db9 -size 8479 +oid sha256:3ddbe27266855f6c4df179db5b8f6819182b56e201c3c11d4bd1998543ada5b4 +size 6703 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-distance_to_image_plane.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-distance_to_image_plane.png index ce6b85679b69..e612796b908c 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-distance_to_image_plane.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-distance_to_image_plane.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:22bd7d4649db97d46f30492b083470c010a77afbdf27b1eb011fb8a1ecc43ccd -size 6078 +oid sha256:b98677241749f1271b5249ef8d90daa1ec50886c2c92ac0e3a49e471b0012377 +size 5150 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-instance_segmentation.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-instance_segmentation.png index 4d5ee409be29..b8bec8372baa 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-instance_segmentation.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-instance_segmentation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3e75ef63e0f0f69817f9c36fc618f925ba268e64398a51b50339fc3338eac34 -size 1755 +oid sha256:eb532890e98edf274bf911a82827f9e7c6597d96f1c6d067ff1cbd591d28fedd +size 1950 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-normals.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-normals.png index 8e39fb81ced5..e74afac22cb2 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-normals.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-normals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ccb78b56a3ab50dd99b13a51dbe9c0c6e9a202716cee2a967afeab6e81333c9d -size 11709 +oid sha256:e072e540f5cb2b233bc3a6b69bdd1e3af0f7445d2db1d1a34bbb12dfe29bb628 +size 9430 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-rgb.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-rgb.png index 5644bd16beaf..dd1a45c1dec9 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-rgb.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-rgb.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8df0b09fc94387d5069ab000de59999e1a1a1ef8038b50c233e1b13b84cd0efa -size 16941 +oid sha256:285c351e009103596d129a60ab26b05154f213a2c5f83a735ca8b294e1c5e66c +size 8044 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-rgba.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-rgba.png index de292d525b3f..6fbb544679ca 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-rgba.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-rgba.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b209e65b34d4126a885e027f944f6cef431049cf8e7268bc04b24106499b6c12 -size 18281 +oid sha256:aad39f20fe3ed06713d7d163d67542604afecc6f893d67b07bde8c4235847f84 +size 9017 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-semantic_segmentation.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-semantic_segmentation.png index 4d5ee409be29..b20f8498f230 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-semantic_segmentation.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-newton_renderer-semantic_segmentation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3e75ef63e0f0f69817f9c36fc618f925ba268e64398a51b50339fc3338eac34 -size 1755 +oid sha256:3071bcfb4795aa7836b234c866e1a87c98ddf65d260f8f80a9b28fdab411cf7c +size 1953 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-depth.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-depth.png index 4f12f32fb34e..9bbf4a3b2520 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-depth.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-depth.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b32abdf7960c2f606412f875e2434cde1f9dc5dc01310c95b43e22b26a40c5ab -size 6129 +oid sha256:da02b96a41c3b8bc9ab180157965518d7cec394d2ca83385a9f21f4d39731f8a +size 5092 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-distance_to_camera.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-distance_to_camera.png index 18bac55d83f1..ff82f958a739 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-distance_to_camera.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-distance_to_camera.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a5e15d04671b1dab95395de331ce4c7dbfd13cb92609f6353d3f8135f597d77 -size 8551 +oid sha256:06b49efa5086f516208e7344fdb07536219c05462fe7093c6a18988aa71e1246 +size 6778 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-distance_to_image_plane.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-distance_to_image_plane.png index 6520c7e3f764..145be02345e2 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-distance_to_image_plane.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-distance_to_image_plane.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a9dc7f8fe16b6da8e465f1a89e7691bbd8fb894e4f2c7fd35a12b027a0b71a8b -size 6090 +oid sha256:e6812bc09dca198fb3426958e47b57482095ebfd0c5fae8ea27fc6a4719ab7ec +size 5112 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-normals.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-normals.png index f4885df1f1e0..a5887702b1f4 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-normals.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-normals.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a67cd6b0053fcaa8e996e53eb90ce9b9013d4f2bc0add8e8bd2a29d72eeaab90 -size 11640 +oid sha256:ea8d45efec21f740549ddf400935648bcad391a629d9c7e9090c1942ff98484f +size 9193 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-rgb.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-rgb.png index 92b34e6d236d..c476ba908e8d 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-rgb.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-rgb.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0302755af03f11993bbc0262778356570dd7684b58cd5bde02da3c227ff6f365 -size 71123 +oid sha256:633c99609eef497fe6e0ec9268bf87b911548fdae908fadb831154e16613361d +size 55364 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-rgba.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-rgba.png index 2c711bce97f5..59e9e91becba 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-rgba.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-rgba.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6524a521740b67c61a9a2172a53f2bdd089908180f6e73380bf9f6489ff6d0e8 -size 80442 +oid sha256:fa31ef9e47006e3644b5d4a26876068d0c0958e66cda193696fb54370865e2c4 +size 62686 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-semantic_segmentation.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-semantic_segmentation.png index 48bb8fa36f4c..810a4cd3a16b 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-semantic_segmentation.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-semantic_segmentation.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7eb07b37baefb619634d5642fd67d09a9649555e8f038b750eaba97ee5085506 -size 1755 +oid sha256:c25c0b94385da81d647fec563925deb9d32b389028b414db2bd51cc6bd9f5fcc +size 1790 diff --git a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-simple_shading_constant_diffuse.png b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-simple_shading_constant_diffuse.png index 98456156a1c7..335c08c8bb4e 100644 --- a/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-simple_shading_constant_diffuse.png +++ b/source/isaaclab_tasks/test/golden_images/franka_soft/newton-ovrtx_renderer-simple_shading_constant_diffuse.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a6f4b1dabd68efc0600c6db3c711f6226caadef22cf59f57a2f87a0d1bcc9df -size 6902 +oid sha256:db81b6c28a30bc5d8c8121ad50d835b842993015f51a5584d1b5c1219820ad68 +size 6890