Skip to content
SportsTechVeloProjectPublic

About

V-LO measures barbell velocity on every rep with two Movesense IMUs on the bar ends, and gives feedback in a web app before the next set. Under 0.10 m/s error in powerlifting zones. KTH sports technology, 2026.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

Β 

History

96 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

V-LO: every rep, measured

Velocity-based training for powerlifters and strength-athletes, built on two off-the-shelf Movesense sensors and a web app for athletes and coaches.

Sensors Sampling Backend Analysis Lifts

Why VBT Β· The problem Β· How it works Β· The app Β· Results Β· Get started Β· Team


Back squat
Back squat
Front squat
Front squat
Bench press
Bench press
Deadlift
Deadlift

⬇️ Click a section below to open it ⬇️


πŸ‹οΈ Why velocity-based training?


Traditional programs prescribe load as a fixed percentage of your 1RM. But your strength changes day to day with sleep, stress and fatigue, so Sunday's spreadsheet may be wrong by Thursday.

Velocity-based training (VBT) uses bar speed instead. As the load gets closer to your max, the bar slows down in a predictable way, which gives a live, objective readout of how hard a set really is.

βœ… Autoregulate: load for the day you're actually having
βœ… Manage fatigue: stop a set when bar speed drops too far
βœ… Estimate 1RM: without testing a true max
βœ… Train with intent: a number after every rep makes you push

VBT gives strength gains similar to percentage-based training, at lower training loads.

Back squat with sensors on the bar ends

Velocity zones

Every set is classified by its mean bar speed:

Velocity zones

Zones as a table Β· click to open


Zone Mean velocity Typical % 1RM Training effect
πŸ”΅ Starting strength > 1.30 m/s bodyweight Overcoming inertia: jumps and throws
🟒 Speed-strength 1.00–1.30 m/s 20–40% Speed first, strength second
🟒 Strength-speed 0.75–1.00 m/s 40–60% Moderately heavy loads, as fast as possible
🟑 Accelerative strength 0.50–0.75 m/s 65–80% Driving heavy loads as fast as possible
🟠 Absolute strength < 0.50 m/s 80–100% Maximal force: heavy triples, doubles, singles

🎯 The problem


Coaches report three barriers to using VBT today:

πŸ’Έ
Expensive
The most accurate devices, linear position transducers, cost a lot.
πŸ”Œ
Hard to use
Cables and setup get in the way of the lift.
πŸ“‰
Limited accuracy
Cheaper wireless IMUs suffer from drift and bar rotation.

ℹ️ Our research question: Can two end-mounted IMUs give accurate enough mean concentric velocity for feedback during training, despite irregular barbell rotation?

Why do cheaper sensors struggle? Β· click to open


  • Integration drift. Velocity comes from integrating acceleration, so small errors add up over time.
  • Irregular bar rotation. The bar tilts and rotates mid-lift, so the sensor axes stop lining up with the movement.
  • One side only. A single sensor can't tell whether the left and right sides of the bar move differently.

βš™οΈ How it works


V-LO puts one Movesense sensor on each end of the bar. The velocitydrift of both sensors are compared and the data from the sensor with the most linear drift are used for velocity estimations.

Data pipeline from rep to result

From acceleration to velocity

  1. Orientation: the Madgwick filter fuses accelerometer and gyroscope data
  2. Drift correction: The velocity drift is approximated as linear. Estimating a gradient coefficient from the first and last half second of data.
  3. Rep detection: Velocity peaks are identified by comparing number of peaks to the known number of repetitions performed.
  4. Velocity: For each repetition the mean velocity is estimated by integrating the acceleration over time for each repetition. Only the velocity data with a value above the approximated drift is used. The peak velocity is estimated using the velocity curves peak height.

Why Movesense, not a custom board?

A custom IMU would mean building our own firmware, Bluetooth stack and enclosure. That time would come out of the data analysis and the user experience, which are our core contributions.

Movesense is commercially available, with a 9-axis IMU and Bluetooth Low Energy.

