All projects

2026 / Research / Applied ML

Rowing Biomechanics Pipeline

An inspectable research system that learns a stroke-level force representation from synchronized video and RP3 telemetry, then packages the same kinematic contract for video-only inference.

The complete pipeline on a synchronized ergometer capture: pose, phase, joint angles, 3D lift, and RP3 force in one inspectable view. RP3 supplies supervision during dataset construction; the intended inference path uses video alone.
Role
Undergraduate researcher
Stack
Python / Sports2D / MotionBERT / OpenCV / NumPy / Pandas / PyTorch
20
matched strokes
calibrated evaluation run
1,203
aligned segment rows
20-stroke calibrated run
11.43 ms
drive-duration MAE
two-pass calibrated run
64 × 14
stroke feature tensor
progress samples × channels

Why this project exists

Force curves reveal when a rower produces power, not just how quickly the handle moves. The usual measurement path requires an instrumented ergometer or lab hardware; ordinary side-view video is far easier to collect.

The project asks a deliberately narrow question: can synchronized RP3 telemetry teach a video pipeline a useful stroke representation, then be removed at inference time? That boundary turns the work into a problem of data contracts, synchronization, leakage control, and honest evaluation—not simply pose estimation.

Scope and evidence boundary

The repository implements the end-to-end path: extraction, calibration, stroke matching, dataset construction, model training, model bundles, video-only prediction, and generated reports. The evidence on this page is strongest for feasibility and data construction.

  • RP3 telemetry supplies labels during supervised dataset creation; it is not required by the intended prediction path.
  • The best calibrated evidence currently comes from one athlete in a controlled ergometer setup.
  • The repository supports athlete-held-out evaluation, but the current paper does not claim a compiled athlete-held-out force-prediction result.

One stroke, one contract

Every drive is resampled onto 64 normalized progress positions. Fourteen channels describe the active-chain knee, hip, elbow, trunk, spine, and head angles; their progress derivatives; and handle velocity and acceleration. Facing direction is canonicalized so left- and right-facing recordings do not teach contradictory signs.

Derivatives are computed in time and converted with dθ/ds = (dθ/dt) / (ds/dt + ε). A stall guard, masks, and explicit quality flags keep low-motion or sparse-tracking regions visible instead of silently turning them into clean-looking numbers.

Synchronizing imperfect clocks

Video events and RP3 strokes are not matched greedily. A coarse interval anchor starts the alignment, a first pass estimates velocity thresholds, and a second pass reruns event detection with calibrated drive durations. Dynamic programming then scores drive, recovery, interval, cumulative, and skip costs across the session.

The visual match editor records pins, exclusions, side, and facing overrides as reusable data. This matters because a good per-stroke duration can coexist with bad cumulative timing; the longer run made that failure mode impossible to ignore.

Models earn their complexity

  • Stage 0 is a reproducibility floor and metadata-only Ridge baseline using rate, length, and drive time.
  • Stage A predicts PCA or functional-PCA force-shape coefficients from scalar and coordination summaries with Ridge, Lasso, or gradient boosting.
  • Stage B consumes the full sequence with a TCN or Transformer, masked loss, derivative loss, AdamW, cosine scheduling, gradient clipping, and early stopping.
  • A model must beat the baseline on curve error and at least peak force or impulse before added complexity is treated as useful.

Engineering for inspection

The package is organized around contracts rather than notebooks. Training and inference share the same side map and segment builder; model bundles carry the progress grid and preprocessing state; generated run and training reports expose provenance, leakage warnings, metrics, and plots.

  • Native RP3 force bins and masks are preserved alongside the fixed-grid representation.
  • Per-stroke QC covers sparse tracking, implausible angular velocity, progress non-monotonicity, detection confidence, and timing plausibility.
  • The current suite contains 50 tests across eight modules, including feature-contract, matching-override, bundle, and report behavior.

What the evidence says

On the controlled 120 fps run, the pipeline matched 20 strokes and exported 1,203 aligned segment rows. Mean absolute drive-duration error was 11.43 ms; interval error was 64 ms and cumulative catch error was 208 ms.

A separate 208-stroke run looked locally credible—32 ms drive-duration error and 22 ms interval error—while accumulating 2.36 seconds of catch drift. That contrast is the most useful result: local agreement alone cannot certify synchronization.

  • The force reconstruction shown below validates RP3 target interpretation; it is not a learned prediction result.
  • Single-athlete evaluation is marked provisional by the reporting code.
  • Generalization across athletes, boats, viewpoints, lighting, and camera clocks remains unproven.

What I learned

  • Normalize the physical domain before choosing the model: RP3 labels live in distance, while video begins in time.
  • Measure local error and accumulated drift separately; one can look excellent while the other invalidates a session.
  • A shared feature contract and self-describing model bundle are as important as the network architecture.
  • The next high-value work is direct shared timestamps and a multi-athlete dataset—not a larger neural network.

Architecture / data contract

Two systems, one feature contract.

Training needs synchronized RP3 telemetry to create labels. Inference does not. Both paths call the same canonicalization, feature-ordering, and progress-resampling code.

01 / Training and evaluation

Build trustworthy labeled strokes.

Two imperfect clocks and two different sampling domains have to agree before a model sees a single example.

Side-view videoSports2D landmarks, MotionBERT 3D lift, tracked handle geometry, and detected catch/finish events.
RP3 telemetryDistance-indexed force samples cleaned in their native 2.2 cm bins and resampled onto normalized drive progress.
  1. CanonicalizeMirror the active side consistently and build the shared 64 × 14 angle, derivative, handle-velocity, and handle-acceleration tensor.
  2. Match and quality-gateTwo-pass calibration and dynamic programming align strokes; hard caps, masks, QC flags, pins, and exclusions preserve uncertainty.
  3. Train behind a baseline gateStage 0 metadata Ridge, Stage A summary models, and Stage B TCN/Transformer models are compared under time-, session-, or athlete-held-out splits.
OutputVersioned model bundle

Feature order, progress grid, normalization, decomposition, weights, manifest, and git SHA travel together.

02 / Video-only inference

Reuse the contract without the ergometer.

A new recording follows the video branch only. RP3 telemetry is a source of supervision, not a runtime dependency.

New side-view videoThe same pose, handle, phase-detection, and facing-direction logic runs on unseen footage.
Model bundleSaved preprocessing state prevents feature-order or normalization drift between training and inference.
  1. Segment the driveCatch and finish events isolate each stroke without consulting RP3 timestamps.
  2. Build the same 64 × 14 tensorProgress-domain resampling and QC reproduce the representation used during model training.
  3. Reconstruct and summarizePredicted coefficients or sequence outputs become a force curve with peak, peak position, impulse, and region metrics.
OutputPer-stroke force estimate

A normalized and distance-indexed curve plus derived metrics, with quality flags retained for downstream review.

Source artifacts

Evidence, in context.

Tracking diagnostic from a separate RP3 session. Whole-body landmarks, handle and machine geometry, joint angles, and the 3D lift stay visible so failures can be inspected frame by frame.
Five rowing strokes aligned against RP3 telemetry with interval, drive-duration, cumulative-error, and joint-angle diagnostics.
An actual calibrated-run diagnostic: local drive timing is close, while the cumulative-error trace makes residual clock drift visible.
Rowing frame with two-dimensional joints, a three-dimensional pose inset, and tracked handle and ergometer reference points.
The feature-extraction surface: 2D landmarks, MotionBERT 3D lift, and handle-relative geometry derived from one side-view camera.
An RP3 force export recreated from its distance-indexed samples with peak force and peak-position annotations.
Target interpretation, not a model prediction: recreating the RP3 export established that its force samples are spaced every 2.2 cm before normalization to stroke progress.
Synthetic comparison of raw rowing force curves and the same curves after peak normalization.
Synthetic explanatory figure: peak normalization lets the shape model separate curve geometry from absolute force magnitude.
Synthetic heatmap illustrating a 64-by-14 rowing-stroke feature tensor.
Synthetic explanatory figure: every stroke becomes 64 progress samples across 14 canonical kinematic channels.

Paper / guide / journal / source

Continue into the work.

The case study is a map. The paper, study guide, research journal, source, and generated visualizations expose the full evidence trail.