some fixes [multithreading,..]
needed interface changes [new options] logger for android wifi-ap-optimization new test-cases
This commit is contained in:
@@ -60,7 +60,7 @@ TEST(TestAll, Nav) {
|
||||
|
||||
// plot path
|
||||
K::GnuplotSplotElementLines path; path.setColorHex("#0000ff"); path.setLineWidth(2);
|
||||
DijkstraNode<GP>* dn = d.getNode(end);
|
||||
const DijkstraNode<GP>* dn = d.getNode(end);
|
||||
while (dn->previous != nullptr) {
|
||||
path.add(K::GnuplotPoint3(dn->element->x_cm, dn->element->y_cm, dn->element->z_cm+50));
|
||||
dn = dn->previous;
|
||||
|
||||
@@ -104,7 +104,7 @@ TEST(GridWalk2HeadingControl, LIVE_walkHeading) {
|
||||
|
||||
|
||||
struct MyControl {
|
||||
float turnAngle = 0;
|
||||
float turnSinceLastTransition_rad = 0;
|
||||
} ctrl;
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ TEST(GridWalk2HeadingControl, LIVE_walkHeading) {
|
||||
// run
|
||||
for (int i = 0; i < 30; ++i) {
|
||||
|
||||
ctrl.turnAngle = (i == 0) ? (rad) : (0);
|
||||
ctrl.turnSinceLastTransition_rad = (i == 0) ? (rad) : (0);
|
||||
|
||||
p.clearParticles();
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ TEST(GridWalk2, LIVE_error) {
|
||||
|
||||
|
||||
struct Control {
|
||||
float turnAngle = 0; // keep the angle as-is!
|
||||
float turnSinceLastTransition_rad = 0; // keep the angle as-is!
|
||||
} ctrl;
|
||||
|
||||
GridWalker<MyNode1239, MyState23452> walker;
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
// ENSURE UNIQUE CLASS NAME
|
||||
struct MyNode345092134 : public GridPoint, public GridNode {
|
||||
float walkImportance = 0;
|
||||
float getWalkImportance() const {return walkImportance;}
|
||||
float navImportance = 0;
|
||||
float getNavImportance() const {return navImportance;}
|
||||
MyNode345092134() {;}
|
||||
|
||||
@@ -138,6 +138,35 @@ TEST(Distribution, Region1) {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
TEST(Distribution, Triangle) {
|
||||
|
||||
std::ofstream out("/tmp/1.dat");
|
||||
for (float x = -9; x <= +9; x += 0.025) {
|
||||
//const float y = Distribution::Region<float>::getProbability(0, 3, 1.2, x);
|
||||
const float y = Distribution::Triangle<float>::getProbability(3, 6, x);
|
||||
out << x << " " << y << "\n";
|
||||
}
|
||||
out.close();
|
||||
|
||||
Distribution::Triangle<float> dist1(0, 3);
|
||||
ASSERT_NEAR(1.0, distCheckArea(dist1, -20, +20), 0.01);
|
||||
|
||||
Distribution::Triangle<float> dist2(0, 1);
|
||||
ASSERT_NEAR(1.0, distCheckArea(dist2, -20, +20), 0.01);
|
||||
|
||||
Distribution::Triangle<float> dist3(1, 3);
|
||||
ASSERT_NEAR(1.0, distCheckArea(dist3, -20, +20), 0.01);
|
||||
|
||||
Distribution::Triangle<float> dist4(1, 2);
|
||||
ASSERT_NEAR(1.0, distCheckArea(dist4, -20, +20), 0.01);
|
||||
|
||||
Distribution::Triangle<float> dist5(-1, 4);
|
||||
ASSERT_NEAR(1.0, distCheckArea(dist5, -20, +20), 0.01);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -34,15 +34,15 @@ TEST(Dijkstra, build) {
|
||||
d.build(&grid[idx5], &grid[idx3], tmp, 99999);
|
||||
|
||||
// start node must be "idx5"
|
||||
DijkstraNode<GP>* n = d.getNode(grid[idx5]);
|
||||
const DijkstraNode<GP>* n = d.getNode(grid[idx5]);
|
||||
ASSERT_EQ(&grid[idx5], n->element); ASSERT_EQ(nullptr, n->previous); ASSERT_EQ(0, n->cumWeight);
|
||||
|
||||
// "idx1" (the center) is reached via idx5
|
||||
DijkstraNode<GP>* n2 = d.getNode(grid[idx1]);
|
||||
const DijkstraNode<GP>* n2 = d.getNode(grid[idx1]);
|
||||
ASSERT_EQ(&grid[idx1], n2->element); ASSERT_EQ(&grid[idx5], n2->previous->element);
|
||||
|
||||
// "idx3" (the target) is reached via idx1 (the center)
|
||||
DijkstraNode<GP>* n3 = d.getNode(grid[idx3]);
|
||||
const DijkstraNode<GP>* n3 = d.getNode(grid[idx3]);
|
||||
ASSERT_EQ(&grid[idx3], n3->element); ASSERT_EQ(&grid[idx1], n3->previous->element);
|
||||
|
||||
|
||||
|
||||
@@ -77,5 +77,45 @@ TEST(LogDistanceCeilingModel, numCeilings) {
|
||||
|
||||
}
|
||||
|
||||
TEST(LogDistanceCeilingModel, numCeilingsFloat) {
|
||||
|
||||
// dummy floorplan
|
||||
Floorplan::Floor* f0 = new Floorplan::Floor(); f0->atHeight = 0;
|
||||
Floorplan::Floor* f1 = new Floorplan::Floor(); f1->atHeight = 3;
|
||||
Floorplan::Floor* f2 = new Floorplan::Floor(); f2->atHeight = 7;
|
||||
|
||||
Floorplan::IndoorMap map;
|
||||
map.floors.push_back(f0);
|
||||
map.floors.push_back(f1);
|
||||
map.floors.push_back(f2);
|
||||
|
||||
WiFiModelLogDistCeiling model(&map);
|
||||
|
||||
const float d = 0.01;
|
||||
|
||||
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,-1), Point3(0,0,0)), d );
|
||||
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,-1)), d );
|
||||
|
||||
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,1)), d );
|
||||
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,1), Point3(0,0,0)), d );
|
||||
|
||||
ASSERT_NEAR(0.5, model.numCeilingsBetweenFloat(Point3(0,0,-0.01), Point3(0,0,+0.50)), d );
|
||||
ASSERT_NEAR(0.5, model.numCeilingsBetweenFloat(Point3(0,0,+0.50), Point3(0,0,-0.01)), d );
|
||||
|
||||
ASSERT_NEAR(0.2, model.numCeilingsBetweenFloat(Point3(0,0,2.99), Point3(0,0,3.20)), d );
|
||||
ASSERT_NEAR(0.2, model.numCeilingsBetweenFloat(Point3(0,0,3.20), Point3(0,0,2.99)), d );
|
||||
|
||||
ASSERT_NEAR(1.0, model.numCeilingsBetweenFloat(Point3(0,0,6.99), Point3(0,0,8.33)), d );
|
||||
ASSERT_NEAR(1.0, model.numCeilingsBetweenFloat(Point3(0,0,8.33), Point3(0,0,6.99)), d );
|
||||
ASSERT_NEAR(2.0, model.numCeilingsBetweenFloat(Point3(0,0,0.00), Point3(0,0,8.33)), d );
|
||||
ASSERT_NEAR(2.0, model.numCeilingsBetweenFloat(Point3(0,0,8.33), Point3(0,0,0.00)), d );
|
||||
|
||||
ASSERT_NEAR(0, model.numCeilingsBetweenFloat(Point3(0,0,7.00), Point3(0,0,99)), d );
|
||||
|
||||
ASSERT_NEAR(1, model.numCeilingsBetweenFloat(Point3(0,0,0), Point3(0,0,7)), d );
|
||||
ASSERT_NEAR(3, model.numCeilingsBetweenFloat(Point3(0,0,-1), Point3(0,0,8)), d );
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -90,11 +90,11 @@ TEST(WiFiGridModelLogDist, create) {
|
||||
model.addAP(ap3, WiFiModelLogDist::APEntry( Point3(0,20,0), -40, 1.5));
|
||||
model.addAP(ap4, WiFiModelLogDist::APEntry( Point3(20,20,0), -40, 1.5));
|
||||
|
||||
std::vector<AccessPoint> aps = {
|
||||
AccessPoint(ap1), AccessPoint(ap2), AccessPoint(ap3), AccessPoint(ap4)
|
||||
};
|
||||
// std::vector<AccessPoint> aps = {
|
||||
// AccessPoint(ap1), AccessPoint(ap2), AccessPoint(ap3), AccessPoint(ap4)
|
||||
// };
|
||||
|
||||
WiFiGridEstimator::estimate(grid, model, aps);
|
||||
WiFiGridEstimator::estimate(grid, model, 0);
|
||||
|
||||
|
||||
ASSERT_EQ(4, grid[0].getNumVisibleAPs()); // 4 APs visible at this node
|
||||
@@ -117,7 +117,7 @@ TEST(WiFiGridModelLogDist, create) {
|
||||
obs.entries.push_back(WiFiMeasurement(MACAddress("00:00:00:00:00:03"), -55, ts));
|
||||
obs.entries.push_back(WiFiMeasurement(MACAddress("00:00:00:00:00:04"), -55, ts));
|
||||
|
||||
WiFiObserverGrid observer(5.0f);
|
||||
WiFiObserverGrid<TestNode190231> observer(5.0f);
|
||||
const TestNode190231& gn = grid.getNodeFor(GridPoint(1000,1000,0));
|
||||
const float p = observer.getProbability(gn, ts, obs);
|
||||
|
||||
|
||||
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