Skip to content

Refactor articulation actuator ownership - #6839

Merged
kellyguo11 merged 151 commits into
isaac-sim:developfrom
AntoineRichard:antoiner/actuators-collection-split-6248
Aug 19, 2026
Merged

Refactor articulation actuator ownership#6839
kellyguo11 merged 151 commits into
isaac-sim:developfrom
AntoineRichard:antoiner/actuators-collection-split-6248

Conversation

@AntoineRichard

@AntoineRichard AntoineRichard commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

Description

This PR adds a backend-neutral actuator runtime around ActuatorCollection and
separates actuator-model state from simulated joint state. It keeps one scoped
collection per articulation while presenting one command, processed-command,
telemetry, group-access, and lifecycle API across PhysX, Newton, and OVPhysX.

The two main goals are:

  1. make actuator ownership and runtime access consistent across backends;
  2. batch compatible actuator groups to reduce launch overhead without changing
    their named configuration or access.

Ownership and public API

  • Articulation owns actuator application and backend submission.
  • ArticulationData owns live solver joint properties, including joint gains,
    solver limits, armature, and friction.
  • ActuatorCollection owns articulation-wide commands, processed commands,
    effort telemetry, group lookup, and actuator lifecycle.
  • Each named group owns only its actuator-model parameters and state.
  • Backend ActuatorControl implementations own ordering conversion,
    joint-property writes, command submission, and native-controller integration.
  • Newton-native controllers retain controller parameters in Newton storage.
# Commands received by actuator models.
robot.actuators.command.position
robot.actuators.command.velocity
robot.actuators.command.effort
robot.actuators.command.set_position_index(value=position_command)

# Commands produced for simulated joints on the Lab-managed path.
robot.actuators.joint_command.position
robot.actuators.joint_command.velocity
robot.actuators.joint_command.effort

# Articulation-wide effort telemetry.
robot.actuators.computed_effort
robot.actuators.applied_effort

# Named model parameters and state.
motor = robot.actuators["legs"]       # explicit group
motor.stiffness
motor.damping
motor.actuator_effort_limit

drive = robot.actuators["gripper"]    # implicit group
drive.joint_effort_limit

All collection-wide arrays use articulation joint order. Native paths bypass
joint_command, so that view is not submitted-command telemetry for them.

Joint properties and actuator properties

actuator_effort_limit is the explicit model clipping limit.
joint_effort_limit and joint_velocity_limit configure the joint or solver.
The deprecated effort_limit alias resolves to the actuator limit for explicit
models and to the joint limit for implicit models. effort_limit_sim and
velocity_limit_sim remain deprecated configuration aliases through 3.x.

Explicit groups retain their model gains, rated velocity, delay, motor curves,
and clipping limits. They do not retain copies of solver limits or friction.
Implicit groups instead read stiffness, damping, and effort limits from live
articulation buffers because the backend executes their drive.

The former group-level joint-property accessors (effort_limit_sim,
velocity_limit_sim, armature, and friction variants) are removed. Read those
values through ArticulationData and update them with articulation joint
writers. The legacy backend gain writers remain deprecated 3.x forwarders;
managed randomization should use randomize_actuator_gains.

Logical groups and execution batching

Named groups remain the configuration and access surface. Internally:

  • disjoint stateless groups of the same exact Lab actuator class may execute as
    one batch even when their parameters differ;
  • implicit batches read live articulation-wide gains and limits and publish
    processed commands and telemetry in one fused Warp launch;
  • ideal-PD and DC-motor batches use pointer-stable staging, in-place Torch
    compute, cached Warp gathers, and fused output publication;
  • a singleton full-articulation explicit group keeps direct views and avoids a
    redundant gather;
  • stateful, neural, subclass-specialized, native, and incompatible groups stay
    separate.

Native runtime parsing aggregates structurally compatible controllers while
keeping per-DOF values. Unsupported custom explicit configurations raise before
USD actuator state is changed. Two ambiguous construction states are rejected:

  • collection membership is fixed after construction;
  • a joint cannot belong to more than one actuator group.

