skyfull-lookat-chamonix-v1
LookAtNet — 4.5k-param MLP that maps a 3D event location to SO-101 arm joint angles for look-at pointing.
Trained in 7 seconds on an M2 MacBook Air on 5,000 simulated pointing episodes over virtual Chamonix terrain (MuJoCo).
Architecture
Input (3): normalised (x_m, y_m, z_m) — event in arm frame [0,1]
→ Linear(3, 64) + SiLU
→ Linear(64, 64) + SiLU
→ Linear(64, 3)
Output (3): (θ0, θ1, θ2) — joint angles in radians
| Parameters | 4,611 |
| Checkpoint size | 21 KB |
| Val angular error | < 0.2° mean, < 0.4° p90 |
| Training time | 7 s (M2, MPS) |
| Epochs | 200 |
Quick start
import torch, numpy as np
import torch.nn as nn
from huggingface_hub import hf_hub_download
class LookAtNet(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(3, 64), nn.SiLU(),
nn.Linear(64, 64), nn.SiLU(),
nn.Linear(64, 3),
)
def forward(self, x): return self.net(x)
ckpt = torch.load(hf_hub_download("Ethgar/skyfull-lookat-chamonix-v1", "lookat_chamonix.pt"), weights_only=False)
model = LookAtNet()
model.load_state_dict(ckpt['state_dict'])
model.eval()
norm = ckpt['norm']
# Event at (x_m=0.20, y_m=0.05, z_m=0.08) in arm frame
xyz = np.array([0.20, 0.05, 0.08], dtype=np.float32)
x_n = (xyz - norm['x_min']) / (norm['x_max'] - norm['x_min']).clip(1e-6)
with torch.no_grad():
y_n = model(torch.from_numpy(x_n).unsqueeze(0)).numpy()[0]
theta = y_n * norm['y_std'] + norm['y_mean']
print(f"θ0={np.degrees(theta[0]):.1f}° θ1={np.degrees(theta[1]):.1f}°")
Sim-to-real transfer
- Deploy on real SO-101
- Point at 3 known reference locations, record joint angles
- Fit affine:
θ_real = A @ θ_sim + b - Apply correction at inference — done
Dataset
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support