Driving a robot with one forearm

Our 17-slide deck for the AWARE-AI Fall Hackathon 2026, which won Best Presentation. Every number on it is read from the recordings and drive logs by a script. Open "What we said" under a slide for the talk.

Driving a robot with one forearm. AWARE-AI Hackathon 2026. AJ · Jose · Kiran · Xinyi.
1 · Driving a robot with one forearm
What we said

(AJ) Hi, I'm AJ, and with me are Jose, Kiran and Xinyi. In the next five minutes we'll show you how we drive the Jackal with one forearm and a Myo armband, what the muscle and motion signals taught us, and the results from the sim. Here's the plan.

Agenda. Five parts, about a minute each. 1 · How you drive. 2 · What the signals told us. 3 · Calibration, assistance, safety. 4 · What broke. 5 · Results.
2 · Five parts, about a minute each
What we said

Five parts. How a driver controls the robot. What the signals told us, which is why our design looks the way it does. How a new driver calibrates, and what keeps the robot safe. What broke while we tested. And the results. First, what we built.

What we did. One forearm drives every course, with no collisions. 20.7 s. L1 Gates. median of 4 runs, 0 collisions. 26.6 s. L2 Slalom. median of 6 runs, 0 collisions. 16.3 s. L3 Corridor + Dock. median of 4 runs, 0 collisions. 51 of 51 runs finished. New driver: 2 minutes to calibrate. Score = time + 5 s per collision + 10 s per missed gate (the sim's rule). Lower is better.
3 · One forearm drives every course, with no collisions
What we said

Here's what we built. One forearm and the Myo armband drive all three courses. Over 51 official runs we finished every single one, with no missed gates and no collisions on the clean courses. Why should you care? A new driver records their own calibration in about two minutes, and it kept working under the judges' slow, lossy link. So how do you drive it?

1 · How you drive. Arm height sets speed, roll steers. STOP · arm up. GO · level. REVERSE · tip down. elbow. STEER · roll the forearm. like turning a doorknob, left or right; a bigger roll turns harder. BRAKE · firm fist. held for 0.4 s; your hand stays relaxed the rest of the time. Raise the arm once to start. Lower = faster, up to full speed at level.
4 · Arm height sets speed, roll steers
What we said

The arm is the joystick. Raise your forearm and the robot stops. Lower it to level and it drives, and the lower you go toward level, the faster. Tip it down past level and it backs up. Roll your forearm like a doorknob to steer. And if something goes wrong, make a firm fist and hold it for under half a second: that's the brake. Your hand stays relaxed the whole time, so it isn't tiring. Why not just use muscle gestures? We tried.

2 · What the signals told us. Muscle gestures broke once the forearm rolled. Still poses (all 5 gestures). 99% read correctly. Fist held with the forearm rolled. 38% read correctly. Rolled fists misread as: right 53, reverse 51, left 8 of 181 windows. Classifier: linear discriminant analysis on 8 EMG channels, tested on takes it never trained on.
5 · Muscle gestures broke once the forearm rolled
What we said

We started with five muscle gestures and a classifier. On still poses it was right 99% of the time, on takes it had never seen. But hold a fist with your forearm rolled, which is exactly what you do while steering, and it read "forward" only 38% of the time. The rest came out as right, reverse or left. Rolling your arm moves the muscles under the electrodes. So we kept the muscle signal for the brake only, and steer with the band's tilt sensor, which rolling can't fool.

2 · What the signals told us. A neural network didn't beat the simple model on our data. Trained on your own calibration. TCN 68%. LDA 85%. Tested on a new driver. TCN 33%. LDA 32%. chance 17%. TCN: neural network on the raw signal. LDA: linear model on 16 features. Share of 200 ms windows read as the right pose; bar: median of 4 drivers, line: lowest to highest. New driver: each scaled by their own calibration.
6 · A neural network didn't beat the simple model on our data

The TCN's new-driver bar (33%) is the run without gain augmentation; with it, the TCN scored 17% on a new driver. Full tables: examples/TCN.md.

What we said

(AJ) We also asked whether deep learning would read the muscles better. We trained a temporal convolutional network on the raw signal, with gain and noise augmentation, and tested it on takes and drivers it never saw. On each person's own two-and-a-half-minute calibration, the simple linear model still won: 85% of poses against 68%. On a driver it had never seen, both were near 32%, against seventeen percent for guessing. With this little data per person, the simple model is the right choice, so the controller keeps it for the brake.

3 · Calibration, assistance, safety. Ready in two minutes, and it stops when unsure. 1. Record. 6 poses × 2, 3, 5 s. 2. Hold straight. 2 s at every start. 3. Raise to start. arms the robot. 4. Drive. speed, steer, brake. The robot stops when: the signal drops. the arm leaves its range. the band has moved (won't start). a fist is held 0.4 s.
7 · Ready in two minutes, and it stops when unsure
What we said

Every driver records their own calibration: six poses, each held for two, three and five seconds, about 2 minutes in all, with prompts. At the start of each drive they hold their arm straight for two seconds, so straight is straight for them. Then they raise the arm to arm it. Underneath, the robot stops whenever it's unsure: if the signal drops, if the arm leaves its calibrated range, or if the band has moved, in which case it refuses to start and asks for a new calibration.

3 · Calibration, assistance, safety. Four drivers calibrated with one command. python examples/lever.py <your name>. AJ. 9.7×. Jose. 4.6×. Xinyi. 4.0×. Kiran. 1.9×. Kiran, 1st try. 0.6×. Fist ÷ relaxed muscle level (mean RMS over 8 channels). Below 1×, the fist didn't register.
8 · Four drivers calibrated with one command
What we said

(Kiran) To get past one driver, we made setup a single command. It connects the Myo, records your calibration, opens the sim and drives. Four of us recorded, and the data is public. The bars show how much stronger each person's fist is than their relaxed hand, which is what the brake detects. My first recording came out below one: the fist didn't register, so I recorded again. Now the tool shows that check after every calibration.

3 · Calibration, assistance, safety. The gate assist nudges you through, and never steers for you. 2 of 6. approaches through gate 1 with the assist. 0 of 6. without it. 0. collisions, either way. only when you're aimed within 20° of a gate. adds at most 0.3 rad/s of turn. never picks a gate for you. off with --no-gate. Scripted off-line approaches to L1's first gate in the sim, the same assist code as the controller.
9 · The gate assist nudges you through, and never steers for you
What we said

(Xinyi) I added a gate assist. The lidar finds the two posts of the next gate. If you are already aimed within twenty degrees of it, it adds a small correction toward the centre, never more than 0.3 radians per second, so you stay in control. In 6 test approaches from off the line, it got through the first gate 2 times against 0 without it, with no collisions either way. When the approach wasn't aimed at the gate, it did nothing.

4 · What broke. Four things broke; each fix is now a rule. Problem. Before. Fix. After. Brake fired by itself. 38% of drive time. fist pattern held 0.4 s. 0%. Right turns too weak. full turn out of reach. each side tuned from your own drives. even turns. Band moved after charging. reversed 58% of a drive. pose checked at every start. refuses to start. Myo vanished after unplugging. no Myo found. wear it, move, keep scanning. connects.
10 · Four things broke; each fix is now a rule
What we said

(Jose) Four things broke. First, the brake fired on its own 38% of the time, because just holding your arm out uses the same forearm muscles. Now it needs a fist pattern held for 0.4 seconds, and it dropped to zero. Second, right turns were weak: with the arm out you only roll about thirty degrees right, so we tune each side from the driver's own logs. Third, after a battery recharge the band went back on differently and the robot reversed 58% of the time. Now it checks the pose at every start and refuses if the band moved. And today the Myo vanished: once unplugged it fell asleep and no laptop could find it. Wearing it and moving while the tool keeps scanning brought it back, and that's in our troubleshooting guide.

5 · Results. All 51 official runs finished, with no missed gates. L1 Gates. 20.7 s. L2 Slalom. 26.6 s. L3 Corridor + Dock. 16.3 s. L1, 300 ms lag + 10% drop. 21.7 s. Bar: median score. Line: best to worst run. Clean courses: 4, 6 and 4 runs; degraded: 8 runs with lag compensation on.
11 · All 51 official runs finished, with no missed gates
What we said

Here are the official scores, the medians over repeated runs so it isn't one lucky lap: 20.7 seconds on L1, 26.6 on the slalom, 16.3 on the corridor and dock, with no collisions. The last bar is L1 under the judges' degraded link, 300 milliseconds of lag and ten percent packet loss: about 21.7 seconds, barely slower than clean. That's the robustness we were after. Speaking of lag, we tested one more idea.

5 · Results. Lag compensation did no harm; benefit unproven. Lag compensation on. median 21.7 s. Off. median 22.5 s. 20 s. 22 s. 24 s. 26 s. 28 s. One dot per run, L1 at 300 ms lag and 10% drop, 2 runs per hidden session. Session medians compared with an exact two-sided permutation test: p = 0.57 for score, 0.26 for workload.
12 · Lag compensation did no harm; benefit unproven
What we said

With 300 milliseconds of lag, drivers overcorrect, so we added lag compensation: it measures the delay, softens steering, and checks obstacles from where the robot will be when each command lands. To test it fairly we ran it blind: 8 sessions, the controller secretly switching it on or off, so the driver couldn't know. With it on, the medians were a little better and there were no collisions, against 2 without. But with this few runs, the difference isn't significant. We kept it on because it did no harm.

5 · Results. What we'd test next. 1. More people. Pretrain on a 36-person Myo dataset, fine-tune on each driver's 2-minute calibration. 2. Lag gain unproven. More blind sessions before we claim lag compensation helps. 3. Top speed 1 m/s. The sim allows 2 m/s: the assist must slow from further out first.
13 · What we'd test next
What we said

(AJ) What we'd do next. Four drivers isn't enough for a neural network, so we'd pretrain on a public Myo dataset of thirty-six people, which has the relaxed hand and the fist the brake needs, then fine-tune on each calibration. The lag result needs more sessions before we'd claim it helps. And we capped speed at one metre per second while tuning, half what the sim allows, so going faster means the obstacle assist has to look further ahead first.

Thank you. AJ · Jose · Kiran · Xinyi. Code and dataset: github.com/ajbarea/Hackathon.
14 · Thank you
What we said

That's our controller: one forearm, no squeezing, every course finished. The code and the dataset are public on GitHub. Thank you, and we're happy to take questions.

Backup slides.
15 · Backup slides
What we said

Backup slides for questions.

Backup. Blind lag-compensation test, session by session. Measure | On | Off | p. Score (s) | 21.66 | 22.51 | 0.57. Steering jerkiness (rad/s²) | 0.66 | 0.74 | 0.63. Workload (NASA-RTLX, 0 to 100) | 43.4 | 50.4 | 0.26. Collisions (total) | 0 | 2 | –. 4 sessions on, 4 off, 2 runs each; the driver never knew which.
16 · Blind lag-compensation test, session by session
What we said

Backup. The blind test in full: medians of each session's two runs, compared with an exact two-sided permutation test.

Backup. How the signals are used. Signal | What we compute | Drives. Tilt (accelerometer, 50 Hz) | forearm height and roll from gravity, never yaw (no drift) | speed, steering, reverse. Muscle (8 EMG channels, 200 Hz) | RMS and waveform length per channel, 0.2 s windows | brake only. Brake classifier | your fist vs your other poses (linear discriminant analysis) | fist held 0.4 s. Lidar (from the sim) | free space ahead and beside the robot | slow down, nudge off walls.
17 · How the signals are used
What we said

Backup. What each signal does: the tilt sensor gives speed, steering and reverse; the muscle signal only gives the brake.