Backend behavior

  • PhysX: runs Lab models in the collection before submission and supported
    native explicit actuators through the shared host adapter.
  • OVPhysX: also runs Lab models in the collection; its native path uses the
    shared host adapter while preserving eager tensor binding and partial writes.
  • Newton: runs Lab models in the collection before submission and
    manager-owned native controllers inside the solver.
  • Ordering: collection buffers stay in public joint order; conversion occurs
    only at backend boundaries.

The host adapter captures staging, native model execution, and telemetry on
CUDA when possible and falls back to eager execution otherwise. It manages the
capture for stateful native actuators. Neural checkpoints use Isaac Lab's shared
file cache before Newton metadata is added, so local and remote paths follow the
same loading path.

Compatibility and documentation

  • Deprecated articulation command setters forward to actuators.command.
  • Deprecated ArticulationData command and torque-telemetry accessors forward
    to the collection.
  • Lab execution of explicit actuator models is deprecated in favor of supported
    Newton-native actuators.
  • The actuator concept page now documents ownership, commands, limits,
    explicit/implicit behavior, batching, native execution, and backend-specific
    constraints.
  • The 3.0 migration guide and tutorials use the new command and property names.

LEAPP action terms retain the annotated articulation setters until the exporter
supports collection setters.

Final performance validation

Both revisions used fresh, isolated environments and the same dependency lock.
Run order was counterbalanced by row and seed. Throughput values below are mean
± sample standard deviation. Throughput changes are paired geometric FPS ratios
with two-sided 95% t intervals; p-values are Holm-adjusted across all 12 rows.

Checkpoint playback: five paired seeds

Protocol: fixed policy checkpoints, 4,096 environments, 50 warm-up steps, and
1,000 measured steps under inference mode. This uses the full benchmark task
configuration rather than the reduced interactive play configuration. The
canonical result set contains 60 paired comparisons and 120 unique bundles.

Task Physics Actuator path develop FPS PR FPS Paired change (95% CI) Holm p
Cartpole PhysX Lab 1,029,140 ± 8,301 1,269,172 ± 7,097 +23.33% [+21.83%, +24.84%] <0.0001
Cartpole Newton Lab 1,505,687 ± 18,142 1,981,901 ± 17,827 +31.63% [+28.28%, +35.07%] 0.0001
G1 Flat PhysX Lab 108,564 ± 3,465 117,091 ± 3,872 +7.85% [+3.53%, +12.35%] 0.0478
G1 Flat Newton Lab 233,893 ± 1,211 250,100 ± 776 +6.93% [+5.96%, +7.90%] 0.0003
ANYmal-D Flat PhysX Lab neural 268,397 ± 6,016 269,470 ± 5,798 +0.40% [-0.79%, +1.61%] 1.0000
ANYmal-D Flat Newton Lab neural 430,949 ± 2,785 434,384 ± 5,860 +0.79% [-0.80%, +2.41%] 1.0000
Franka Reach PhysX Lab 315,996 ± 9,606 332,548 ± 29,851 +4.95% [-4.74%, +15.64%] 1.0000
Franka Reach Newton Lab 563,375 ± 8,702 635,729 ± 6,690 +12.85% [+11.66%, +14.05%] <0.0001
Go2 Flat PhysX Lab 266,480 ± 37,831 280,768 ± 14,739 +6.05% [-10.82%, +26.12%] 1.0000
Go2 Flat PhysX Newton native 297,084 ± 23,028 294,879 ± 29,591 -0.91% [-20.53%, +23.56%] 1.0000
Go2 Flat Newton Lab 813,321 ± 5,481 836,744 ± 2,688 +2.88% [+1.73%, +4.04%] 0.0172
Go2 Flat Newton Newton native 905,438 ± 5,792 924,958 ± 10,496 +2.15% [+0.90%, +3.42%] 0.0520

