Skip to content

[Proposal] Back Newton Articulation joint_viscous_friction_coeff with Model.joint_damping #6517

Description

@rubengrandia

Proposal

Back the existing base-interface joint_viscous_friction_coeff with Newton's Model.joint_damping in the Newton articulation backend (isaaclab_newton).

Newton's Model.joint_damping is the passive viscous damping coefficient — a resistive force/torque proportional to joint velocity that is always active on the joint. Semantically this matches the base-interface joint_viscous_friction_coeff that the PhysX backend already implements. The Newton backend currently returns a zeros stub for this property, so we should bind and write it through to Model.joint_damping instead.

Naming subtlety worth calling out: today Articulation.data.joint_damping in the Newton backend is bound to Newton's Model.joint_target_kd (the PD drive damping gain), not to Model.joint_damping. These are distinct physical quantities, and this proposal does not change that mapping — it only adds the passive viscous term via joint_viscous_friction_coeff.

Motivation

Newton's Model defines three distinct per-DOF arrays:

  • joint_target_ke — Joint stiffness [N/m or N·m/rad] (PD position gain)
  • joint_target_kd — Joint damping [N·s/m or N·m·s/rad] (PD velocity gain)
  • joint_damping — Passive velocity damping [N·s/m or N·m·s/rad], always active on the joint (viscous damping coefficient)

Currently in isaaclab_newton:

  • data.joint_damping is bound to Model.joint_target_kd (PD gain), and the genuine passive viscous damping (Model.joint_damping) is never bound and cannot be read or written.
  • The PhysX backend exposes a velocity-proportional viscous term via joint_viscous_friction_coeff / write_joint_viscous_friction_coefficient_to_sim_* (PhysX 5.0+ DOF friction [static, dynamic, viscous]). The Newton backend stubs joint_viscous_friction to zeros, with a comment in events.py noting "Newton only has static friction."

Backing joint_viscous_friction_coeff with Model.joint_damping gives the best cross-backend parity: PhysX already implements this property, and the Newton value is currently just a zeros stub. It also enables correct domain randomization of viscous damping under the Newton backend.

Alternatives

None — this approach maximizes cross-backend parity by reusing the existing joint_viscous_friction_coeff interface rather than introducing a new, Newton-specific API.

Build Info

  • Isaac Lab Version: 3.0.0
  • Isaac Sim Version: N/A (Newton backend)

Additional context

Relevant code:

  • source/isaaclab_newton/.../articulation/articulation_data.py_sim_bind_joint_damping_sim = get_attribute("joint_target_kd", ...); _joint_viscous_friction zeros stub.
  • source/isaaclab_newton/.../articulation/articulation.pywrite_joint_damping_to_sim_index/_mask write to joint_target_kd.
  • Newton Model definitions: newton/_src/sim/model.py (joint_target_ke, joint_target_kd, joint_damping).
  • PhysX reference: source/isaaclab_physx/.../articulation.py write_joint_viscous_friction_coefficient_to_sim_*.

Checklist

  • I have checked that there is no similar issue in the repo (required)

Acceptance Criteria

  • The Newton Articulation binds Model.joint_damping to the joint_viscous_friction_coeff property (replacing the zeros stub) and exposes it for reading.
  • write_joint_viscous_friction_coefficient_to_sim_index/_mask are implemented in the Newton backend and write through to Model.joint_damping, emitting the appropriate JOINT_DOF_PROPERTIES model-change notification.
  • Viscous-friction domain randomization (events.py) works under the Newton backend (no longer gated to PhysX-only).
  • Tests covering the write → read round-trip for joint_viscous_friction_coeff on the Newton backend.
  • Docs/changelog fragment added.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Fields

No fields configured for issues without a type.

Projects

Status
Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions