Kamino#
SolverKamino simulates constrained rigid multi-body
systems in maximal coordinates. It is designed for mechanical assemblies with
kinematic loops, under- or overactuation, joint limits, hard frictional
contacts, and restitutive impacts.
Unlike the other maximal-coordinate solvers, Kamino focuses on constrained rigid mechanical assemblies rather than particle or deformable simulation. Kamino is currently in BETA 1, and Newton users are discouraged from depending on it. Evaluate it only when kinematic loops and hard contact constraints are primary requirements and an experimental solver is acceptable.
Experimental
SolverKamino is experimental. Its public API,
behavior, feature support, performance, and implementation may change
without prior notice.
See the SolverKamino API reference for construction
and configuration details. Runnable workflows are available in the
Kamino examples.
Choosing a dynamics solver#
Kamino provides two forward-dynamics backends:
"padmm"(default): proximal ADMM, dense Jacobians/dynamics, and the Euler integrator. It is the slower, more robust option because it solves equality and inequality constraints together."dvi"(opt-in): projected dual iterations, sparse Jacobians, dense dynamics with the RCM-reordered blocked LLT solver, and the Euler integrator. It is generally faster, but approximates the coupled problem by alternating between a direct solve for equality constraints and projected iterations for inequality constraints. As a rule of thumb, DVI solves inequality constraints less accurately than PADMM, particularly as the number of active inequalities grows. Dual preconditioning is not supported.
Select the backend when constructing the configuration so dependent defaults initialize consistently:
config = newton.solvers.SolverKamino.Config(dynamics_solver="dvi")
solver = newton.solvers.SolverKamino(model, config=config)
DVI is best suited to performance-sensitive rigid mechanisms with relatively
few active contacts; PADMM remains the safer and more broadly validated choice.
Set sparse_jacobian=False for fully dense DVI, or set
sparse_dynamics=True to use sparse dynamics with the Conjugate Residual
solver. With
collect_solver_info=True, DVI stores terminal residual status that should
not be interpreted as PADMM ADMM residuals.
For large bilateral systems, opt into RCM-reordered factorization explicitly:
config.dvi.bilateral_solver_type = "LLTBRCM"
config.dvi.bilateral_solver_kwargs = {
"block_size": 32,
"reuse_permutation": True,
"parallel_factorization": True,
}
The cached permutation remains mathematically valid when matrix values or
sparsity change and is recomputed automatically if the active dimension
changes. Keep the default "LLTB" solver for small systems.
Actuation and forward kinematics#
Kamino dynamics routes actuation independently for each joint DoF. A DoF can use explicit effort, unbounded implicit PD, or effort-limited implicit PD; passive armature, damping, and Coulomb friction are likewise configured per DoF. Implicit-PD target modes require a non-zero applicable gain: velocity mode requires derivative gain, while position-based modes require proportional or derivative gain. Coulomb friction supports all non-free joint types, while joint dynamics and implicit PD currently support revolute, prismatic, and gimbal joint types only.
The forward-kinematics solver still partitions each joint as entirely passive
or entirely actuated. Different non-passive target modes are allowed within a
joint, but mixing passive and actuated DoFs within one joint is not yet
supported. The fk_actuation_flag model attribute provides an explicit
joint-level override for this FK partition.