Overview
Event: AI & Robotics Hackathon, Jun 20–21 2026, CIC Berlin Track: NormaCore — AI-Powered Robot Control Team: Team 4 (4-person team) Prize: 1 ElRobot unit
The challenge: make the ElRobot 7+1 DoF robotic arm perform a task autonomously from a natural-language instruction and camera feed, using imitation learning.
Architecture
Teleop (master→follower) → Record demos → SmolVLA fine-tune → run_policy (camera + text) → Autonomous task
Pipeline
| Step | Tool | What |
|---|---|---|
| Record | st3215-remote-teleop-py |
Human moves leader; follower mirrors. Station streams inference/normvla (2 cams + joint state/goal) |
| Dataset | bin/dataset-generator (Go) |
Reads queue range → splits into episodes → parquet (task string stamped per frame) |
| QC | bin/dataset-mp4 (Go) |
Renders parquet as grid mp4 for visual inspection |
| Train | smolvla_py/scripts/train.py |
Fine-tunes lerobot/smolvla_base on Nebius L40S GPU |
| Deploy | smolvla_py/scripts/run_policy.py --auto |
Camera + state + task → action → ST3215 command on follower = autonomous |
Key Decisions
- VLA-first, not Claude-only. Claude Vision alone is too imprecise for real manipulation (grasping). With working master→follower teleop, learning from demonstrations is the right tool.
- NormaCore's existing pipeline. No reinvention — their tooling covers the full flow: teleop → dataset-generator → smolvla_py/train.py → run_policy.py.
- Hybrid control. Claude orchestrates + verifies, SmolVLA executes. Claude (with camera access) issues the instruction and checks success; SmolVLA does the manipulation.
- 8 joints. ElRobot has 7 arm joints + 1 gripper →
state_dim=action_dim=8,--motor-ids 1,2,3,4,5,6,7,8. - 2 cameras required. Pipeline expects exactly 2 images per frame (cam0 + C270 cam1); frames without both are silently dropped.
Task
"move the waffle to the black side" — one task, one instruction string, used verbatim at record time and inference.
Results
- 47 teleop episodes recorded (8 joints, 2 cameras) across 6 waffle start positions
- SmolVLA fine-tuned on Nebius L40S (10k steps, batch 64, 12 workers) and local RTX 4050 backup
- Loss converged to ~0.05
- Published checkpoints to HuggingFace
- Deployed on real follower arm via
run_policy(PC runs model, Pi runs Station over LAN) - Walk-mode hardening:
run_policy_walk.pyglides toward policy target instead of dead-locking when arm starts far from demo pose
Lessons Learned
- Camera pipeline matters.
normvlacameras, calibration, and OOD start poses were the biggest deploy-day gotchas. - Start near demo pose. Best deploy conditions: match scene/lighting and start position to training distribution.
- Use highest-step checkpoint. More training steps consistently improved robustness.
- Walk-mode saved the demo. Without it, the arm would dead-lock when starting from a slightly different pose.
Tech Stack
- Robot: ElRobot (7+1 DoF, ST3215 servos)
- Platform: NormaCore Station (Go binary, TCP/WebSocket API)
- Model: SmolVLA (450M params, SmolVLM2-500M backbone + flow-matching action expert)
- Training: Nebius L40S GPU (remote) + local RTX 4050 (backup)
- Orchestration: Claude Code + Claude Vision (hybrid layer)
- Data: Parquet format, 2×224px JPEG cameras, 8-joint state/action
Resources
- GitHub: ozkannceylan/normacore-hackhaton-team4
- HuggingFace: ozkanceylan/elrobot-smolvla-waffle — fine-tuned checkpoints
- NormaCore Station: v0.1.0-beta.8
- SmolVLA: HuggingFace docs · Paper (arXiv 2506.01844)
- Base model: hf.co/lerobot/smolvla_base