FAILURE MAP
← Case archive

FA-88101 / Inverse kinematics solvers / Open access

Delta carriage is solved on the lower root · case 01

Carriages are placed below the effector plane.

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

ROOT CAUSE

The rod vertical component is subtracted from z instead of added.

VERIFIED REPAIR

Carriage height is z + sqrt(radicand).

Unsuccessful approach: Dropping z places the carriage relative to the bed rather than the effector.

Case contract

Input [R,e,L,x,y,z,hmax]: linear delta printer, towers at 90, 210 and 330 degrees (in that output order) on radius R, effector joints offset e toward the centre so the effective radius is R-e, diagonal rods of length L. Carriage height is z+sqrt(L^2-dx^2-dy^2); a negative radicand returns "unreachable", a carriage above hmax returns "out-of-travel". Return heights rounded to 4.

Why this case matters

Inverse kinematics code turns task-space goals into joint commands; a wrong branch, sign, limit or update order sends a real arm to the wrong pose.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    R,e,L,px,py,pz,hmax=x
    r=R-e
    S=math.sqrt(3.0)/2.0
    hs=[]
    for tx,ty in [(0.0,r),(-r*S,-r/2),(r*S,-r/2)]:
        q=L*L-(px-tx)**2-(py-ty)**2
        if q<0: return 'unreachable'
        h=pz-math.sqrt(q)
        if h>hmax: return 'out-of-travel'
        hs.append(round(h,4))
    return hs
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['centre', [[10, 2, 12, 0, 0, 5, 40]], [13.9443, 13.9443, 13.9443]], ['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['beyond rod reach', [[10, 2, 10, 0, -3, 0, 40]], 'unreachable'], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]]], [['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]], ['toward tower three', [[10, 1, 15, 4, -2, 3, 40]], [12.3808, 11.9245, 17.2952]], ['high z low travel', [[10, 2, 12, 0, 0, 25, 30]], 'out-of-travel'], ['no effector offset', [[8, 0, 12, 1, 1, 2, 40]], [11.6954, 9.4929, 11.1573]]], [['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['high z low travel', [[10, 2, 12, 0, 0, 25, 30]], 'out-of-travel'], ['no effector offset', [[8, 0, 12, 1, 1, 2, 40]], [11.6954, 9.4929, 11.1573]], ['large offset', [[12, 5, 11, -1, 2, 4, 40]], [13.7468, 12.07, 10.3934]], ['asymmetric point', [[10, 2, 12, 3, 4, 1, 40]], 'unreachable'], ['negative z', [[10, 2, 12, -2, 1, -3, 40]], [6.5394, 6.7321, 3.2679]]], [['centre', [[10, 2, 12, 0, 0, 5, 40]], [13.9443, 13.9443, 13.9443]], ['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['asymmetric point', [[10, 2, 12, 3, 4, 1, 40]], 'unreachable'], ['negative z', [[10, 2, 12, -2, 1, -3, 40]], [6.5394, 6.7321, 3.2679]]], [['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['beyond rod reach', [[10, 2, 10, 0, -3, 0, 40]], 'unreachable'], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]], ['toward tower three', [[10, 1, 15, 4, -2, 3, 40]], [12.3808, 11.9245, 17.2952]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
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
centre[-3.9443, -3.9443, -3.9443][13.9443, 13.9443, 13.9443]Failed
off centre[0.6411, -2.9553, -5.8955][9.3589, 12.9553, 15.8955]Failed
rod horizontal at tower one[0.0, -6.9282, -6.9282][0.0, 6.9282, 6.9282]Failed
beyond rod reachunreachableunreachablePassed
carriage exactly at top[-3.0, -3.0, -3.0][7.0, 7.0, 7.0]Failed
carriage over top[-2.5, -2.5, -2.5]out-of-travelFailed
toward tower two[-6.3808, -11.2952, -5.9245][12.3808, 17.2952, 11.9245]Failed

SHA-256 / 0bc6fd6e3c7c58abd20b675f880a65f884246e2b834bbf23ee737e3c652ccf78

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    R,e,L,px,py,pz,hmax=x
    r=R-e
    S=math.sqrt(3.0)/2.0
    hs=[]
    for tx,ty in [(0.0,r),(-r*S,-r/2),(r*S,-r/2)]:
        q=L*L-(px-tx)**2-(py-ty)**2
        if q<0: return 'unreachable'
        h=math.sqrt(q)
        if h>hmax: return 'out-of-travel'
        hs.append(round(h,4))
    return hs
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['centre', [[10, 2, 12, 0, 0, 5, 40]], [13.9443, 13.9443, 13.9443]], ['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['beyond rod reach', [[10, 2, 10, 0, -3, 0, 40]], 'unreachable'], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]]], [['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]], ['toward tower three', [[10, 1, 15, 4, -2, 3, 40]], [12.3808, 11.9245, 17.2952]], ['high z low travel', [[10, 2, 12, 0, 0, 25, 30]], 'out-of-travel'], ['no effector offset', [[8, 0, 12, 1, 1, 2, 40]], [11.6954, 9.4929, 11.1573]]], [['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['high z low travel', [[10, 2, 12, 0, 0, 25, 30]], 'out-of-travel'], ['no effector offset', [[8, 0, 12, 1, 1, 2, 40]], [11.6954, 9.4929, 11.1573]], ['large offset', [[12, 5, 11, -1, 2, 4, 40]], [13.7468, 12.07, 10.3934]], ['asymmetric point', [[10, 2, 12, 3, 4, 1, 40]], 'unreachable'], ['negative z', [[10, 2, 12, -2, 1, -3, 40]], [6.5394, 6.7321, 3.2679]]], [['centre', [[10, 2, 12, 0, 0, 5, 40]], [13.9443, 13.9443, 13.9443]], ['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['asymmetric point', [[10, 2, 12, 3, 4, 1, 40]], 'unreachable'], ['negative z', [[10, 2, 12, -2, 1, -3, 40]], [6.5394, 6.7321, 3.2679]]], [['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['beyond rod reach', [[10, 2, 10, 0, -3, 0, 40]], 'unreachable'], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]], ['toward tower three', [[10, 1, 15, 4, -2, 3, 40]], [12.3808, 11.9245, 17.2952]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
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
centre[8.9443, 8.9443, 8.9443][13.9443, 13.9443, 13.9443]Failed
off centre[4.3589, 7.9553, 10.8955][9.3589, 12.9553, 15.8955]Failed
rod horizontal at tower one[0.0, 6.9282, 6.9282][0.0, 6.9282, 6.9282]Passed
beyond rod reachunreachableunreachablePassed
carriage exactly at top[5.0, 5.0, 5.0][7.0, 7.0, 7.0]Failed
carriage over top[5.0, 5.0, 5.0]out-of-travelFailed
toward tower two[9.3808, 14.2952, 8.9245][12.3808, 17.2952, 11.9245]Failed

SHA-256 / c7dcf1dd7ab5f100478957228305ab909db7e6b9cb8fcce1d0c1ad9b6d17ce7e

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
import math
N = 1
observations = []
def solve(x):
    R,e,L,px,py,pz,hmax=x
    r=R-e
    S=math.sqrt(3.0)/2.0
    hs=[]
    for tx,ty in [(0.0,r),(-r*S,-r/2),(r*S,-r/2)]:
        q=L*L-(px-tx)**2-(py-ty)**2
        if q<0: return 'unreachable'
        h=pz+math.sqrt(q)
        if h>hmax: return 'out-of-travel'
        hs.append(round(h,4))
    return hs
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['centre', [[10, 2, 12, 0, 0, 5, 40]], [13.9443, 13.9443, 13.9443]], ['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['beyond rod reach', [[10, 2, 10, 0, -3, 0, 40]], 'unreachable'], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]]], [['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]], ['toward tower three', [[10, 1, 15, 4, -2, 3, 40]], [12.3808, 11.9245, 17.2952]], ['high z low travel', [[10, 2, 12, 0, 0, 25, 30]], 'out-of-travel'], ['no effector offset', [[8, 0, 12, 1, 1, 2, 40]], [11.6954, 9.4929, 11.1573]]], [['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['high z low travel', [[10, 2, 12, 0, 0, 25, 30]], 'out-of-travel'], ['no effector offset', [[8, 0, 12, 1, 1, 2, 40]], [11.6954, 9.4929, 11.1573]], ['large offset', [[12, 5, 11, -1, 2, 4, 40]], [13.7468, 12.07, 10.3934]], ['asymmetric point', [[10, 2, 12, 3, 4, 1, 40]], 'unreachable'], ['negative z', [[10, 2, 12, -2, 1, -3, 40]], [6.5394, 6.7321, 3.2679]]], [['centre', [[10, 2, 12, 0, 0, 5, 40]], [13.9443, 13.9443, 13.9443]], ['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['asymmetric point', [[10, 2, 12, 3, 4, 1, 40]], 'unreachable'], ['negative z', [[10, 2, 12, -2, 1, -3, 40]], [6.5394, 6.7321, 3.2679]]], [['off centre', [[10, 2, 12, 2, -3, 5, 40]], [9.3589, 12.9553, 15.8955]], ['rod horizontal at tower one', [[10, 2, 10, 0, -2, 0, 40]], [0.0, 6.9282, 6.9282]], ['beyond rod reach', [[10, 2, 10, 0, -3, 0, 40]], 'unreachable'], ['carriage exactly at top', [[12, 0, 13, 0, 0, 2, 7]], [7.0, 7.0, 7.0]], ['carriage over top', [[12, 0, 13, 0, 0, 2.5, 7]], 'out-of-travel'], ['toward tower two', [[10, 1, 15, -4, -2, 3, 40]], [12.3808, 17.2952, 11.9245]], ['toward tower three', [[10, 1, 15, 4, -2, 3, 40]], [12.3808, 11.9245, 17.2952]]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(*args), expected)
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
centre[13.9443, 13.9443, 13.9443][13.9443, 13.9443, 13.9443]Passed
off centre[9.3589, 12.9553, 15.8955][9.3589, 12.9553, 15.8955]Passed
rod horizontal at tower one[0.0, 6.9282, 6.9282][0.0, 6.9282, 6.9282]Passed
beyond rod reachunreachableunreachablePassed
carriage exactly at top[7.0, 7.0, 7.0][7.0, 7.0, 7.0]Passed
carriage over topout-of-travelout-of-travelPassed
toward tower two[12.3808, 17.2952, 11.9245][12.3808, 17.2952, 11.9245]Passed

SHA-256 / 503e27b9f552fd24256d743cf15c5459263bc7338a9383597dd525e8ac97ca8a

Verification & scope

Deterministic planar or low-dimensional teaching model with a stipulated convention; not a general robotics library. 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:51:05.066056+00:00.

Case digest / 431af21e315bc36f31b9164988820a99e82aa75ccc3f95059c8330ba1bab075f