help & physics
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
<h1>Welcome to Rowsandall.com</h1>
|
<h1>Welcome to Rowsandall.com</h1>
|
||||||
<ul class="main-content">
|
<ul class="main-content">
|
||||||
<li class="grid_2">
|
<li class="grid_2">
|
||||||
|
<h2>What is it?</h2>
|
||||||
<p>
|
<p>
|
||||||
Rowsandall.com is an online tool for rowers to analyze data from On The Water
|
Rowsandall.com is an online tool for rowers to analyze data from On The Water
|
||||||
(OTW) and On The Erg (OTE) workouts. It accepts workout data from a
|
(OTW) and On The Erg (OTE) workouts. It accepts workout data from a
|
||||||
|
|||||||
@@ -76,28 +76,28 @@
|
|||||||
<label for="group-chart">Static Charts</label>
|
<label for="group-chart">Static Charts</label>
|
||||||
<ul>
|
<ul>
|
||||||
<li id="chart-time">
|
<li id="chart-time">
|
||||||
<a href="/rowers/workout/{{ workout.id }}/addtimeplot">
|
<a href="/rowers/workout/{{ workout.id }}/addstatic/1">
|
||||||
<i class="fas fa-stopwatch fa-fw"></i> Time
|
<i class="fas fa-stopwatch fa-fw"></i> Time
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li id="chart-distance">
|
<li id="chart-distance">
|
||||||
<a href="/rowers/workout/{{ workout.id }}/adddistanceplot">
|
<a href="/rowers/workout/{{ workout.id }}/addstatic/2">
|
||||||
<i class="fas fa-ruler fa-fw"></i> Distance
|
<i class="fas fa-ruler fa-fw"></i> Distance
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li id="chart-powerpie">
|
<li id="chart-powerpie">
|
||||||
<a href="/rowers/workout/{{ workout.id }}/addpowerpiechart">
|
<a href="/rowers/workout/{{ workout.id }}/addstatic/13">
|
||||||
<i class="far fa-chart-pie fa-fw"></i> Power (Pie)
|
<i class="far fa-chart-pie fa-fw"></i> Power (Pie)
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li id="chart-hrpie">
|
<li id="chart-hrpie">
|
||||||
<a href="/rowers/workout/{{ workout.id }}/addpiechart">
|
<a href="/rowers/workout/{{ workout.id }}/addstatic/3">
|
||||||
<i class="fas fa-heartbeat fa-fw"></i> Heart Rate (Pie)
|
<i class="fas fa-heartbeat fa-fw"></i> Heart Rate (Pie)
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% if workout|water %}
|
{% if workout|water %}
|
||||||
<li id="chart-otwpower">
|
<li id="chart-otwpower">
|
||||||
<a href="/rowers/workout/{{ workout.id }}/addotwpowerplot">
|
<a href="/rowers/workout/{{ workout.id }}/addstatic/9">
|
||||||
<i class="fas fa-chart-area fa-fw"></i> OTW Power
|
<i class="fas fa-chart-area fa-fw"></i> OTW Power
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
+134
-136
@@ -1,166 +1,164 @@
|
|||||||
|
{% extends "newbase.html" %}
|
||||||
|
{% block title %}About us{% endblock title %}
|
||||||
|
{% block main %}
|
||||||
|
|
||||||
{% extends "base.html" %}
|
<h1>How we calculate things</h1>
|
||||||
{% block title %}About us{% endblock title %}
|
|
||||||
{% block content %}
|
|
||||||
|
|
||||||
<div class="grid_6 alpha">
|
<ul class="main-content">
|
||||||
<h3>How we calculate things</h3>
|
<li class="grid_2">
|
||||||
<p>You are reading this because you want to understand how the wind/stream conversion and the conversion from OTW pace to OTE pace works.</p>
|
<p>You are reading this because you want to understand how the wind/stream conversion and the conversion from OTW pace to OTE pace works.</p>
|
||||||
|
|
||||||
<p>The conversions are done using a one-dimensional mechanical model that is
|
<p>The conversions are done using a one-dimensional mechanical model that is
|
||||||
introduced <a href="https://sanderroosendaal.wordpress.com/index/">here</a>.
|
introduced <a href="https://sanderroosendaal.wordpress.com/index/">here</a>.
|
||||||
The model takes into account, among others, the following parameters:
|
The model takes into account, among others, the following parameters:
|
||||||
<ul>
|
<ul>
|
||||||
<li>Stroke rate</li>
|
<li>Stroke rate</li>
|
||||||
<li>Stroke length</li>
|
<li>Stroke length</li>
|
||||||
<li>Rigging parameters</li>
|
<li>Rigging parameters</li>
|
||||||
<li>Rower and boat weight</li>
|
<li>Rower and boat weight</li>
|
||||||
</ul>
|
</ul>
|
||||||
For this site, we use "standard" rigging parameters, blade shapes, and FISA minimum boat weights. For the eight, I add the weight of a cox (at the FISA minimum weight). The stroke length is also set at a fixed value, but in the future I
|
For this site, we use "standard" rigging parameters, blade shapes, and FISA minimum boat weights. For the eight, I add the weight of a cox (at the FISA minimum weight). The stroke length is also set at a fixed value, but in the future I
|
||||||
will allow you to adjust to your own stroke length.
|
will allow you to adjust to your own stroke length.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Knowing boat type (rigging), pace and stroke rate, and taking into account
|
Knowing boat type (rigging), pace and stroke rate, and taking into account
|
||||||
the influence of wind and stream (if provided), I am able to find the
|
the influence of wind and stream (if provided), I am able to find the
|
||||||
mechanical power that you provide to the rowing system by a reverse
|
mechanical power that you provide to the rowing system by a reverse
|
||||||
calculation. That is, I vary the input force until I find the one that
|
calculation. That is, I vary the input force until I find the one that
|
||||||
corresponds to your actual pace at that stroke rate.
|
corresponds to your actual pace at that stroke rate.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Knowing the power, I can calculate how fast you would have gone without
|
Knowing the power, I can calculate how fast you would have gone without
|
||||||
external wind and stream influences by running the calculation in a forward
|
external wind and stream influences by running the calculation in a forward
|
||||||
way, using the power and force profile found. This is the wind/stream
|
way, using the power and force profile found. This is the wind/stream
|
||||||
corrected pace, which I think is useful to know and be able to compare
|
corrected pace, which I think is useful to know and be able to compare
|
||||||
from training to training and between different rowing venues.
|
from training to training and between different rowing venues.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Using another algorithm to calculate total mechanical power on an erg, I can
|
||||||
|
calculate what the erg display would show you if you rowed on the erg with
|
||||||
|
the same average power, at the same stroke rate. The calculations are done
|
||||||
|
for a statical Concept2 erg with a fairly standard drag factor. I cannot
|
||||||
|
take into account the fact that you may use different technique or would
|
||||||
|
row at a different stroke rate on the erg.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Using another algorithm to calculate total mechanical power on an erg, I can
|
It is important to understand that the Power display on the erg is not showing
|
||||||
calculate what the erg display would show you if you rowed on the erg with
|
you the complete picture. In my calculations, I use my proprietary algorithms
|
||||||
the same average power, at the same stroke rate. The calculations are done
|
to calculate the additional power that goes into moving your body weight up
|
||||||
for a statical Concept2 erg with a fairly standard drag factor. I cannot
|
and down the slide on a static erg. To get the most accurate results, it is
|
||||||
take into account the fact that you may use different technique or would
|
important to be honest about your weight and set it independently for each
|
||||||
row at a different stroke rate on the erg.
|
workout.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>Not taken into account are the following factors:
|
||||||
It is important to understand that the Power display on the erg is not showing
|
<ul>
|
||||||
you the complete picture. In my calculations, I use my proprietary algorithms
|
|
||||||
to calculate the additional power that goes into moving your body weight up
|
|
||||||
and down the slide on a static erg. To get the most accurate results, it is
|
|
||||||
important to be honest about your weight and set it independently for each
|
|
||||||
workout.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>Not taken into account are the following factors:
|
|
||||||
<ul>
|
|
||||||
<li>Water Temperature</li>
|
<li>Water Temperature</li>
|
||||||
<li>Heavier/shorter/wider boats than the ones used by the elite</li>
|
<li>Heavier/shorter/wider boats than the ones used by the elite</li>
|
||||||
<li>Bungees, weed, or other artefacts slowing down the boat</li>
|
<li>Bungees, weed, or other artefacts slowing down the boat</li>
|
||||||
<li>Boat stopping technique flaws</li>
|
<li>Boat stopping technique flaws</li>
|
||||||
<li>Effect of wave height or cross-wind</li>
|
<li>Effect of wave height or cross-wind</li>
|
||||||
</ul>
|
</ul>
|
||||||
The water temperature has a small but measurable effect on the water density
|
The water temperature has a small but measurable effect on the water density
|
||||||
(and thus on the drag). I am using the value at 20 degrees C, which is a
|
(and thus on the drag). I am using the value at 20 degrees C, which is a
|
||||||
good average over the OTW season for a lake in a temperate climate. All
|
good average over the OTW season for a lake in a temperate climate. All
|
||||||
the other elements result in an equivalent erg pace that is probably slower
|
the other elements result in an equivalent erg pace that is probably slower
|
||||||
than what you can achieve on the erg. So look at it as an incentive to
|
than what you can achieve on the erg. So look at it as an incentive to
|
||||||
improve your technique (big effect) and/or buy a faster boat (minor effect).
|
improve your technique (big effect) and/or buy a faster boat (minor effect).
|
||||||
If your OTW to OTE pace conversion results in numbers close to what you
|
If your OTW to OTE pace conversion results in numbers close to what you
|
||||||
normally achieve on the erg, you are rowing like an elite rower (but possibly
|
normally achieve on the erg, you are rowing like an elite rower (but possibly
|
||||||
at a lower power)! When I get around it, I will try to model the effect of cross-wind.
|
at a lower power)! When I get around it, I will try to model the effect of cross-wind.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I have checked the model both from a Physics perspective (I have a degree in
|
||||||
|
Physics, if you are interested) and compared with the data available.
|
||||||
|
An important data set has been published <a href="http://www.biorow.com/RBN_en_2007_files/App2007RowBiomNews08.pdf">here</a> by Dr Kleshnev. For sculling,
|
||||||
|
my algorithms are extremely close in reproducing that data set. For sweep
|
||||||
|
rowing, I am still fine tuning some parameters, but I am close for a pair and
|
||||||
|
a four. I had to make assumptions about Kleshnev's data, especially about the
|
||||||
|
stroke rate, but as I got realistic stroke rates (35 and higher) for world
|
||||||
|
record performance, I am quite confident.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
On top of that I am constantly comparing the model's results to my own sculling
|
||||||
|
and rowing, and I will be the first to admit flaws and correct them. So please
|
||||||
|
contact me if there are any inconsistencies, suspicions, questions or simply
|
||||||
|
if you want to chat about Rowing Physics.
|
||||||
|
</p>
|
||||||
|
|
||||||
<p>
|
</li>
|
||||||
I have checked the model both from a Physics perspective (I have a degree in
|
<li class="grid_2">
|
||||||
Physics, if you are interested) and compared with the data available.
|
<h2>Manual</h2>
|
||||||
An important data set has been published <a href="http://www.biorow.com/RBN_en_2007_files/App2007RowBiomNews08.pdf">here</a> by Dr Kleshnev. For sculling,
|
|
||||||
my algorithms are extremely close in reproducing that data set. For sweep
|
|
||||||
rowing, I am still fine tuning some parameters, but I am close for a pair and
|
|
||||||
a four. I had to make assumptions about Kleshnev's data, especially about the
|
|
||||||
stroke rate, but as I got realistic stroke rates (35 and higher) for world
|
|
||||||
record performance, I am quite confident.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
<p>Here's the best way - in my mind - to use the Rowing Physics
|
||||||
On top of that I am constantly comparing the model's results to my own sculling
|
functionality. I am assuming you have successfully uploaded or imported
|
||||||
and rowing, and I will be the first to admit flaws and correct them. So please
|
a rowing workout. You must have position data (lat/long) with your row. A
|
||||||
contact me if there are any inconsistencies, suspicions, questions or simply
|
TCX from CrewNerd or RiM or a workout imported from SportTracks or Strava
|
||||||
if you want to chat about Rowing Physics.
|
(where you see a map of your workout on those sites) should have those
|
||||||
</p>
|
data. I am working on adding the FIT file format that is used by SpeedCoach
|
||||||
|
GPS. For now, export the data to Strava and then import them here.
|
||||||
|
</p>
|
||||||
</div>
|
|
||||||
<div class="grid_6 omega">
|
<p>Recipe for success:
|
||||||
<h3>Manual</h3>
|
<ol>
|
||||||
|
|
||||||
<p>Here's the best way - in my mind - to use the Rowing Physics
|
|
||||||
functionality. I am assuming you have successfully uploaded or imported
|
|
||||||
a rowing workout. You must have position data (lat/long) with your row. A
|
|
||||||
TCX from CrewNerd or RiM or a workout imported from SportTracks or Strava
|
|
||||||
(where you see a map of your workout on those sites) should have those
|
|
||||||
data. I am working on adding the FIT file format that is used by SpeedCoach
|
|
||||||
GPS. For now, export the data to Strava and then import them here.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>Recipe for success:
|
|
||||||
<ol>
|
|
||||||
<li>Click on the workout. This will bring you to the workout Edit view</li>
|
<li>Click on the workout. This will bring you to the workout Edit view</li>
|
||||||
<li>Click on the "Advanced" button</li>
|
<li>Look for three menu items labelled "Edit Wind Data", "Edit Stream
|
||||||
<li>Click on "Geeky Stuff"</li>
|
|
||||||
<li>Look for three buttons labelled "Edit Wind Data", "Edit Stream
|
|
||||||
Data" and "OTW Power"</li>
|
Data" and "OTW Power"</li>
|
||||||
<li>If you have wind or stream data, click on the appropriate
|
<li>If you have wind or stream data, click on the appropriate
|
||||||
button and enter your data.</li>
|
menu item and enter your data.</li>
|
||||||
<li>If you have both wind and stream, click the shortcut button
|
|
||||||
on the respective page to take you to the other parameter</li>
|
|
||||||
<li>Click on OTW Power</li>
|
<li>Click on OTW Power</li>
|
||||||
<li>Select the boat type and enter the average weight
|
<li>Select the boat type and enter the average weight
|
||||||
per crew member.
|
per crew member.
|
||||||
Do not use the crew total weight.</li>
|
Do not use the crew total weight.</li>
|
||||||
<li>Click "Update & Run"</li>
|
<li>Click "Update & Run"</li>
|
||||||
<li>Go do something else. You will receive an email when the calculations are finished. The calculation itself will take about 10 minutes for an
|
<li>Go do something else. You will receive an email when the calculations are finished. The calculation itself will take about 10 minutes for an
|
||||||
hour long row, but there may be other people's calculations in the queue, so
|
hour long row, but there may be other people's calculations in the queue, so
|
||||||
it may take longer.</li>
|
it may take longer.</li>
|
||||||
<li>Progress can be monitored by clicking on "here" in the message
|
<li>Progress can be monitored by clicking on "here" in the message
|
||||||
at the top of the page advising that the calculation has
|
at the top of the page advising that the calculation has
|
||||||
begun.</li>
|
begun.</li>
|
||||||
<li>
|
</ol>
|
||||||
When the calculation is complete, go back to the "Geeky Stuff" page
|
</p>
|
||||||
and click on "Corrected Pace Plot" to see the result. From here, you can re-run the calculation with different parameters.</li>
|
|
||||||
</ol>
|
<p>
|
||||||
</p>
|
Once you have run the calculation, the boat type, average crew weight,
|
||||||
|
Power and corrected pace data are stored permanently on the site. If you would
|
||||||
|
export the data to Strava or SportTracks now, those sites will have the
|
||||||
|
Power data.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Why does the calculation take so much time?</h2>
|
||||||
|
|
||||||
<p>
|
<p>I am running the calculations from a first principles base, so for
|
||||||
Once you have run the calculation, the boat type, average crew weight,
|
each data point that I am calculating, I am finding the stroke average
|
||||||
Power and corrected pace data are stored permanently on the site. If you would
|
force, then calculating corrected pace (wind/stream) and finding the
|
||||||
export the data to Strava or SportTracks now, those sites will have the
|
corresponding erg power. I am not taking any shortcuts. The advantage
|
||||||
Power data.
|
of this approach is that I can give you numbers irrespective of your
|
||||||
</p>
|
weight, speed, stroke rate, sex, etc. The model can deal with circumstances
|
||||||
|
it has not encountered before. The downside is that it takes time.</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
A much faster approach would be to simply take pre-calculated data from
|
||||||
|
a table and interpolate. The advantage of this approach is is speed. The
|
||||||
|
disadvantage is that extrapolation outside the limits of the available
|
||||||
|
data is dangerous and will lead to erroneous results.</p>
|
||||||
|
|
||||||
|
<p>Future versions of this site will use a hybrid approach
|
||||||
|
but only for pace/wind/stream/stroke rate/weight combinations that I consider
|
||||||
|
well validated. For that, I need to collect data, so keep the workouts coming!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<img src="/static/img/validation.png" width="450">
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
<h3>Why does the calculation take so much time?</h3>
|
{% endblock %}
|
||||||
|
|
||||||
<p>I am running the calculations from a first principles base, so for
|
{% block sidebar %}
|
||||||
each data point that I am calculating, I am finding the stroke average
|
{% include 'menu_help.html' %}
|
||||||
force, then calculating corrected pace (wind/stream) and finding the
|
{% endblock %}
|
||||||
corresponding erg power. I am not taking any shortcuts. The advantage
|
|
||||||
of this approach is that I can give you numbers irrespective of your
|
|
||||||
weight, speed, stroke rate, sex, etc. The model can deal with circumstances
|
|
||||||
it has not encountered before. The downside is that it takes time.</p>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
A much faster approach would be to simply take pre-calculated data from
|
|
||||||
a table and interpolate. The advantage of this approach is is speed. The
|
|
||||||
disadvantage is that extrapolation outside the limits of the available
|
|
||||||
data is dangerous and will lead to erroneous results.</p>
|
|
||||||
|
|
||||||
<p>Future versions of this site will use a hybrid approach
|
|
||||||
but only for pace/wind/stream/stroke rate/weight combinations that I consider
|
|
||||||
well validated. For that, I need to collect data, so keep the workouts coming!
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<img src="/static/img/validation.png" width="450">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock content %}
|
|
||||||
|
|||||||
@@ -270,7 +270,6 @@ urlpatterns = [
|
|||||||
),
|
),
|
||||||
url(r'^physics$',TemplateView.as_view(template_name='physics.html'),name='physics'),
|
url(r'^physics$',TemplateView.as_view(template_name='physics.html'),name='physics'),
|
||||||
url(r'^partners$',TemplateView.as_view(template_name='partners.html'),name='partners'),
|
url(r'^partners$',TemplateView.as_view(template_name='partners.html'),name='partners'),
|
||||||
url(r'^workout/(?P<id>\d+)/$',views.workout_view),
|
|
||||||
# keeping the old URLs for retrofit
|
# keeping the old URLs for retrofit
|
||||||
url(r'^workout/(?P<id>\d+)/addtimeplot$',
|
url(r'^workout/(?P<id>\d+)/addtimeplot$',
|
||||||
views.workout_add_chart_view,
|
views.workout_add_chart_view,
|
||||||
|
|||||||
+14
-2
@@ -6717,6 +6717,7 @@ def workout_undo_smoothenpace_view(
|
|||||||
request,id=0,message="",successmessage=""
|
request,id=0,message="",successmessage=""
|
||||||
):
|
):
|
||||||
row = get_workout(id)
|
row = get_workout(id)
|
||||||
|
r = getrower(request.user)
|
||||||
|
|
||||||
if (checkworkoutuser(request.user,row)==False):
|
if (checkworkoutuser(request.user,row)==False):
|
||||||
message = "You are not allowed to edit this workout"
|
message = "You are not allowed to edit this workout"
|
||||||
@@ -6737,7 +6738,12 @@ def workout_undo_smoothenpace_view(
|
|||||||
row.write_csv(filename,gzip=True)
|
row.write_csv(filename,gzip=True)
|
||||||
dataprep.update_strokedata(id,row.df)
|
dataprep.update_strokedata(id,row.df)
|
||||||
|
|
||||||
url = "/rowers/workout/"+str(id)+"/advanced"
|
url = reverse(r.defaultlandingpage,
|
||||||
|
kwargs = {
|
||||||
|
'id':id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
@@ -6747,6 +6753,8 @@ def workout_undo_smoothenpace_view(
|
|||||||
def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
|
def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
|
||||||
row = get_workout(id)
|
row = get_workout(id)
|
||||||
|
|
||||||
|
r = getrower(request.user)
|
||||||
|
|
||||||
if (checkworkoutuser(request.user,row)==False):
|
if (checkworkoutuser(request.user,row)==False):
|
||||||
message = "You are not allowed to edit this workout"
|
message = "You are not allowed to edit this workout"
|
||||||
messages.error(request,message)
|
messages.error(request,message)
|
||||||
@@ -6776,7 +6784,11 @@ def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
|
|||||||
row.write_csv(filename,gzip=True)
|
row.write_csv(filename,gzip=True)
|
||||||
dataprep.update_strokedata(id,row.df)
|
dataprep.update_strokedata(id,row.df)
|
||||||
|
|
||||||
url = "/rowers/workout/"+str(id)+"/advanced"
|
url = reverse(r.defaultlandingpage,
|
||||||
|
kwargs = {
|
||||||
|
'id':id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
return HttpResponseRedirect(url)
|
return HttpResponseRedirect(url)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user