FA-12121 / Robotics frame conventions / Open access
A force torque is transferred to a new origin with the wrong moment arm · case 01
A force torque is transferred to a new origin with the wrong moment arm.
ROOT CAUSE
Torque is treated as independent of the origin where a wrench is reported.
VERIFIED REPAIR
Subtract r cross force when r points from old origin to new origin.
Unsuccessful approach: Adding r cross force has the sign for shifting in the opposite direction.
Case contract
In a common planar basis, return torque about new origin: tau_new=tau_old-(rx*fy-ry*fx). Force and r are integer pairs.
Why this case matters
Robot adapters must preserve the declared frame, reference point, and representation conventions across interfaces.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
def rot(v, q):
x,y = v
return [(x,y),(-y,x),(-x,-y),(y,-x)][q%4]
N = 1
observations = []
def solve(force,tau,r):
return tau
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('transverse force', solve([0,2],0,[N,0]), -2*N)
check('other axis', solve([2,0],0,[0,N]), 2*N)
check('existing torque', solve([1,2],3*N,[N,N]), 2*N)
check('same origin', solve([1,2],N,[0,0]), N)
check('zero force', solve([0,0],N,[N,N]), N)
check('parallel force', solve([1,1],N,[N,N]), N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| transverse force | 0 | -2 | Failed |
| other axis | 0 | 2 | Failed |
| existing torque | 3 | 2 | Failed |
| same origin | 1 | 1 | Passed |
| zero force | 1 | 1 | Passed |
| parallel force | 1 | 1 | Passed |
SHA-256 / 4dc6380570c94230435dfcdf81bf6bd8efdd80cb61babbf3a070cae368a8c6f2
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
def rot(v, q):
x,y = v
return [(x,y),(-y,x),(-x,-y),(y,-x)][q%4]
N = 1
observations = []
def solve(force,tau,r):
return tau+r[0]*force[1]-r[1]*force[0]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('transverse force', solve([0,2],0,[N,0]), -2*N)
check('other axis', solve([2,0],0,[0,N]), 2*N)
check('existing torque', solve([1,2],3*N,[N,N]), 2*N)
check('same origin', solve([1,2],N,[0,0]), N)
check('zero force', solve([0,0],N,[N,N]), N)
check('parallel force', solve([1,1],N,[N,N]), N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| transverse force | 2 | -2 | Failed |
| other axis | -2 | 2 | Failed |
| existing torque | 4 | 2 | Failed |
| same origin | 1 | 1 | Passed |
| zero force | 1 | 1 | Passed |
| parallel force | 1 | 1 | Passed |
SHA-256 / 78e7303e20379f4b1c20b4ea4f786e6e396109098378d698014746548fcf577e
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
def rot(v, q):
x,y = v
return [(x,y),(-y,x),(-x,-y),(y,-x)][q%4]
N = 1
observations = []
def solve(force,tau,r):
return tau-r[0]*force[1]+r[1]*force[0]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('transverse force', solve([0,2],0,[N,0]), -2*N)
check('other axis', solve([2,0],0,[0,N]), 2*N)
check('existing torque', solve([1,2],3*N,[N,N]), 2*N)
check('same origin', solve([1,2],N,[0,0]), N)
check('zero force', solve([0,0],N,[N,N]), N)
check('parallel force', solve([1,1],N,[N,N]), N)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| transverse force | -2 | -2 | Passed |
| other axis | 2 | 2 | Passed |
| existing torque | 2 | 2 | Passed |
| same origin | 1 | 1 | Passed |
| zero force | 1 | 1 | Passed |
| parallel force | 1 | 1 | Passed |
SHA-256 / 9e35e3ce476728cf7fe9955500c54c84d99f8a5560e0de03e21dd81bea9b04bd
Verification & scope
Small exact offline frame model; not a robot middleware implementation or continuous pose estimator. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:38:54.066679+00:00.
Case digest / 00c4fc9fcab424ee556704cf044c6907f14c6839c09852d1ea5befb0940b798b