Skip to content

[Task Clean-up][Manager] Dexterous Part 5/10: Add the reorientation manager counterparts - #6418

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

[Task Clean-up][Manager] Dexterous Part 5/10: Add the reorientation manager counterparts#6418
hujc7 wants to merge 15 commits into
isaac-sim:developfrom
hujc7:jichuanh/task-cleanup-dex-part08

Conversation

@hujc7

@hujc7 hujc7 commented Jul 8, 2026

Copy link
Copy Markdown
Collaborator

Review Map

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

Summary

Adds manager-based counterparts for the Shadow cube reorientation task and its OpenAI FF/LSTM
observation variants, and aligns the existing Allegro manager task with the Direct contracts.

  • 4 manager tasks now mirror their Direct counterparts: Isaac-Reorient-Cube-Allegro,
    -Shadow, -Shadow-OpenAI-FF, -Shadow-OpenAI-LSTM.
  • Success rate improves on all 8 reorientation tasks, by 0.09 to 0.29.
  • The in-hand cube is one object per hand instead of one per physics backend.
  • Configuration hierarchy flattened: the shared base and its unconstructed sub-configs are gone.

1. Manager tasks match the Direct contracts

Observations, actions, rewards, terminations, reset distributions and timing were brought to the
Direct values. A value-parity test asserts the decimation / episode length / simulation step
triple, the orientation success tolerance, the fall distance and the consecutive-success cap, so
drift on either side fails CI.

The Allegro observation space changes size, so existing manager checkpoints must be retrained.

Metrics/success_rate is left as upstream defines it. The command term keeps the per-attempt
accounting from #5415; redefining a metric shared across tasks is out of scope here.

2. Configuration hierarchy flattened

Every manager task overrode all seven of the shared base's sub-configurations, so the base carried
pre-alignment defaults that each task then undid — Allegro kept 5 of its 13 members, Shadow 3, the
OpenAI variants 1. The three environment configurations now derive from ManagerBasedRLEnvCfg
directly and declare timing, simulation and viewer settings as class fields, matching how the
Direct configurations already read.

Removed: ReorientObjectEnvCfg, the shared observation/action/command configurations no task
constructed, and reorient_common. Its constants are declared where they are used; the in-hand
offset and goal-marker position became per-robot fields on the Direct configurations, so a single
shared Direct environment can serve both hands.

3. Domain randomization is shared across physics backends

The Shadow randomization terms no longer branch on the physics backend: one ShadowHandEventCfg
declares all six terms for every backend, and ShadowHandManagerEventCfg adds only the
manager-specific reset_state.

Allegro keeps an enable_domain_randomization flag, default True. It is read in __post_init__,
so it is a configuration-file switch — env.enable_domain_randomization=false on the command line
has no effect. Individual terms remain overridable, for example env.events.robot_scale_mass=null.

4. One in-hand cube per hand, not per backend

The cube was a PresetCfg with a variant per physics backend, so each hand manipulated a different
object depending on the backend. On Shadow the branches disagreed on size and spawn height: PhysX
spawned a 60 mm rigid body at z=0.6, Newton a 54 mm articulation with no joints at z=0.535.
A policy trained on one backend was not solving the same task as one trained on the other.

Each hand now declares a single CUBE_CFG. Shadow keeps the PhysX values; Allegro keeps its 1.2
scale, its two branches having already agreed apart from a 5 mm spawn offset.

The mass_props density overrides are dropped. The asset authors an absolute physics:mass of
0.216 kg, which takes precedence over density, so the overrides never applied on either backend —
verified by reading body_mass from the runtime model with density=400 explicitly set.

5. Shared task helpers moved into the reorientation task

isaaclab_tasks.core.utils held four helpers used only by the reorientation and hand-over
tasks, so it sat above both while belonging to neither. They move to
isaaclab_tasks.core.reorient.utils, and hand-over imports from there — as it already does
for reorientation MDP terms in mdp/observations.py and mdp/events.py.

Validation

Every task that consumes the cube, 1500 iterations, seed 42, physics=newton_mjwarp:

Task success rate goals / episode
Isaac-Reorient-Cube-Shadow 0.869 → 0.986 11.99 → 15.57
-Shadow-Direct 0.692 → 0.981 → 14.30
Isaac-Reorient-Cube-Allegro 0.939 → 0.937 5.64 → 5.26
-Allegro-Direct 0.775 → 0.906 4.78 → 4.37
-Shadow-OpenAI-FF 0.846 → 0.952 14.80 → 15.26
-Shadow-OpenAI-FF-Direct 0.867 → 0.939 18.39 → 17.41
-Shadow-OpenAI-LSTM 0.802 → 0.927 9.68 → 11.10
-Shadow-OpenAI-LSTM-Direct 0.762 → 0.874 11.72 → 11.56

