Fix swapped params
This commit is contained in:
parent
e1b1d5f908
commit
420e5cee5a
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue