Solver backends#
All backends implement Solver and minimise the
same weighted least-squares task cost. Pick based on step semantics and whether
you need hard limits.
Quick reference#
Name |
|
Use when |
|---|---|---|
DLS |
|
Real-time velocity IK (Mink-style differential step); default |
LM |
|
Few Newton-style steps on |
L-BFGS |
|
Multi-iteration reach with quasi-Newton |
Constrained |
|
Hard limits via box / general-inequality ADMM (Mink QP equivalent) |
Only ConstrainedSolver has supports_limits = True.
Cost-only backends (DLS / LM / L-BFGS) ignore limits= if passed explicitly.
Damped least squares (default)#
solver = mw.make_solver(cfg, "dls", damping=1e-12)
v = solver.solve(tasks, dt=0.01)
cfg.integrate_inplace(v, dt)
DLSSolver is also exposed as mink_warp.IKSolver.
Levenberg–Marquardt#
solver = mw.LMSolver(cfg)
solver.solve_and_integrate(tasks, dt=0.01, iterations=5)
Advances q on device; returns equivalent tangent velocity.
L-BFGS#
solver = mw.LBFGSSolver(cfg, history=10)
solver.solve_and_integrate(tasks, dt=0.01, iterations=20)
Hard limits (constrained)#
Mink-compatible shortcut — auto-builds ConstrainedSolver:
from mink_warp.limits import ConfigurationLimit, VelocityLimit
v = mw.solve_ik(cfg, tasks, dt=0.01, limits=None) # default joint limit
v = mw.solve_ik(
cfg, tasks, dt=0.01,
limits=[ConfigurationLimit(model), VelocityLimit(model, 3.0)],
)
Explicit solver (tuning admm_iters, use_inequalities, etc.):
solver = mw.ConstrainedSolver(cfg, limits=[ConfigurationLimit(model)])
v = solver.solve(tasks, dt=0.01)
limits=[] disables hard limits (regularized DLS inside the constrained backend).
Full guide: Constrained IK (hard limits).
Functional shortcuts#
v = mw.solve_ik(cfg, tasks, dt) # unconstrained DLS
q = mw.solve_ik_iterations(cfg, tasks, dt, iterations=10)
See Solvers for the full API.