000f54adaadf3670414cbe7b1c94586c03e885f4
PlanarConstraint's point-in-plane residual used a body-attached normal (z_j) that rotates with body_j. When combined with CylindricalConstraint, which allows rotation about the shared axis, the plane normal tilts during Newton iteration. This allows the body to drift along the cylinder axis while technically satisfying the rotated distance residual. Fix: snapshot the world-frame normal at system-build time (as Const nodes) and use it in the distance residual. The cross-product residuals still use body-attached normals to enforce parallelism. Only the distance residual needs the fixed reference direction. Works for any offset value: (p_i - p_j) · z_ref - offset = 0.
Kindred Solver
Assembly constraint solver addon for Kindred Create. Implements the IKCSolver interface via kcsolve.register_solver().
Components
Kindred Solver (Phase 1)
Expression-based Newton-Raphson constraint solver. Pure Python, registered as a Create addon.
- Expression DAG with eval, symbolic differentiation, simplification:
kindred_solver/expr.py - Parameter table with fixed/free tracking:
kindred_solver/params.py - Quaternion rotation as polynomial Expr trees:
kindred_solver/quat.py - RigidBody entity (7 params: position + unit quaternion):
kindred_solver/entities.py - Constraint residual generators (Coincident, DistancePointPoint, Fixed):
kindred_solver/constraints.py - Newton-Raphson solver with symbolic Jacobian:
kindred_solver/newton.py - Pre-solve passes (substitution, single-equation):
kindred_solver/prepass.py - DOF counting via Jacobian rank:
kindred_solver/dof.py - KCSolve IKCSolver bridge:
kindred_solver/solver.py
GNN (future phases)
Graph neural network constraint prediction layer. OndselSolver C++ engine and ML training infrastructure. Moved to GNN/ — will be integrated in later phases.
Create Addon Integration
This repo is a git submodule at mods/solver/ in the Create repository. The addon loader discovers package.xml and executes Init.py, which registers the solver:
import kcsolve
from kindred_solver import KindredSolver
kcsolve.register_solver("kindred", KindredSolver)
Testing
python3 -m venv .venv && . .venv/bin/activate
pip install pytest numpy
PYTHONPATH=. pytest tests/ -v
Repository Structure
├── package.xml # Create addon manifest
├── Init.py # Solver registration entry point
├── kindred_solver/ # Phase 1: expression-based Newton solver
│ ├── expr.py # Expression DAG
│ ├── params.py # Parameter table
│ ├── quat.py # Quaternion math as Expr trees
│ ├── entities.py # RigidBody entity
│ ├── constraints.py # Constraint residual generators
│ ├── newton.py # Newton-Raphson solver
│ ├── prepass.py # Pre-solve passes
│ ├── dof.py # DOF counting
│ └── solver.py # IKCSolver bridge
├── tests/ # Unit tests (82 tests)
└── GNN/ # GNN solver layer (future phases)
License
LGPL-2.1-or-later (see LICENSE)
Languages
C++
66.2%
Python
32.5%
CMake
1.1%