Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
0d21518
Add flat Franka asset and backend body-resolution support
maxkra15 Sep 29, 2026
7d4731f
Migrate Franka Reach and Drawer to flat asset
maxkra15 Sep 29, 2026
b0f54b4
Update Franka environment browser presets
maxkra15 Sep 29, 2026
4f84d15
Verify backend payload selection for cabinet IK
maxkra15 Sep 29, 2026
e1ffab9
Scope shared-asset tests to migrated rigid tasks
maxkra15 Sep 29, 2026
c40b2ad
Preserve Franka compatibility and fix direct clone matching
maxkra15 Sep 29, 2026
69031a3
Align Reach preset test with preserved Menagerie asset
maxkra15 Sep 29, 2026
6f4affd
Keep published Menagerie URL during Franka migration
maxkra15 Sep 29, 2026
b78c6f0
Preserve mixed body matches and correct Franka migration defaults
maxkra15 Sep 30, 2026
f73ea42
Merge remote-tracking branch 'origin/develop' into maximiliank/franka…
maxkra15 Sep 30, 2026
6158468
Address Franka task migration review feedback
maxkra15 Sep 30, 2026
c51cced
Merge develop into Franka Reach and Drawer migration
maxkra15 Sep 30, 2026
a949270
Select PhysX explicitly in controller tutorials
maxkra15 Sep 30, 2026
691c593
Declare the canonical Franka configuration independently
maxkra15 Sep 30, 2026
453e8fb
Simplify inherited Franka IK controller settings
maxkra15 Sep 30, 2026
2840585
Merge remote-tracking branch 'origin/develop' into maximiliank/franka…
maxkra15 Sep 30, 2026
27cd131
Merge remote-tracking branch 'origin/develop' into maximiliank/franka…
maxkra15 Sep 30, 2026
2b64e78
Migrate Franka changelog fragments to Towncrier
maxkra15 Sep 30, 2026
3a7432f
Migrate Franka task changelogs to Towncrier fragments
maxkra15 Sep 30, 2026
2bf8ac2
Merge branch 'maximiliank/franka-flat-backend-upstream' into maximili…
maxkra15 Sep 30, 2026
7fd9f45
Merge develop and resolve Franka main config migration
StafaH Oct 1, 2026
8108835
Clarify Franka migration names and retain behavioral alias coverage
StafaH Oct 1, 2026
58bd446
Merge remote-tracking branch 'origin/develop' into maximiliank/franka…
maxkra15 Oct 1, 2026
e58a1f5
Separate Franka asset migration and add explicit minimal Reach task
maxkra15 Oct 1, 2026
25ad1ec
Document the full-collision Franka configuration migration
maxkra15 Oct 1, 2026
90960d4
Fix Franka migration CI regressions
maxkra15 Oct 1, 2026
817b5bf
Move Franka collision guidance out of the environment browser
maxkra15 Oct 1, 2026
6cf973c
Replace minimal Franka task with Reach and Lift presets
StafaH Oct 1, 2026
4123063
Update Franka asset guidance to use the minimal preset
StafaH Oct 1, 2026
123d489
Merge remote-tracking branch 'upstream/develop' into pr-8170-minimal-…
StafaH Oct 1, 2026
d38266b
Remove Franka collision scope documentation
StafaH Oct 1, 2026
6e9075a
Prune redundant Franka migration test coverage
StafaH Oct 1, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/source/_static/css/environment-browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,16 @@
["Isaac-Lift-Cable-Franka-Camera", "rsl_rl", "newton_mjwarp_vbd_proxy", "isaacsim_rtx,newton_renderer,ovrtx", "ik,joint", "tasks/manipulation/franka_lift_cable.jpg", false, {"*": ["joint"]}],
["Isaac-Lift-Cloth-Franka", "rsl_rl", "isaacsim_physx,newton_mjwarp_vbd_proxy", "", "ik,joint", "tasks/manipulation/franka_lift_cloth.jpg", false, {"*": ["joint"]}],
["Isaac-Lift-Cloth-Franka-Camera", "rsl_rl", "isaacsim_physx,newton_mjwarp_vbd_proxy", "isaacsim_rtx,newton_renderer,ovrtx", "ik,joint", "tasks/manipulation/franka_lift_cloth.jpg", false, {"*": ["joint"]}],
["Isaac-Lift-Franka", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "cube,shapes", "", false, {"*": ["shapes"]}],
["Isaac-Lift-Franka", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "cube,minimal,shapes", "", false, {"*": ["shapes"]}],
["Isaac-Lift-KukaAllegro", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "cube,shapes", "tasks/manipulation/kuka_allegro_lift.jpg", false, {"*": ["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", "tasks/manipulation/kuka_allegro_lift.jpg", false, {"*": ["rgb64", "shapes", "single_camera"]}],
["Isaac-Lift-Soft-Franka", "rsl_rl", "isaacsim_physx,newton_mjwarp_vbd_proxy", "", "ik,joint", "newton/franka-mjwarp-vbd-coupling.png", false, {"*": ["joint"]}, {}, "tetrahedralization"],
["Isaac-Lift-Soft-Franka-Camera", "rsl_rl", "isaacsim_physx,newton_mjwarp_vbd_proxy", "isaacsim_rtx,newton_renderer,ovrtx", "ik,joint", "newton/franka-mjwarp-vbd-coupling.png", false, {"*": ["joint"]}, {}, "tetrahedralization"],
["Isaac-Open-Drawer-Franka-Direct", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "tasks/manipulation/franka_open_drawer.jpg"],
["Isaac-Open-Drawer-Franka", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "tasks/manipulation/franka_open_drawer.jpg"],
["Isaac-Pendulum-MARL-Direct", "rl_games,skrl", "isaacsim_physx,newton_kamino,newton_mjwarp,ovphysx", "", "", "tasks/classic/cart_double_pendulum.jpg", false, {}, {"skrl": "MAPPO"}],
["Isaac-Reach-Franka", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "diffik,diffik_abs,joint_pos,newton_ik", "tasks/manipulation/franka_reach.jpg", true, {"*": ["joint_pos"]}],
["Isaac-Reach-Franka-OSC", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "diffik_abs", "tasks/manipulation/franka_reach.jpg", false, {"*": ["diffik_abs"]}],
["Isaac-Reach-Franka", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "diffik,diffik_abs,joint_pos,minimal,newton_ik", "tasks/manipulation/franka_reach.jpg", true, {"*": ["joint_pos"]}],
["Isaac-Reach-Franka-OSC", "rsl_rl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "diffik_abs,minimal", "tasks/manipulation/franka_reach.jpg", false, {"*": ["diffik_abs"]}],
["Isaac-Reach-UR10", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "tasks/manipulation/ur10_reach.jpg", true],
["Isaac-RenderBenchmark-Franka-Cabinet", "", "isaacsim_physx,newton_mjwarp,ovphysx", "isaacsim_rtx,newton_renderer,ovrtx", "albedo,depth,rgb,simple_shading_constant_diffuse,simple_shading_diffuse_mdl,simple_shading_full_mdl", "", false, {"*": ["rgb"]}],
["Isaac-Reorient-Cube-Allegro-Direct", "rl_games,rsl_rl,skrl", "isaacsim_physx,newton_mjwarp,ovphysx", "", "", "tasks/manipulation/allegro_cube.jpg", true],
Expand Down
5 changes: 3 additions & 2 deletions examples/haply_teleoperation.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ class FrankaHaplySceneCfg(InteractiveSceneCfg):
robot = instantiate(robot_cfg)
robot.init_state.pos = (-0.02, 0.0, 1.05)
robot.spawn.activate_contact_sensors = True
robot.spawn.variants["Physics"] = "mujoco" if args_cli.physics == "newton_mjwarp" else "physx"

cube = RigidObjectCfg(
prim_path="{ENV_REGEX_NS}/Cube",
Expand All @@ -146,15 +147,15 @@ class FrankaHaplySceneCfg(InteractiveSceneCfg):
)

left_finger_contact_sensor = ContactSensorCfg(
prim_path="{ENV_REGEX_NS}/Robot/panda_leftfinger",
prim_path="{ENV_REGEX_NS}/Robot/(Geometry/.*/)?panda_leftfinger",
update_period=0.0,
history_length=3,
debug_vis=True,
track_pose=True,
)

right_finger_contact_sensor = ContactSensorCfg(
prim_path="{ENV_REGEX_NS}/Robot/panda_rightfinger",
prim_path="{ENV_REGEX_NS}/Robot/(Geometry/.*/)?panda_rightfinger",
update_period=0.0,
history_length=3,
debug_vis=True,
Expand Down
8 changes: 6 additions & 2 deletions scripts/tutorials/05_controllers/run_diff_ik.py
Comment thread
maxkra15 marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
The differential IK controller can be configured in different modes. It uses the Jacobians computed by
PhysX. This helps perform parallelized computation of the inverse kinematics.

The Franka high-PD preset uses the same USD and effort limits as the base preset, with stiffer gains
for tracking IK targets. Other tasks can retain their calibrated actuator gains.

.. code-block:: bash

# Usage
Expand Down Expand Up @@ -53,7 +56,7 @@
##
# Pre-defined configs
##
from isaaclab_assets import FRANKA_PANDA_LEGACY_HIGH_PD_CFG, UR10_CFG # isort:skip
from isaaclab_assets import FRANKA_PANDA_HIGH_PD_CFG, UR10_CFG # isort:skip


@configclass
Expand Down Expand Up @@ -82,7 +85,8 @@ class TableTopSceneCfg(InteractiveSceneCfg):

# articulation
if args_cli.robot == "franka_panda":
robot = replace(FRANKA_PANDA_LEGACY_HIGH_PD_CFG, prim_path="{ENV_REGEX_NS}/Robot")
robot = replace(FRANKA_PANDA_HIGH_PD_CFG, prim_path="{ENV_REGEX_NS}/Robot")
robot.spawn.variants["Physics"] = "physx"
elif args_cli.robot == "ur10":
robot = replace(UR10_CFG, prim_path="{ENV_REGEX_NS}/Robot")
else:
Expand Down
11 changes: 5 additions & 6 deletions scripts/tutorials/05_controllers/run_osc.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
##
# Pre-defined configs
##
from isaaclab_assets import FRANKA_PANDA_LEGACY_HIGH_PD_CFG # isort:skip
from isaaclab_assets import FRANKA_PANDA_HIGH_PD_CFG # isort:skip


@configclass
Expand Down Expand Up @@ -97,11 +97,10 @@ class SceneCfg(InteractiveSceneCfg):
debug_vis=False,
)

robot = replace(FRANKA_PANDA_LEGACY_HIGH_PD_CFG, prim_path="{ENV_REGEX_NS}/Robot")
robot.actuators["panda_shoulder"].stiffness = 0.0
robot.actuators["panda_shoulder"].damping = 0.0
robot.actuators["panda_forearm"].stiffness = 0.0
robot.actuators["panda_forearm"].damping = 0.0
robot = replace(FRANKA_PANDA_HIGH_PD_CFG, prim_path="{ENV_REGEX_NS}/Robot")
robot.spawn.variants["Physics"] = "physx"
robot.actuators["panda_arm"].stiffness = 0.0
robot.actuators["panda_arm"].damping = 0.0
robot.spawn.rigid_props.disable_gravity = True


Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Added an ``offset`` to ``DifferentialInverseKinematicsActionCfg`` so normalized policies can use
an affine task-space action transform. The default is zero and preserves existing configurations.
Empty file.
2 changes: 2 additions & 0 deletions source/isaaclab/isaaclab/envs/mdp/actions/actions_cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,8 @@ class OffsetCfg:
"""Offset of target frame w.r.t. to the body frame. Defaults to None, in which case no offset is applied."""
scale: float | tuple[float, ...] = 1.0
"""Scale factor for the action. Defaults to 1.0."""
offset: float | tuple[float, ...] = 0.0
"""Offset applied to the scaled action in controller-specific units. Defaults to 0.0."""
controller: DifferentialIKControllerCfg = MISSING
"""The configuration for the differential IK controller."""

Expand Down
22 changes: 14 additions & 8 deletions source/isaaclab/isaaclab/envs/mdp/actions/task_space_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,23 +34,25 @@
class DifferentialInverseKinematicsAction(ActionTerm):
r"""Inverse Kinematics action term.

This action term performs pre-processing of the raw actions using scaling transformation.
This action term pre-processes raw actions using an affine transformation.

.. math::
\text{action} = \text{scaling} \times \text{input action}
\text{action} = \text{offset} + \text{scaling} \times \text{input action}
\text{joint position} = J^{-} \times \text{action}

where :math:`\text{scaling}` is the scaling applied to the input action, and :math:`\text{input action}`
is the input action from the user, :math:`J` is the Jacobian over the articulation's actuated joints,
and \text{joint position} is the desired joint position command for the articulation's joints.
where :math:`\text{offset}` and :math:`\text{scaling}` define the affine transformation,
:math:`\text{input action}` is the input action from the user, :math:`J` is the Jacobian over the
articulation's actuated joints, and \text{joint position} is the desired joint position command.
"""

cfg: actions_cfg.DifferentialInverseKinematicsActionCfg
"""The configuration of the action term."""
_asset: Articulation
"""The articulation asset on which the action term is applied."""
_scale: torch.Tensor
"""The scaling factor applied to the input action. Shape is (1, action_dim)."""
"""The scaling factor applied to the input action. Shape is (num_envs, action_dim)."""
_offset: torch.Tensor
"""The offset applied to the scaled action. Shape is (num_envs, action_dim)."""
_clip: torch.Tensor
"""The clip applied to the input action."""

Expand Down Expand Up @@ -100,9 +102,11 @@ def __init__(self, cfg: actions_cfg.DifferentialInverseKinematicsActionCfg, env:
# owned buffer; _compute_frame_jacobian mutates this, not the data-layer view.
self._jacobian_b = torch.zeros(self.num_envs, 6, len(self._jacobi_joint_ids), device=self.device)

# save the scale as tensors
# save the affine transform as tensors
self._scale = torch.zeros((self.num_envs, self.action_dim), device=self.device)
self._scale[:] = torch.tensor(self.cfg.scale, device=self.device)
self._offset = torch.zeros((self.num_envs, self.action_dim), device=self.device)
self._offset[:] = torch.tensor(self.cfg.offset, device=self.device)

# convert the fixed offsets to torch tensors of batched shape
if self.cfg.body_offset is not None:
Expand Down Expand Up @@ -160,6 +164,7 @@ def IO_descriptor(self) -> GenericActionIODescriptor:
- body_name: The name of the body.
- joint_names: The names of the joints.
- scale: The scale of the action term.
- offset: The offset of the action term.
- clip: The clip of the action term.
- controller_cfg: The configuration of the controller.
- body_offset: The offset of the body.
Expand All @@ -174,6 +179,7 @@ def IO_descriptor(self) -> GenericActionIODescriptor:
self._IO_descriptor.body_name = self._body_name
self._IO_descriptor.joint_names = self._joint_names
self._IO_descriptor.scale = self._scale
self._IO_descriptor.offset = self._offset
if self.cfg.clip is not None:
self._IO_descriptor.clip = self.cfg.clip
else:
Expand All @@ -189,7 +195,7 @@ def IO_descriptor(self) -> GenericActionIODescriptor:
def process_actions(self, actions: torch.Tensor):
# store the raw actions
self._raw_actions[:] = actions
self._processed_actions[:] = self.raw_actions * self._scale
self._processed_actions[:] = self.raw_actions * self._scale + self._offset
if self.cfg.clip is not None:
self._processed_actions = torch.clamp(
self._processed_actions, min=self._clip[:, :, 0], max=self._clip[:, :, 1]
Expand Down
4 changes: 2 additions & 2 deletions source/isaaclab/test/controllers/test_differential_ik.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
##
# Pre-defined configs
##
from isaaclab_assets import FRANKA_PANDA_LEGACY_HIGH_PD_CFG, UR10_CFG # isort:skip
from isaaclab_assets import FRANKA_PANDA_HIGH_PD_CFG, UR10_CFG # isort:skip

pytestmark = pytest.mark.integration

Expand Down Expand Up @@ -441,7 +441,7 @@ def test_franka_ik_pose_abs(sim):
sim_context, num_envs, ee_pose_b_des_set = sim

# Create robot instance
robot_cfg = replace(FRANKA_PANDA_LEGACY_HIGH_PD_CFG, prim_path="{ENV_REGEX_NS}/Robot")
robot_cfg = replace(FRANKA_PANDA_HIGH_PD_CFG, prim_path="{ENV_REGEX_NS}/Robot")
robot = Articulation(cfg=robot_cfg)

# Create IK controller
Expand Down
1 change: 1 addition & 0 deletions source/isaaclab/test/controllers/test_operational_space.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ def sim():
# clone the env xform
cloner.usd_replicate(stage, [env_fmt.format(0)], [env_fmt], env_ids, positions=env_origins)

# Keep controller regressions on their original plant; canonical asset parity is tested by each backend.
robot_cfg = replace(FRANKA_PANDA_LEGACY_CFG, prim_path="{ENV_REGEX_NS}/Robot")
# Explicit torque actuators enforce effort limits on the commands sent to the simulator.
for actuator_name in ("panda_shoulder", "panda_forearm"):
Expand Down
39 changes: 38 additions & 1 deletion source/isaaclab/test/envs/test_diffik_jacobian_aliasing.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#
# SPDX-License-Identifier: BSD-3-Clause

"""Regression tests for task-space body offsets and DiffIK Jacobian aliasing (NVBug 6043099).
"""Tests for task-space action processing, body offsets, and Jacobian aliasing (NVBug 6043099).

``DifferentialInverseKinematicsAction._compute_frame_jacobian`` historically
aliased the parent Jacobian and applied the body-offset correction in place.
Expand All @@ -19,6 +19,8 @@
import pytest
import torch

from isaaclab.controllers import DifferentialIKControllerCfg
from isaaclab.envs.mdp.actions.actions_cfg import DifferentialInverseKinematicsActionCfg
from isaaclab.envs.mdp.actions.task_space_actions import (
DifferentialInverseKinematicsAction,
OperationalSpaceControllerAction,
Expand Down Expand Up @@ -63,6 +65,41 @@ def _make_stub(num_envs: int, num_joints: int, body_offset_pos, body_offset_rot,
return _Stub(num_envs, num_joints, body_offset_pos, body_offset_rot, backing_buffer)


def test_process_actions_applies_scale_then_offset(monkeypatch: pytest.MonkeyPatch) -> None:
"""DiffIK actions use the configured affine transformation before reaching the controller."""
num_envs = 2
controller_cfg = DifferentialIKControllerCfg(command_type="position", use_relative_mode=False, ik_method="dls")
cfg = DifferentialInverseKinematicsActionCfg(
asset_name="robot",
joint_names=[".*"],
body_name="tool",
scale=(0.5, 2.0, -1.0),
offset=(0.1, -0.2, 0.3),
controller=controller_cfg,
)
asset = SimpleNamespace(
find_joints=lambda _names: ([0, 1, 2], ["joint1", "joint2", "joint3"]),
find_bodies=lambda _name: ([0], ["tool"]),
num_joints=3,
num_base_dofs=0,
is_fixed_base=False,
)
env = SimpleNamespace(scene={"robot": asset}, num_envs=num_envs, device="cpu")
action = DifferentialInverseKinematicsAction(cfg, env)
ee_pos = torch.zeros(num_envs, 3)
ee_quat = torch.tensor([[0.0, 0.0, 0.0, 1.0]]).repeat(num_envs, 1)
monkeypatch.setattr(action, "_compute_frame_pose", lambda: (ee_pos, ee_quat))

raw_actions = torch.tensor([[1.0, -2.0, 0.5], [-1.0, 0.25, -0.5]])
expected = torch.tensor([[0.6, -4.2, -0.2], [-0.4, 0.3, 0.8]])

action.process_actions(raw_actions)

torch.testing.assert_close(action.raw_actions, raw_actions)
torch.testing.assert_close(action.processed_actions, expected)
torch.testing.assert_close(action._ik_controller.ee_pos_des, expected)


def test_compute_frame_jacobian_is_idempotent_within_step():
"""Two consecutive calls under the same state must return identical Jacobians.

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
* Added ``FRANKA_MINIMAL_CFG`` using the same USD and actuator settings as ``FRANKA_PANDA_CFG`` with only
hand and fingertip colliders for applications that do not need arm contacts.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
* **Breaking:** Enabled full primitive arm and gripper collisions in ``FRANKA_PANDA_CFG`` and its high-PD
derivative. Use ``FRANKA_MINIMAL_CFG`` or select ``Colliders=gripper_only`` to retain the previous reduced
collision scope. Requalify policies against the chosen robot configuration.
Empty file.
2 changes: 2 additions & 0 deletions source/isaaclab_assets/isaaclab_assets/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ __all__ = [
"GR1T2_CFG",
"GR1T2_HIGH_PD_CFG",
"FRANKA_PANDA_CFG",
"FRANKA_MINIMAL_CFG",
"FRANKA_PANDA_LEGACY_CFG",
"FRANKA_PANDA_LEGACY_HIGH_PD_CFG",
"FRANKA_PANDA_HIGH_PD_CFG",
Expand Down Expand Up @@ -91,6 +92,7 @@ from .robots import (
GR1T2_CFG,
GR1T2_HIGH_PD_CFG,
FRANKA_PANDA_CFG,
FRANKA_MINIMAL_CFG,
FRANKA_PANDA_LEGACY_CFG,
FRANKA_PANDA_LEGACY_HIGH_PD_CFG,
FRANKA_PANDA_HIGH_PD_CFG,
Expand Down
2 changes: 2 additions & 0 deletions source/isaaclab_assets/isaaclab_assets/robots/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ __all__ = [
"GR1T2_CFG",
"GR1T2_HIGH_PD_CFG",
"FRANKA_PANDA_CFG",
"FRANKA_MINIMAL_CFG",
"FRANKA_PANDA_LEGACY_CFG",
"FRANKA_PANDA_LEGACY_HIGH_PD_CFG",
"FRANKA_PANDA_HIGH_PD_CFG",
Expand Down Expand Up @@ -84,6 +85,7 @@ from .cassie import CASSIE_CFG
from .fourier import GR1T2_CFG, GR1T2_HIGH_PD_CFG
from .franka import (
FRANKA_PANDA_CFG,
FRANKA_MINIMAL_CFG,
FRANKA_PANDA_LEGACY_CFG,
FRANKA_PANDA_LEGACY_HIGH_PD_CFG,
FRANKA_PANDA_HIGH_PD_CFG,
Expand Down
15 changes: 13 additions & 2 deletions source/isaaclab_assets/isaaclab_assets/robots/franka.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
The following configurations are available:

* :obj:`FRANKA_PANDA_CFG`: Shared flat asset for maintained Franka tasks
* :obj:`FRANKA_MINIMAL_CFG`: Shared asset with gripper-only colliders
* :obj:`FRANKA_PANDA_HIGH_PD_CFG`: Flat asset with stiffer PD control
* :obj:`FRANKA_PANDA_LEGACY_CFG`: Legacy asset and actuators
* :obj:`FRANKA_PANDA_LEGACY_HIGH_PD_CFG`: Legacy high-PD configuration
Expand Down Expand Up @@ -98,7 +99,7 @@
FRANKA_PANDA_CFG = ArticulationCfg(
spawn=sim_utils.UsdFileCfg(
usd_path=f"{ISAACLAB_NUCLEUS_DIR}/Robots/FrankaEmika/franka_panda.usda",
variants={"Physics": "physx", "Colliders": "gripper_only"},
variants={"Physics": "physx", "Colliders": "primitives"},
activate_contact_sensors=False,
rigid_props=PhysxRigidBodyCfg(disable_gravity=False, max_depenetration_velocity=5.0),
articulation_props=[
Expand Down Expand Up @@ -138,13 +139,23 @@
"""Configuration of the Franka Emika Panda robot.

The flat asset contains PhysX and MuJoCo physics variants and gripper-only, primitive, and convex-hull
collider variants. The gripper-only collider variant is the default. Explicit solver properties keep
collider variants. Full primitive arm and gripper collisions are enabled by default. Explicit solver properties keep
the actuator contract consistent across physics payloads. Only the leading finger has an active drive;
the authored mimic constraint moves the passive follower. The standalone configuration selects the PhysX
payload by default; direct Newton consumers must select the ``mujoco`` physics variant explicitly.
"""


FRANKA_MINIMAL_CFG = clone(FRANKA_PANDA_CFG)
FRANKA_MINIMAL_CFG.spawn.variants["Colliders"] = "gripper_only"
"""Configuration of Franka with only hand and fingertip collision geometry.

This configuration shares the main USD, inertial properties, actuators, and backend payloads.
Use it when arm contacts are not required to reduce collision-processing cost. Policies must be
qualified for the selected collision scope.
"""


FRANKA_PANDA_HIGH_PD_CFG = clone(FRANKA_PANDA_CFG)
FRANKA_PANDA_HIGH_PD_CFG.spawn.rigid_props.disable_gravity = True
FRANKA_PANDA_HIGH_PD_CFG.actuators["panda_arm"].stiffness = 400.0
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Excluded the robot subtree from cuRobo world obstacles even when custom world ignore substrings were configured.
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@ def _initialize_static_world(self) -> None:

self._static_world_config = self.usd_helper.get_obstacles_from_stage(
only_paths=[env_prim_path],
ignore_paths=[robot_prim_path],
reference_prim_path=robot_prim_path,
ignore_substring=ignore_list,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Corrected zero-agent hold actions for absolute differential IK configured with a nonzero action offset.
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ def pink_policy() -> torch.Tensor:
def differential_ik_policy() -> torch.Tensor:
ee_pos, ee_quat = term._compute_frame_pose()
command = ee_pos if term.cfg.controller.command_type == "position" else torch.cat((ee_pos, ee_quat), dim=-1)
return _unscale_action(command, term._scale)
return _unscale_action(command - term._offset, term._scale)

return differential_ik_policy

Expand Down
Loading
Loading