Skip to content

Commit

Permalink
Improvement of flywheel velocity and acceleration algorithm
Browse files Browse the repository at this point in the history
Improvement of the algorithm used for the flywheel speed and acceleration, which makes it less errorprone  and more smooth.
  • Loading branch information
JaapvanEkris authored Jan 9, 2024
1 parent e0aabf4 commit 0e6de16
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions app/engine/Flywheel.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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))
Expand Down

0 comments on commit 0e6de16

Please sign in to comment.