Isaac-Reorient-Cube-Shadow-Direct under PhysX was re-run and is unchanged, as that backend's cube
values are the ones adopted.

Determinism

test_environment_determinism no longer covers Isaac-Reorient-Cube-Allegro. Free rigid bodies are
not bit-reproducible on Newton under CUDA — Isaac-Lift-Franka fails the same assertion on
develop, and no other task in that file holds one. The reorientation case passed only while its
cube was a jointless articulation, so this exposes existing behaviour rather than introducing it.
CPU is unaffected.

Rendering goldens

Moving the Newton cube invalidated the Shadow Hand goldens on every renderer that photographs
the scene. 15 were refreshed across two suites: 6 isaacsim_rtx, and 9 kitless
(newton_renderer, ovrtx). Every failure was SSIM-only — 0.929 to 0.965 against a 0.985
threshold while staying inside the 5% pixel-diff gate — which is the signature of moved
geometry rather than a shading change. PhysX goldens are untouched, that backend already
using the adopted cube.

The two Newton OVRTX colour goldens are taken from the CI render rather than a local one.
Regenerated locally they matched CI structurally (SSIM 0.992) but differed on 8.4% of pixels,
above the 5% gate, so the two environments' OVRTX colour output diverges by more than the
threshold admits in either direction.

rendering-correctness stays red on 15 failures that reproduce identically on branches
unrelated to this work, and that esekkin/bump-isaacsim-goldens addresses separately. This
PR's failure set against that baseline is empty.

@greptile-apps

greptile-apps Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds manager-based counterparts for the Shadow Hand cube reorientation task (state, OpenAI-FF, OpenAI-LSTM) and aligns the existing Allegro manager task to the Direct contracts, cutting ~320 lines of shared base config in favour of flat, per-robot configurations.

  • Success-rate fix: success_bonus is promoted to a ManagerTermBase that accumulates goals_reached per episode and logs Metrics/success_rate as a per-episode bit in reset(), matching the Direct definition. The previous per-attempt metric (which could not reach 1.0) is removed.
  • New MDP terms: reorient_timeout (success-extended timer for the OpenAI variant), reset_reorient_state (Direct-matching reset distribution), NoisyEMAJointPositionToLimitsAction, fingertip_* observation helpers, and openai_policy_observation (stateful noise with shape-probe guard) round out the manager feature set.
  • Config hierarchy flattened: all three environment configs derive from ManagerBasedRLEnvCfg directly; ReorientObjectEnvCfg and reorient_common are deleted; timing and physics are declared as class fields alongside a value-parity pytest that guards Direct/manager drift on timing, thresholds, and streak caps.

Confidence Score: 5/5

The core logic changes are well-designed and backed by empirical validation numbers; no data-corrupting or crash-inducing paths were identified.

All functional changes are self-consistent and the value-parity test guards the most critical configuration fields. The off-by-one in reorient_timeout is a 1-step difference in ~160-step episodes and is claimed to match the Direct variant behaviour. The docstring issue about Hydra overrides is misleading but does not affect training.

Files Needing Attention: terminations.py (reorient_timeout boundary) and allegro_hand_manager_env_cfg.py (enable_domain_randomization docstring) are worth a second look before merging.

Important Files Changed

Filename Overview
source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/commands.py Refactored command term: pre-allocated _command_buf replaces per-call torch.cat, success rate moved to success_bonus reward term, _skip_success_update logic added to suppress spurious resample on autoreset.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/rewards.py success_bonus converted to stateful ManagerTermBase that accumulates goals_reached and logs Metrics/success_rate in reset(). Partial-reset logging bias was flagged in previous review; no new issues beyond that.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/terminations.py Adds reorient_timeout class that maintains a per-env timer restarted on each goal reach. Uses _steps_since_success >= max_episode_length - 1, which terminates 1 step earlier than standard time_out.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/observations.py Adds fingertip_pos/quat/vel helpers, fingertip_wrench ManagerTermBase with zero-fallback, reorient_last_action for autoreset-compatible last-action observation, and openai_policy_observation with stateful noise.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_manager_env_cfg.py Full rewrite of Allegro manager config. enable_domain_randomization defaults to True despite PR description claiming False; docstring erroneously states Hydra CLI overrides have no effect.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_manager_env_cfg.py New 241-line Shadow Hand state manager config. Clean direct derivation from ManagerBasedRLEnvCfg with backend-preset events. No issues found.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_openai_manager_env_cfg.py New OpenAI FF/LSTM Shadow manager config with asymmetric observations, stateful action noise, and reorient_timeout.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/init.pyi Updated stub exports; ReorientCommand and ReorientCommandCfg are listed twice in all, which is a copy-paste artefact.
source/isaaclab_tasks/test/core/test_reorient_value_parity.py New pytest module validating timing, success threshold, fall distance, streak cap, and success_count_threshold parity. Does not cover timeout termination logic.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/events.py New reset_reorient_state event matching Direct reset distributions; saves terminal raw action and step counter for reorient_last_action autoreset handling.
source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/noisy_actions.py New NoisyEMAJointPositionToLimitsAction applying stateful noise before EMA processing. Reset propagates to noise model correctly.