There is no supported playback regression. Six rows remain significant after
correction. The negative Go2 PhysX-native point estimate is small relative to
its seed variance and its interval spans large gains and losses.

Environment creation time (exploratory)

The playback harness also records the time spent in gym.make(), including
articulation construction. This is not total process startup: imports, task
configuration, app launch, runner and checkpoint loading, and the first step
are outside this timer. Persistent driver and Warp caches can also affect these
measurements, so the intervals below are unadjusted and should be treated as
follow-up evidence rather than a release gate. A positive change means the PR
was slower to create the environment.

Task Physics Actuator path develop seconds PR seconds Paired PR/develop change (95% CI)
Cartpole PhysX Lab 4.633 ± 0.036 4.670 ± 0.162 +0.76% [-2.94%, +4.60%]
Cartpole Newton Lab 5.271 ± 0.055 5.294 ± 0.045 +0.44% [-1.12%, +2.01%]
G1 Flat PhysX Lab 48.631 ± 0.269 48.605 ± 0.135 -0.05% [-0.80%, +0.70%]
G1 Flat Newton Lab 8.379 ± 2.552 7.956 ± 0.017 -2.14% [-29.19%, +35.23%]
ANYmal-D Flat PhysX Lab neural 21.974 ± 0.646 22.753 ± 1.897 +3.31% [-6.73%, +14.42%]
ANYmal-D Flat Newton Lab neural 6.813 ± 0.456 6.852 ± 0.076 +0.73% [-5.79%, +7.71%]
Franka Reach PhysX Lab 32.516 ± 0.097 33.241 ± 1.758 +2.12% [-4.16%, +8.81%]
Franka Reach Newton Lab 8.554 ± 0.297 8.981 ± 0.791 +4.74% [-7.75%, +18.92%]
Go2 Flat PhysX Lab 24.657 ± 0.356 24.509 ± 0.086 -0.59% [-2.19%, +1.03%]
Go2 Flat PhysX Newton native 27.424 ± 1.349 26.848 ± 0.084 -2.01% [-7.47%, +3.77%]
Go2 Flat Newton Lab 6.281 ± 0.044 6.506 ± 0.093 +3.58% [+2.24%, +4.93%]
Go2 Flat Newton Newton native 6.329 ± 0.026 6.561 ± 0.054 +3.66% [+2.35%, +4.99%]

Most rows are unresolved. The consistent signal worth a dedicated startup
benchmark is the roughly 0.23-second increase for Go2 on Newton, on both the Lab
and native actuator paths.

Full training: three paired seeds

Protocol: RSL-RL, 4,096 environments, 50 timing warm-up steps, and each task's
full schedule: Cartpole 150, ANYmal-D and Go2 300, Franka 1,000, and G1 1,500
iterations. The canonical set contains 36 paired comparisons and 72 unique
successful bundles. Native neural runs are excluded because that path is known
not to work on either revision.

Task Physics Actuator path develop FPS PR FPS Paired change (95% CI) Holm p
Cartpole PhysX Lab 609,337 ± 1,779 680,158 ± 3,496 +11.62% [+10.98%, +12.27%] 0.0018
Cartpole Newton Lab 755,488 ± 11,886 846,398 ± 6,748 +12.04% [+8.82%, +15.36%] 0.0354
G1 Flat PhysX Lab 100,722 ± 938 104,069 ± 1,021 +3.32% [-1.42%, +8.29%] 0.5742
G1 Flat Newton Lab 184,909 ± 425 194,393 ± 975 +5.13% [+4.35%, +5.91%] 0.0131
ANYmal-D Flat PhysX Lab neural 205,431 ± 716 205,932 ± 2,199 +0.24% [-2.45%, +3.00%] 1.0000
ANYmal-D Flat Newton Lab neural 270,330 ± 1,242 273,531 ± 2,486 +1.18% [-1.54%, +3.98%] 1.0000
Franka Reach PhysX Lab 241,489 ± 175 257,090 ± 2,820 +6.46% [+3.51%, +9.48%] 0.0855
Franka Reach Newton Lab 376,112 ± 2,892 399,159 ± 8,936 +6.11% [+2.22%, +10.15%] 0.1455
Go2 Flat PhysX Lab 228,745 ± 5,309 229,636 ± 10,642 +0.34% [-9.65%, +11.43%] 1.0000
Go2 Flat PhysX Newton native 227,488 ± 10,813 232,861 ± 3,340 +2.43% [-5.57%, +11.12%] 1.0000
Go2 Flat Newton Lab 443,121 ± 3,497 448,127 ± 4,156 +1.13% [+0.73%, +1.53%] 0.0607
Go2 Flat Newton Newton native 458,881 ± 4,562 459,165 ± 1,376 +0.06% [-1.75%, +1.91%] 1.0000

