Constructive Two-View Gauge Initialization / two_view_registered_track.py

✓✓ Beats tuned baseline

Raw ⬇ ZIP
 1import math
 2import numpy as np
 3
 4META = {
 5    'name': 'two_view_gauge_localization',
 6    'domain': 'geometry/localization',
 7    'description': 'Planar two-view global and relay-frame observations for target localization with an unknown yaw and translation gauge.'
 8}
 9
10def _rot(a):
11    c, s = np.cos(a), np.sin(a)
12    return np.array([[c, -s], [s, c]], dtype=np.float32)
13
14def _make(seed, n):
15    rng = np.random.default_rng(seed)
16    x = rng.uniform(-2, 2, (n, 2)).astype(np.float32)
17    p = rng.uniform(-2, 2, (n, 2)).astype(np.float32)
18    psi = rng.uniform(-math.pi, math.pi, n)
19    q1 = rng.uniform(-1, 1, (n, 2)).astype(np.float32)
20    dq = rng.uniform(-2, 2, (n, 2)).astype(np.float32)
21    dq += (np.linalg.norm(dq, axis=1) < .25)[:, None] * np.array([.4, .1], np.float32)
22    q2 = q1 + dq
23    ev1 = np.empty_like(q1); ev2 = np.empty_like(q1); et = np.empty_like(q1)
24    for i, a in enumerate(psi):
25        R = _rot(-a)
26        ev1[i] = R @ (q1[i] - x[i]); ev2[i] = R @ (q2[i] - x[i]); et[i] = R @ (p[i] - x[i])
27    noise = .035
28    for z in (q1, q2, ev1, ev2, et):
29        z += rng.normal(0, noise, z.shape).astype(np.float32)
30    return np.concatenate([q1, q2, ev1, ev2, et], axis=1).astype(np.float32), p.astype(np.float32)
31
32def get_dataset(seed, n_train, n_test):
33    xtr, ytr = _make(seed, n_train)
34    xte, yte = _make(seed + 5000, n_test)
35    return {'xtr': xtr, 'ytr': ytr, 'xte': xte, 'yte': yte,
36            'task': 'regression', 'metric': 'mse', 'out_dim': 2}