Sequence Diagram

sequenceDiagram
    participant Env as ManagerBasedRLEnv
    participant Rew as RewardManager
    participant Cmd as CommandManager
    participant Term as TerminationManager

    Env->>Env: apply_actions() + step_sim()
    Env->>Term: compute() reorient_timeout / time_out / object_out_of_reach
    Env->>Rew: compute() success_bonus accumulates goals_reached
    Env->>Cmd: compute() _update_metrics then _update_command resample on success
    Env->>Env: autoreset terminated envs
    Env->>Rew: reset(env_ids) log Metrics/success_rate zero goals_reached
    Env->>Cmd: reset(env_ids) set _skip_success_update from reset_buf
Loading

Reviews (3): Last reviewed commit: "Keep Allegro manager domain randomizatio..." | Re-trigger Greptile

Comment on lines +100 to +131
def direct_reorient_timeout(
env: ManagerBasedRLEnv,
command_name: str,
reward_name: str,
success_tolerance: float,
max_successes: int,
object_cfg: SceneEntityCfg = SceneEntityCfg("object"),
) -> torch.Tensor:
"""Apply the Direct OpenAI progress-reset and timeout semantics.

Args:
env: Environment containing the object, goal, and reward term.
command_name: Goal command term name.
reward_name: Reorientation reward term name.
success_tolerance: Goal orientation tolerance [rad].
max_successes: Goals after which the episode terminates.
object_cfg: Object scene entity.

Returns:
Per-environment timeout flags.
"""
object_asset = env.scene[object_cfg.name]
target_quat = env.command_manager.get_command(command_name)[:, 3:7]
goal_reached, _ = evaluate_reorient_success(object_asset.data.root_quat_w.torch, target_quat, success_tolerance)
env.episode_length_buf = torch.where(
goal_reached,
torch.zeros_like(env.episode_length_buf),
env.episode_length_buf,
)
reward_term: DirectReorientReward = env.reward_manager.get_term_cfg(reward_name).func
max_success_reached = reward_term.successes >= max_successes
return (env.episode_length_buf >= env.max_episode_length - 1) | max_success_reached

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.

P1 Side-effecting termination mutates shared episode state

direct_reorient_timeout writes directly to env.episode_length_buf inside what the framework expects to be a stateless predicate. When a goal is reached the counter is zeroed, which effectively hides elapsed time from every other termination term evaluated after this one in the same step. If a second fall or out-of-reach termination runs after this one, the reset can mask conditions that had been accumulating. The function is not wired into the current Allegro config (direct_timeout is used instead), but the PR description states it will be adopted by the Shadow manager parts 9–11, so the risk will materialize.

Comment on lines +226 to +235
def reset(self, env_ids: Sequence[int] | None = None) -> None:
if env_ids is None:
env_ids = slice(None)
threshold = self.cfg.params["success_count_threshold"]
self._env.extras.setdefault("log", {})["Metrics/success_rate"] = (
(self._successes[env_ids] >= threshold).float().mean().item()
)
for statistic, value in self._orientation_error.reset(env_ids).items():
self._env.extras["log"][f"Diagnostics/episode_min_orientation_error_{statistic}"] = value
self._successes[env_ids] = 0.0

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 Partial-reset logging overwrites the global success-rate metric

reset is called with only the env_ids terminating in the current step; when a fraction of environments reset, the logged Metrics/success_rate reflects only that fraction and overwrites any earlier value from the same training step. Training dashboards may see a highly-variable or systematically biased metric depending on the batch composition at each reset boundary. Consider always computing the mean over all envs (ignoring env_ids) so the logged value is representative of the full population.

Comment on lines +103 to +108


@configclass
class ObservationsCfg:
"""Full 124-dimensional state observation in Direct order."""

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 set_num_envs double-writes the physx backend via its default alias

