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.
#!/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'])}")
