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.py — write_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
Acceptance Criteria
Proposal
Back the existing base-interface
joint_viscous_friction_coeffwith Newton'sModel.joint_dampingin the Newton articulation backend (isaaclab_newton).Newton's
Model.joint_dampingis 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-interfacejoint_viscous_friction_coeffthat the PhysX backend already implements. The Newton backend currently returns a zeros stub for this property, so we should bind and write it through toModel.joint_dampinginstead.Naming subtlety worth calling out: today
Articulation.data.joint_dampingin the Newton backend is bound to Newton'sModel.joint_target_kd(the PD drive damping gain), not toModel.joint_damping. These are distinct physical quantities, and this proposal does not change that mapping — it only adds the passive viscous term viajoint_viscous_friction_coeff.Motivation
Newton's
Modeldefines 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_dampingis bound toModel.joint_target_kd(PD gain), and the genuine passive viscous damping (Model.joint_damping) is never bound and cannot be read or written.joint_viscous_friction_coeff/write_joint_viscous_friction_coefficient_to_sim_*(PhysX 5.0+ DOF friction[static, dynamic, viscous]). The Newton backend stubsjoint_viscous_frictionto zeros, with a comment inevents.pynoting "Newton only has static friction."Backing
joint_viscous_friction_coeffwithModel.joint_dampinggives 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_coeffinterface rather than introducing a new, Newton-specific API.Build Info
Additional context
Relevant code:
source/isaaclab_newton/.../articulation/articulation_data.py—_sim_bind_joint_damping_sim = get_attribute("joint_target_kd", ...);_joint_viscous_frictionzeros stub.source/isaaclab_newton/.../articulation/articulation.py—write_joint_damping_to_sim_index/_maskwrite tojoint_target_kd.Modeldefinitions:newton/_src/sim/model.py(joint_target_ke,joint_target_kd,joint_damping).source/isaaclab_physx/.../articulation.pywrite_joint_viscous_friction_coefficient_to_sim_*.Checklist
Acceptance Criteria
ArticulationbindsModel.joint_dampingto thejoint_viscous_friction_coeffproperty (replacing the zeros stub) and exposes it for reading.write_joint_viscous_friction_coefficient_to_sim_index/_maskare implemented in the Newton backend and write through toModel.joint_damping, emitting the appropriateJOINT_DOF_PROPERTIESmodel-change notification.events.py) works under the Newton backend (no longer gated to PhysX-only).joint_viscous_friction_coeffon the Newton backend.