self.default is the same Python object as self.physx (assigned by default = physx), so self.default.num_envs = num_envs and self.physx.num_envs = num_envs are redundant. The second assignment is a no-op today but could confuse readers or silently break if default is ever re-pointed to a different backend.

Suggested change
@configclass
class ObservationsCfg:
"""Full 124-dimensional state observation in Direct order."""
def set_num_envs(self, num_envs: int) -> None:
"""Set the environment count on every backend alternative."""
self.physx.num_envs = num_envs
self.newton_mjwarp.num_envs = num_envs
self.ovphysx.num_envs = num_envs
self.default = self.physx

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!

@hujc7
hujc7 force-pushed the jichuanh/task-cleanup-dex-part08 branch from 3b4f0cc to d4d1290 Compare July 17, 2026 00:56
@hujc7 hujc7 changed the title [Task Clean-up][Manager] Dexterous Part 8/11: Align the Allegro manager to the Direct contract [Task Clean-up][Manager] Dexterous Part 8: Add the reorientation manager counterparts Jul 17, 2026
@hujc7 hujc7 changed the title [Task Clean-up][Manager] Dexterous Part 8: Add the reorientation manager counterparts [Task Clean-up][Manager] Dexterous Part 8/11: Align the Allegro manager to the Direct contract 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][Manager] Dexterous Part 8/11: Align the Allegro manager to the Direct contract [Task Clean-up][Manager] Dexterous Part 5/8: Add the reorientation manager counterparts Jul 17, 2026
@hujc7
hujc7 force-pushed the jichuanh/task-cleanup-dex-part08 branch from f8b3611 to c5195e8 Compare July 18, 2026 11:10
@hujc7
hujc7 requested a review from a team July 18, 2026 11:10
prim_path="/World/Light",
spawn=sim_utils.DomeLightCfg(intensity=2000.0, color=(0.75, 0.75, 0.75)),
)
dome_light = None

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 dome_light = None? maybe just remove?

params={"asset_cfg": SceneEntityCfg("robot", joint_names=".*", preserve_order=False)},
)
# -- object
object_pos = ObsTerm(func=mdp.root_pos_w, params={"asset_cfg": SceneEntityCfg("object")})

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.

isn't this pos quat lin vel and ang vel just root state?

joint_vel = ObsTerm(
func=mdp.joint_vel,
scale=0.2,
params={"asset_cfg": SceneEntityCfg("robot", joint_names=".*", preserve_order=False)},

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.

, joint_names=".*", preserve_order=False

this is default you don't need it

params={"asset_cfg": SceneEntityCfg("object"), "command_name": "object_pose", "make_quat_unique": False},
)
# -- robot fingertips
fingertip_pos = ObsTerm(

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.

isn't this just finger tip state?

def __post_init__(self):
# visualizer camera settings
self.sim.default_visualizer_cfg = VisualizerCfg(eye=(2.0, 2.0, 2.0))
if not self.enable_domain_randomization:

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.

lets remove this and always enable randomziation, because this won't be able to be hydro overridable

params={"asset_cfg": SceneEntityCfg("robot", joint_names=".*", preserve_order=False)},
)
# -- object
object_pos = ObsTerm(func=mdp.root_pos_w, params={"asset_cfg": SceneEntityCfg("object")})

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.

again this is just object state

