some fixes [multithreading,..]
needed interface changes [new options] logger for android wifi-ap-optimization new test-cases
This commit is contained in:
83
tests/sensors/radio/TestWiFiOptimizer.cpp
Normal file
83
tests/sensors/radio/TestWiFiOptimizer.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
#ifdef WITH_TESTS
|
||||
|
||||
#include "../../Tests.h"
|
||||
#include "../../../sensors/radio/setup/WiFiOptimizer.h"
|
||||
#include "../../../sensors/radio/setup/WiFiFingerprint.h"
|
||||
#include "../../../misc/Debug.h"
|
||||
|
||||
#include <random>
|
||||
|
||||
/**
|
||||
* test the wifi-optimizer by generating synthetic fingerprints and optimizing parameters from them
|
||||
*/
|
||||
TEST(WiFiOptimizer, optimize) {
|
||||
|
||||
|
||||
const VAPGrouper vg(VAPGrouper::Mode::DISABLED, VAPGrouper::Aggregation::AVERAGE);
|
||||
|
||||
const MACAddress mac1("00:00:00:00:00:01");
|
||||
const MACAddress mac2("00:00:00:00:00:02");
|
||||
|
||||
const Point3 pos1(10, 12, 5);
|
||||
const Point3 pos2(20, -10, 2);
|
||||
|
||||
// building with one floor at 3.0 meters
|
||||
Floorplan::IndoorMap map;
|
||||
Floorplan::Floor floor1; floor1.atHeight = 3.0f;
|
||||
Floorplan::FloorOutlinePolygon poly1; poly1.poly.points.push_back(Point2(-30, -30)); poly1.poly.points.push_back(Point2(+30, +30));
|
||||
floor1.outline.push_back(&poly1);
|
||||
map.floors.push_back(&floor1);
|
||||
|
||||
// add the two APs to the model
|
||||
WiFiModelLogDistCeiling mdl(&map);
|
||||
mdl.addAP(mac1, WiFiModelLogDistCeiling::APEntry(pos1, -40, 2, -4));
|
||||
mdl.addAP(mac2, WiFiModelLogDistCeiling::APEntry(pos2, -40, 2, -4));
|
||||
|
||||
// generate some (synthetic) fingerprints
|
||||
std::minstd_rand gen;
|
||||
std::vector<WiFiFingerprint> fingerprints;
|
||||
for (int i = 0; i < 50; ++i) {
|
||||
|
||||
std::uniform_real_distribution<float> distX(-30, +30);
|
||||
std::uniform_real_distribution<float> distY(-30, +30);
|
||||
std::uniform_real_distribution<float> distZ( -9, +9);
|
||||
|
||||
// get a random position and calculate the model RSSIs
|
||||
const Point3 randomPt(distX(gen), distY(gen), distZ(gen));
|
||||
const float rssi1 = mdl.getRSSI(mac1, randomPt);
|
||||
const float rssi2 = mdl.getRSSI(mac2, randomPt);
|
||||
|
||||
// construct a corresponding synthetic fingerprint
|
||||
WiFiFingerprint fp(randomPt);
|
||||
fp.measurements.entries.push_back(WiFiMeasurement(AccessPoint(mac1), rssi1));
|
||||
fp.measurements.entries.push_back(WiFiMeasurement(AccessPoint(mac2), rssi2));
|
||||
fingerprints.push_back(fp);
|
||||
|
||||
}
|
||||
|
||||
WiFiOptimizer opt(&map, vg);
|
||||
for (const WiFiFingerprint& fp : fingerprints) {
|
||||
opt.addFingerprint(fp);
|
||||
}
|
||||
|
||||
ASSERT_EQ(2, opt.getAllMACs().size());
|
||||
float errRes;
|
||||
|
||||
const WiFiOptimizer::APParams params1 = opt.optimize(mac1, errRes);
|
||||
ASSERT_TRUE(errRes < 0.1);
|
||||
ASSERT_NEAR(0, pos1.getDistance(params1.getPos()), 0.4); // apx position estimation
|
||||
ASSERT_NEAR(-40, params1.txp, 1.0);
|
||||
ASSERT_NEAR(2, params1.exp, 0.1);
|
||||
ASSERT_NEAR(-4, params1.waf, 0.5);
|
||||
|
||||
const WiFiOptimizer::APParams params2 = opt.optimize(mac2, errRes);
|
||||
ASSERT_TRUE(errRes < 0.1);
|
||||
ASSERT_NEAR(0, pos2.getDistance(params2.getPos()), 0.4); // apx position estimation
|
||||
ASSERT_NEAR(-40, params1.txp, 1.0);
|
||||
ASSERT_NEAR(2, params2.exp, 0.1);
|
||||
ASSERT_NEAR(-4, params2.waf, 0.5);
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user