R1V3R.CC nilo@r1v3r:/home/obras/axis-smart-deck$ AXIS · Smart Deck /home/obras/gappin Gappin
drwxr-xr-x/home/obras/axis-smart-deckAXIS · Smart Deck1/1
README

Gappin · personal project · R&D in progress

The deck that measures its own trick.

Bench prototype (phase 0). Real firmware: 1,411 lines, ESP32 + MPU6050, 8×8 matrix, on-board classifier. Nothing here is a render: the numbers came from the code and from measurements.

axis-smart-deck.mp4
AXIS[to measure: case film — drop the .mp4 in site/media/cases/ and swap the placeholder for the <video>]
case-nums-03
200 Hzorientation and IMU
< 5 msnetwork latency
114 Bone packet, no JSON
64pressure cells
1.3 msmatrix scan
6 hon a 1,000 mAh battery
the-problem.txt

The problem

Skateboarding has no data. Video is an opaque blob: you can see the kickflip, you can't measure the pop, the height, the spin, the foot. And what a phone in a pocket measures is the body, not the deck. Gappin needed the deck speaking for itself — without changing the weight, the feel or the griptape of whoever rides it.

What the house made

A deck instrumented end to end: sensors that survive a landing, firmware that separates measuring from transmitting across two cores, a protocol that would rather lose a packet than delay it, and the dashboard that turns the stream into reading. AXIS takes its name from the three axes it measures: pitch, roll and yaw.

How it was built

Three decisions from the first prototype did not survive real use and were replaced with numbers in hand: keyboard membrane became Velostat (continuous reading, no contact to break); MQTT over TCP became fire-and-forget UDP (a packet lost at ms 15 must not arrive at ms 300); raw data became quaternions from the Madgwick filter, immune to the gimbal lock a 360° flip causes.

a-seven-layer-sandwich-invis.txt
1 · The griptape that feels

A seven-layer sandwich, invisible under the grip

Two families of conductive-fabric strips cross a whole sheet of Velostat, a carbon-loaded polyethylene whose resistance drops under pressure. Every crossing is an analogue cell from 0 to 255. Fabric, not copper: the deck flexes, and copper tape cracks on the first ollie. Edges pinned with Kapton, the centre free to compress. No solder in the standing area — the connection folds to the side of the deck, near the trucks.

The prototype's 8×8 grid came from a handboard demo. Measuring 13,365 frames of real contact in the replay, the foot sweeps 48 cm along the deck by 5 cm across: it slides lengthwise, from pop to catch, not rail to rail. The measured proposal is 40×10 cells of 2 cm over the whole 80.1 × 20.5 cm deck — a sole covers 20 cells and the flick crosses 15 to 25. It costs 8.1 ms of scanning and the second core. Proposed with numbers; not yet decided.

griptapewide insulating tapecolumns · conductive fabric tapeVELOSTAT — whole sheetrows · conductive fabric tapeKaptondeck woodrow × column= one cell, 0–2558×8 = 64 · proposal 40×10 = 400each layer is ~0.1 mm; the set weighs 30 to 50 g and does not change the feel
two-cores-one-measures-the-o.txt
2 · From sensor to packet

Two cores: one measures, the other speaks

The ESP32 has two cores at 240 MHz and the firmware uses them as two departments. On core 0, the IMU reads at 200 Hz (±16 g, ±2,000 °/s, a 42 Hz filter against asphalt vibration), Madgwick fuses accelerometer and gyroscope into a quaternion, and the matrix is scanned at 60 Hz through two 16-channel multiplexers. On core 1, it all becomes a 114-byte struct with a sequence number and a timestamp, and leaves as a UDP broadcast. Per 5 ms frame the work takes 1.66 ms: 66% is left over.

The IMU sits at the deck's geometric centre, and that enters the maths: 15 cm off centre, a 1,200 °/s kickflip adds 6.71 g of centripetal term to the reading; at the centre, zero. It is the choice that makes the signal interpretable.

CORE 0 · measure (real time)CORE 1 · speakIMU MPU6050±16 g · ±2000 °/s · DLPF 42 HzMadgwick AHRSβ 0.04 → quaternion200 HzVelostat 8×860 Hz · 0–255 per cell2 × CD74HC4067ADC · 1.3 ms per scan64 × ADCAxisDataPacket114 B · seq · timestamp µsq · ω · a8×8UDP broadcastSoftAP AXIS_xx · port 4200114 BGappin Node (Tauri · Rust)ring buffer → UI at 20 Hzphone appHUD · 3D deck · recorder< 5 ms< 5 msbudget per frame at 200 Hz: IMU 100 µs · Madgwick 50 µs · scan 1,300 µs · packet 10 µs · UDP 200 µs = 1,660 of 5,000 µsSoftAP: the deck is the router — works at any spot, up to 4 clients, 30 to 50 m
fire-and-forget.txt
3 · The protocol