No row has a negative mean training-throughput change. Cartpole on both
backends and G1 on Newton remain significant after correction.

Each run's late-training reward is averaged over its final 100 iterations. The
table reports the mean ± sample standard deviation across three seeds:

Task Physics Actuator path develop reward PR reward
Cartpole PhysX Lab 4.917 ± 0.035 4.917 ± 0.035
Cartpole Newton Lab 4.922 ± 0.016 4.922 ± 0.016
G1 Flat PhysX Lab 28.252 ± 0.358 27.237 ± 0.502
G1 Flat Newton Lab 22.992 ± 0.629 23.254 ± 0.722
ANYmal-D Flat PhysX Lab neural 15.083 ± 2.840 15.083 ± 2.840
ANYmal-D Flat Newton Lab neural 7.803 ± 0.088 12.673 ± 4.248
Franka Reach PhysX Lab 0.033 ± 0.098 0.033 ± 0.098
Franka Reach Newton Lab 0.014 ± 0.092 -0.031 ± 0.047
Go2 Flat PhysX Lab 32.038 ± 1.152 32.038 ± 1.152
Go2 Flat PhysX Newton native 31.253 ± 1.027 31.547 ± 0.825
Go2 Flat Newton Lab 34.071 ± 0.979 34.223 ± 1.019
Go2 Flat Newton Newton native 34.604 ± 0.318 34.742 ± 0.538

Episode length and success were also checked over the final 100 iterations. No
convergence regression is statistically established.
G1 PhysX has a lower mean reward on the PR, but the paired difference is
unresolved (p = 0.157) and success is unchanged. ANYmal-D on Newton is
bimodal across seeds; its apparent improvement is also unresolved (p = 0.182).

Compared commits:

  • develop: 135cf98904cbd73f3b8bdd89188e1a463ebcbb97
  • PR: 9ee6296124687ec54ed13e102ac59b7667b08d8d

Validation

  • Complete core actuator suite on CPU and CUDA: 479 passed
  • Focused Newton target-mode, native-gain, and friction integration: 15 passed
  • Focused PhysX native current-state ordering: 2 passed
  • OVPhysX native command, mixed-path, reset, gain, and state-refresh coverage
  • Warning-as-error Sphinx build succeeded
  • All repository pre-commit hooks passed before the final push
  • Independent final code review found no remaining Critical or Important findings
  • Independent benchmark audit accepted all 192 canonical final bundles

Fused implicit telemetry can differ from the previous Torch expression by one
float32 ULP (4.768e-7) because of arithmetic ordering. Processed position,
velocity, and feed-forward effort commands sent to the backend remain exact.

Type of change

  • New feature: backend-neutral actuator collection and Newton-native execution
  • Performance: automatic batching and fused/cached Warp staging
  • Bug fix: joint/actuator ownership, class validation, ordering, and remote checkpoints
  • Documentation and migration update

