worked on signal-strength-estimation

add this information to grid nodes
evaluate this information
new test-cases
This commit is contained in:
2016-07-15 15:29:07 +02:00
parent 34e52cd7f0
commit 99ee95ce7b
21 changed files with 568 additions and 26 deletions

View File

@@ -1,4 +1,37 @@
#ifndef TESTAPI_CPP
#define TESTAPI_CPP
#ifdef WITH_TESTS
#endif // TESTAPI_CPP
#include "../Tests.h"
#include "../../api/api.h"
#include "../../api/DummyAPI.h"
class LeListener : public APIListener {
virtual void onPathUpdate(const std::vector<Point3>& curPath) override {
}
virtual void onPositionUpdate(const Point3 curPos) override {
//std::cout << curPos.x << "," << curPos.y << "," << curPos.z << std::endl;
}
};
TEST(API, run) {
std::string folder = "/mnt/data/workspaces/IndoorMap/maps";
DummyAPI api(folder);
api.setTarget(1);
api.addListener(new LeListener());
api.startNavigation();
sleep(5);
api.stopNavigation();
}
#endif

View File

@@ -23,7 +23,7 @@ TEST(TestAll, Nav) {
int getNumNeighbors(const GP& node) const {return node.getNumNeighbors();}
const GP* getNeighbor(const GP& node, const int idx) const {return &grid.getNeighbor(node, idx);}
float getWeightBetween(const GP& n1, const GP& n2) const {
float d = ((Point3)n1 - (Point3)n2).length(2.5);
float d = (n1.inCentimeter() - n2.inCentimeter()).length(2.5);
//if (d > 20) {d*= 1.30;}
return d / std::pow(n2.imp, 3);
}

View File

@@ -12,6 +12,7 @@
#include "../../grid/walk/GridWalkWeighted.h"
#include "../../grid/walk/GridWalkLightAtTheEndOfTheTunnel.h"
//TEST(Walk, plot) {
TEST(Walk, DISABLED_plot) {
@@ -59,7 +60,7 @@ TEST(Walk, DISABLED_plot) {
int getNumNeighbors(const GP& node) const {return node.getNumNeighbors();}
const GP* getNeighbor(const GP& node, const int idx) const {return &grid.getNeighbor(node, idx);}
float getWeightBetween(const GP& n1, const GP& n2) const {
float d = ((Point3)n1 - (Point3)n2).length(2.0);
float d = (n1.inCentimeter() - n2.inCentimeter()).length(2.0);
//if (d > 20) {d*= 1.30;}
return d / std::pow(n2.imp, 3);
}

View File

@@ -29,16 +29,16 @@ TEST(AStar, build) {
// const GP* getNeighbor(const GP& node, const int idx) const {return &grid.getNeighbor(node, idx);}
const std::vector<GP>& getAllNodes() const {return grid.getNodes();}
decltype(grid.neighbors(GP())) getNeighbors(const GP& node) const {return grid.neighbors(node);}
float getWeightBetween(const GP& n1, const GP& n2) const {return ((Point3)n1 - (Point3)n2).length();}
float getWeightBetween(const GP& n1, const GP& n2) const {return (n1.inCentimeter() - n2.inCentimeter()).length();}
float getHeuristic(const GP& n1, const GP& n2) const {return std::abs(n1.x_cm - n2.x_cm) + std::abs(n1.y_cm - n2.y_cm);}
} tmp(grid);
AStar<GP> nav;
std::vector<const GP*> vec = nav.get(&grid[0], &grid[4], tmp);
// std::vector<const GP*> vec = nav.get(grid[0], grid[4], tmp);
for (const GP* g : vec) {
std::cout << g << std::endl;
}
// for (const GP* g : vec) {
// std::cout << g << std::endl;
// }
}

View File

@@ -27,7 +27,7 @@ TEST(Dijkstra, build) {
TMP(Grid<GP>& grid) : grid(grid) {;}
int getNumNeighbors(const GP& node) const {return node.getNumNeighbors();}
const GP* getNeighbor(const GP& node, const int idx) const {return &grid.getNeighbor(node, idx);}
float getWeightBetween(const GP& n1, const GP& n2) const {return ((Point3)n1 - (Point3)n2).length();}
float getWeightBetween(const GP& n1, const GP& n2) const {return (n1.inCentimeter() - n2.inCentimeter()).length();}
} tmp(grid);
Dijkstra<GP> d;
@@ -94,7 +94,7 @@ void dijkstra(Grid<GP>& grid) {
TMP(Grid<GP>& grid) : grid(grid) {;}
int getNumNeighbors(const GP& node) const {return node.getNumNeighbors();}
const GP* getNeighbor(const GP& node, const int idx) const {return &grid.getNeighbor(node, idx);}
float getWeightBetween(const GP& n1, const GP& n2) const {return ((Point3)n1 - (Point3)n2).length();}
float getWeightBetween(const GP& n1, const GP& n2) const {return (n1.inCentimeter() - n2.inCentimeter()).length();}
} tmp(grid);
Dijkstra<GP> d;

View File

@@ -2,7 +2,7 @@
#include "../../Tests.h"
#include "../../../sensors/radio/LogDistanceModel.h"
#include "../../../sensors/radio/model/LogDistanceModel.h"
TEST(LogDistanceModel, calc) {

View File

@@ -0,0 +1,96 @@
#ifdef WITH_TESTS
#include "../../Tests.h"
#include "../../../sensors/radio/WiFiGridEstimator.h"
#include "../../../sensors/radio/model/WiFiModelLogDist.h"
#include "../../../sensors/radio/WiFiObservation.h"
#include "../../../grid/Grid.h"
struct MyNode : GridNode, GridPoint, WiFiGridNode<10> {
MyNode(const int x_cm, const int y_cm, const int z_cm) : GridPoint(x_cm, y_cm, z_cm) {;}
};
/** test the RSSI storage. [we use only a single byte due to memory constraints, but allow 0.25 dB steps!] */
TEST(WiFiGridNodeAP, rssi) {
for (float rssi = -40; rssi > -103; rssi -= 0.1f) {
WiFiGridNodeAP ap(0, rssi);
ASSERT_NEAR(rssi, ap.getRSSI(), 0.2f); // max 0.2 dB variation from what it should be
}
}
/** test the signal-strength limit: [-40: -103] */
TEST(WiFiGridNodeAP, rssiLimits) {
// limit 1
WiFiGridNodeAP ap1(0, -10);
ASSERT_EQ(-40, ap1.getRSSI());
// limit 2
WiFiGridNodeAP ap2(0, -200);
ASSERT_EQ(-103, ap2.getRSSI());
}
TEST(WiFiGridModelLogDist, create) {
int gs = 20;
Grid<MyNode> grid(gs);
for (int x = 0; x < 2000; x += gs) {
for (int y = 0; y < 2000; y += gs) {
grid.add(MyNode(x,y,0));
}
}
std::cout << "GridNodeSize: " << sizeof(MyNode) << std::endl;
LocatedAccessPoint ap1("00:00:00:00:00:01", Point3( 0, 0,0));
LocatedAccessPoint ap2("00:00:00:00:00:02", Point3(20, 0,0));
LocatedAccessPoint ap3("00:00:00:00:00:03", Point3( 0,20,0));
LocatedAccessPoint ap4("00:00:00:00:00:04", Point3(20,20,0));
std::vector<LocatedAccessPoint> aps = {ap1, ap2, ap3, ap4};
ASSERT_EQ(0, grid[0].getNumVisibleAPs());
WiFiModelLogDist model(-40, 1.5);
WiFiGridEstimator::estimate(grid, model, aps);
ASSERT_EQ(4, grid[0].getNumVisibleAPs()); // 4 APs visible at this node
ASSERT_GT(0, grid[0].getRSSI("00:00:00:00:00:01")); // non-zero RSSI
ASSERT_GT(0, grid[0].getRSSI("00:00:00:00:00:02")); // non-zero RSSI
ASSERT_GT(0, grid[0].getRSSI("00:00:00:00:00:03")); // non-zero RSSI
ASSERT_GT(0, grid[0].getRSSI("00:00:00:00:00:04")); // non-zero RSSI
ASSERT_EQ(0, grid[0].getRSSI("00:00:00:00:00:05")); // unknown AP -> 0 RSSI
WiFiGridEstimator::dump(grid, "00:00:00:00:00:01", "/tmp/ap1.gp");
WiFiGridEstimator::dump(grid, "00:00:00:00:00:02", "/tmp/ap2.gp");
WiFiGridEstimator::dump(grid, "00:00:00:00:00:03", "/tmp/ap3.gp");
WiFiGridEstimator::dump(grid, "00:00:00:00:00:04", "/tmp/ap4.gp");
WiFiObservation obs;
obs.entries.push_back(WiFiObservationEntry(MACAddress("00:00:00:00:00:01"), -55));
obs.entries.push_back(WiFiObservationEntry(MACAddress("00:00:00:00:00:02"), -55));
obs.entries.push_back(WiFiObservationEntry(MACAddress("00:00:00:00:00:03"), -55));
obs.entries.push_back(WiFiObservationEntry(MACAddress("00:00:00:00:00:04"), -55));
WiFiObserver observer(5.0f);
const MyNode& gn = grid.getNodeFor(GridPoint(1000,1000,0));
const float p = observer.getProbability(gn, obs, 0);
observer.dump(grid, obs, "/tmp/eval1.gp");
int i = 0; (void) i;
}
#endif