Skip to content

Commit 9191147

Browse files
Address review feedback on collision pipeline config
Move config resolution out of NewtonManager into NewtonCollisionPipelineCfg.to_pipeline_args(), following the Kamino to_solver_config() pattern. Fix truthiness check on hydroelastic config dict to use explicit `is not None`. Add missing changelog entry for MJWarpSolverCfg.tolerance. Use specific return type hint dict[str, Any].
1 parent 0d82b15 commit 9191147

3 files changed

Lines changed: 29 additions & 7 deletions

File tree

source/isaaclab_newton/docs/CHANGELOG.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@ Added
99

1010
* Added :class:`~isaaclab_newton.physics.NewtonCollisionPipelineCfg` to expose Newton
1111
collision pipeline parameters via :attr:`~isaaclab_newton.physics.NewtonCfg.collision_cfg`.
12+
* Added :attr:`~isaaclab_newton.physics.MJWarpSolverCfg.tolerance` for solver convergence control.
13+
14+
Fixed
15+
^^^^^
16+
17+
* Fixed truthiness check on hydroelastic config dict in collision pipeline
18+
initialization. An explicit ``is not None`` check is now used so that
19+
:class:`~isaaclab_newton.physics.newton_collision_cfg.HydroelasticSDFCfg`
20+
with all-default values is no longer silently skipped.
1221

1322

1423
0.5.12 (2026-04-13)

source/isaaclab_newton/isaaclab_newton/physics/newton_collision_cfg.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from __future__ import annotations
99

10-
from typing import Literal
10+
from typing import Any, Literal
1111

1212
from isaaclab.utils import configclass
1313

@@ -166,3 +166,21 @@ class NewtonCollisionPipelineCfg:
166166
167167
Defaults to ``None`` (hydroelastic disabled, same as Newton's default).
168168
"""
169+
170+
def to_pipeline_args(self) -> dict[str, Any]:
171+
"""Build keyword arguments for :class:`newton.CollisionPipeline`.
172+
173+
Converts this configuration into the dict expected by
174+
``CollisionPipeline.__init__``, handling nested config conversion
175+
(e.g. :class:`HydroelasticSDFCfg` → ``HydroelasticSDF.Config``).
176+
177+
Returns:
178+
Keyword arguments suitable for ``CollisionPipeline(model, **args)``.
179+
"""
180+
from newton.geometry import HydroelasticSDF
181+
182+
cfg_dict = self.to_dict()
183+
hydro_cfg = cfg_dict.pop("sdf_hydroelastic_config", None)
184+
if hydro_cfg is not None:
185+
cfg_dict["sdf_hydroelastic_config"] = HydroelasticSDF.Config(**hydro_cfg)
186+
return cfg_dict

source/isaaclab_newton/isaaclab_newton/physics/newton_manager.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
_cudart = None
2929
from newton import Axis, CollisionPipeline, Contacts, Control, Model, ModelBuilder, State, eval_fk
3030
from newton._src.usd.schemas import SchemaResolverNewton, SchemaResolverPhysx
31-
from newton.geometry import HydroelasticSDF
3231
from newton.sensors import SensorContact as NewtonContactSensor
3332
from newton.sensors import SensorFrameTransform
3433
from newton.solvers import SolverBase, SolverFeatherstone, SolverMuJoCo, SolverNotifyFlags, SolverXPBD
@@ -731,11 +730,7 @@ def _initialize_contacts(cls) -> None:
731730
# Newton collision pipeline: create pipeline and generate contacts
732731
if cls._collision_pipeline is None:
733732
if cls._collision_cfg is not None:
734-
cfg_dict = cls._collision_cfg.to_dict()
735-
hydro_cfg = cfg_dict.pop("sdf_hydroelastic_config", None)
736-
if hydro_cfg:
737-
cfg_dict["sdf_hydroelastic_config"] = HydroelasticSDF.Config(**hydro_cfg)
738-
cls._collision_pipeline = CollisionPipeline(cls._model, **cfg_dict)
733+
cls._collision_pipeline = CollisionPipeline(cls._model, **cls._collision_cfg.to_pipeline_args())
739734
else:
740735
cls._collision_pipeline = CollisionPipeline(cls._model, broad_phase="explicit")
741736

0 commit comments

Comments
 (0)