Skip to content

Decouple implicit-actuator effort limit from solver clamp - #7078

Closed
ooctipus wants to merge 1 commit into
isaac-sim:developfrom
ooctipus:zhengyuz/actuators/effort-limit-semantics
Closed

Decouple implicit-actuator effort limit from solver clamp#7078
ooctipus wants to merge 1 commit into
isaac-sim:developfrom
ooctipus:zhengyuz/actuators/effort-limit-semantics

Conversation

@ooctipus

Copy link
Copy Markdown
Collaborator

Description

This is the effort-limit mirror of #6481 and extracts the actuator dependency from #6891.

Actuator configs expose two effort-limit fields with different responsibilities, but implicit actuators currently require them to be equal and raise ValueError when both carry different values.

This PR gives each field one clear job and lets them coexist:

  • effort_limit — the actuator-facing rated force or torque. Explicit actuator models use it for output clipping; implicit actuators retain it as their model-facing limit.
  • effort_limit_sim — the solver-level clamp. Physics backends write this value to the simulated joint drive.

Keeping them independent lets a configuration retain a rated limit while deliberately selecting a different solver clamp. This is needed by the Factory Franka configuration, which carries datasheet limits separately from its contact-stability solver guards.

Backwards compatibility: configurations that set only one field, set equal values, or set neither behave as before. The narrow behavior change is that setting both to different values is now valid instead of raising, and an effort_limit-only implicit actuator no longer emits a deprecation warning.

Type of change

  • Breaking change (narrow: differing implicit-actuator limits are accepted instead of raising)

Validation

  • Existing implicit-actuator effort-limit matrix: 72 passed
  • PhysX articulation effort-limit matrix: 24 passed
  • Newton articulation effort-limit matrix: 24 passed
  • Regression check fails on unmodified develop at the differing-limit case
  • uv run isaaclab -f
  • Changelog fragment validation

Treat effort_limit as the actuator-facing rated force or torque and effort_limit_sim as the physics-solver clamp. Preserve existing one-field fallbacks while allowing both fields to carry distinct values, mirroring the velocity-limit semantics introduced in isaac-sim#6481.
@ooctipus
ooctipus requested a review from a team August 13, 2026 18:03
@github-actions github-actions Bot added the isaac-lab Related to Isaac Lab team label Aug 13, 2026
@greptile-apps

greptile-apps Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR separates an implicit actuator's model-facing rated effort limit from its solver-level clamp while preserving existing fallback behavior for single-field configurations.

  • Removes rejection of differing effort_limit and effort_limit_sim values.
  • Updates actuator API documentation and changelog entries to describe the independent responsibilities.
  • Expands core, PhysX, Omniverse, and Newton tests to verify both actuator-facing and solver-facing values.

Confidence Score: 5/5

The PR appears safe to merge, with the intended independent effort-limit semantics consistently documented and covered across the affected simulation backends.

The constructor preserves prior behavior for zero-, one-, and equal-field configurations, while differing values are resolved separately and backend tests verify that only the solver-facing value is written to physics.

Important Files Changed

Filename Overview
source/isaaclab/isaaclab/actuators/actuator_pd.py Removes the differing-limit validation while retaining bidirectional fallback when only one effort field is configured.
source/isaaclab/isaaclab/actuators/actuator_base_cfg.py Documents the distinct model-facing and solver-facing effort-limit contracts and their compatibility fallbacks.
source/isaaclab/test/actuators/test_implicit_actuator.py Covers scalar combinations of absent, equal, and differing effort limits and verifies both resolved tensors.
source/isaaclab_newton/test/assets/test_articulation.py Verifies that Newton receives the solver clamp while the actuator retains its independently configured rated limit.
source/isaaclab_ov/test/assets/test_articulation.py Verifies independent actuator and solver effort limits through the Omniverse articulation path.
source/isaaclab_physx/test/assets/test_articulation.py Verifies independent actuator and solver effort limits through the PhysX articulation path.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Config["ImplicitActuatorCfg"]
  Rated["effort_limit<br/>rated/model-facing limit"]
  Solver["effort_limit_sim<br/>solver clamp"]
  Model["Implicit actuator<br/>effort estimate"]
  Physics["Physics backend<br/>joint drive"]

  Config --> Rated
  Config --> Solver
  Rated --> Model
  Solver --> Physics
