650 lines
28 KiB
Markdown
650 lines
28 KiB
Markdown
# Extending open rowing monitor (mostly javascript)
|
||
|
||
We can use python functions via node.json to use [RowingData](https://pypi.org/project/rowingdata/)
|
||
[See below](## RowingData)
|
||
|
||
* [child_process.spawn() function](https://nodejs.org/api/child_process.html#child_processspawncommand-args-options)
|
||
* [child_process.spawnSync](https://nodejs.org/api/child_process.html#child_processspawnsynccommand-args-options)
|
||
|
||
[How to run a python script from node.js](https://www.halo-lab.com/blog/how-to-run-a-python-script-from-node-js)
|
||
|
||
or we can use [node-calls-python](https://www.npmjs.com/package/node-calls-python)
|
||
to call Python from Node.js directly in-process without spawning processes using
|
||
an embedded Python interpreter. [More examples](https://github.com/hmenyus/node-calls-python/tree/main/test)
|
||
|
||
If the execution time of your Python code is less than creating a new process,
|
||
you will see significant performance problems because your Node.js code will
|
||
keep creating new processes instead of executing your Python code. Suppose you
|
||
have a few NumPy calls in Python,you don't want to create a new process for that
|
||
|
||
## Libraries
|
||
|
||
* [Node.js](https://nodejs.org/en) is a JavaScript runtime environment that
|
||
lets developers create servers, web apps, command line tools and scripts.
|
||
* [Rollup.js](https://rollupjs.org/) is a Node.js module bundler most
|
||
often used for client-side JavaScript running in the browser. ECMAScript ES6
|
||
ES modules.
|
||
* [Babel](https://babeljs.io/) is a JavaScript compiler.
|
||
* [Snowpack](https://www.snowpack.dev/) is a frontend build tool.
|
||
* [lit](https://lit.dev/) Lit is a simple library for building fast, lightweight
|
||
web components. (alternative to reactjs) Lit uses TypeScript.
|
||
* [web components](https://developer.mozilla.org/en-US/docs/Web/Web_Components)
|
||
are a set of native browser APIs that let you create your own HTML elements.
|
||
Those elements can do whatever you want them to. Lit is a library that wraps
|
||
around web components, making them easier to work with. Instead of setting
|
||
up web components using the native APIs directly, you can use Lit to make
|
||
Lit Components.
|
||
|
||
* [uvu](https://github.com/lukeed/uvu) is a test runner for Node.js
|
||
* [axios](https://github.com/axios/axios) Make http requests from node.js,
|
||
Supports the Promise API
|
||
|
||
## Files
|
||
|
||
### tree -L 3
|
||
|
||
```ascii
|
||
.
|
||
├── app
|
||
│ ├── ant
|
||
│ │ └── AntManager.js
|
||
│ ├── ble
|
||
│ │ ├── BufferBuilder.js
|
||
│ │ ├── BufferBuilder.test.js
|
||
│ │ ├── CentralManager.js
|
||
│ │ ├── CentralService.js
|
||
│ │ ├── ftms
|
||
│ │ ├── FtmsPeripheral.js
|
||
│ │ ├── PeripheralManager.js
|
||
│ │ ├── pm5
|
||
│ │ └── Pm5Peripheral.js
|
||
│ ├── client
|
||
│ │ ├── components
|
||
│ │ ├── icon.png
|
||
│ │ ├── index.html
|
||
│ │ ├── index.js
|
||
│ │ ├── lib
|
||
│ │ ├── manifest.json
|
||
│ │ └── store
|
||
│ ├── engine
|
||
│ │ ├── averager
|
||
│ │ ├── MovingFlankDetector.js
|
||
│ │ ├── RowingEngine.js
|
||
│ │ ├── RowingEngine.test.js
|
||
│ │ ├── RowingStatistics.js
|
||
│ │ ├── Timer.js
|
||
│ │ ├── WorkoutRecorder.js
|
||
│ │ └── WorkoutUploader.js
|
||
│ ├── gpio
|
||
│ │ └── GpioTimerService.js
|
||
│ ├── server.js
|
||
│ ├── tools
|
||
│ │ ├── AuthorizedStravaConnection.js
|
||
│ │ ├── ConfigManager.js
|
||
│ │ ├── Helper.js
|
||
│ │ ├── RowingRecorder.js
|
||
│ │ └── StravaAPI.js
|
||
│ └── WebServer.js
|
||
├── babel.config.json
|
||
├── bin
|
||
│ ├── openrowingmonitor.sh
|
||
│ └── updateopenrowingmonitor.sh
|
||
├── config
|
||
│ ├── default.config.js
|
||
│ └── rowerProfiles.js
|
||
├── docs
|
||
│ ├── assets
|
||
│ │ └── css
|
||
│ ├── attribution.md
|
||
│ ├── backlog.md
|
||
│ ├── CODE_OF_CONDUCT.md
|
||
│ ├── _config.yml
|
||
│ ├── CONTRIBUTING.md
|
||
│ ├── hardware_setup_WRX700.md
|
||
│ ├── img
|
||
│ │ ├── favicon.ico
|
||
│ │ ├── icon.png
|
||
│ │ ├── openrowingmonitor_frontend.png
|
||
│ │ ├── openrowingmonitor_icon.png
|
||
│ │ ├── physics
|
||
│ │ ├── raspberrypi_internal_wiring.jpg
|
||
│ │ └── raspberrypi_reedsensor_wiring.jpg
|
||
│ ├── installation.md
|
||
│ ├── _layouts
|
||
│ │ └── default.html
|
||
│ ├── physics_openrowingmonitor.md
|
||
│ ├── README.md
|
||
│ ├── rower_settings.md
|
||
│ └── Rowing_Settings_Analysis_Small.xlsx
|
||
├── install
|
||
│ ├── config.js
|
||
│ ├── install.sh
|
||
│ ├── openrowingmonitor.service
|
||
│ ├── smb.conf
|
||
│ ├── webbrowserkiosk.service
|
||
│ └── webbrowserkiosk.sh
|
||
├── jsconfig.json
|
||
├── LICENSE
|
||
├── package.json
|
||
├── package-lock.json
|
||
├── recordings
|
||
│ ├── DKNR320.csv
|
||
│ ├── RX800.csv
|
||
│ ├── WRX700_1magnet.csv
|
||
│ ├── WRX700_2magnets.csv
|
||
│ └── WRX700_2magnets_session.csv
|
||
├── rollup.config.js
|
||
└── snowpack.config.js
|
||
```
|
||
|
||
### Engine
|
||
|
||
* WorkoutRecorder.js
|
||
This Module captures the metrics of a rowing session and persists them.
|
||
* recordStroke,
|
||
recordRotationImpulse,
|
||
handlePause,
|
||
activeWorkoutToTcx,
|
||
reset
|
||
* Todo: split this into multiple modules
|
||
|
||
* RowingStatistics.js - This Module calculates the training specific metrics.
|
||
* sessionState,
|
||
durationTotal,
|
||
durationTotalFormatted,
|
||
strokesTotal,
|
||
distanceTotal,
|
||
caloriesTotal,
|
||
caloriesPerMinute,
|
||
caloriesPerHour,
|
||
strokeTime,
|
||
distance,
|
||
power,
|
||
split.
|
||
splitFormatted,
|
||
powerRatio,
|
||
instantaneousTorque,
|
||
strokesPerMinute,
|
||
speed,
|
||
strokeState,
|
||
heartrate,
|
||
heartrateBatteryLevel
|
||
|
||
* RowingEngine.js
|
||
The Rowing Engine models the physics of a real rowing boat.
|
||
[Physics of Rowing by Anu Dudhia](http://eodg.atm.ox.ac.uk/user/dudhia/rowing/physics)
|
||
* averager
|
||
moving, interval and weighted
|
||
* MovingFlankDetector.js
|
||
A Detector used to test for up-going and down-going flanks
|
||
* Timer.js
|
||
Stopwatch used to measure multiple time intervals
|
||
* WorkoutUploader.js
|
||
Handles uploading workout data to different cloud providers
|
||
|
||
### Client
|
||
|
||
* server.js - entry point
|
||
* app/client/index.js
|
||
Main Initialization Component of the Web Component App.
|
||
renders a performance-dashboard component, defines a custom element called
|
||
web-app using LitElement.
|
||
* app/client/components/AppElement.js
|
||
Base Component for all other App Components.
|
||
* app/client/components/DashboardActions.js
|
||
Component that renders the action buttons of the dashboard.
|
||
* app/client/components/DashboardMetric.js
|
||
Component that renders a metric of the dashboard.
|
||
* app/client/components/PerformanceDashboard.js
|
||
Component that renders the dashboard.
|
||
* app/client/components/BatteryIcon.js
|
||
Component that renders a battery indicator.
|
||
* app/client/components/AppDialog.js
|
||
Component that renders a html dialog.
|
||
|
||
### tools
|
||
|
||
* RowingRecorder.js
|
||
A utility to record and replay flywheel measurements for
|
||
development purposes.
|
||
* ConfigManager.js
|
||
Merges the different config files and presents the
|
||
configuration to the application
|
||
* StravaAPI.js
|
||
Implements required parts of the [Strava API](https://developers.strava.com/)
|
||
* AuthorizedStravaConnection.js
|
||
Creates an OAuth authorized connection to
|
||
[Strava](https://developers.strava.com/) Running, Cycling & Hiking App
|
||
* Helper.js
|
||
Helper functions
|
||
|
||
```html
|
||
https://stackblitz.com/edit/lit-element
|
||
https://stackblitz.com/edit/web-components-example-lit
|
||
https://stackblitz.com/edit/lit-element-rxjs-playground
|
||
https://stackblitz.com/edit/select-litelements
|
||
https://stackblitz.com/edit/lit-element-portal
|
||
|
||
https://stackblitz.com/edit/lit-element-chartjs-dtrcwz?file=index.js
|
||
https://www.chartjs.org/docs/latest/samples/bar/vertical.html
|
||
|
||
https://www.chartjs.org/docs/latest/samples/line/line.html
|
||
```
|
||
|
||
## TODO
|
||
|
||
## Pages
|
||
|
||
[ORM github](https://github.com/laberning/openrowingmonitor)
|
||
[ORM docs](https://laberning.github.io/openrowingmonitor)
|
||
|
||
## What you get
|
||
|
||
* Stroke detection
|
||
* Power (watts)
|
||
* Split time (/500m)
|
||
* Strokes per Minute
|
||
* Calories used (kcal)
|
||
* Training Duration
|
||
* Heart Rate (supports BLE and ANT+ heart rate monitors, ANT+ requires an ANT+
|
||
USB stick USB id 0x1008 or 0x1009)
|
||
|
||
* web sockets front end
|
||
* BLE (FTMS indoor bike, FMTS rower, concept2 PM)
|
||
|
||
Export session in [TCX](https://en.wikipedia.org/wiki/Training_Center_XML), csv for [RowingData](https://pypi.org/project/rowingdata/),
|
||
and csv raw data.
|
||
|
||
## [RowingData](https://pypi.org/project/rowingdata/)
|
||
|
||
[readthedocs](https://rowingdata.readthedocs.io/en/latest/)
|
||
[github](https://github.com/sanderroosendaal/rowingdata)
|
||
|
||
Make the data accessible in python and create useful plots.
|
||
|
||
* Upload fitness data captured in TCX format to the Concept2 logbook
|
||
* Get erg data captured with apps that have no “upload to Concept2”
|
||
functionality and upload them to the Concept2 logbook
|
||
* Get erg data captured with apps that have no TCX export functionality and
|
||
convert hem to TCX
|
||
* Make the data accessible in python and create useful plots.
|
||
* Color HR band charts or Pie Charts
|
||
* Plot drive length, drive time, and other erg related parameters as a function
|
||
of time or distance (implemented)
|
||
* Create histograms (Do-it-yourself).
|
||
* And much more (do-it-yourself). You’ve got the entire Python matplotlib at
|
||
your disposal.
|
||
|
||
The project is based on:
|
||
|
||
* [python plotting code](https://quantifiedrowing.com/category/software-tools/) by Greg Smith
|
||
|
||
and inspired by:
|
||
|
||
* the [RowPro Dan Burpee spreadsheet](http://www.sub7irc.com/RP_Split_Template.zip)
|
||
* the [Burpee forum post](https://freespiritsrowing.com/forum/viewtopic.php?t=3248)
|
||
|
||
The [roadmap](./backlog.md) indentifies:
|
||
|
||
* add possibility to define training timers
|
||
* add possibility to define workouts (i.e. training intervals with goals)
|
||
|
||
which we aim to add using the concept2 training plans and davids spreadsheet
|
||
formula to provide a training program for a given goal date which varies the
|
||
program in relation to improvements over time.
|
||
|
||
## training
|
||
|
||
The [roadmap](https://laberning.github.io/openrowingmonitor/backlog.html) indentifies:
|
||
|
||
* add possibility to define workouts (i.e. training intervals with goals)
|
||
|
||
which we aim to add using the concept2 training plans and davids spreadsheet
|
||
formula to provide a training program for a given goal date which varies the
|
||
program in relation to improvements over time.
|
||
|
||
### Feedback from the Coach
|
||
|
||
#### CMA for the Coach
|
||
|
||
* Provide warning over excess heart rate while exercising:
|
||
Heart rate should remain below upper limit of "expected zone".
|
||
Advise that heart rate above upper limit by >1 bpm means user must reduce
|
||
effort.
|
||
* Instruction on when to take rest days.
|
||
* Recording of heart rate after work-outs too, to identify pending illness.
|
||
* Coach warns of over training when performance declines steadily over, say 4 or
|
||
more, days.
|
||
* When over training is indicated, Coach suggests: skip a day or two; eat more;
|
||
Coach also warns of over training when, after a skip, performance has not
|
||
returned to before.
|
||
* Coach suggests work rates based on recent past performance.
|
||
* Perhaps present this as a choice for the user, perhaps between:
|
||
(Coach's default, perhaps based on yesterday's performance), and (user choice).
|
||
(yesterday's performance) and (the day before's performance).
|
||
(low|easier|"get the job done") versus (high|harder|"make a mark").
|
||
* Marking of results of rows rows taken in contravention of instructions.
|
||
* Display of recorded rows highlighting contraventions, say in red.
|
||
* Have an optional way to, temporarily, display results without the red.
|
||
|
||
## What we need
|
||
|
||
* resting heart rate (ask)
|
||
* max heart rate (stepped challenge)
|
||
* heart rate after given workload (watt/duration challenge)
|
||
* heart rate after work-outs too, to identify pending illness
|
||
* Interpolate heart rate to predict competition performance.
|
||
* Have Eddie's racing warm-up (as attached to the rower atm)
|
||
|
||
### Candidate rowing programmes
|
||
|
||
* For athlete levels 1 (not exercised for 3 years) to 5 (hero).
|
||
* Have table of suggested rowing effort and duration.
|
||
|
||
## Sensor Methods
|
||
|
||
### IMU
|
||
|
||
motion analysis, most require athletes to wear sensors to acquire their posture
|
||
data; however, this method easily introduces noise due to friction during motions
|
||
|
||
[Automated Rower Assignment to Rowing Events: A Machine Learning Approach](https://commons.nmu.edu/cgi/viewcontent.cgi?article=2810&context=isbs)
|
||
[Analysis of indoor rowing motion using wearable inertial sensors](https://dl.acm.org/doi/pdf/10.4108/eai.28-9-2015.2261465)
|
||
|
||
#### [Biorowtel](https://biorow.com/index.php?route=product/product&path=61_108&product_id=54)
|
||
|
||
£8,325.00
|
||
|
||
* [2D Oar Angle sensor](https://biorow.com/products/biorow_sensors/2d_oar_angle) £420
|
||
* Catch and finish angles, and total stroke length ([RBN 2003/04](https://www.biorow.com/RBN_en_2003_files/2003RowBiomNews04.pdf) [RBN2003/05](https://www.biorow.com/RBN_en_2003_files/2003RowBiomNews05.pdf), [RBN 2017/04](https://biorow.com/index.php?route=information/news/news&news_id=17)).
|
||
* Handle velocity is derived using the horizontal oar angle and actual inboard ([RBN 2002/07](https://www.biorow.com/RBN_en_2002_files/2002RowBiomNews07.pdf))
|
||
* Work per Stroke ([RBN 2014/07](https://www.biorow.com/RBN_en_2014_files/2014RowBiomNews07.pdf)) rowing power measurements ([RBN 2014/03](https://www.biorow.com/RBN_en_2014_files/2014RowBiomNews03.pdf), [RBN 2018/09](https://biorow.com/index.php?route=information/news/news&news_id=34))
|
||
* Depth of the blade in the water ([RBN 2015/08](https://www.biorow.com/RBN_en_2015_files/2015RowBiomNews08.pdf))
|
||
* Effective angles ([RBN 2009/10](https://www.biorow.com/RBN_en_2009_files/2009RowBiomNews10.pdf))
|
||
* effective blade work ([RBN 2018/06](https://biorow.com/index.php?route=information/news/news&news_id=31) [RBN 2018/07](https://biorow.com/index.php?route=information/news/news&news_id=32) [RBN 2018/08](https://biorow.com/index.php?route=information/news/news&news_id=33)).
|
||
* [Oar bend (force) sensor (loadcell)](https://biorow.com/products/biorow_sensors/oar_bend_sensor) £320
|
||
* [Position-sensor](https://biorow.com/products/biorow_sensors/position_sensor) £380
|
||
* [Foot-stretcher force sensor](https://biorow.com/products/biorow_sensors/stretcher_force2) £1,200
|
||
[RBN info](http://www.biorow.com/RBN_en_2015_files/2015RowBiomNews02.pdf)
|
||
Biomechanics of Rowing: 2.5.3 Stretcher Force
|
||
* [3D Pin Force sensor (Instrumented C-bracket)](https://biorow.com/products/biorow_sensors/c_bracket) £1,500
|
||
|
||
#### DIY IMU
|
||
|
||
##### ORM on a raspberry pi
|
||
|
||
##### Holyiot nRF52840 USB Dongle
|
||
|
||
##### DIY nRF52840 implementing [Reefwing-AHRS](https://github.com/Reefwing-Software/Reefwing-AHRS) to provide reliable roll, pitch and yaw angles.
|
||
|
||
* [LSM9DS1](https://www.st.com/en/mems-and-sensors/lsm9ds1.html) 9-axis IMU [Reefwing-LSM9DS1](https://github.com/Reefwing-Software/Reefwing-LSM9DS1)
|
||
* [MPU6050](https://invensense.tdk.com/products/motion-tracking/6-axis/mpu-6050/) 6-axis IMU [Reefwing-MPU6050](https://github.com/Reefwing-Software/Reefwing-MPU6050)
|
||
* [MPU6500](https://invensense.tdk.com/products/motion-tracking/6-axis/mpu-6500/) 6-axis IMU [Reefwing-MPU6x00](https://github.com/Reefwing-Software/MPU6x00)
|
||
|
||
##### Beacon for handle, seat and trunk
|
||
|
||
| NRF chip | RAM | ROM | Notes |
|
||
|----------|----------|------------|-------------------------------------------------|
|
||
| 52810 | 24k | 192k | BARELY enough RAM for "broadcast only" function |
|
||
| 52820 | 32k | 256k | Untested, should work just as the 832 does |
|
||
| 52832 | 64/32 KB | 512/256 KB | Enough RAM for additional sensors |
|
||
| 52840 | 256 KB | 1 MB | Untested; probably overkill for this application|
|
||
See: [bthome-presence hardware](https://github.com/kquinsland/bthome-presence/blob/main/hardware/readme.md)
|
||
|
||
* 3x [holyiot 21014]() nRF52810 + lis2dh12 + RGB LED + button
|
||
* [holyiot 21014 zephyr project](https://github.com/danielstuart14/wlen_project/tree/master/beacon/boards/arm/holyiot_21014)
|
||
* [bthome-presence](https://github.com/kquinsland/bthome-presence/)
|
||
firmware for presence detection that "just works" with Home Assistant.
|
||
The firmware targets the cheap nrf52 based BT LE tags that are available on
|
||
Ali Express.
|
||
*
|
||
|
||
##### 3-axis load cell for foot spreader
|
||
|
||
##### load-cell for the seat
|
||
|
||
### Video
|
||
|
||
2D pose analysis using [OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
|
||
system to capture the skeletal joints of individuals, even in complex postures,
|
||
using a simple camera.
|
||
|
||
* [OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
|
||
Real-time multi-person keypoint detection library for body, face, hands, and
|
||
foot estimation, with [python api](https://cmu-perceptual-computing-lab.github.io/openpose/web/html/doc/md_doc_03_python_api.html)
|
||
* [OpenPose Video](https://www.youtube.com/watch?v=OgQLDEAjAZ8)
|
||
|
||
* Automatic Rowing Kinematic Analysis Using OpenPose and Dynamic Time Warping]
|
||
* [An introduction to Dynamic Time Warping](https://rtavenar.github.io/blog/dtw.html)
|
||
* [dtw-python](https://dynamictimewarping.github.io/py-api/html/index.html)
|
||
In order to apply the DTW algorithm, we first need to choose a reference or
|
||
desired rowing cycle. The paper above chooses to take the rowing cycle from a
|
||
known good rower, we want to take the rowing cycle from the Biomechanics of
|
||
Rowing book chapter 4: Technique.
|
||
|
||
[Intelligent Performance Evaluation in Rowing Sport Using a Graph-Matching Network](https://pmc.ncbi.nlm.nih.gov/articles/PMC10532480/)
|
||
This study aimed to develop a video-based approach to analyze the performance of
|
||
rowing poses of rowing pairs. To enable effective automatic comparison of rowing
|
||
poses, the OpenPose system was used to extract robust rowing pose features and
|
||
convert them into a graph structure. Subsequently, the GEM and GMN models were
|
||
utilized to analyze the similarities in rowing postures between each pair of rowers.
|
||
|
||
[Inaccurate Action Detection Algorithm for Rowing Machine Exercise Based on
|
||
Attention-CNN](https://ieeexplore.ieee.org/iel8/6287639/10380310/10638659.pdf)
|
||
Assessing the conformity of a rower’s actions using [OpenPose](https://github.com/CMU-Perceptual-Computing-Lab/openpose)
|
||
, [1D CNN](https://www.mdpi.com/2076-3417/14/18/8500) and
|
||
[CoT](https://www.ibm.com/topics/chain-of-thoughts) to recognize
|
||
whether the movement is standard.
|
||
|
||
[1D Convolutional Neural Network Models for Human Activity Recognition](https://machinelearningmastery.com/cnn-models-for-human-activity-recognition-time-series-classification/)
|
||
Classifying sequences of accelerometer data recorded by specialized harnesses or
|
||
smart phones into known well-defined movements.
|
||
|
||
### [Rowsandall](https://analytics.rowsandall.com/) Rowsandall Rowing Data Analytics
|
||
|
||
For our Basic user, the website is Free. Within this package you get
|
||
|
||
* User defined heart rate and power zones
|
||
* Synchronization with Strava, SportTracks, Concept2 logbook, RunKeeper.
|
||
* Download CSV and TCX files.
|
||
* Session summary, Session Summary Chart and Pie Charts
|
||
* Flexible charting of time, distance, stroke rate, power, heart rate
|
||
* Interval editor
|
||
* Ranking piece pace predictor
|
||
|
||
With the Pro user: 15 € per year
|
||
|
||
* All basic features
|
||
* Flexible charting of drive length, force, work per stroke, and Empower Oarlock data
|
||
* Workout power histogram
|
||
* Compare workouts
|
||
* Data fusion (from different sources)
|
||
* Calculate correlations and other statistical analysis
|
||
* Weather information
|
||
* Stroke power histogram
|
||
|
||
#### blog articles
|
||
|
||
* [Rowsandall Manual](https://analytics.rowsandall.com/2022/04/12/training-planning-updated-manual-for-rowsandall-com/)
|
||
* [In-Stroke Metric Analysis Comparison](https://analytics.rowsandall.com/2022/10/29/in-stroke-metric-analysis-comparison/)
|
||
* [Force Curves and In-Stroke Analysis](https://analytics.rowsandall.com/2024/06/20/how-to-work-with-force-curves-and-in-stroke-analysis/)
|
||
* [Quantifying Training Intensity Distribution](https://analytics.rowsandall.com/2021/06/10/quantifying-training-intensity-distribution-new-tool/)
|
||
|
||
[RowingData](https://pypi.org/project/rowingdata/)
|
||
|
||
## Other projects
|
||
|
||
### [Rider ride data from TCX plotted](https://www.kaggle.com/code/runesh/rider-ride-data-from-tcx-file-plotted-on-a-graph) python notebook
|
||
|
||
### [dynrow](https://github.com/monsdar/dynrow)
|
||
|
||
Displays thorough statistics about your current workout. In addition to that
|
||
there should be a variety of bots available. Here are a few ideas:
|
||
|
||
* *Constant pace:* This is useful if you want to row in a certain tempo
|
||
* *Boomerang:* They're rowing at a constant pace, but if they get behind you
|
||
they will row faster. If they get too far in front, they'll decelerate to
|
||
let you keep up with them. They're almost like the constant pace boats, but
|
||
they'll always be around. This leads to having opponents around even at the
|
||
longest training sessions
|
||
* *Heartrate:* You set up your desired target heart rate and the bot will row
|
||
faster/slower according to your current heart rate
|
||
* *Ghostrider:* This bot replays a previously rowing session of yourself
|
||
* *Intervals:* Usually this bot runs on a constant pace, but it'll push the
|
||
tempo from time to time.
|
||
|
||
### Elevate
|
||
|
||
* [Elevate github](https://github.com/thomaschampagne/elevate)
|
||
* [Elevate docs](https://thomaschampagne.github.io/elevate-docs/)
|
||
* [More fun with Elevate](https://quantifiedrowing.com/2017/03/09/more-fun-with-stravastix/)
|
||
* [‘training impulse’ (TRIMP)](http://www.trainingimpulse.com/banisters-trimp-0)
|
||
* [TRIMP example in Elevate – A Strava plugin deprecated](https://rowingmusings.wordpress.com/2017/02/04/stravistix-a-strava-plugin-which-can-help-with-rowing/) now a windows or mac app.
|
||
|
||
* Typescript as programming language.
|
||
* Angular as frontend (build with @angular/cli).
|
||
* Angular Material for material designed components.
|
||
* Metrics Graphics, Plotly & D3 for charting.
|
||
* LokiJS as in-memory NoSQL database persisted in IndexedDB.
|
||
* Jest as Javascript test runner (instead of "stock" karma one).
|
||
|
||
### Fitness Dashboard/[Fitness ECG](https://www.fitnesshrv.com/)
|
||
|
||
#### Fitness Dashboard
|
||
|
||
Fitness_Dashboard captures Ant+ and BLE data from power meters, heart rate
|
||
monitors, fitness trainers and various other [devices](https://www.fitnesshrv.com/2024/01/11/devices.html).
|
||
|
||
The data is displayed in two ways. First is a set of graphs showing various
|
||
statistics. Second a large display of the current values for the statistics
|
||
from each device being monitored. The intent is to provide the equivalent of
|
||
a cycling computer with a much larger and easier to read interface suitable
|
||
for using when training indoors.
|
||
|
||
Currently supported:
|
||
|
||
* Ant+ Device Profiles
|
||
* Heart Rate
|
||
* Bicycle Power
|
||
* Fitness Equipment (FE-C)
|
||
* Muscle Oxygen
|
||
* Bicycle Speed and Cadence
|
||
|
||
#### Fitness_ECG
|
||
|
||
Captures heart rate and ECG data from a Polar H10 heart rate monitor (proprietary
|
||
BLE service). This is displayed as an ECG trace and heart rate graph over time.
|
||
|
||
### Android
|
||
|
||
### [Quiske RowP App](https://www.rowingperformance.com/tutorial)
|
||
|
||
The Quiske pod also allows for dynamic rowing on machines such as a Concept2 on slides.
|
||
|
||
* [Quiske Manual](https://www.rowingperformance.com/blog/the-virtual-coach-evolved)
|
||
* [Quiske knows dynamic too](https://www.rowingperformance.com/blog/quiske-coach-knows-dynamic-too)
|
||
* [Making Sense of the Data](https://www.rowingperformance.com/blog/making-sense-of-the-data)
|
||
* [Technique](https://www.rowingperformance.com/blog/three-steps-to-good-rowing-technique)
|
||
Chapter 4 Technique
|
||
* [Drag](https://www.rowingperformance.com/blog/drag-factor)
|
||
Chapter 5.2.3 Handle Drag Factor HDF
|
||
* [Rowing Style](https://www.rowingperformance.com/blog/got-style)
|
||
Chapter 4.1.5 Rowing Styles
|
||
* [More Style](https://www.rowingperformance.com/blog/drill-into-style)
|
||
* [Stroke timing](https://www.rowingperformance.com/blog/stroke-timing)
|
||
Chapter 4.1.6 ‘Transition point’ during the drive
|
||
* [Rhythm](https://www.rowingperformance.com/blog/what-s-your-rhythm)
|
||
* [Swing](https://www.rowingperformance.com/blog/how-s-your-swing)
|
||
* [Android 13 app](https://play.google.com/store/apps/details?id=com.quiske.rowingperformance&hl=en_GB)
|
||
* plus 'pod' (presumably an IMU)
|
||
|
||
* 430,00 € Pod for indoor rowing
|
||
* 99,00 € for cloud analytics subscription
|
||
* 50,00 € Report on your rowing technique
|
||
* 85,00 € Remote coaching
|
||
|
||
The phone is attached to the handle and the pod to the seat. The correct form
|
||
is derived from the difference in speed of the seat and handle in the various
|
||
stages of the stroke.
|
||
|
||
[For example](https://www.coachbergenroth.com/improve-your-rowing-with-the-quiske-pod/),
|
||
when I approach the catch, I could see that my handle speed and deceleration
|
||
was different from my seat deceleration. This data indicated to me that I was
|
||
not establishing my forward body angle early enough on the recovery.
|
||
|
||
### [EXR](https://play.google.com/store/apps/details?id=com.SaltyLemonEntertainment.EXR)
|
||
|
||
EXR | Row together Virtually Subscription: € 7,95/month
|
||
|
||
### [Coxwain](https://github.com/svenmeier/coxswain) [Android](https://play.google.com/store/apps/details?id=svenmeier.coxswain)
|
||
|
||
waterrower workout tracker,
|
||
|
||
* [Coxwain2fit](https://github.com/inonoob/Coxswain2Fit) Convert garmin TCX
|
||
export file from Coxswain android app (Waterrower) to a garmin FIT file.
|
||
|
||
## Requests
|
||
|
||
An "unlocked" PM would be such an amazing training tool.
|
||
|
||
* Everything that ErgData does, without crashing.
|
||
* Also average stroke rating could help a lot, especially on pieces where my
|
||
coach gives us punishments for not hitting our goal average stroke rate exactly.
|
||
* My only complaint with PM5 is that if you sync your HRM to it, you get your HR
|
||
from the end of the split not the average across it. Sort that and I'm all set.
|
||
|
||
The PM6 Super Plus:
|
||
|
||
* Improved screen resolution and size
|
||
* Larger more detailed power curve
|
||
* More data metrics on one screen:
|
||
* peak power %,
|
||
* watts + split at the same time,
|
||
* stroke length,
|
||
* average stroke rate data to the tenth of a stroke,
|
||
* current split to the tenth of a split
|
||
* Accurate average heart rate data - right now the resulting heart rate for a
|
||
piece seems closer to the final heart rate measured than the average for the
|
||
piece
|
||
* Ability to add a split distance by the push of a button (so if you do 1500m,
|
||
with 250m splits, you push a button and it adds that distance to your piece)
|
||
* Results graph that shows heart rate, stroke rate, split over the course of the
|
||
piece
|
||
* Front facing speakers
|
||
* Netflix + spotify
|
||
* LED backlit screen
|
||
* Full colour display
|
||
* Picture-in-picture or overlay (so you can have erg data plus another feed,
|
||
perhaps a TV stream or something nice to watch). A headphone jack/
|
||
bluetooth audio connection would be awesome too, with input either from
|
||
streams or a radio/TV receiver. It would also give the option of something
|
||
I've always wanted for training/coaching rate work - timing pips. Seriously,
|
||
like a metronome, but for rowing, would be absolutely incredible for keeping
|
||
focus / improving consistency.
|
||
* Touch screen, and a good one at that. Buttons are nice but this is 2018.
|
||
* WiFi / Mobile Data. Cables are also something which should be optional in all
|
||
but the most critical situation. Obviously, for stability sensitive things
|
||
like indoor rowing competitions in real-time, the Ethernet connection is
|
||
absolutely irreplaceable, but additional connectivity for more general use
|
||
would be an excellent feature.
|
||
* Use of the data connection to allow me to store my data on a cloud based
|
||
profile, great for shared ergs in clubs/gyms, just sign in and save/recall
|
||
all your metrics, bonus points if you can access it from other platforms
|
||
too for analysis. So much smoother and cleaner than a USB stick, much better
|
||
UX too.
|
||
* Buttons on the handle that control the PM6 and/or my music via bluetooth,
|
||
because sometimes I'm just not feeling a track. Hate myself for adding this
|
||
one but it would be cool as hell, plus great to be able to make changes
|
||
(e.g. add 1000m to a steady state piece) mid-row without breaking rhythm.
|
||
|
||
## Books
|
||
|
||
* Biomechanics of Rowing -- Valery Kleshnev -- Crowood
|
||
for people who want to measure numbers in rowing, relate them to technique
|
||
and give specific advice to coaches and rowers.
|
||
* CHAPTER 4 TECHNIQUE
|
||
combine with Automatic_Rowing_Kinematic_Analysis_Using_OpenPose_and_Dynamic_Time_Warping.pdf
|
||
* CHAPTER 5 ERGOMETER ROWING
|
||
* CHAPTER 7 PERFORMANCE ANALYSIS IN ROWING
|
||
* CHAPTER 8.1 EFFECT OF THE EXERCISE DURATION
|
||
* Rowing Faster - 2nd Edition -- Volker Nolte -- 2, 2011 -- Human Kinetics |