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.
- 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.
- CanonicalizeMirror the active side consistently and build the shared 64 × 14 angle, derivative, handle-velocity, and handle-acceleration tensor.
- Match and quality-gateTwo-pass calibration and dynamic programming align strokes; hard caps, masks, QC flags, pins, and exclusions preserve uncertainty.
- 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.
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.
- Segment the driveCatch and finish events isolate each stroke without consulting RP3 timestamps.
- Build the same 64 × 14 tensorProgress-domain resampling and QC reproduce the representation used during model training.
- Reconstruct and summarizePredicted coefficients or sequence outputs become a force curve with peak, peak position, impulse, and region metrics.
A normalized and distance-indexed curve plus derived metrics, with quality flags retained for downstream review.
Source artifacts
Evidence, in context.





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.