Fix swapped params

This commit is contained in:
DTTerastar 2023-11-17 08:55:34 -05:00
parent e1b1d5f908
commit 420e5cee5a
2 changed files with 26 additions and 26 deletions

View File

@ -16,7 +16,7 @@ class ClientCallbacks : public BLEClientCallbacks {
static ClientCallbacks clientCB; static ClientCallbacks clientCB;
BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float fcmin, float beta, float dcutoff) : filteredDistance{FilteredDistance(25, 0.1)} { BleFingerprint::BleFingerprint(BLEAdvertisedDevice *advertisedDevice, float fcmin, float beta, float dcutoff) : filteredDistance{FilteredDistance(0.1, 25)} {
firstSeenMillis = millis(); firstSeenMillis = millis();
address = NimBLEAddress(advertisedDevice->getAddress()); address = NimBLEAddress(advertisedDevice->getAddress());
addressType = advertisedDevice->getAddressType(); addressType = advertisedDevice->getAddressType();

View File

@ -1,64 +1,64 @@
#include "FilteredDistance.h" #include "FilteredDistance.h"
#include <Arduino.h> #include <Arduino.h>
FilteredDistance::FilteredDistance(float processNoise, float measurementNoise): processNoise(processNoise), measurementNoise(measurementNoise), isFirstMeasurement(true) {} FilteredDistance::FilteredDistance(float processNoise, float measurementNoise) : processNoise(processNoise), measurementNoise(measurementNoise), isFirstMeasurement(true) {}
void FilteredDistance::addMeasurement(float dist) { void FilteredDistance::addMeasurement(float dist) {
if (isFirstMeasurement) { if (isFirstMeasurement) {
// Initialize state // Initialize state
state[0] = dist; // Distance state[0] = dist; // Distance
state[1] = 0; // Rate of change in distance state[1] = 0; // Rate of change in distance
// Initialize covariance matrix // Initialize covariance matrix
covariance[0][0] = 1; // Initial guess covariance[0][0] = 1; // Initial guess
covariance[0][1] = 0; covariance[0][1] = 0;
covariance[1][0] = 0; covariance[1][0] = 0;
covariance[1][1] = 1; // Initial guess covariance[1][1] = 1; // Initial guess
lastUpdateTime = micros(); // Set the update time lastUpdateTime = micros(); // Set the update time
isFirstMeasurement = false; isFirstMeasurement = false;
return; return;
} }
// Calculate time delta for subsequent measurements const unsigned long now = micros();
unsigned long currentTime = micros(); const unsigned long elapsed = now - now;
float deltaTime = (currentTime - lastUpdateTime) / 1.0e6; // Convert micros to seconds float dT = std::max(elapsed * 0.000001f, 0.05f); // Convert microseconds to seconds, enforce a minimum dT
lastUpdateTime = currentTime; lastUpdateTime = now;
// Perform prediction and update // Perform prediction and update
prediction(deltaTime); prediction(dT);
update(dist); update(dist);
} }
const float FilteredDistance::getDistance() const { const float FilteredDistance::getDistance() const {
unsigned long currentTime = micros(); const unsigned long now = micros();
float deltaTime = (currentTime - lastUpdateTime) / 1.0e6; // Convert micros to seconds const unsigned long elapsed = now - now;
if (elapsed < 5000) return state[0]; // If the last update was less than 5ms ago, return the current state
// Calculate predicted distance float dT = elapsed * 0.000001f;
float predictedDistance = state[0] + state[1] * deltaTime; return state[0] + state[1] * dT;
return predictedDistance;
} }
void FilteredDistance::prediction(float deltaTime) { void FilteredDistance::prediction(float dT) {
// Update state estimate // Update state estimate
state[0] += state[1] * deltaTime; state[0] += state[1] * dT;
// Update covariance // Update covariance
covariance[0][0] += deltaTime * (covariance[1][0] + covariance[0][1]) + processNoise; covariance[0][0] += dT * (dT * covariance[1][1] + covariance[1][0]) + processNoise;
covariance[0][1] += deltaTime * covariance[1][1]; covariance[0][1] += dT * covariance[1][1] + processNoise;
covariance[1][0] += deltaTime * covariance[1][1]; covariance[1][0] += dT * covariance[1][1] + processNoise;
covariance[1][1] += processNoise;
} }
void FilteredDistance::update(float distanceMeasurement) { void FilteredDistance::update(float distanceMeasurement) {
// Kalman gain calculation // Kalman gain calculation
float S = covariance[0][0] + measurementNoise; float S = covariance[0][0] + measurementNoise;
float K[2]; // Kalman gain float K[2]; // Kalman gain
K[0] = covariance[0][0] / S; K[0] = covariance[0][0] / S;
K[1] = covariance[1][0] / S; K[1] = covariance[1][0] / S;
// Update state // Update state
float y = distanceMeasurement - state[0]; // measurement residual float y = distanceMeasurement - state[0]; // measurement residual
state[0] += K[0] * y; state[0] += K[0] * y;
state[1] += K[1] * y; state[1] += K[1] * y;