Friction
Steel uses the isotropic , not a pyramid, and solves both tangent directions of a contact together on their 2×2 block at the contact’s current normal impulse. If the unconstrained (“stick”) solution lies inside the disk of radius , the contact sticks. If not, scaling it back onto the circle is wrong whenever is anisotropic, which it almost always is for an articulated finger. Steel solves the trust-region problem
with up to eight safeguarded Newton steps on and a bisection fallback. An impulse that already satisfies the optimality conditions is kept unchanged, so a converged sweep can be exactly stationary.
Friction patches and anchors
Section titled “Friction patches and anchors”A box on a table has four contact points, three rows each, acting on six degrees of freedom. The solver can shift load between corners from step to step without changing the motion, and with per-point friction the friction budget moves with the load, so a held object creeps. By default (friction_anchor_beta=None, which selects 0.2) Steel separates the friction budget from how load is distributed:
- Contacts of one body pair form a region when their normals agree within about six degrees, their friction coefficients match, their contact planes are close and the shapes touch. Every contact keeps its own normal row, so support and tipping are unchanged.
- Friction moves to at most two anchors at the ends of the region’s principal axis, which share the region’s pooled normal load.
- Each anchor carries its tangential displacement across steps, from the SE(3) logarithm of both bodies’ pose increments, and its rows add so static friction holds position, not just zero velocity.
- History is matched by body pair and geometry, independently of the collision pipeline’s contact matching. An anchor is released when its region unloads, or when it is within 5% of the cone and slipping against it.
Turn the push and change its size. Each friction location solves the coupled disk update of the friction demo, after enough Gauss-Seidel sweeps to converge; the dashed circles are each location’s friction disk. Below, what Steel measured on a box near its friction limit: point friction creeps, the anchors hold. Tutorial: Patch friction vs point friction · Friction combine modes · Global friction scale
Set friction_anchor_beta=0 for point friction: two coupled tangent rows per contact. It is cheaper where nothing is held. Call reset after teleporting a body to discard its history.
Friction modes. friction_mode is experimental, and every mode other than the default uses point friction. "fixed_normal" (default) is the disk solve above at the contact’s current normal impulse. "coulomb_newton" solves each free-body contact’s cone exactly, normal and tangent together. Under the immediate response articulated contacts keep the "fixed_normal" update; solve_mode="colored" puts articulated contacts on propagation rows with the selected mode, except contacts between two links of one articulation, which stay on dense rows with the articulated update. "bisection" and "bisection_desaxce" search the normal impulse, but each probe scales the stick impulse radially onto the disk, the projection ruled out above for an anisotropic . Near the friction limit that converges to a slipping answer, and more iterations do not change it: a box at 97% of its limit slides away under both, while "fixed_normal" and "coulomb_newton" hold it. A fix is in review in skild-ai/newton#26. Until it lands, use "fixed_normal", or "coulomb_newton" for free bodies near the friction limit.
Tutorials Friction update modes · Conveyor belts · Kinematic bodies
Torsion, rolling and spin
Section titled “Torsion, rolling and spin”Spin friction about the normal is opt-in per shape with steel:min_torsional_patch_radius , imported from PhysX’s physxCollision:minTorsionalPatchRadius. Sliding and spin share one Coulomb budget, . The radius is an effective footprint: for a uniformly loaded disk of radius . On the integration branch, free-body contacts also take MuJoCo’s condim convention through steel:condim: 4 adds a spin row and 6 adds a rolling pair. The MJCF importer reads a geom’s friction triple but not its condim into steel:condim, so set the attribute after import or author newton:steel:condim in USD; a change that reads MJCF condim is in review in skild-ai/newton#22.
At a sphere–plane point contact, sliding friction cannot oppose spin about the contact normal; it changes rolling while the contact slips, but adds no rolling resistance once the ball rolls without slipping. Spin and rolling rows add those resistances. The curves are Steel runs from the tutorials. Tutorial: Torsional friction on articulated bodies · Spin and rolling friction
Steel docs and tutorials are licensed under Apache-2.0. Third-party notices. "Skild", "Skild AI" and the Skild logo are trademarks of Skild AI and are not licensed under Apache-2.0.