Fire and forget

MQTT runs over TCP, and TCP guarantees delivery: when a packet is lost, it pauses everything and resends the old one. For kinematic telemetry that is poison — the sample from millisecond 15 arriving at 300 destroys the physics. AXIS speaks UDP from a Wi-Fi network it creates itself, with no router, no internet and no pairing: the same protocol as multiplayer games. Eight bytes of header, no retransmission, latency under 5 ms. A one-byte sequence number reveals what was lost; nobody waits for it.

a-neural-network-of-87-28-9.txt
4 · The trick, recognised on the deck

A neural network of 87 → 28 → 9

An event starts at 3 g and is confirmed at 6 g. From there, 1.74 s of acceleration at 50 Hz (decimated from 200) feed a per-axis neural network with 87 inputs, 28 hidden neurons and 9 outputs — the phase-1 flatground tricks — based on Corrêa, Lima, Russomano and Santos (2017). At 70% confidence the deck emits the event: trick name, peak height, landing g, airtime. Classification happens on the microcontroller, before any cloud.

t-where-the-foot-is-and-how-.txt
The pressure map

Π(t): where the foot is, and how hard

One instant of the Footprint Map, front foot on the left, back foot on the right. The pop is a sudden peak at the tail; the catch is pressure migrating to the centre and nose; the landing is a symmetric distribution with the g peak on the accelerometer at the same instant; the resting position says whether the skater is regular or goofy.

00281240005459288323001878645570150032230402550NOSETAILvalues 0–255 per cell · example from the hardware document · colour from the house's warm table
live-over-udp-forever-in-par.txt
5 · The data path

Live over UDP, forever in Parquet

During the session the stream is live: deck → phone or Gappin Node, never through the internet. The ESP32 keeps a copy on its own flash to sync later if the network fails. Session over, the batch goes up as FlatBuffers and becomes one Parquet file per session: ten minutes at 200 Hz and 60 Hz are 7.58 MB raw and about 450 KB columnar, 94% less, queryable in SQL. The dashboard receives a JSON summary, never the raw data.

AXISIMU 200 Hz · pressure 60 Hzphone / Gappin Nodelive HUD · 3D deck · recordingUDP 200 HzESP32 SPI flashcopy to sync latercloudFlatBuffers → Parquetpost-sessionGappin dashboardsummary, never rawJSON10 min: 7.58 MB raw→ ~450 KB in Parquet (−94%)React 19 · R3F · MapLibre
one-session-six-projections.txt
6 · The dashboard

One session, six projections

Every trick becomes a W5H record: who, what, where, when and how — the how is the biomechanical tensor, and in place of why comes WOW, the measured impact. Over that timestamped event stream, the Gappin dashboard does not draw one screen: it draws six projections of the same data. Time is the primary axis and colour encodes data — style polarity, smooth to aggressive, runs cyan to magenta across the whole interface; WOW, 0 to 100 with a half-life, sets the intensity.

Underneath, 55,000 entities in SQLite (skaters, videos, brands, tracks) in a typed graph, the UDP receiver in Rust inside Tauri, and React reading the ring buffer at 20 Hz.

W5Htimestamped event streamTrickGraphtimeline by trickAtlasmap with WOW heatWOW funnelranking with half-lifePolarity spheresmooth ↔ aggressiveSpot hex gridwhere it's hotCommunity graphwho films whomplus D.BASE (55,000 entities), AXIS Designer, Node Dashboard and The Moment — all read the same clock
status-measured.txt

Status, measured

What exists: PlatformIO firmware with IMU, 8×8 matrix, Madgwick, UDP and the on-board classifier; a Rust receiver in the Gappin Node; a dashboard with the views above. What is proposed with numbers and not decided: the 40×10 matrix, a custom PCB with ESP32-S3 and ICM-42688-P, a 100-unit run at about US$ 33 each. What does not exist: a production backend, an iOS app. The house writes what it measured.

Credits and sources

Concept, hardware, firmware, protocol and dashboard: Nilo River. Scientific basis of the classifier: Corrêa KN, Lima JCM, Russomano T, Santos MA, “Development of a skateboarding trick classifier using accelerometry and machine learning”, Research on Biomedical Engineering, 2017. Filter: Madgwick AHRS (open source). Documentation: GAPPIN_AXIS_HARDWARE.md, GAPPIN_TECHNICAL_OVERVIEW.md, firmware/axis_deck.