From 0e6de1636b7abf83ca11d96f2b262e29d7ea2a94 Mon Sep 17 00:00:00 2001 From: Jaap van Ekris <82339657+JaapvanEkris@users.noreply.github.com> Date: Tue, 9 Jan 2024 21:11:13 +0100 Subject: [PATCH] Improvement of flywheel velocity and acceleration algorithm Improvement of the algorithm used for the flywheel speed and acceleration, which makes it less errorprone and more smooth. --- app/engine/Flywheel.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/app/engine/Flywheel.js b/app/engine/Flywheel.js index a6ea8dba07..5eaab18d20 100644 --- a/app/engine/Flywheel.js +++ b/app/engine/Flywheel.js @@ -22,9 +22,10 @@ import loglevel from 'loglevel' import { createStreamFilter } from './utils/StreamFilter.js' -import { createLabelledBinarySearchTree } from './utils/BinarySearchTree.js' import { createOLSLinearSeries } from './utils/OLSLinearSeries.js' import { createTSQuadraticSeries } from './utils/FullTSQuadraticSeries.js' +import { createWeighedSeries } from './utils/WeighedSeries.js' + const log = loglevel.getLogger('RowingEngine') function createFlywheel (rowerSettings) { @@ -116,19 +117,20 @@ function createFlywheel (rowerSettings) { } // Let's make room for a new set of values for angular velocity and acceleration - _angularVelocityMatrix[_angularVelocityMatrix.length] = createLabelledBinarySearchTree() - _angularAccelerationMatrix[_angularAccelerationMatrix.length] = createLabelledBinarySearchTree() + _angularVelocityMatrix[_angularVelocityMatrix.length] = createWeighedSeries() + _angularAccelerationMatrix[_angularAccelerationMatrix.length] = createWeighedSeries() let i = 0 + const goodnessOfFit = _angularDistance.goodnessOfFit() + while (i < _angularVelocityMatrix.length) { - // Please note, the label used in the Binary Search Tree has no meaning, as we will not do any targetted remove actions - _angularVelocityMatrix[i].push(i, _angularDistance.firstDerivativeAtPosition(i)) - _angularAccelerationMatrix[i].push(i, _angularDistance.secondDerivativeAtPosition(i)) + _angularVelocityMatrix[i].push(_angularDistance.firstDerivativeAtPosition(i), goodnessOfFit) + _angularAccelerationMatrix[i].push(_angularDistance.secondDerivativeAtPosition(i), goodnessOfFit) i++ } - _angularVelocityAtBeginFlank = _angularVelocityMatrix[0].median() - _angularAccelerationAtBeginFlank = _angularAccelerationMatrix[0].median() + _angularVelocityAtBeginFlank = _angularVelocityMatrix[0].weighedAverage() + _angularAccelerationAtBeginFlank = _angularAccelerationMatrix[0].weighedAverage() // And finally calculate the torque _torqueAtBeginFlank = (rowerSettings.flywheelInertia * _angularAccelerationAtBeginFlank + drag.clean() * Math.pow(_angularVelocityAtBeginFlank, 2))