Back to Supersonic RC Revive
SOURCE / PINNED RELEASE

Made of little things.

Supersonic RC Revive

Release
1ba42f1ca1d6…
Author-recorded commit
baecad10b1cd…
License
LICENSE
Author’s source reference
nostr://npub1ye5ptcxfyyxl5vjvdjar2ua3f0hynkjzpx552mu5snj3qmx5pzjscpknpr/wss%3A%2F%2Fgit.napplet.soy%2F/n-143146b0d6f

Archive hash verified: 90d22b206672eba4…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

tools/sim/fitwindow.py
#!/usr/bin/env python3
"""RMS errors of yaw rate, roll rate, pitch rate and L-R/F-R spring differences in a sim window.
    python3 tools/sim/fitwindow.py original.txt port.txt t0 t1"""
import math, sys
def load(p):
    out = []
    for l in open(p, newline=''):
        for part in l.replace('\r', '\n').split('\n'):
            r = part.split()
            if len(r) >= 33: out.append([float(x) for x in r[:33]])
    return out

def pair_by_sim(orig, port, tol=0.02):
    """Pair each original row with the port row nearest in simTime (within tol)."""
    out, j = [], 0
    for o in orig:
        while j + 1 < len(port) and abs(port[j + 1][1] - o[1]) <= abs(port[j][1] - o[1]):
            j += 1
        if port and abs(port[j][1] - o[1]) <= tol:
            out.append((o, port[j]))
    return out

o = load(sys.argv[1]); pairs = pair_by_sim(o, load(sys.argv[2]))
t0, t1 = float(sys.argv[3]), float(sys.argv[4])
acc = {k: [] for k in ('wx', 'wy', 'wz', 'roll', 'pitch', 'pos')}
for r, q in pairs:
    if not (t0 <= r[1] <= t1): continue
    for i, k in ((12, 'wx'), (13, 'wy'), (14, 'wz')): acc[k].append(r[i] - q[i])
    roll = lambda x: x[16] + x[22] - x[19] - x[25]
    pitch = lambda x: x[16] + x[19] - x[22] - x[25]
    acc['roll'].append(roll(r) - roll(q)); acc['pitch'].append(pitch(r) - pitch(q))
    acc['pos'].append(math.dist(r[2:5], q[2:5]))
print(' '.join(f"{k}={math.sqrt(sum(e*e for e in v)/max(1,len(v))):.3f}" for k, v in acc.items()), f"n={len(acc['pos'])}")