quickik
A kinematic tree (body plan), loaded from JSON.
The pose being solved for.
Observation of a single keypoint: missing(), position_3d(pos, weight),
or position_2d(pos, weight).
A 3D world position, e.g. triangulated from multiple calibrated
cameras. Raises ValueError if pos doesn't have exactly 3
elements.
A 2D position in whatever space the consuming Solver's mapper
expects (e.g. camera pixel coordinates). Raises ValueError if pos
doesn't have exactly 2 elements.
A pinhole camera mapper for 2D keypoint observations.
A mapper for 2D keypoints already reprojected to physical X-Y coordinates.
Configuration for the inverse kinematics solver. Does not include the
mapper -- see [Solver]'s and SequenceSolver's
mapper argument.
Stop iterating early once an update step's largest root-position
component drops below this value, and the largest angle update drops
below angle_tolerance. 0 disables early termination.
Number of Gauss-Newton steps per solve call. Also the cap on early
termination -- see position_tolerance/angle_tolerance.
The inverse kinematics solver.
mapper is a Camera, an XYView, or None (the default, for 3D-only
observations); it's fixed for this Solver's lifetime, mirroring Rust's
Solver<M> generic parameter -- there's no setter, only the read-only
mapper property.
config is a live, shared handle: solver.config always returns the
same Python SolverConfig object, so mutating it (e.g.
solver.config.n_iterations = 5) takes effect on the next solve call,
mirroring Rust's pub config field. Assigning solver.config = other
re-points it at other (which then also mutates in place, same as any
other Python object reference).
Runs up to config.n_iterations Gauss-Newton steps in place on
state, given one KeypointObservation per joint (in
kinematic_tree.joints order; use KeypointObservation.missing()
for keypoints not observed this frame).
Solves a continuous sequence of frames for a single tracked body, warm
starting each frame from the previous frame's converged pose. See
Solver for mapper and config semantics
(both flattened here from Rust's nested solver.solver).
Solves the next frame, warm-started from the current pose, and
returns the converged state (also available as .state).
Solves every frame in sequence (a list of per-frame observation
lists) in order, each warm-started from the previous one; returns
the converged pose after each frame.
Configuration for [solve_sequence_segmented_parallel].
Solves a single long sequence in parallel by splitting it into slightly
overlapping segments, each solved on its own thread. mapper is a
Camera, an XYView, or None -- see Solver.
Observations are given as raw arrays rather than a list of per-frame
KeypointObservation lists: positions is (n_frames, n_keypoints, 3)
and weights is (n_frames, n_keypoints), both in
kinematic_tree.joints order; a keypoint with weight <= 0 is treated
as missing. This
avoids constructing one Python KeypointObservation object per keypoint
per frame, which otherwise dominates call overhead for large sequences
(e.g. a whole recording's worth of frames in one call).