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.
This commit is contained in:
Jaap van Ekris 2024-01-09 21:11:13 +01:00 committed by GitHub
parent e0aabf4431
commit 0e6de1636b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 10 additions and 8 deletions

View File

@ -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))