Checklist

  • I have read and understood the contribution guidelines
  • I have run pre-commit checks with ./isaaclab.sh -f
  • I have updated the documentation
  • I have added focused behavioral tests and verified regression tests fail before their fixes
  • I have added the required changelog fragments
  • My name already exists in CONTRIBUTORS.md

@github-actions github-actions Bot added documentation Improvements or additions to documentation isaac-lab Related to Isaac Lab team infrastructure labels Aug 1, 2026
@AntoineRichard
AntoineRichard force-pushed the antoiner/actuators-collection-split-6248 branch from 5c59a09 to 9ce89f5 Compare August 5, 2026 23:35
@github-actions github-actions Bot added the isaac-mimic Related to Isaac Mimic team label Aug 5, 2026
@AntoineRichard
AntoineRichard force-pushed the antoiner/actuators-collection-split-6248 branch 4 times, most recently from 0d670f4 to d15f91a Compare August 7, 2026 14:57
@kellyguo11 kellyguo11 moved this to In progress in Isaac Lab Aug 9, 2026
@github-actions github-actions Bot added the asset New asset feature or request label Aug 12, 2026
@AntoineRichard
AntoineRichard force-pushed the antoiner/actuators-collection-split-6248 branch from 4929716 to 6a6049a Compare August 12, 2026 14:15
@AntoineRichard
AntoineRichard marked this pull request as ready for review August 13, 2026 14:29
@AntoineRichard
AntoineRichard requested a review from a team August 13, 2026 14:29
@greptile-apps

greptile-apps Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Too many files changed for review (176 files, 100 file limit).

Bypass the limit by tagging @greptile-apps to review.

@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 backend-neutral ActuatorCollection ownership split is coherent, but two construction-path regressions affect supported custom actuator configurations: direct ActuatorBase subclasses receive unsupported gain keywords, and string class references are validated without being resolved for instantiation.

  • Design and architecture: The separation between articulation-owned solver state, collection-owned commands and telemetry, model-owned parameters, and backend-specific control adapters is consistent across PhysX, Newton, and OVPhysX. Before merge, the collection’s group-construction path should preserve the documented ActuatorBase extension contract and consistently use resolved actuator classes.
  • API: ActuatorBase subclasses that inherit its constructor now fail because ActuatorCollection unconditionally supplies stiffness and damping even though ActuatorBase.init no longer accepts them. This breaks a documented extension point without a compatibility path. Additionally, string class_type references are treated as accepted inputs during validation but fail later because the unresolved string is inspected and called.
  • Implementation: Execution batching, backend submission, alias forwarding, and copied-config resolution are broadly consistent. The actionable defects are localized to ActuatorCollection._build_groups: conditionally pass gain arguments or retain compatibility in ActuatorBase, and resolve class_type once before signature inspection, construction, and grouping.

Minor fixes needed. Posted 2 actionable findings inline.

The full PR diff was reviewed; some supplemental surrounding file context was omitted.

Automated review; human maintainers own approval decisions.

joint_ids=actuator_joint_ids,
num_envs=self.num_instances,
device=self.device,
stiffness=properties.stiffness,

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.

🟡 Warning · Api — ActuatorBase subclasses break on gain kwargs

_build_groups always passes stiffness= and damping= into cfg.class_type(**actuator_kwargs), but ActuatorBase.__init__ no longer accepts them (they moved to ImplicitActuator/IdealPDActuator). Actuators deriving directly from ActuatorBase, a documented extension point, now raise TypeError at construction with no deprecation path. Either keep accepting these kwargs in ActuatorBase.__init__, or gate them with the same inspect.signature fallback already used for effort_limit.

else:
effort_limit_name = "actuator_effort_limit"
effort_limit_value = defaults.joint_effort_limit
constructor_parameters = inspect.signature(actuator_cfg.class_type.__init__).parameters

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.

🟡 Warning · Implementation — String class_type resolved but not used

