needed interface changes [new options] logger for android wifi-ap-optimization new test-cases
87 lines
2.3 KiB
C++
87 lines
2.3 KiB
C++
#ifndef WIFIPROBABILITYFREE_H
|
|
#define WIFIPROBABILITYFREE_H
|
|
|
|
#include "WiFiProbability.h"
|
|
#include "model/WiFiModel.h"
|
|
#include "../../math/Distributions.h"
|
|
#include "VAPGrouper.h"
|
|
|
|
#include <unordered_map>
|
|
|
|
/**
|
|
* compare WiFi-Measurements within predictions of a given model.
|
|
* predictions are just based on the distance to the access-point.
|
|
*/
|
|
class WiFiObserverFree : public WiFiProbability {
|
|
|
|
private:
|
|
|
|
const float sigma = 8.0f;
|
|
|
|
const float sigmaPerSecond = 3.0f;
|
|
|
|
/** the RSSI prediction model */
|
|
WiFiModel& model;
|
|
|
|
/** the map's floorplan */
|
|
Floorplan::IndoorMap* map;
|
|
|
|
public:
|
|
|
|
WiFiObserverFree(const float sigma, WiFiModel& model) : sigma(sigma), model(model) {
|
|
|
|
}
|
|
|
|
double getProbability(const Point3& pos_m, const Timestamp curTime, const WiFiMeasurements& obs) const {
|
|
|
|
double prob = 1.0;
|
|
int numMatchingAPs = 0;
|
|
|
|
// process each measured AP
|
|
for (const WiFiMeasurement& entry : obs.entries) {
|
|
|
|
// sanity check
|
|
Assert::isFalse(entry.getTimestamp().isZero(), "wifi measurement without timestamp. coding error?");
|
|
|
|
// get the model's RSSI (if possible!)
|
|
const float modelRSSI = model.getRSSI(entry.getAP().getMAC(), pos_m);
|
|
|
|
// NaN? -> AP not known to the model -> skip
|
|
if (modelRSSI != modelRSSI) {continue;}
|
|
|
|
|
|
// the scan's RSSI
|
|
const float scanRSSI = entry.getRSSI();
|
|
|
|
// the measurement's age
|
|
const Timestamp age = curTime - entry.getTimestamp();
|
|
|
|
Assert::isTrue(age.ms() >= 0, "found a negative wifi measurement age. this does not make sense");
|
|
Assert::isTrue(age.ms() <= 40000, "found a 40 second old wifi measurement. maybe there is a coding error?");
|
|
|
|
// sigma grows with measurement age
|
|
const float sigma = this->sigma + this->sigmaPerSecond * age.sec();
|
|
|
|
// update probability
|
|
prob *= Distribution::Normal<double>::getProbability(modelRSSI, sigma, scanRSSI);
|
|
//prob *= Distribution::Region<double>::getProbability(modelRSSI, sigma, scanRSSI);
|
|
|
|
++numMatchingAPs;
|
|
|
|
}
|
|
|
|
// sanity check
|
|
Assert::isTrue(numMatchingAPs > 0, "not a single measured AP was matched against known ones. coding error? model error?");
|
|
|
|
return prob;
|
|
|
|
}
|
|
|
|
template <typename Node> double getProbability(const Node& n, const Timestamp curTime, const WiFiMeasurements& obs, const int age_ms = 0) const {
|
|
throw Exception("todo??");
|
|
}
|
|
|
|
};
|
|
|
|
#endif // WIFIPROBABILITYFREE_H
|