You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A free and open source performance monitor for rowing machines. It upgrades a rowing machine into a smart trainer that can be used with training applications and games.
7
7
@@ -12,7 +12,7 @@ We suspect it works well with DIY rowing machines like the [Openergo](https://op
12
12
13
13
## Features
14
14
15
-
The following items describe most of the current features, more functionality will be added in the future, check the [Development Roadmap](./backlog.md) if you are curious.
15
+
The following items describe most of the current features, more functionality will be added in the future, check the [Development Roadmap](backlog.md) if you are curious.
16
16
17
17
### Rowing Metrics
18
18
@@ -33,7 +33,7 @@ The web interface visualizes the rowing metrics on any device that can run a web
33
33
If you connect a screen to the Raspberry Pi, then this interface can also be directly shown on the device. The installation script can set up a web browser in kiosk mode that runs on the Raspberry Pi.
Also have a look at the [Detailed Installation Instructions](./installation.md) for more information on the software installation and for instructions on how to connect the rowing machine.
66
+
Also have a look at the [Detailed Installation Instructions](installation.md) for more information on the software installation and for instructions on how to connect the rowing machine.
67
67
68
68
## How it all started
69
69
@@ -77,8 +77,8 @@ This project is already in a very usable stage, but some things are still a bit
77
77
78
78
Feel free to leave a message in the [GitHub Discussions](https://github.com/laberning/openrowingmonitor/discussions) if you have any questions or ideas related to this project.
79
79
80
-
Check the advanced information on the [Physics behind Open Rowing Monitor](./physics_openrowingmonitor.md).
80
+
Check the advanced information on the [Physics behind Open Rowing Monitor](physics_openrowingmonitor.md).
81
81
82
-
We plan to add more features, here is the [Development Roadmap](./backlog.md).
82
+
We plan to add more features, here is the [Development Roadmap](backlog.md).
83
83
84
-
This project uses some great work by others, see the [Attribution here](./attribution.md).
84
+
This project uses some great work by others, see the [Attribution here](attribution.md).
Copy file name to clipboardexpand all lines: docs/hardware_setup_WRX700.md
+4-1
Original file line number
Diff line number
Diff line change
@@ -21,4 +21,7 @@ How to connect this to your rowing machine is specific to your device. You need
21
21

22
22
*Connecting the reed sensor*
23
23
24
-
You should now adjust the rower specific parameters in `config/config.js` to suit your rowing machine. Have a look at [config/default.config.js](../config/default.config.js) to see what config parameters are available.
24
+
## Rower Settings
25
+
26
+
You should now adjust the rower specific parameters in `config/config.js` to suit your rowing machine. Have a look at `config/default.config.js` to see what config parameters are available.
27
+
Also check the [Guide for rower specific settings](rower_settings.md).
Copy file name to clipboardexpand all lines: docs/installation.md
+1-1
Original file line number
Diff line number
Diff line change
@@ -94,5 +94,5 @@ If your machine isn't listed and does not have something like this or if the sen
94
94
95
95
## Rower Settings
96
96
97
-
You should now adjust the rower specific parameters in `config/config.js` to suit your rowing machine. Have a look at [config/default.config.js](../config/default.config.js) to see what config parameters are available.
97
+
You should now adjust the rower specific parameters in `config/config.js` to suit your rowing machine. Have a look at `config/default.config.js` to see what config parameters are available.
98
98
Also check the [Guide for rower specific settings](rower_settings.md).
Copy file name to clipboardexpand all lines: docs/physics_openrowingmonitor.md
+4-4
Original file line number
Diff line number
Diff line change
@@ -63,14 +63,14 @@ Here, we plot the *currentDt* (time between impulses) against its sequence numbe
63
63
64
64
* The **Recovery Phase**, where the rower returns to his starting position
65
65
66
-
As the rowing cycle always follows this fixed schema, Open Rowing Monitor models it as a finite state machine (implemented in [RowingEngine's handleRotationImpulse](https://github.com/laberning/openrowingmonitor/blob/main/app/engine/RowingEngine.js)):
66
+
As the rowing cycle always follows this fixed schema, Open Rowing Monitor models it as a finite state machine (implemented in `handleRotationImpulse` in `engine/RowingEngine.js`).
67
67
68
68

69
69
*Finite state machine of rowing cycle*
70
70
71
71
### Basic stroke detection
72
72
73
-
Given that the *Angular Displacement* between impulses is fixed, we can deduct some things simply from looking at the subsequent *time between impulses*, *currentDt*. When the *currentDt* shortens, *Angular Velocity* is increasing, and thus the flywheel is accelerating (i.e. we are in the drive phase of the rowing cycle). When times between subsequent impulses become longer, the *Angular Velocity* is decreasing and thus the flywheel is decelerating (i.e. we are the recovery phase of the rowing cycle). This is the robust implementation of a stroke (implemented in [MovingFlankDetector's implementation of isFlywheelPowered and isFlywheelUnpowered for naturalDeceleration = 0](https://github.com/laberning/openrowingmonitor/blob/main/app/engine/MovingFlankDetector.js)), which is similar to the implementation used by industry leaders like Concept2. Concept2 are generally considered the golden standard when it comes to metrics, and they state (see [this Concept2 FAQ](https://www.concept2.com/service/software/ergdata/faqs): 'Drive time is measured by the amount of time the flywheel is accelerating. Note: It is possible that the athlete may pull on the handle and not accelerate the flywheel due to no energy being put into it and therefore no effective effort. This portion of the handle pull is not measured.')
73
+
Given that the *Angular Displacement* between impulses is fixed, we can deduct some things simply from looking at the subsequent *time between impulses*, *currentDt*. When the *currentDt* shortens, *Angular Velocity* is increasing, and thus the flywheel is accelerating (i.e. we are in the drive phase of the rowing cycle). When times between subsequent impulses become longer, the *Angular Velocity* is decreasing and thus the flywheel is decelerating (i.e. we are the recovery phase of the rowing cycle). This is the robust implementation of a stroke (implemented in MovingFlankDetector's implementation of isFlywheelPowered and isFlywheelUnpowered for naturalDeceleration = 0 in `engine/MovingFlankDetector.js`), which is similar to the implementation used by industry leaders like Concept2. Concept2 are generally considered the golden standard when it comes to metrics, and they state (see [this Concept2 FAQ](https://www.concept2.com/service/software/ergdata/faqs): 'Drive time is measured by the amount of time the flywheel is accelerating. Note: It is possible that the athlete may pull on the handle and not accelerate the flywheel due to no energy being put into it and therefore no effective effort. This portion of the handle pull is not measured.')
74
74
75
75
### Advanced stroke detection
76
76
@@ -83,7 +83,7 @@ In this graph, we plot *currentDt* against the time in the stroke, averaged over
83
83
84
84
However, from the acceleration/deceleration curve it is also clear that despite the deceleration, there is still a force present: the deceleration-curve hasn't reached its stable minimum despite crossing 0. This is due to the pull still continuing through the arms: the net force is negative due to a part drive-phase (the arm-movement) delivering weaker forces than the drag-forces of the flywheel. Despite being weaker than the other forces on the flywheel, the rower is still working. In this specific example, at around 0.52 sec the rower's force was weaker than all drag-forces combined. However, only at 0,67 seconds (thus approx. 150 ms later) the net force reaches its stable bottom: the only force present is the drag from the flywheel. Getting closer to this moment is a goal.
85
85
86
-
By specifying the expected natural deceleration of the flywheel (naturalDeceleration, which in this case is around 8 Rad/S^2) in the configuration of the rower, the stroke starts earlier and ends later (implemented in [MovingFlankDetector's implementation of isFlywheelPowered and isFlywheelUnpowered for naturalDeceleration < 0](../app/engine/MovingFlankDetector.js)). Please note: as several derived metrics depend on the length of the drive phase or the exact timing of that moment (like the drag factor when calculated dynamically), these are likely to change when this setting is changed. For a more in-depth explanation, see [here for more details](physics_openrowingmonitor.md#a-closer-look-at-the-effects-of-the-various-drive-and-recovery-phase-detection).
86
+
By specifying the expected natural deceleration of the flywheel (naturalDeceleration, which in this case is around 8 Rad/S^2) in the configuration of the rower, the stroke starts earlier and ends later (implemented in MovingFlankDetector's implementation of isFlywheelPowered and isFlywheelUnpowered for naturalDeceleration < 0 in `engine/MovingFlankDetector.js`). Please note: as several derived metrics depend on the length of the drive phase or the exact timing of that moment (like the drag factor when calculated dynamically), these are likely to change when this setting is changed. For a more in-depth explanation, see [here for more details](physics_openrowingmonitor.md#a-closer-look-at-the-effects-of-the-various-drive-and-recovery-phase-detection).
87
87
88
88
Testing shows that setting a value close to the natural deceleration provides more accurate results very reliably. However, some rowers might contain a lot of noise in their data, making this approach infeasible (hence the fallback option of naturalDeceleration = 0)
89
89
@@ -227,7 +227,7 @@ There are some additional options for the frequency of metric calculations:
227
227
228
228
* To allow for a very frequent update of the monitor, and allow for testing for typical end-criteria for trainings that change quite quickly (i.e. absolute distance, elapsed time), we calculate these for each new *currentDt*;
229
229
230
-
* As we can only calculate the drag factor at the end of the recovery phase, we can only (retrospectively) apply it to the realized linear distance of that same recovery phase. Therefore, we we need to report absolute time and distance from the [RowingEngine](../app/engine/RowingEngine.js));
230
+
* As we can only calculate the drag factor at the end of the recovery phase, we can only (retrospectively) apply it to the realized linear distance of that same recovery phase. Therefore, we we need to report absolute time and distance from the `RowingEngine` in `engine/RowingEngine.js`);
231
231
232
232
## A closer look at the effects of the various Drive and Recovery phase detection
0 commit comments