params={"asset_cfg": SceneEntityCfg("object"), "command_name": "object_pose", "make_quat_unique": False},
)
# -- robot fingertips
fingertip_pos = ObsTerm(

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 is just finger tip state

terminations: TerminationsCfg = TerminationsCfg()
events: ShadowHandManagerEventCfg = ShadowHandManagerEventCfg()

enable_domain_randomization: bool = False

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.

remove this always enable randomizaiton


@configclass
class PolicyCfg(ObsGroup):
openai = ObsTerm(

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.

what is opain policy observation? this name is not descriptive?

)
max_consecutive_success = DoneTerm(
func=mdp.max_consecutive_success,
time_out=True,

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 is not time out

# make sure the quaternion real-part is always positive
return math_utils.quat_unique(quat) if make_quat_unique else quat

class fingertip_wrench(ManagerTermBase):

@ooctipus ooctipus Aug 7, 2026

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.

are you sure there is not shared wrench mdp?



# -- composed observation groups
class openai_policy_observation(ManagerTermBase):

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 is not descriptive abotu what this is.



# -- action terms
def reorient_last_action(env: ManagerBasedRLEnv, action_name: str) -> torch.Tensor:

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 not just last action?

hujc7 added 12 commits August 7, 2026 18:24
Introduce the command, event, observation, reward and termination terms the\nmanager-based reorientation tasks need, and move the shared helpers into\nisaaclab_tasks.core.reorient.utils so the hand-over task can reach them.\n\nreset_buf now exists before the first step, so terms that run during the\ninitial reset can read it.
The Shadow and Allegro manager tasks declared the same eleven observation\nterms, the same rewards and the same terminations. Collect them into a\nhand-agnostic configuration that each hand specializes with its fingertip\nbodies, actuated joints, goal threshold, marker and control rate.
Register Isaac-Reorient-Cube-Shadow and Isaac-Reorient-Cube-Shadow-Camera,\nand offer presets=asymmetric, which pairs a reduced actor observation with a\nprivileged critic.\n\nRegistrations are ordered state before vision and Direct before manager.
AllegroCubePPORunnerCfg and AllegroHandPPORunnerCfg named the object and the\nrobot while serving the manager and Direct tasks respectively. Name them for\nthe workflow instead, and drop the Allegro manager-only agent files now that\nboth workflows share one set.
The paper's regime -- 20 Hz control, action and observation noise, and an\nepisode budget spent per goal -- serves its sim-to-real study and does not\ngeneralize, so it no longer ships in the core task. The configuration moves\nunchanged; only its imports are rehomed.
Both backends now share the PhysX rigid body, a 60 mm cube at z=0.6, so the\nrendered references and the determinism fixtures move with it.
Regenerate the catalog from the registry and record the task moves, the new\nmanager counterparts and the renamed runner configurations.
The shared configuration stamped one SceneEntityCfg into both fingertip
observation terms. The manager fills body_ids on the instance it resolves,
so the second term saw both body_names and body_ids and was rejected.

Contrib also resolved the core agents module: binding the name "agents"
from the core package shadowed the sibling subpackage for the later
relative import.
The camera manager configuration referenced observation terms the
reorientation cleanup had removed and three that had never existed in
this branch. Rewrite the first onto their framework replacements, bring
the rest across, and extract the camera validator so both the Direct and
manager configurations share one check.
…/hujc7/IsaacLab into jichuanh/task-cleanup-dex-part08

# Conflicts:
#	docs/source/overview/environments.rst
#	source/isaaclab_tasks/changelog.d/task-cleanup-dex-part08.major.rst
#	source/isaaclab_tasks/isaaclab_tasks/contrib/reorient/config/shadow_hand/__init__.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/__init__.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/agents/rsl_rl_ppo_cfg.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/allegro_hand/allegro_hand_manager_env_cfg.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/__init__.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_common.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_camera_env_cfg.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_direct_env_cfg.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/config/shadow_hand/shadow_hand_manager_env_cfg.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/__init__.pyi
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/events.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/observations.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/mdp/terminations.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/reorient_direct_env.py
#	source/isaaclab_tasks/isaaclab_tasks/core/reorient/reorient_manager_env_cfg.py
#	source/isaaclab_tasks/test/core/test_reorient_value_parity.py
…eanup-dex-part08

# Conflicts:
#	docs/source/_static/css/environment-browser.js
#	docs/source/overview/environments.rst
#	source/isaaclab_tasks/test/golden_images/shadow_hand/newton-isaacsim_rtx_renderer-rgb.png
#	source/isaaclab_tasks/test/golden_images/shadow_hand/newton-isaacsim_rtx_renderer-rgba.png
#	source/isaaclab_visualizers/test/golden_images/shadow_hand/newton-kit-tiled.png
#	source/isaaclab_visualizers/test/golden_images/shadow_hand/newton-kit-viewport.png
#	uv.lock
@hujc7
hujc7 requested a review from fatimaanes as a code owner August 8, 2026 08:02
@github-actions github-actions Bot added the isaac-mimic Related to Isaac Mimic team label Aug 8, 2026
hujc7 added 2 commits August 8, 2026 01:35
A merge from the stale pushed branch head re-added fragments the nightly
Compile changelog fragments job had consumed on develop. They belong to
the released changelog now, not to this PR.
Split the full state into a robot half and an object half so the camera
actor can build on the robot terms instead of inheriting the full group and
nulling the object ones.

The object reset now uses the framework reset_root_state_with_random_orientation;
only the hand half stays task-local, because it must re-seed the PD targets that
reset_joints_by_offset leaves untouched.

Order the environment catalog by task, then state before vision, then Direct
before manager, and drop the untested newton_kamino preset.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

asset New asset feature or request documentation Improvements or additions to documentation infrastructure isaac-lab Related to Isaac Lab team isaac-mimic Related to Isaac Mimic team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants