Skip to content

[Task Clean-up] Dexterous Part 3/8: Add success-rate metrics to the reorientation Direct tasks#6413

Open
hujc7 wants to merge 2 commits into
isaac-sim:developfrom
hujc7:jichuanh/task-cleanup-dex-part03
Open

[Task Clean-up] Dexterous Part 3/8: Add success-rate metrics to the reorientation Direct tasks#6413
hujc7 wants to merge 2 commits into
isaac-sim:developfrom
hujc7:jichuanh/task-cleanup-dex-part03

Conversation

@hujc7

@hujc7 hujc7 commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

Review Map

PR Status Depends on Exact changes
#6410 [Docs] Environment overview regen
#6411 Part 1/8: Newton cloner/cubric/visualizer fixes
#6412 Part 2/8: OVPhysX articulation + manager runtime
📌 #6413 Part 3/8: Reorient Direct, torch (this PR)
#6414 Part 4/8: MARL-to-single-agent fix + handover/camera Direct #6413 changes
#6418 Part 5/8: Reorient manager counterparts #6413 changes
#6421 Part 6/8: Handover + camera manager counterparts #6413, #6414, #6418 changes
#6415 Part 7/8: Benchmark success-rate utilities + docs #6413, #6414, #6418, #6421 changes
#6582 Part 8/8: Warp variants → experimental (draft; merges last) #6413 changes
#6324 [DO-NOT-MERGE] Lumped validation reference ALL