_is_implicit_actuator_cfg resolves a string class_type via _resolve_actuator_class, so string references are an accepted config form, but _build_groups then calls inspect.signature(actuator_cfg.class_type.__init__) and actuator_cfg.class_type(**actuator_kwargs) on the unresolved value. A "module:Class" config therefore fails at construction. Resolve the class once and reuse that type for signature inspection, instantiation, and grouping.

Add ActuatorCollection as the backend-neutral owner for actuator state and command APIs. Route legacy articulation target and gain setters through the collection with deprecation warnings.

Move common articulation actuator-control forwarding into a shared helper and keep backend adapters focused on command submission, friction writes, and native actuator paths for PhysX, OVPhysX, and Newton.

Add changelog fragments and focused ActuatorCollection tests.
Newton-executed groups no longer instantiate Isaac Lab actuator models:
the Newton controllers own their parameters, so a Lab model only held
misleading construction-time snapshots behind access guards. The
collection mapping now returns the owning Newton actuator objects
directly, letting users read and modify controller storage without
indirection. Newton merges structurally identical joints into one
actuator, so several groups can share an object; the collection keeps
per-group joint indices and uses them for the group-scoped, user-ordered
read_actuator_parameter and write_actuator_parameter access paths.

The Newton-managed gain guards on IdealPDActuator are deleted along with
the dead construction tensors they protected. The adapter's
bind_articulation and build_implicit_dof_mask take implicit joint
selectors instead of the Lab actuator mapping, decoupling the Newton
binding from Lab model objects entirely. Gain randomization classifies
groups by ownership: implicit groups write through the articulation,
Newton groups through the parameter door, and Lab explicit groups keep
their own tensors.
Three simplifications to the actuator models:

- ImplicitActuator setters for articulation-owned properties now warn
  and ignore the assignment instead of storing pre-binding values or
  raising. Construction writes go through the private construction
  buffers, so the store-or-raise state machine served no caller, and a
  warning pointing at the articulation writers is friendlier than an
  exception while still refusing the write.
- The deprecated ImplicitActuator.effort_limit override is deleted: the
  base-class alias already forwards to actuator_effort_limit, which
  implicit models expose as the live articulation joint effort limit.
- RemotizedPDActuator no longer resolves deprecated aliases itself or
  mutates the user's configuration before construction. The base class
  resolves aliases, and the parsed actuator limits are replaced with
  infinity afterwards, since the angle-dependent lookup table governs
  effort clipping for this model.
- Extract resolve_joint_parameter as the single source of joint-parameter
  resolution semantics; ActuatorBase._parse_joint_parameter and the
  collection's construction-time property resolution both delegate to it.
- Key the implicit executor's cached Warp launch with a monotonic counter
  instead of id(), which could be reused after garbage collection.
- Align documentation with the direct-ownership model: the parameter door
  documents itself as the group-scoped, user-ordered access path next to
  raw Newton actuator objects, and _resolve_limit_aliases documents its
  in-place configuration writes.
- Give ImplicitActuator.reset the base-class signature and fold the two
  gain-default capture loops in randomize_actuator_gains into one.
The concepts page still described the collection as a mapping to Isaac
Lab actuator models. Describe the ownership-based mapping: Lab-executed
groups return their model instances, Newton-executed groups return the
owning Newton actuator objects (shared when Newton merges structurally
identical joints), with raw component access next to the group-scoped
read_actuator_parameter and write_actuator_parameter paths. Also note
that implicit property assignments are ignored with a warning and that
plain implicit groups execute through one fused kernel launch.
Cut verified redundancy across the actuator tests without losing
behavioral coverage:

- Extract the backend-agnostic material shared verbatim by the two
  Lab-vs-Newton equivalence suites into
  isaaclab.test.utils.actuator_equivalence: the actuator config
  catalog, the four equivalence assertion oracles as a mixin, the
  actuator-state-reset scenario base, the DR mocks, and the neural
  checkpoint builders. The duplicated Spot knee lookup tables are
  replaced by imports of the public table in isaaclab_assets.
