FAILURE MAP
← Case archive

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.

Verified by executionVariant 1 · 6 checks per implementationDownload source bundle ↓JSON ↗

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 fixtureActualExpectedOutcome
transverse force0-2Failed
other axis02Failed
existing torque32Failed
same origin11Passed
zero force11Passed
parallel force11Passed

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 fixtureActualExpectedOutcome
transverse force2-2Failed
other axis-22Failed
existing torque42Failed
same origin11Passed
zero force11Passed
parallel force11Passed

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 fixtureActualExpectedOutcome
transverse force-2-2Passed
other axis22Passed
existing torque22Passed
same origin11Passed
zero force11Passed
parallel force11Passed

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