Summary

  • Adds a behavioral Metrics/success_rate signal (goal-reach streaks per episode) and threshold-independent episode orientation-error diagnostics to the Direct reorientation environments; success gates task health, reward stays diagnostic.
  • Task logic is torch-first per the mainline convention (plain torch buffers; .torch accessors only at the core-lib boundary). This supersedes the earlier warp-first revision of this PR; the warp implementation moved to isaaclab_tasks_experimental ([Task Clean-up] Dexterous Part 8/8: Move the warp Direct task variants to isaaclab_tasks_experimental #6582).
  • Lands shared helpers in isaaclab_tasks.core.utils (EpisodeErrorRecorder, sample_joint_positions_within_limits) with torch math tests; fixes hand resets below lower joint limits.

Stacking

  • First stack PR; based on develop.

Validation

Review history

@greptile-apps

greptile-apps Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds behavioral Metrics/success_rate and threshold-independent Diagnostics/episode_min_orientation_error_* metrics to the Direct reorientation environments, and fixes hand resets that could place joints below their lower position limits. New shared helpers (EpisodeErrorRecorder, sample_joint_positions_within_limits) land in isaaclab_tasks.core.utils with unit tests.

  • EpisodeErrorRecorder tracks per-episode minimum orientation error across all active environments, emitting mean/median/p90 aggregates on reset; the recorder carries no success threshold, keeping measurement decoupled from policy.
  • sample_joint_positions_within_limits replaces the old reset logic that could violate lower joint limits by interpolating uniformly between the default position and each joint's sampled limit endpoint, with a final clamp as a safety net.
  • The core reward computation is refactored into direct_reorient_reward in the MDP rewards module, and the compute_rewards wrapper now delegates to it; find_joints/find_bodies replace the manual index-and-sort loops for joint and body discovery.

Confidence Score: 4/5

Safe to merge; all new behaviour is additive (metrics, diagnostics, safer resets) and the reward math is functionally unchanged from the original.

The core reward logic, success tracking, and joint-reset fix are all correct. The two findings are cosmetic: an unreachable torch.abs() on a provably non-negative value, and a repeated quaternion-distance computation (up to three times per step) that produces identical results each time. Neither affects training correctness or runtime safety.

reorient_direct_env.py and mdp/rewards.py are worth a second look for the redundant evaluate_reorient_success calls; no other files require special attention.

Important Files Changed

Filename Overview
source/isaaclab_tasks/isaaclab_tasks/core/utils.py New shared utilities: EpisodeErrorRecorder for threshold-independent episode-minimum tracking, and sample_joint_positions_within_limits for safe joint resets; logic is correct and well-guarded.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/rewards.py Adds direct_reorient_rotation_distance, evaluate_reorient_success, and direct_reorient_reward helpers; a redundant torch.abs() on an already-non-negative value is present in evaluate_reorient_success, and the orientation error is computed multiple times per step.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/reorient_direct_env.py Wires success-rate metrics, orientation-error diagnostics, and fixed joint-reset sampling into the env; evaluate_reorient_success is called up to three times per step (once in _get_dones, once in _get_rewards for the recorder, once inside direct_reorient_reward).
source/isaaclab_tasks/test/core/test_core_utils.py Unit tests for EpisodeErrorRecorder and sample_joint_positions_within_limits; covers boundary cases, invalid inputs, and empty-episode edge cases.
source/isaaclab_tasks/changelog.d/task-cleanup-dex-part03.minor.rst Changelog fragment documenting the added success metrics and joint-limit reset fix.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant Env as ReorientDirectEnv
    participant Dones as _get_dones()
    participant Rewards as _get_rewards()
    participant DRR as direct_reorient_reward()
    participant Rec as EpisodeErrorRecorder
    participant Reset as _reset_idx()

    Env->>Dones: step()
    Dones->>Dones: "evaluate_reorient_success() [if max_consecutive_success > 0]"
    Dones-->>Env: (terminated, truncated)

    Env->>Rewards: _get_rewards()
    Rewards->>Rewards: evaluate_reorient_success() → orientation_error
    Rewards->>Rec: update(orientation_error)
    Rewards->>DRR: compute_rewards() → direct_reorient_reward()
    DRR->>DRR: evaluate_reorient_success() [3rd call, same data]
    DRR-->>Rewards: reward, goal_resets, successes, consecutive_successes
    Rewards-->>Env: total_reward

    Env->>Reset: _reset_idx(env_ids)
    Reset->>Reset: "_last_episode_success = successes >= threshold"
    Reset->>Rec: "reset(env_ids) → {mean, median, p90}"
    Reset->>Reset: log Metrics/success_rate
    Reset->>Reset: "log Diagnostics/episode_min_orientation_error_*"
    Reset->>Reset: sample_joint_positions_within_limits()
    Reset-->>Env: done
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant Env as ReorientDirectEnv
    participant Dones as _get_dones()
    participant Rewards as _get_rewards()
    participant DRR as direct_reorient_reward()
    participant Rec as EpisodeErrorRecorder
    participant Reset as _reset_idx()

    Env->>Dones: step()
    Dones->>Dones: "evaluate_reorient_success() [if max_consecutive_success > 0]"
    Dones-->>Env: (terminated, truncated)

    Env->>Rewards: _get_rewards()
    Rewards->>Rewards: evaluate_reorient_success() → orientation_error
    Rewards->>Rec: update(orientation_error)
    Rewards->>DRR: compute_rewards() → direct_reorient_reward()
    DRR->>DRR: evaluate_reorient_success() [3rd call, same data]
    DRR-->>Rewards: reward, goal_resets, successes, consecutive_successes
    Rewards-->>Env: total_reward

    Env->>Reset: _reset_idx(env_ids)
    Reset->>Reset: "_last_episode_success = successes >= threshold"
    Reset->>Rec: "reset(env_ids) → {mean, median, p90}"
    Reset->>Reset: log Metrics/success_rate
    Reset->>Reset: "log Diagnostics/episode_min_orientation_error_*"
    Reset->>Reset: sample_joint_positions_within_limits()
    Reset-->>Env: done
Loading

Comments Outside Diff (1)

  1. source/isaaclab_tasks/isaaclab_tasks/core/reorient/reorient_direct_env.py, line 202-230 (link)

    P2 Triple orientation-error computation per step

    evaluate_reorient_success is called up to three times each step with the same inputs: once here for the recorder (line 203), once inside direct_reorient_reward via compute_rewards (line 210), and once in _get_dones when max_consecutive_success > 0 (line 252). All three calls produce identical results because no simulation step occurs between them. The raw orientation_error returned by the direct_reorient_reward path is already available inside that function; surfacing it as a fifth return value (or computing it once before the call and passing it in) would eliminate the duplicate work.

Reviews (1): Last reviewed commit: "Add success-rate metrics to the reorient..." | Re-trigger Greptile

Comment on lines +132 to +133
orientation_error = direct_reorient_rotation_distance(object_quat, target_quat)
return torch.abs(orientation_error) <= success_tolerance, orientation_error

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 torch.abs() is redundant here. direct_reorient_rotation_distance computes 2 * arcsin(clamp(norm, max=1)), where the clamped norm is in [0, 1] and arcsin returns [0, π/2], so the product is always in [0, π]. Applying torch.abs on a provably non-negative tensor is a no-op and slightly misleads readers into thinking the value could be negative.

Suggested change
orientation_error = direct_reorient_rotation_distance(object_quat, target_quat)
return torch.abs(orientation_error) <= success_tolerance, orientation_error
orientation_error = direct_reorient_rotation_distance(object_quat, target_quat)
return orientation_error <= success_tolerance, orientation_error

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@AntoineRichard AntoineRichard left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want to move more of our logic to pure warp? Worth to discuss during our Thursday architecture meeting. I am also seeing dramatic speed-ups for newton when we start writing more kernels in the tasks. One of my concerns would mostly be on readability this is quite loaded, and some users may struggle to figure things out with this little information to go on. I think we should be a bit more didactic in the kernel descriptions.

Comment on lines +36 to +179
@wp.kernel
def _out_of_reach_kernel(
object_pos_w: wp.array(dtype=wp.vec3f),
env_origins: wp.array(dtype=wp.vec3f),
target_pos_e: wp.array(dtype=wp.vec3f),
fall_distance: float,
out_of_reach: wp.array(dtype=wp.bool),
):
i = wp.tid()
out_of_reach[i] = wp.length(object_pos_w[i] - env_origins[i] - target_pos_e[i]) >= fall_distance


@wp.kernel
def _full_obs_kernel(
joint_pos: wp.array2d(dtype=wp.float32),
joint_vel: wp.array2d(dtype=wp.float32),
lower: wp.array2d(dtype=wp.float32),
upper: wp.array2d(dtype=wp.float32),
vel_scale: float,
object_pos_w: wp.array(dtype=wp.vec3f),
env_origins: wp.array(dtype=wp.vec3f),
object_quat: wp.array(dtype=wp.quatf),
object_lin_vel: wp.array(dtype=wp.vec3f),
object_ang_vel: wp.array(dtype=wp.vec3f),
in_hand_pos_e: wp.array(dtype=wp.vec3f),
goal_quat: wp.array(dtype=wp.quatf),
body_pos_w: wp.array2d(dtype=wp.vec3f),
body_quat_w: wp.array2d(dtype=wp.quatf),
body_vel_w: wp.array2d(dtype=wp.spatial_vectorf),
finger_ids: wp.array(dtype=wp.int32),
force: wp.array2d(dtype=wp.vec3f),
torque: wp.array2d(dtype=wp.vec3f),
wrench_ids: wp.array(dtype=wp.int32),
force_scale: float,
with_forces: int,
actions: wp.array2d(dtype=wp.float32),
out: wp.array2d(dtype=wp.float32),
):
"""Direct full observation / full state, matching the torch concatenation order.

Launched over ``(num_envs, obs_dim)``: each thread walks a branch ladder over the
segment boundaries and writes one output column, so warps (32 consecutive columns)
stay branch-uniform except at segment boundaries.
"""
i, j = wp.tid()
num_joints = joint_pos.shape[1]
num_fingers = finger_ids.shape[0]
# segment boundaries, in column order
end_joint = 2 * num_joints
end_object = end_joint + 13
end_goal = end_object + 11
end_tip_pos = end_goal + 3 * num_fingers
end_tip_quat = end_tip_pos + 4 * num_fingers
end_tip_vel = end_tip_quat + 6 * num_fingers
end_wrench = end_tip_vel
if with_forces != 0:
end_wrench += 6 * num_fingers
# hand: normalized DOF positions, scaled DOF velocities
if j < num_joints:
out[i, j] = 2.0 * (joint_pos[i, j] - lower[i, j]) / (upper[i, j] - lower[i, j]) - 1.0
elif j < end_joint:
out[i, j] = vel_scale * joint_vel[i, j - num_joints]
# object pose and velocities (environment frame position)
elif j < end_object:
k = j - end_joint
if k < 3:
p = object_pos_w[i] - env_origins[i]
out[i, j] = p[k]
elif k < 7:
out[i, j] = object_quat[i][k - 3]
elif k < 10:
out[i, j] = object_lin_vel[i][k - 7]
else:
out[i, j] = vel_scale * object_ang_vel[i][k - 10]
# goal: in-hand anchor, goal rotation, and the goal-to-object rotation difference
elif j < end_goal:
k = j - end_object
if k < 3:
out[i, j] = in_hand_pos_e[i][k]
elif k < 7:
out[i, j] = goal_quat[i][k - 3]
else:
# quat_inverse == conjugate for these unit quaternions, matching
# isaaclab.utils.math.quat_mul/quat_conjugate semantics
qe = object_quat[i] * wp.quat_inverse(goal_quat[i])
out[i, j] = qe[k - 7]
# fingertips: environment-frame positions, rotations, spatial velocities
elif j < end_tip_pos:
out[i, j] = fingertip_pos_col(body_pos_w, env_origins, finger_ids, i, j - end_goal)
elif j < end_tip_quat:
out[i, j] = fingertip_quat_col(body_quat_w, finger_ids, i, j - end_tip_pos)
elif j < end_tip_vel:
out[i, j] = fingertip_vel_col(body_vel_w, finger_ids, i, j - end_tip_quat)
# fingertip force/torque sensors (full state only; absent when with_forces == 0)
elif j < end_wrench:
if with_forces == 1:
k = j - end_tip_vel
c = k % 6
if c < 3:
out[i, j] = force_scale * force[i, wrench_ids[k // 6]][c]
else:
out[i, j] = force_scale * torque[i, wrench_ids[k // 6]][c - 3]
else:
# full state requested but the sensor has no data yet: zero block
out[i, j] = 0.0
# actions
else:
out[i, j] = actions[i, j - end_wrench]


@wp.kernel
def _reduced_obs_kernel(
body_pos_w: wp.array2d(dtype=wp.vec3f),
env_origins: wp.array(dtype=wp.vec3f),
finger_ids: wp.array(dtype=wp.int32),
object_pos_w: wp.array(dtype=wp.vec3f),
object_quat: wp.array(dtype=wp.quatf),
goal_quat: wp.array(dtype=wp.quatf),
actions: wp.array2d(dtype=wp.float32),
out: wp.array2d(dtype=wp.float32),
):
"""Direct reduced (OpenAI) observation, matching the torch concatenation order."""
i = wp.tid()
num_fingers = finger_ids.shape[0]
for f in range(num_fingers):
fp = body_pos_w[i, finger_ids[f]] - env_origins[i]
out[i, 3 * f + 0] = fp[0]
out[i, 3 * f + 1] = fp[1]
out[i, 3 * f + 2] = fp[2]
idx = 3 * num_fingers
p = object_pos_w[i] - env_origins[i]
# quat_inverse == conjugate for these unit quaternions, matching
# isaaclab.utils.math.quat_mul/quat_conjugate semantics
qe = object_quat[i] * wp.quat_inverse(goal_quat[i])
out[i, idx + 0] = p[0]
out[i, idx + 1] = p[1]
out[i, idx + 2] = p[2]
out[i, idx + 3] = qe[0]
out[i, idx + 4] = qe[1]
out[i, idx + 5] = qe[2]
out[i, idx + 6] = qe[3]
idx += 7
for a in range(actions.shape[1]):
out[i, idx + a] = actions[i, a]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are they not in the re-orient kernel file?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's direct env specific. Is it still prefer to be moved given it's not used by others?

Comment on lines 246 to 248
self.successes = torch.zeros(self.num_envs, dtype=torch.float, device=self.device)
self.consecutive_successes = torch.zeros(1, dtype=torch.float, device=self.device)
self._last_episode_success = torch.zeros(self.num_envs, dtype=torch.bool, device=self.device)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we are going full warp why not use wp.zeros?

Comment on lines +334 to +347
wp.launch(
ema_actuation_kernel,
dim=(self.num_envs, self._actuated_dof_ids_wp.shape[0]),
inputs=[
wp.from_torch(self.actions),
self._lower_limits_wp,
self._upper_limits_wp,
self._actuated_dof_ids_wp,
self.cfg.act_moving_average,
self._prev_targets_wp,
self._cur_targets_wp,
],
outputs=[self._compact_targets_wp],
device=self._compact_targets_wp.device,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For extra speeeeeed we could cache the kernel on the first exec using the record launch command.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will defer those for now. is there a util class merged?

Comment on lines 359 to 364
# RSL-RL holds the observation reference across the next env.step, so hand out
# a per-step snapshot rather than the persistent kernel output buffer.
observations = {"policy": obs.clone()}
if self.cfg.asymmetric_obs:
observations["critic"] = self.compute_full_state()
observations["critic"] = self.compute_full_state().clone()
return observations

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Rather than cloning outside the kernel launch the kernel launch could write to safe pre-allocated warp arrays with cached torch bindings?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rl lib could take the output and keep it more than one step. So properly using a persistent buffer would require a bit more changes. Deferring it for now.

Comment on lines 438 to 442
self.episode_length_buf = torch.where(
torch.abs(rot_dist) <= self.cfg.success_tolerance,
goal_reached,
torch.zeros_like(self.episode_length_buf),
self.episode_length_buf,
)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't the kernel above do the torch.where?

Comment on lines 453 to 455
self.extras.setdefault("log", {})["Metrics/success_rate"] = (
self._last_episode_success[env_ids].float().mean().item()
)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will force a cuda sync, there is a way to avoid this,

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the suggested way?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should have UTs on these kernels?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added.

@hujc7
hujc7 force-pushed the jichuanh/task-cleanup-dex-part03 branch from b1e2a42 to cf21603 Compare July 15, 2026 09:12
Add a behavioral Metrics/success_rate signal (goal-reach streaks per
episode) and threshold-independent episode orientation-error diagnostics
to the Direct reorientation environments, with the shared helpers in
isaaclab_tasks.core.utils and torch math tests. The task logic is
torch-first per the mainline convention; success gates task health while
reward stays diagnostic. Also fix hand resets that could initialize
joints below their lower position limits.
@hujc7
hujc7 force-pushed the jichuanh/task-cleanup-dex-part03 branch from ef2b22c to 6e8a63e Compare July 17, 2026 00:44
@hujc7 hujc7 changed the title [Task Clean-up] Dexterous Part 3/11: Add success-rate metrics to the reorientation Direct tasks [Task Clean-up] Dexterous Part 3: Add success-rate metrics to the reorientation Direct tasks Jul 17, 2026
@hujc7 hujc7 changed the title [Task Clean-up] Dexterous Part 3: Add success-rate metrics to the reorientation Direct tasks [Task Clean-up] Dexterous Part 3/11: Add success-rate metrics to the reorientation Direct tasks Jul 17, 2026
hujc7 added a commit that referenced this pull request Jul 17, 2026
…nager runtime (#6412)

## Summary

- Fixes OVPhysX actuator joint indices to follow the common actuator
indexing contract.
- Fixes OVPhysX initialization alongside Kit by reusing Kit's registered
PhysX schema provider.
- Fixes the OVPhysX manager to support both the declared public runtime
API and the current runtime API.
- Regression tests included. Validated by full dexterous training runs
on the OVPhysX backend; split out of the lumped validation branch #6324
(Part 2 of 11).

## Dependencies

- None.

## Series review map

Full integrated diff + training/validation evidence: the lumped
validation PR #6324
(DO-NOT-MERGE).

| Part | PR |
|---|---|
| Docs: regenerate the environment overview table |
#6410 |
| Part 1/11: Newton runtime fixes (cloner rows, cubric fallback, viz
teardown) | #6411 |
| **Part 2/11: OVPhysX runtime fixes (this PR)** |
#6412 |
| Part 3/11: success-rate metrics for the Direct reorientation tasks |
#6413 |
| Part 4/11: RSL-RL training for the handover Direct task |
#6414 |
| Part 5/11: success-rate support in the benchmark utilities |
#6415 |
| Part 6/11: renderer presets for the Direct camera task |
#6416 |
| Part 7/11: OVPhysX presets for the dexterous tasks |
#6417 |
| Part 8/11: Allegro manager counterpart |
#6418 |
| Part 9/11: Shadow + OpenAI manager counterparts |
#6419 |
| Part 10/11: Shadow camera manager counterpart |
#6420 |
| Part 11/11: Shadow handover manager counterpart |
#6421 |


---
### Exact changes in this PR

- OVPhysX backend changes + tests:
1f7a433
@hujc7 hujc7 changed the title [Task Clean-up] Dexterous Part 3/11: Add success-rate metrics to the reorientation Direct tasks [Task Clean-up] Dexterous Part 3/8: Add success-rate metrics to the reorientation Direct tasks Jul 17, 2026
@hujc7
hujc7 requested a review from StafaH July 17, 2026 23:51
@hujc7

hujc7 commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator Author

Do we want to move more of our logic to pure warp? Worth to discuss during our Thursday architecture meeting. I am also seeing dramatic speed-ups for newton when we start writing more kernels in the tasks. One of my concerns would mostly be on readability this is quite loaded, and some users may struggle to figure things out with this little information to go on. I think we should be a bit more didactic in the kernel descriptions.

@AntoineRichard For this PR, I am updating the torch impl. The already implemented warp one is moving to experimental folder

@hujc7
hujc7 requested a review from AntoineRichard July 18, 2026 09:34
Fold the reviewed lump changes that belong to this part's content:

- Share per-family sim settings through task-cfg base mixins.
- Deduplicate backend scene presets via inner-class defaults and nest
  single-consumer helper cfgs in the shadow-hand Direct cfg.
- Compute the orientation error through
  isaaclab.utils.math.quat_error_magnitude and delete the local
  direct_reorient_rotation_distance primitive.
- Rename direct_reorient_reward to reorient_reward: shared symbols
  carry no paradigm prefix.

Source commits on the lump branch: 2c22af0, 792e400,
42675b6, c6140f9, 173e9dc.
@hujc7
hujc7 requested a review from ooctipus as a code owner July 18, 2026 11:10
@hujc7
hujc7 requested a review from a team July 18, 2026 11:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants