Inspiration Prosthetic arms exist, but meaningful control of them remains out of reach for most users. We wanted to build something that demonstrates what real neural motor decoding looks like — using chess as a tangible, scoreable demo of a system designed for actual prosthetic use.

What it does Zippr decodes 64-channel neural signals from the SciFi headstage into robotic arm commands in real time. A GRU model running on-device converts brain signals to joystick outputs, an inverse kinematics solver translates those to arm movements, and a dashboard shows the current chess target and live bitrate score.

How we built it We collected 11+ minutes of labeled neural recordings, preprocessed them through bandpass filtering (200–5000 Hz), 100ms binning, and multi-threshold spike counting to produce 192 features per timestep. After iterating through 9 decoder versions (MLPs, XGBoost, CNN), we landed on a 2-layer GRU (467K params) that best captured the temporal structure of motor signals. The model was exported to ONNX and deployed as a C++ Synapse app on the SciFi device, running at 10 Hz with ~16ms latency. Decoded outputs map to a 6-DOF SO-101 arm via an ikpy IK solver, with EMA smoothing and a deadzone filter for stable control. The Streamlit dashboard displays the chess grid, target moves, and live bitrate in real time.

Challenges we ran into

  • 100ms bins outperformed 10ms bins — counter-intuitive, but coarser bins reduced lag artifacts and improved accuracy
  • Standard random train/test splits caused temporal leakage; we switched to file-level splits with non-overlapping validation sequences
  • IK singularities and joint-limit failures only appeared on real hardware, requiring workspace clamping and EMA smoothing
  • Deploying ONNX Runtime on the ARM64 SciFi device required Docker-based cross-compilation

Accomplishments that we're proud of Trained a decoder with R²=0.847 on joystick decoding and 97.1% gate accuracy, deployed fully on-device at ~16ms end-to-end latency, with rigorous validation to back the numbers.

What we learned Motor neural signals are sequential — GRUs capture this, MLPs don't (R² 0.33 → 0.847). Bin size, spike thresholds, and train/test split strategy all have outsized impact on real accuracy. The sim-to-real gap is real: every hardware failure mode was invisible in simulation.

What's next for Zippr Higher decoder accuracy, greater arm range of motion, and continuous adaptation to individual users — with the goal of moving from demo to deployable assistive device.

Built With

Share this project:

Updates