- Delete subsumed equivalence classes: the zero-feedforward implicit
  twins (the feedforward classes exercise a superset), the mixed
  explicit class (covered standalone and by mixed-with-implicit), two
  decimation variants, the physx remotized functional class (implied
  by its equivalence class), and the newton gain-env-stride class
  (its absolute assertion moved into the DR test). Drop the private
  adapter-gather halves of the DR gain assertions in favor of the
  public parameter reads made alongside them.
- Keep the full limit-resolution matrix on the Newton backend only;
  PhysX and OVPhysX reduce to per-limit smoke tests that verify the
  resolved values land in each backend's native solver reads. Trim a
  duplicate actuator_effort_limit parametrize value and constant
  single-value parametrizes, keeping the ones the sim fixture consumes.
- Delete collection tests whose concepts died with explicit
  aggregation, the legacy-control dynamic-type test, and the runtime
  alias-property block duplicated by the per-actuator suites; fold the
  alias forward-when-unset rows into the equivalence matrix.
- Remove the dead simulation fixture from the implicit-actuator unit
  tests (48 pointless sim boots) and collapse the per-limit unit tests
  in the implicit and ideal-PD suites into parametrized single tests;
  the two unit files no longer require Isaac Sim at all. Slim the
  authoring integration test to one actuator group.
The parameter door was the last Newton-only surface on the otherwise
backend-neutral ActuatorCollection. With native groups mapping directly
to their Newton actuator objects, group-scoped access is explicitly
Newton tooling: read_group_parameter and write_group_parameter now live
in isaaclab.actuators.newton as free functions taking the collection and
group name, next to the selection machinery they are built from. The
collection keeps only backend-neutral responsibilities (mapping,
commands, telemetry, lifecycle) plus its group joint metadata, which the
functions consume for user-ordered columns.

Call sites (gain randomization event, deprecated gain-write forwarder,
tests) and the documentation move to the new spelling.
applied_val_log = default_usd_val if cfg_val is None else float(new_val[idx])
table.append([name, int(ids[idx]), default_usd_val, cfg_val_log, applied_val_log])