Data pipeline in detail Β· click to open


  1. Save. You press β–  Stop & save. The web app saves the sensor data and adds a row to the sessions table in Supabase.
  2. Trigger. A Supabase webhook fires on the new row and sends the recording to our app on Azure.
  3. Analyze. Azure queues the recording, runs the analysis code (Squats2) and saves the reps and velocities back to Supabase.
  4. Show. The web app checks for results every 2 seconds and shows the set's velocity, whether it hit the target zone, and a suggested next weight. No refresh needed.
  • Cold start: if Azure has been idle, the first set can take 10–30 s.
  • Retries: missed sets are resent automatically every minute.
  • Errors: if a set can't be analyzed, it shows the reason instead of a result.

πŸ“± The app


Deadlift

1. πŸ“ Place the sensors on the bar ends
2. πŸ“Ά Connect in the web app
3. πŸ‹οΈ Pick exercise and weight
4. πŸ“Š Lift and get feedback on every rep

After each set you see peak and mean velocity, a rep-by-rep readout, consistency, whether you hit the target zone, and a suggested next weight.

Web-based, so it works on any phone, tablet or laptop.

V-LO website

Coaches get a team view with training volume, average bar speed per lift, and PR leaderboards for each velocity zone.

Team dashboard
Team dashboard
Top PRs per velocity zone
Top PRs per velocity zone

➑️ More screenshots: Website walkthrough


πŸ“Š Results


We validated V-LO against a GymAware RS linear position transducer, a gold-standard reference that recorded the same reps at the same time.

4

participants, 6 squats in each of 3 velocity zones

<Β 0.10Β m/s

error in the zones where powerlifters train

5.8Β s

median time from saved set to feedback

Accurate where powerlifters train

The table shows the mean absolute error (Β± SD) between V-LO and GymAware, in m/s:

Zone (by peak velocity) Mean velocity Peak velocity Error below 0.10 m/s?
Absolute strength (< 0.5 m/s) 0.03 Β± 0.02 0.04 Β± 0.02 βœ… Yes
Speed strength (0.5–1.3 m/s) 0.05 Β± 0.16 0.06 Β± 0.03 βœ… Yes
Starting strength (> 1.3 m/s) 0.33 ± 0.17 0.21 ± 0.13 ❌ No
Mean velocity per participant, GymAware vs V-LO
Mean velocity
Peak velocity per participant, GymAware vs V-LO
Peak velocity

Why accuracy drops at high speed

V-LO doesn't measure velocity directly. It integrates acceleration over each rep, and that approach works best for slower, heavier lifts:

  • Fast reps are short. At 104 Hz, a very fast rep contains fewer samples, so each small measurement error carries more weight in the result.
  • Fast reps have bigger, sharper accelerations. Quick changes in speed and more bar vibration make the signal harder to follow, and errors build up faster during integration.
  • The drift correction assumes the drift is linear. That holds well over a controlled lift, but less well when the movement is very explosive.

This matters less than it sounds: peak velocities above 1.3 m/s only happen with very light loads, which powerlifters rarely train with. In the zones where powerlifting training happens, the error stays below 0.10 m/s.

Feedback before the next set

5.8 s

median processing time

0.9–7.5 s

range over 7 recorded sets

Measured from the moment a recording is saved until its results appear in the app. Results usually arrive well before the next set starts, since rest between sets in powerlifting is typically a few minutes. The spread comes mainly from the analysis app on Azure: when it has been idle, it needs a few extra seconds to start up. This is a preliminary test.


πŸš€ Get started


python -m http.server 8080

Then open localhost:8080/vlo.html in Chrome or Edge (they support Web Bluetooth, which connects to the sensors) and log in with your own account.

⚠️ Warning: The analysis runs on Azure, so changes to the analysis code also need a deploy. Check with the team before deploying.

Recording a set

How to record a set

Standing still at the start gives a clean baseline, gaps between reps help separate them, and a firm rack marks the end of the set.


🧭 Limitations and roadmap


Known limitations

  • Small number of participants

  • The participants were not professional powerlifters

  • The evaluation was only done for squats

  • Unreliable Bluetooth connection

  • Slow first set after Azure is idle

Next steps

  • Better drift handling to make fast, light lifts as accurate as heavy ones
  • Bench press and deadlift analysis, validated like the squat
  • A larger validation study with powerlifters
  • Combine both sensors, e.g. to measure left–right balance
  • Automatic rep detection, so no rep count has to be entered

Longer term

  • Estimate the 1RM from the athlete's load–velocity profile
  • Intelligent coach platform with programs and benchmarks
  • More exercises, including team sports
  • Other lifting equipment beyond the barbell
  • Wearable version that tracks the athlete

πŸ“ Repository


.github/
β”œβ”€β”€ README.md                           ← this page
β”œβ”€β”€ code/                               ← all source code
β”‚   β”œβ”€β”€ analysis/                       ← Azure app that analyses each set
β”‚   β”‚   β”œβ”€β”€ squat/                      ← squat analysis (Squats2.py)
β”‚   β”‚   β”œβ”€β”€ function_app.py             ← entry point Azure runs
β”‚   β”‚   └── requirements.txt            ← Python packages
β”‚   β”œβ”€β”€ database/                       ← Supabase database
β”‚   β”‚   β”œβ”€β”€ migrations/                 ← changes to the tables, by date
β”‚   β”‚   └── queries/                    ← useful SQL queries
β”‚   └── website/                        ← the V-LO web app
β”‚       β”œβ”€β”€ css/                        ← styling (vlo.css)
β”‚       └── js/                         ← app logic: sensors, recording, charts
β”œβ”€β”€ data/                               ← recorded sensor data and test results
β”œβ”€β”€ docs/
β”‚   β”œβ”€β”€ images/
β”‚   β”‚   β”œβ”€β”€ readme/                     ← banners, diagrams and 3D lifters
β”‚   β”‚   └── website/                    ← screenshots of the V-LO website
β”‚   └── papers/                         ← final paper and presentation
└── Issue_Template/                     ← templates for reporting issues
Path What's inside
code/analysis/ The Azure app that runs after every saved set. function_app.py is the entry point, and supabase_api.py reads recordings from and writes results back to Supabase.
code/analysis/squat/ The squat analysis: MagdwickFilter.py (orientation), ValidatePeaks.py (rep detection), VelocityCalculations.py (velocity) and Squats2.py, which ties them together.
code/database/migrations/ SQL files that build and change the Supabase tables, named by date so they run in order.
code/database/queries/ Saved SQL queries, such as processing-timing.sql for checking how long the analysis takes.
code/website/ The V-LO web app. Start it with python -m http.server 8080.
code/website/css/ The styling for the whole app, in vlo.css.
code/website/js/ The app logic: sensors.js (Bluetooth), recorder.js (recording sets), charts.js, vbt.js, team.js, plans.js and more.
data/ Recorded sensor data from test sessions, plus the GymAware reference data used in the validation.
docs/images/readme/ The banners, diagrams and 3D lifter images used in this README.
docs/images/website/ Screenshots of the V-LO website, with a walkthrough explaining each page.
docs/papers/ The final paper and the final presentation.
Issue_Template/ Templates for reporting bugs and suggesting features.

πŸ‘₯ Team


Arvid
Arvid
Greipur
Greipur
Hugo
Hugo
Silje
Silje
Svanberg
Svanberg

Roles Β· click to open


🧭 Scrum master

Svanberg (Addi)
Led the sprints and built the data pipeline from Supabase to Azure and back. Worked across both the UI and the code.

🎨 UI / UX

Designed and built the web app: the dashboard, the flow for connecting sensors and picking a lift, and how feedback is shown after each set.

🐍 Data and analysis

Wrote the Python code that processes the sensor data: filtering, orientation, rep detection and velocity estimation.

About

V-LO measures barbell velocity on every rep with two Movesense IMUs on the bar ends, and gives feedback in a web app before the next set. Under 0.10 m/s error in powerlifting zones. KTH sports technology, 2026.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages