#ifdef WITH_TESTS #include "../../Tests.h" #include "../../../sensors/radio/setup/WiFiOptimizer.h" #include "../../../sensors/radio/setup/WiFiFingerprint.h" #include "../../../misc/Debug.h" #include /** * 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 fingerprints; for (int i = 0; i < 50; ++i) { std::uniform_real_distribution distX(-30, +30); std::uniform_real_distribution distY(-30, +30); std::uniform_real_distribution 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