Loading

Reviews (1): Last reviewed commit: "Decouple implicit-actuator effort limit ..." | Re-trigger Greptile

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

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.

Isaac Lab Review Bot

The implicit-actuator effort-limit split is consistently implemented and tested, but the updated public configuration docstrings need the required SI unit notation before merge.

  • Design and architecture: The separation of model-facing effort_limit from solver-facing effort_limit_sim is coherent with the fallback behavior and backend write paths covered by the updated tests.
  • API: The rewritten public docstrings for ActuatorBaseCfg.effort_limit and effort_limit_sim omit inline [N or N·m] units, contrary to the repository documentation requirements and the corresponding runtime attribute documentation. Add the unit notation to both fields.
  • Implementation: The fallback branches preserve single-field behavior, while differing configured values remain independent and only effort_limit_sim reaches the solver. No implementation issue is evidenced beyond the public documentation omission.

Minor fixes needed. Posted 1 actionable finding inline.

Automated review; human maintainers own approval decisions.


This limit is used to clip the computed torque sent to the simulation. If None, the
limit is set to the value specified in the USD joint prim.
This is the actuator's rated force/torque reflected at the joint. It clips the output of explicit

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.

🔵 Suggestion · Api — Config effort-limit docstrings omit SI units

The rewritten docstrings for effort_limit and effort_limit_sim describe force/torque quantities without the required inline unit notation, while the matching ActuatorBase attributes were updated in this diff to [N or N·m]. Add the same [N or N·m] annotation to both config fields so the public configuration surface states units consistently with the runtime attributes.

kellyguo11 pushed a commit that referenced this pull request Aug 14, 2026
# Description

> [!IMPORTANT]
> **Depends on #7078 — that PR must be merged first.** This branch is
stacked on the effort-limit mirror of #6481, so the diff includes its
single actuator commit. Review the Factory commits on top; after #7078
lands, rebasing will remove the parent commit from this diff.

Adds **`IsaacContrib-Factory-Franka`**, a preset-driven contact-rich
assembly task under `isaaclab_tasks.contrib.nist`.

The task covers 12 NIST taskboard variants:

- M16 nut threading
- round peg insertion at 4, 8, 12, and 16 mm
- rectangular rod insertion at 4, 8, 12, and 16 mm
- small, medium, and large gear meshing

Assembly geometry, reset strategy, curriculum, robot, and physics are
composed through presets rather than separate environment classes. The
task supports explicit `isaacsim_physx` and `newton_mjwarp` presets,
with `physx` retaining automatic backend selection.

## Dependency

#7078 separates the two implicit-actuator effort fields:

- `effort_limit` retains the actuator-facing rated force or torque.
- `effort_limit_sim` controls the physics-solver clamp.

The Factory Franka configuration intentionally authors distinct rated
and solver limits, so it cannot construct on unmodified `develop`.

## Changes

- Added the Factory task, assembly profiles, reset-state generation,
sampling, rewards, observations, terminations, and curriculum.
- Added the 12 task presets and RSL-RL configuration.
- Added explicit Isaac Sim PhysX and Newton physics configuration.
- Kept task assets on uploaded asset paths; no Factory-specific Nucleus
root constant is introduced.
- Bounded precollected reset states in the existing environment smoke
harness so one- and two-environment CI cases remain smoke tests rather
than building the full training bank.

## Type of change

- New feature (non-breaking)

## Validation

- [x] `uv run isaaclab -f`
- [x] Preset decision suite: 19 passed
- [x] Exact Factory two-environment CI smoke case: 1 passed in 35.8
seconds
- [x] Five-iteration `isaacsim_physx` training run completed
- [x] Changelog fragment validation
- [x] No new test files were added while addressing the CI failures
@ooctipus ooctipus closed this Aug 14, 2026
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.

1 participant