FA-12096 / Robotics frame conventions / Open access
North-east-down positions are labeled as east-north-up · case 01
North-east-down positions are labeled as east-north-up.
ROOT CAUSE
The navigation adapter changes the frame label without changing coordinates.
VERIFIED REPAIR
Swap horizontal components and negate down.
Unsuccessful approach: Swapping north and east alone preserves the wrong vertical sign.
Case contract
Convert integer local NED [north,east,down] to ENU [east,north,up] with coincident origins.
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(v):
return v
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('north', solve([N,0,0]), [0,N,0])
check('east', solve([0,N,0]), [N,0,0])
check('down', solve([0,0,N]), [0,0,-N])
check('zero', solve([0,0,0]), [0,0,0])
check('mixed', solve([N,2*N,3*N]), [2*N,N,-3*N])
check('up', solve([-N,0,-N]), [0,-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 |
|---|---|---|---|
| north | [1, 0, 0] | [0, 1, 0] | Failed |
| east | [0, 1, 0] | [1, 0, 0] | Failed |
| down | [0, 0, 1] | [0, 0, -1] | Failed |
| zero | [0, 0, 0] | [0, 0, 0] | Passed |
| mixed | [1, 2, 3] | [2, 1, -3] | Failed |
| up | [-1, 0, -1] | [0, -1, 1] | Failed |
SHA-256 / da497c5c5d4f82648998f7a90ff369d096cf321d27fbb22922a132d29521858f
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(v):
return [v[1],v[0],v[2]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('north', solve([N,0,0]), [0,N,0])
check('east', solve([0,N,0]), [N,0,0])
check('down', solve([0,0,N]), [0,0,-N])
check('zero', solve([0,0,0]), [0,0,0])
check('mixed', solve([N,2*N,3*N]), [2*N,N,-3*N])
check('up', solve([-N,0,-N]), [0,-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 |
|---|---|---|---|
| north | [0, 1, 0] | [0, 1, 0] | Passed |
| east | [1, 0, 0] | [1, 0, 0] | Passed |
| down | [0, 0, 1] | [0, 0, -1] | Failed |
| zero | [0, 0, 0] | [0, 0, 0] | Passed |
| mixed | [2, 1, 3] | [2, 1, -3] | Failed |
| up | [0, -1, -1] | [0, -1, 1] | Failed |
SHA-256 / 4418732f97fb8c58786c52ce072af1b8158466b9782e492b42e63291ee311101
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(v):
return [v[1],v[0],-v[2]]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('north', solve([N,0,0]), [0,N,0])
check('east', solve([0,N,0]), [N,0,0])
check('down', solve([0,0,N]), [0,0,-N])
check('zero', solve([0,0,0]), [0,0,0])
check('mixed', solve([N,2*N,3*N]), [2*N,N,-3*N])
check('up', solve([-N,0,-N]), [0,-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 |
|---|---|---|---|
| north | [0, 1, 0] | [0, 1, 0] | Passed |
| east | [1, 0, 0] | [1, 0, 0] | Passed |
| down | [0, 0, -1] | [0, 0, -1] | Passed |
| zero | [0, 0, 0] | [0, 0, 0] | Passed |
| mixed | [2, 1, -3] | [2, 1, -3] | Passed |
| up | [0, -1, 1] | [0, -1, 1] | Passed |
SHA-256 / f89834ce93cd27b5c8b0b560c05a848a70a01c70395052430c7dd7b787eb236d
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:53.696272+00:00.
Case digest / fa5f548ef59b474b20d40f23b25613c500112ad0f2640f070df341b7b41a00cf