Skip to content

Project / 03

Radar Gesture Detection

Training a neural network to add my own gesture to a 60 GHz radar, and running it on the radar's own processor.

Capture, training and live detection, from the maker portfolio film2025 · Working

Snapshot

The fast read

Role
Design, training, firmware integration
Year
2025
Status
Working
Type
Personal
Team
Solo
Stack
TI IWR6843, Python, NumPy, Neural network, Embedded C
Tags
Signal processing · Machine learning · Embedded

Section

Why

After interning at Zadar Labs, a radar startup in the Bay Area, I brought home a spare TI IWR6843 and started experimenting with its gesture-detection demo. The technology was impressive, but the gestures were the ones TI shipped. I wanted to train a network to detect my own — starting with a wave.

Section

How the radar sees

The sensor is a four-receiver, three-transmitter array transmitting at 60 GHz and measuring what comes back. It puts the signals through three stages of FFT — range, Doppler, and angle — to build a detection matrix of what is moving and where.

I wrote a Python script to capture that output in real time, pulling six features per frame: velocity, range, horizontal angle, and several correlation metrics.

The TI IWR6843 radar evaluation board on a desk, its status LEDs lit, connected by USB.
FIG. 01 — The IWR6843 on the desk, streaming frames over USB.

Section

Making frames into gestures

A gesture is not a frame, it is a movement, so single frames carry almost nothing. I used a sliding window of fifteen consecutive frames, flattened into a ninety-feature input vector — fifteen frames by six features.

That feeds a network with two hidden layers, trained by gradient descent over a hundred epochs. I kept the problem honest and small to start: two classes, a wave and a no-gesture baseline, reaching about 98.1 % accuracy.

Section

Capture, train, reflash

Collection is the unglamorous part: sitting in front of the radar performing the same wave over and over while the script counts frames into a dataset, then checking that the classes are actually separable before training anything.

For deployment the trained model is converted from NumPy arrays into C header files and compiled into the radar's firmware. Raw confidence alone was too twitchy, so I added temporal filtering — both confidence within a frame and persistence across frames — before a gesture counts as detected.

After reflashing, the gestures are recognised in real time on the radar's own ARM processor at thirty frames per second.

Split screen: a terminal counting collected feature frames up to 150, above a view of a hand waving in front of the radar board.
FIG. 02 — Collecting the dataset, one wave at a time.
A spreadsheet of captured radar frames: thousands of rows of numeric features including velocity, range and angle columns.
FIG. 03 — What a wave looks like as numbers, before any of it means anything.

Section

Where it stands

It works: a wave in front of the sensor prints wave, and the rest of the time it prints no gesture. The repository carries the whole pipeline — capture, dataset checks, training, C export, parity checks between the Python and embedded versions — along with later three- and four-class iterations beyond the original two.

Split screen: a terminal printing 'Gesture detected: wave' among lines reading 'no gesture detected', above a hand waving in front of the radar board.
FIG. 04 — Running on the radar itself, at thirty frames per second.

Links

Elsewhere

Next project