iDCOL computes contact — distance, location, normal — and its exact derivatives, for any pair of strictly convex bodies. Every contact reduces to the same fixed six-dimensional KKT system, solved in microseconds, regardless of the geometry.
Shown here in 2D for simplicity — an ellipse standing in for the paper's 3D primitives — but the transformation itself is dimension-agnostic: the reference body φ(x)=0 becomes φ(RT(x − r)/α)=0 under scale α, rotation R, and translation r.
Dashed = reference body φ(x)=0 at the origin. Solid = the same body under φ(RT(x − r)/α)=0. Drag to set the translation r, sliders control scale α and rotation θ.
Each family carries exactly one smoothing parameter — β for the log-sum-exp families (polytope, truncated cone), n for the superquadric families (ellipsoid, cylinder). Turn it up and the corners sharpen back into the exact, non-strictly-convex primitive; turn it down and they round off into a strictly convex surface that's differentiable everywhere — exactly what iDCOL's Newton solve needs. It's a single dial between geometric exactness and differentiability, not a compromise between them.
Growth distance turns contact into a constrained program: grow (or shrink) both bodies about their own centers by the same factor α until they just touch. Its KKT conditions collapse that program into six scalar equations in six unknowns — no inequality constraints, no combinatorics, just a root to find.
Jc = ∂F/∂z, fully analytic — no finite differences.
iDCOL casts collision as a 6-variable, 6-equation root-finding problem!
Two configurations break a naive Newton solve: bodies nearly coincident (α* → 0) and bodies far apart (α* → ∞). The surrogate problem rescales the relative translation into one well-conditioned range — near or far, every case is tamed.
Drag body B, or use the slider to spin it. 1.00 = αmin, the bounding-sphere gap ratio. Surrogate moves body B (pushing it out if close, pulling it in if far), same direction and rotation, until the spheres just touch.
This is the actual iDCOL C++ solver — the same
idcol_solve.cpp compiled to WebAssembly, running natively
in this page. Pick two shapes, pose body B freely in 6D, and press
Iteration to watch each real Newton step converge.
Not solved yet — press Solve or Iteration.
Solid = both bodies at their true pose (α=1). Transparent = both bodies scaled by the solved α*. Red dot = the shared contact point x*.
Gradient-based planning, control, and simulation all need derivatives of contact — distance, location, normal — with respect to robot state. Finite differences are slow and noisy. iDCOL gets exact derivatives by differentiating straight through the KKT solve itself.
q is the robot's generalized coordinates, J(q) its geometric Jacobian, and ∂F/∂q is chain-ruled through the relative pose g(q).
Every derivative of contact kinematics falls out of one extra, nearly free linear solve.
Applications in gradient-based path planning and differentiable contact physics.
An RRT-initialized path through eight static obstacles, refined by gradient-based optimization with iDCOL collision constraints.
A 6-DOF manipulator, its links convex-decomposed into 8 ellipsoids, planned around three obstacles across 24 collision pairs.
Ten strictly convex bodies — cones, cylinders, ellipsoids, polytopes — colliding freely across 45 contact pairs.
A tendon-actuated Cosserat-rod arm, modeled as a chain of smooth truncated cones, contacting the ground and two rigid obstacles.
iDCOL trades some things for speed and differentiability. Practitioners should know where those trades bite.
Complex or nonconvex robot links have to be split into convex pieces first; each piece is then solved within the same framework.
Sharp edges, flat faces, narrow regions, and high-aspect-ratio features get rounded off by the smooth approximation. Raising β or n recovers accuracy but can hurt numerical conditioning.
The Newton solve isn't globally convergent. The surrogate problem and warm-starting help in practice, but challenging configurations can still need a better initial guess.
Strict convexity means a single witness point per body pair — distributed line or surface contact (a box resting flush on a table) isn't directly represented.
The sphere and four smoothed families below cover most robotics primitives. Any strictly convex implicit surface works just as well — supply φ, ∇φ, ∇2φ and iDCOL treats it the same way, as shown by the last card.
// A, b: half-space constraints Ax <= b, one row per face auto poly = make_poly(20.0, A, b); auto ellip = make_se(1.0, 0.5, 1.0, 1.5); // A contact pair solves for the shared touching point ContactPair pair(poly, ellip); Eigen::Matrix4d g = Eigen::Matrix4d::Identity(); g.topRightCorner<3,1>() << 0.2, 0.1, 0.3; SolveResult out = pair.solve(g); if (out.newton.converged) { std::cout << "alpha = " << out.newton.alpha; }
@article{mathew2026iDCOL,
title = {Collision Detection With Analytical Derivatives of Contact Kinematics},
author = {Anup Teejo Mathew and Anees Peringal and Daniele Caradonna
and Frederic Boyer and Federico Renda},
journal = {IEEE Robotics and Automation Letters},
year = {2026},
doi = {10.1109/LRA.2026.3732913}
}