def _parse_joint_parameter(

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 shim looks removable

@ooctipus ooctipus 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.

Thanks this looks much nicer now.
only left a comment about shim layer but otherwise looks like a great rework :D
Congrat

| gpu_max_rigid_patch_count: 81920 | actuators={ |
| gpu_found_lost_pairs_capacity: 1024 | "cart_actuator": ImplicitActuatorCfg( |
| gpu_found_lost_aggregate_pairs_capacity: 262144 | joint_names_expr=["slider_to_cart"], |
| gpu_total_aggregate_pairs_capacity: 1024 | effort_limit=400.0, |

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 should be actuator_limit?

"arm": ImplicitActuatorCfg(
joint_names_expr=["shoulder_pan_joint", "shoulder_lift_joint",
"elbow_joint", "wrist_1_joint", "wrist_2_joint", "wrist_3_joint"],
effort_limit=87.0, # From UR10e specifications

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.

would this be actuator_(effort|velocity)_limit?

The command view holds the targets users request and the joint-command
view holds what the actuator models produce for the solver; name them
for those roles. ActuatorCommand becomes ActuatorTargetCommand exposed
as target_command, and ActuatorJointCommand becomes ActuatorOutputCommand
exposed as output_command, swept across the backends, data bindings,
deprecation messages, tests, tutorials, and documentation.
The superpowers entry excluded a contributor-local worktree stash that
does not exist in the repository.
The method had become a one-line wrapper around the module-level
resolve_joint_parameter() after the resolution logic moved there.
Call sites in the actuator models now call the free function
directly, addressing review feedback on the redundant indirection.
Custom-actuator backward compatibility was already broken by the
constructor rework in this PR, so no deprecation path is kept.
Fix leftover command and joint_command view names in the actuators
concept page, and replace the stale 1.0e9 solver effort note: explicit
groups now keep the authored joint effort limit, so the solver clips
the model output a second time. Document that behavior change with
migration guidance in the 3.0 guide and the changelog fragment, point
users of the deprecated write_actuator_*_to_sim writers at
randomize_actuator_gains and write_group_parameter, and add the
isaaclab.actuators.newton group-parameter functions to the API
reference so their cross-references resolve.
Export resolve_joint_parameter from isaaclab.actuators so custom
actuator subclasses have a public replacement for the removed
ActuatorBase._parse_joint_parameter helper. Add the function to the
API reference, a migration-guide entry with a before/after snippet
for custom actuator authors, and changelog entries for the addition
and the removal.
Fix the write_actuator_*_to_sim deprecation warning to point at
write_group_parameter instead of the removed ActuatorBase.write_parameter,
drop the unasserted private _sim_bind_joint_computed_effort recordings
from both actuator equivalence twins, classify implicit groups in
randomize_actuator_gains through the is_implicit_model class flag
instead of a parallel isinstance tuple, and hoist the local imports in
the PhysX benchmark asset runtime.
Forward None instead of slice(None) from Articulation.reset to the
actuator collection so delayed-actuator buffers, which reject slices,
reset all environments correctly (review feedback). Rename the fake
collection in the PhysX prepare test to the target_command view and
drop the removed adapter computed-effort field from the shared
ordering-trace helper.
The OV articulation was missed when the PhysX and Newton backends
were changed to forward None instead of slice(None) to the actuator
collection reset. Also migrate the OV gain-event test off the removed
group.stiffness/damping accessors to read_group_parameter, fixing the
previously failing environment-selective reset and gain test.
Integrates 51 commits from develop. Notable resolutions:

- Ported the implicit-actuator rated/solver effort-limit separation
  (isaac-sim#7078, via the Factory task isaac-sim#6891) into the renamed API: implicit
  groups honor a configured actuator_effort_limit as a stored rated
  limit distinct from the joint_effort_limit solver clamp, and the
  deprecated effort_limit alias now resolves to the rated limit for
  every actuator type (mirroring to the solver clamp when no separate
  clamp is configured). Verified the Factory Franka configs resolve
  with distinct rated and solver limits on both axes.
- Kept develop's whole-path prim-regex matching (path_expr_to_glob)
  in both backend articulations.
- Followed develop's test prunes (test_dr_legs_physics_presets.py
  deleted, reach preset tests trimmed) and kept the consolidated
  actuator equivalence twins.
Quote the torch union annotation in build_implicit_dof_mask so the
module imports under Sphinx's mocked torch, remove the stale
ActuatorJointProperties references from the actuators API page,
rebuild the four migration-guide grid tables whose columns overflowed
during the command-view rename, and wrap an overlong line in the
actuator schema authoring.
Import IdealPDActuator lazily in randomize_actuator_gains so the
environment-factory import path stays free of actuator config modules
(test_factories_are_kitless_in_fresh_process), and point the actuators
concept page at the existing policy-transfer how-to instead of a
nonexistent document.
@kellyguo11
kellyguo11 merged commit ddb54d3 into isaac-sim:develop Aug 19, 2026
46 of 49 checks passed
@github-project-automation github-project-automation Bot moved this from In progress to Done in Isaac Lab Aug 19, 2026
hujc7 added a commit to hujc7/IsaacLab that referenced this pull request Aug 20, 2026
Resolves six conflicts from isaac-sim#6839 (actuator ownership) and isaac-sim#7036 (Shadow Hand
prototype spawn):

- Carry isaac-sim#7036's spawn_path onto the unified asset so only env_0 is authored.
- Adopt joint_effort_limit, the new name for effort_limit_sim.
- Keep isaac-sim#6839's actuators.compute/submit_commands delegation and re-apply the
  MuJoCo tendon actuator write on top.
- Restore SHADOW_HAND_NEWTON_CFG as the asset's MuJoCo variant, so the demo and
  its new test keep working against the unified asset.
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

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants