Smart soccer ball · Virginia Tech

Every kick, measured in flight.

A nine-axis inertial core and a Wi-Fi radio, sealed at the center of a soccer ball. Spin, ball speed off the foot, arc and impact, sampled at 100 Hz, built to be on your dashboard before the ball stops rolling.

01 · Sense

An instrument where the ball's center is.

A Bosch BNO055 fuses accelerometer, gyroscope and magnetometer on-chip, so orientation and linear acceleration arrive clean at 100 Hz, from inside the ball itself.

How it works

Sense it. Send it. Understand it.

Three systems, one soccer ball. Each one below is explorable: replay a kick as the sensor sees it, watch integration drift get bounded instead of ignored, and open the ball up layer by layer.

Live telemetry · BNO055 at 100 Hz

One kick, sample by sample.

Every 10 ms the IMU at the ball's centre reports linear acceleration, angular rate and orientation, fused on-chip and pushed over Wi-Fi as it happens. Below, one simulated kick replayed at half speed: the raw stream, and the phases the pipeline reads out of it.

Kick replay

A ball on the ground, a kick, the flight, a bounce and a roll-out, the way the sensor would report it. Watch the acceleration: about zero while the ball sits still, pinned at the sensor's widest ±16 g full scale for the kick itself (a 20 ms impulse in this model, well over a hundred g — more than the accelerometer can measure at any setting), exactly one g in free flight (gravity and nothing else), a second spike at the bounce, then 0.12 g of rolling drag that the stillness gate waits out.

In this simulated kick the ball leaves the foot at 20.0 metres per second and 22 degrees with 300 rpm of backspin, peaks at 3.0 metres, and lands 28.3 metres away after 1.53 seconds of flight at 20.0 metres per second. The kick itself peaks near 144 g, so the accelerometer clips at its 16 g full-scale ceiling for 20 milliseconds; it reads about 0 g while the ball is still, 1 g in free flight, and a 15 g spike lasting 30 milliseconds at the bounce. The ball then rolls 2.0 metres and the stillness gate re-engages 1.71 seconds after landing.

|a| Linear accelerationg

ω Angular raterpm

h Heightm

9-axis

accelerometer + gyroscope + magnetometer

±16 g

accelerometer range

±2000 °/s

gyroscope range

Simulated, not recorded: the replay is generated from a drag-free projectile model at the sensor's real 100 Hz output rate, with seeded measurement noise, so every replay is identical. Drag and Magnus lift are omitted, and on a soccer ball at this speed they matter: a real shot lands shorter, and a curled one bends.

BNO055ESP32I²CSensor fusionWi-Fi
View on GitHub ↗

Flight analysis · Drift-bounded stats

From raw motion to a number you can coach.

Position is two integrations away from what the accelerometer reports, and each one turns a small, constant sensor bias into an error that grows with time. Six seconds of naive integration can put the ball metres from where it is. The pipeline only ever integrates across one kick, checks itself against every stop, and takes spin straight from the gyroscope, where no integration is needed.

The drift problem

One 1.6 s kick inside a 6 s recording, still before and after. Both traces integrate the same simulated accelerometer, 100 Hz with 0.15 m/s² of noise plus the bias you set and no 16 g ceiling (that is the telemetry section's problem), and what is plotted is how far each answer sits from the true position.

Traces shown

0.05 m/s²
0 m/s²0.2 m/s²
  • Naive integration
  • Intelleball pipeline

With an accelerometer bias of 0.05 m/s², integrating the recording naively puts the ball 94.0 cm from where it really is after 6 seconds. The Intelleball pipeline, which pins velocity to zero at every detected stillness and corrects each kick window against its known stop, is off by 1.0 cm.

Naive integration · error at 6 s
94.0 cm
Intelleball pipeline · error at 6 s
1.0 cm

Why the pipeline wins: a constant bias integrates into a velocity ramp and then a position parabola, so the naive error grows with the square of the time since velocity was last known. The pipeline never lets that clock run past one kick: every detected stillness is a free, exact velocity measurement of 0 m/s, and subtracting the residual velocity linearly across the window cancels a constant bias outright. What survives is the noise's random walk over 1.6 s: centimetres, not metres.

Release explorer

Ball speed and launch angle are what the pipeline reads at the instant the ball leaves the foot. Set them, put the goal line where you like, and the projectile model fills in the rest of the kick: apex, hang time, range, and how high the ball's centre is when it crosses the line, against the crossbar.

22°
5°45°
20.0 m/s
8 m/s30 m/s
18.0 m
6 m35 m

At 22° and 20.0 m/s off the foot, kicked from the ground, the ball peaks at 2.97 m, lands 28.32 m away after 1.53 s, and crosses the goal line 18.0 m out with its centre at 2.76 m: over the bar (the underside of the crossbar is 2.44 m).

Apex height
2.97 m
Hang time
1.53 s
Range
28.32 m
Height at the line
2.76 m

5

stats per kick: spin, ball speed, launch angle, apex, hang time

0 m/s

velocity pinned at every detected stillness (zero-velocity update)

100 Hz

sample rate the model runs at

Both models omit drag and Magnus lift, and on a soccer ball at shooting speed neither is small: a real shot lands shorter and steeper than the drag-free arcs drawn here, and a curled one bends sideways, which a side view cannot show. The drift figures describe a simulated sensor, not a bench measurement.

Projectile modelZUPTDrift correctionTypeScript

The sensor core · XIAO ESP32 + BNO055

Inside the ball.

A Seeed XIAO ESP32 and a Bosch BNO055 on one I²C bus, a LiPo cell and a charging coil, sealed at the soccer ball's center of mass. Scroll to take it apart, layer by layer.

The Intelleball hardware in four layers. The shell: a sealed, multi-panel soccer-ball skin with nothing on its surface. The cushion: a layer between skin and core that isolates the core from kicks and bounces and holds it at the center of mass. The core: a small puck carrying a Seeed XIAO ESP32 for compute and Wi-Fi, a Bosch BNO055 nine-axis IMU, a LiPo cell and a wireless charging coil. The link: an I²C bus on GPIO 21 (SDA) and GPIO 22 (SCL) between the two boards, read every 10 milliseconds, with the ESP32 streaming samples over 2.4 GHz Wi-Fi, WPA2-Enterprise included, to the dashboard.

Step 01 · The shell

A soccer ball first.

A sealed, multi-panel soccer-ball skin with nothing on the surface to give it away: no port, no seam that does not belong. If the electronics changed how it flies or bounces, the data would describe the wrong ball.

2boards: XIAO ESP32 + BNO055 breakout
115200baud serial debug link
2.4 GHzWi-Fi radio, WPA2-Enterprise capable
Seeed XIAO ESP32compute + 2.4 GHz Wi-Fi
Bosch BNO0559-axis IMU, fusion on-chip
LiPo cellpower
Charging coilwireless charging, no port
XIAO ESP32BNO055LiPoWireless chargingArduino
View on GitHub ↗

Firmware

Shipped

Bring-up & campus Wi-Fi

v0.0.1 firmware: BNO055 bring-up over I²C with a first double-integration prototype, and a WPA2-Enterprise (PEAP) bench test that gets the ESP32 onto eduroam and logs IP, gateway and RSSI.

ArduinoESP32WPA2-EnterpriseBNO055

v0.0.1 in the repo today

Source ↗

Software

In development

Coach dashboard

Accounts, per-kick history and live device status in the browser. Auth runs fully client-side today (PBKDF2-hashed, stored locally), ready to swap for a real backend when the telemetry link lands.

Next.jsTypeScriptWebGLFramer Motion

0 servers required to try it

The story

Make the ball tell the truth.

Intelleball started with a simple frustration: the only feedback most players get on a kick is the outcome. Goal or miss, on target or over the bar. Everything that happened between the foot and the goal, the spin, the speed off the foot, the arc, is invisible unless a camera and a coach are both watching.

So we put the instrument inside the soccer ball. A nine-axis IMU at the center of mass, an ESP32 to fuse and stream, and enough battery to last a session. Version 0.0.1 is on the bench today: the sensor talks, the radio joins a campus network, and the first motion prototype is running.

The hard part is not reading a sensor. It is trusting it. Integrate acceleration twice and the position wanders off within seconds. The whole pipeline is built around bounding that error: integrating only between moments the ball is provably still, correcting velocity against every known stop, and taking spin straight from the gyroscope, where no integration is needed.

Next is the link from ball to browser: batched telemetry over Wi-Fi, a dashboard that shows every kick as it happens, and validation against high-speed video with real players. This site is the front door. The dashboard behind it is already live to try.

Roadmap

From the bench to the game.

What is built, what is being built, and what comes next. Dates are targets; the status pills are honest.

Sep 2026

Shipped

Firmware v0.0.1

Bench bring-up

First code in the repo: the IMU talks, the radio joins the campus network.

  • BNO055 linear acceleration read over I²C every 10 ms
  • First velocity and position integration prototype with a stillness gate
  • WPA2-Enterprise (PEAP) bench test on eduroam, logging IP, gateway and RSSI

Fall 2026

In progress

Motion pipeline

Drift-bounded stats

Turn raw samples into per-kick numbers that hold up.

  • Stillness detection on accelerometer + gyroscope (zero-velocity updates)
  • Per-kick windows with post-hoc velocity correction
  • Spin rate and spin axis straight from the gyroscope

Winter 2026

Planned

Telemetry link

Ball → browser

Get every sample off the ball without a phone in the loop.

  • Timestamped, batched samples over Wi-Fi
  • WebSocket ingest behind the dashboard
  • Session recording and replay

2027

Planned

Field testing

Real players, real kicks

Validate the numbers against a camera, then tune.

  • Side-by-side validation against high-speed video
  • Battery, balance and durability trials
  • Coach feedback on which stats actually matter

Under the hood

Maturity of each part of the stack in the current build, on a five-dot scale. Five means it ships today.

Sensing

  • BNO055 9-axis IMU
  • On-chip sensor fusion
  • Zero-velocity updates
  • Spin from gyroscope

Compute

  • Seeed XIAO ESP32
  • Arduino / C++
  • I²C bus
  • FreeRTOS tasks

Connectivity

  • Wi-Fi WPA2-Enterprise
  • Batched telemetry
  • WebSocket streaming

Software

  • Next.js / TypeScript
  • WebGL surfaces
  • Client-side auth
  • Telemetry dashboard

Principles

How we build.

01

Measure, don't guess.

A coach's eye is a great instrument with terrible logging. The ball should carry its own sensor, keep its own record, and report what actually happened on every kick.

02

Bounded error beats false precision.

Integrating acceleration twice drifts without limit. We only publish numbers we can bound: short windows between stillness, velocity corrected against known stops, spin read straight from the gyro.

03

The ball should disappear.

If the electronics change how it flies, the data describes the wrong ball. Center-mounted, balanced, sealed, and light enough that nobody kicking it remembers it is there.

Get in touch

Want one at your feet?

Intelleball is in active development at Virginia Tech. If you coach, train, or build hardware, we would like to hear from you. The firmware and this site are open source.