torque_decompose — DRIVE tactorque op

• Data kinds: matrix × matrix × scalar × scalar × scalar → table

• Call: import fullseye as fs; fs.ledger.torque_decompose(pts, u, area: 'float', G: 'float', nu: 'float', a: 'float | None' = None, window=None, radius: 'float | None' = None, coef: 'float | None' = None, P: 'float | None' = None, mu: 'float | None' = None, torsion_model: 'str' = 'partial_slip') -> 'dict' (to call the implementation directly, import tactorque; tactorque.torque_decompose(pts, u, area: 'float', G: 'float', nu: 'float', a: 'float | None' = None, window=None, radius: 'float | None' = None, coef: 'float | None' = None, P: 'float | None' = None, mu: 'float | None' = None, torsion_model: 'str' = 'partial_slip') -> 'dict'; from the registry, opsdrive.get("torque_decompose"))

Usage

Splits the marker field into 3 mechanical quantities: translation = mean displacement in the window (shear Q, unidirectional component), omega = rigid rotation angle (rigid_rotation_fit) → torsion Mz (needs a; omega_curl = mean curl/2 for reference), D = divergence dipole (area-weighted) → tilt M1 = D / coef (coef defaults to the half-space closed form −(1−2ν)/(2G); on real hardware pass the calibrated value), tau = (−M1_y, M1_x). Divergence and curl do not change when the mean displacement is subtracted (the derivative of a constant is 0), so the order does not matter. The window (cx, cy, R) is limited to the contact circle (because in a half-space pure shear creates a divergence dipole over the whole window; see the module docstring). radius = neighborhood radius for the divergence (required).

Torsion: the no-slip relation (Reissner–Sagoci) M = (16Ga³/3)ω is kept in Mz_no_slip. ★With torsion_model="partial_slip" (default, since 2026-10-06) the value corrected by the numerical solution for partial slip of a Hertz contact (normal force P, friction mu, contact radius a) (contact and from_no_slip_read of cuttouch.torsion_partial_slip) is returned in Mz —— torsion of a Hertz contact always slips from the edge, so keeping the no-slip relation overreads M (+33 % at ratio-to-full-slip 0.5, +85 % at 0.8). Also returns Mz_ratio (ratio to full slip), Mz_c_over_a (stick-circle radius / a), Mz_readable (not full slip, and the stick circle contains the radius of the fitting window —— if false the number is returned but is not reliable; false if there is no window). If a is given but P or mu is missing, correction is impossible, so ValueError (it does not silently return the no-slip value). "no_slip" gives the values up to 0.4.0 (Mz = Mz_no_slip) —— for flat-punch indenters (no-slip is exact up to 8/(3π) times full slip) or bonded discs. Raises ValueError: area, G ≤ 0, ν outside [0, 0.5], shape of points, no radius, fewer than 3 points in the window, misspelt torsion_model, partial_slip with a given but P / mu not positive finite.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_tactile_dipole_torque — py -3.11 examples/poc_tactile_dipole_torque.py

Ops the type connects to (they accept table as input)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

Same category (tactorque)

punch_pressure · punch_surface_uz · hertz_pressure_shifted · ellipse_pressure_shifted · pressure_first_moment · boussinesq_kernel · boussinesq_surface_displacement · surface_divergence_closed_form


*Provenance: tactorque.py — DRIVE operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.