From 8dc8146abf222f7007952ccef3fc70f59f570ac9 Mon Sep 17 00:00:00 2001 From: Lars Berning <151194+laberning@users.noreply.github.com> Date: Tue, 8 Mar 2022 20:09:42 +0100 Subject: [PATCH] fixes #69 error in angularDisplacement calculation --- app/engine/RowingEngine.js | 16 ++++++++-------- config/rowerProfiles.js | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/app/engine/RowingEngine.js b/app/engine/RowingEngine.js index ef8ea5a..d471abd 100644 --- a/app/engine/RowingEngine.js +++ b/app/engine/RowingEngine.js @@ -80,7 +80,7 @@ function createRowingEngine (rowerSettings) { cyclePhase = 'Recovery' } else { // We seem to have lost power to the flywheel, but it is too early according to the settings. We stay in the Drive Phase - log.debug(`Time: ${totalTime.toFixed(4)} sec, impuls ${totalNumberOfImpulses}: flank suggests no power (${flankDetector.accelerationAtBeginOfFlank().toFixed(1)} rad/s2), but waiting for for recoveryPhaseLength (${recoveryPhaseLength.toFixed(4)} sec) to exceed minimumRecoveryTime (${rowerSettings.minimumRecoveryTime} sec)`) + log.debug(`Time: ${totalTime.toFixed(4)} sec, impulse ${totalNumberOfImpulses}: flank suggests no power (${flankDetector.accelerationAtBeginOfFlank().toFixed(1)} rad/s2), but waiting for for recoveryPhaseLength (${recoveryPhaseLength.toFixed(4)} sec) to exceed minimumRecoveryTime (${rowerSettings.minimumRecoveryTime} sec)`) updateDrivePhase(currentDt) } } else { @@ -99,7 +99,7 @@ function createRowingEngine (rowerSettings) { cyclePhase = 'Drive' } else { // We see a force, but the "Recovery" phase has been too short, we stay in the "Recovery" phase - log.debug(`Time: ${totalTime.toFixed(4)} sec, impuls ${totalNumberOfImpulses}: flank suggests power (${flankDetector.accelerationAtBeginOfFlank().toFixed(1)} rad/s2), but waiting for recoveryPhaseLength (${recoveryPhaseLength.toFixed(4)} sec) to exceed minimumRecoveryTime (${rowerSettings.minimumRecoveryTime} sec)`) + log.debug(`Time: ${totalTime.toFixed(4)} sec, impulse ${totalNumberOfImpulses}: flank suggests power (${flankDetector.accelerationAtBeginOfFlank().toFixed(1)} rad/s2), but waiting for recoveryPhaseLength (${recoveryPhaseLength.toFixed(4)} sec) to exceed minimumRecoveryTime (${rowerSettings.minimumRecoveryTime} sec)`) updateRecoveryPhase(currentDt) } } else { @@ -118,7 +118,7 @@ function createRowingEngine (rowerSettings) { } else { log.debug(`CycleLength isn't plausible: recoveryPhaseLength ${recoveryPhaseLength.toFixed(4)} sec, drivePhaseLength = ${drivePhaseLength.toFixed(4)} s, maximumImpulseTimeBeforePause ${rowerSettings.maximumImpulseTimeBeforePause} s`) } - recoveryPhaseAngularDisplacement = (totalNumberOfImpulses - recoveryPhaseStartAngularDisplacement) * angularDisplacementPerImpulse + recoveryPhaseAngularDisplacement = ((totalNumberOfImpulses - flankDetector.noImpulsesToBeginFlank()) - recoveryPhaseStartAngularDisplacement) * angularDisplacementPerImpulse // Calculation of the drag-factor if (flankDetector.impulseLengthAtBeginFlank() > 0) { @@ -135,7 +135,7 @@ function createRowingEngine (rowerSettings) { } else { // The calculated drag factor is outside the plausible range log.info(`Calculated drag factor: ${(currentDragFactor * 1000000).toFixed(2)}, which is too far off the currently used dragfactor of ${movingDragAverage.getAverage() * 1000000}`) - log.debug(`Time: ${totalTime.toFixed(4)} sec, impuls ${totalNumberOfImpulses}: recoveryStartAngularVelocity = ${recoveryStartAngularVelocity.toFixed(2)} rad/sec, recoveryEndAngularVelocity = ${recoveryEndAngularVelocity.toFixed(2)} rad/sec, recoveryPhaseLength = ${recoveryPhaseLength.toFixed(4)} sec`) + log.debug(`Time: ${totalTime.toFixed(4)} sec, impulse ${totalNumberOfImpulses}: recoveryStartAngularVelocity = ${recoveryStartAngularVelocity.toFixed(2)} rad/sec, recoveryEndAngularVelocity = ${recoveryEndAngularVelocity.toFixed(2)} rad/sec, recoveryPhaseLength = ${recoveryPhaseLength.toFixed(4)} sec`) if (currentDragFactor < (movingDragAverage.getAverage() * dragFactorMaxDownwardChange)) { // The current calculated dragfactor makes an abrupt downward change, let's follow the direction, but limit it to the maximum allowed change movingDragAverage.pushValue(movingDragAverage.getAverage() * dragFactorMaxDownwardChange) @@ -150,10 +150,10 @@ function createRowingEngine (rowerSettings) { log.info(`*** Calculated drag factor: ${(currentDragFactor * 1000000).toFixed(2)}`) } } else { - log.error(`Time: ${totalTime.toFixed(4)} sec, impuls ${totalNumberOfImpulses}: division by 0 prevented, recoveryPhaseLength = ${recoveryPhaseLength} sec, recoveryStartAngularVelocity = ${recoveryStartAngularVelocity} rad/sec, recoveryEndAngularVelocity = ${recoveryEndAngularVelocity} rad/sec`) + log.error(`Time: ${totalTime.toFixed(4)} sec, impulse ${totalNumberOfImpulses}: division by 0 prevented, recoveryPhaseLength = ${recoveryPhaseLength} sec, recoveryStartAngularVelocity = ${recoveryStartAngularVelocity} rad/sec, recoveryEndAngularVelocity = ${recoveryEndAngularVelocity} rad/sec`) } } else { - log.error(`Time: ${totalTime.toFixed(4)} sec, impuls ${totalNumberOfImpulses}: division by 0 prevented, impulseLengthAtBeginFlank = ${flankDetector.impulseLengthAtBeginFlank()} sec`) + log.error(`Time: ${totalTime.toFixed(4)} sec, impulse ${totalNumberOfImpulses}: division by 0 prevented, impulseLengthAtBeginFlank = ${flankDetector.impulseLengthAtBeginFlank()} sec`) } // Calculate the key metrics @@ -164,7 +164,7 @@ function createRowingEngine (rowerSettings) { averagedCyclePower = calculateCyclePower() // Next, we start the "Drive" Phase - log.debug(`*** DRIVE phase started at time: ${totalTime.toFixed(4)} sec, impuls number ${totalNumberOfImpulses}`) + log.debug(`*** DRIVE phase started at time: ${totalTime.toFixed(4)} sec, impulse number ${totalNumberOfImpulses}`) strokeNumber++ drivePhaseStartTime = totalTime - flankDetector.timeToBeginOfFlank() drivePhaseStartAngularDisplacement = totalNumberOfImpulses - flankDetector.noImpulsesToBeginFlank() @@ -277,7 +277,7 @@ function createRowingEngine (rowerSettings) { // There is no division by zero and the data data is plausible cyclePower = dragFactor * Math.pow((recoveryPhaseAngularDisplacement + drivePhaseAngularDisplacement) / cycleLength, 3.0) } else { - log.error(`Time: ${totalTime.toFixed(4)} sec, impuls ${totalNumberOfImpulses}: cycle length was not plausible, CycleLength = ${cycleLength} sec`) + log.error(`Time: ${totalTime.toFixed(4)} sec, impulse ${totalNumberOfImpulses}: cycle length was not plausible, CycleLength = ${cycleLength} sec`) } return cyclePower } diff --git a/config/rowerProfiles.js b/config/rowerProfiles.js index 64ab5cf..6d37351 100644 --- a/config/rowerProfiles.js +++ b/config/rowerProfiles.js @@ -95,15 +95,15 @@ export default { WRX700: { numOfImpulsesPerRevolution: 2, naturalDeceleration: -5.0, - flywheelInertia: 0.45, - dragFactor: 22000 + flywheelInertia: 0.72, + dragFactor: 32000 }, // DKN R-320 Air Rower DKNR320: { numOfImpulsesPerRevolution: 1, - flywheelInertia: 0.41, - dragFactor: 4000 + flywheelInertia: 0.94, + dragFactor: 8522 }, // NordicTrack RX800 Air Rower @@ -151,8 +151,8 @@ export default { naturalDeceleration: -8.6, // perfect runs IIIXI minimumDriveTime: 0.28, minimumRecoveryTime: 0.90, - flywheelInertia: 0.131, - dragFactor: 310 + flywheelInertia: 0.189, + dragFactor: 460 // /* Damper setting 4