current state
This commit is contained in:
296
main.cpp
296
main.cpp
@@ -26,11 +26,15 @@
|
||||
|
||||
#include "EvalApOpt.h"
|
||||
#include "EvalData.h"
|
||||
#include "EvalWiFi.h"
|
||||
#include "EvalWiFiSigStrength.h"
|
||||
#include "pf/EvalWalk.h"
|
||||
#include "EvalWifiOptResult.h"
|
||||
#include "wifi/EvalWiFiConvex.h"
|
||||
#include "wifi/EvalWiFiGround.h"
|
||||
#include "wifi/EvalWiFi.h"
|
||||
#include "wifi/EvalWiFiPaths.h"
|
||||
#include "wifi/EvalWiFiPathMethods.h"
|
||||
|
||||
|
||||
|
||||
#include "plots/PlotErrFunc.h"
|
||||
@@ -42,7 +46,7 @@ void paperOutputs() {
|
||||
|
||||
|
||||
// show optimization behaviour
|
||||
if (1 == 1) {
|
||||
if (1 == 0) {
|
||||
|
||||
EvalWiFiConvex eval(map, Settings::fCalib);
|
||||
eval.showParams();
|
||||
@@ -52,29 +56,72 @@ void paperOutputs() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
// show fingerprints as plot
|
||||
if (1==0){
|
||||
if (1 == 0){
|
||||
EvalWiFiSigStrength sig(Settings::fMap, Settings::fCalib);
|
||||
Plotty* p = new Plotty(map);
|
||||
p->writeCodeTo(Settings::fPathGFX + "compare-wifi-in-out.gp");
|
||||
p->writeEpsTex(Settings::fPathGFX + "compare-wifi-in-out.tex");
|
||||
p->writeEpsTex(Settings::fPathGFX + "compare-wifi-in-out.tex", K::GnuplotSize(8.6, 4.7));
|
||||
p->settings.floors = {0};
|
||||
p->settings.maxZ = 1;
|
||||
p->settings.outlineColor = K::GnuplotColor::fromRGB(170,170,170);
|
||||
p->buildFloorplan();
|
||||
sig.forAP_avg(p, MACAddress("d8:84:66:4a:23:d0"));
|
||||
sig.forPaperNN(p, MACAddress("d8:84:66:4a:23:d0"));
|
||||
p->equalXY();
|
||||
p->setView(0,0);
|
||||
p->setScale(3.1, 3.1);
|
||||
p->addRectangle(Point3(62, 24, 0), Point3(72, 34, 0), Color::fromRGB(0,0,0), false, false);
|
||||
p->setScale(3.45, 3.45, -0.005, -0.04);
|
||||
p->addRectangleW(Point3(62.5, 24, 0), Point3(72, 35, 0), K::GnuplotColor::fromRGB(0,0,0), 3, true); // small
|
||||
p->addRectangleW(Point3(8.0, 39.75, 0), Point3(72, 43.75, 0), K::GnuplotColor::fromRGB(0,0,0), 3, true); // big
|
||||
p->noFrame();
|
||||
p->plot();
|
||||
delete p;
|
||||
}
|
||||
|
||||
|
||||
// perform varios AP-param optimizations
|
||||
// generate error plot showing the performance of each
|
||||
// save the resulting wifi-models to XML for later re-use during the walk-eval <<<<<< !!!!
|
||||
if (1 == 1) {
|
||||
if (1 == 0) {
|
||||
|
||||
#include "bboxes.h"
|
||||
|
||||
Plotty pt(map);
|
||||
pt.settings.outline = false;
|
||||
pt.buildFloorplan();
|
||||
|
||||
// coloring
|
||||
K::GnuplotColor cH = K::GnuplotColor::fromRGB(220,220,220);
|
||||
K::GnuplotColor cO = K::GnuplotColor::fromRGB(0,128,0);
|
||||
K::GnuplotColor cI = K::GnuplotColor::fromRGB(190,190,190);
|
||||
|
||||
// floor 0
|
||||
pt.addBBoxes(bboxes0H, cH);
|
||||
pt.addBBoxes(bboxes0O, cO);
|
||||
pt.addBBoxes(bboxes0I, cI);
|
||||
|
||||
// floor 1
|
||||
pt.addBBoxes(bboxes1H, cH);
|
||||
pt.addBBoxes(bboxes1O, cO);
|
||||
pt.addBBoxes(bboxes1I, cI);
|
||||
|
||||
// floor 2
|
||||
pt.addBBoxes(bboxes2H, cH);
|
||||
|
||||
// floor 3
|
||||
pt.addBBoxes(bboxes3H, cH);
|
||||
|
||||
pt.plot();
|
||||
|
||||
int i = 0; (void) i;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// perform varios AP-param optimizations
|
||||
// generate error plot showing the performance of each
|
||||
// save the resulting wifi-models to XML for later re-use during the walk-eval <<<<<< !!!!
|
||||
if (1 == 0) {
|
||||
|
||||
// // use walks?
|
||||
// std::vector<std::pair<std::string, std::vector<int>>> calibWalks = {
|
||||
@@ -85,36 +132,42 @@ void paperOutputs() {
|
||||
// };
|
||||
// EvalCompareOpt2 opt1(Settings::fMap, calibWalks);
|
||||
|
||||
auto removeNone = [] (const WiFiFingerprint& fp) -> bool {
|
||||
return false;
|
||||
};
|
||||
// all combined
|
||||
auto removeNone = [] (const WiFiFingerprint& fp) -> bool {return false;};
|
||||
|
||||
auto only0th = [] (const WiFiFingerprint& fp) -> bool {
|
||||
return std::abs(fp.pos_m.z - (1.3)) > 0.1;
|
||||
};
|
||||
// per floor
|
||||
auto only0th = [] (const WiFiFingerprint& fp) -> bool {return std::abs(fp.pos_m.z - (1.3)) > 0.1;};
|
||||
auto only1st = [] (const WiFiFingerprint& fp) -> bool {return std::abs(fp.pos_m.z - (4+1.3)) > 0.1;};
|
||||
auto only2nd = [] (const WiFiFingerprint& fp) -> bool {return std::abs(fp.pos_m.z - (4+3.4+1.3)) > 0.1;};
|
||||
auto only3rd = [] (const WiFiFingerprint& fp) -> bool {return std::abs(fp.pos_m.z - (4+3.4+3.4+1.3)) > 0.1;};
|
||||
|
||||
auto only1st = [] (const WiFiFingerprint& fp) -> bool {
|
||||
return std::abs(fp.pos_m.z - (4+1.3)) > 0.1;
|
||||
};
|
||||
// per bbox
|
||||
#include "bboxes.h"
|
||||
auto only0H = [&] (const WiFiFingerprint& fp) -> bool {return !bboxes0H.contains(fp.pos_m);};
|
||||
auto only0O = [&] (const WiFiFingerprint& fp) -> bool {return !bboxes0O.contains(fp.pos_m);};
|
||||
auto only0I = [&] (const WiFiFingerprint& fp) -> bool {return !bboxes0I.contains(fp.pos_m);};
|
||||
|
||||
auto only2nd = [] (const WiFiFingerprint& fp) -> bool {
|
||||
return std::abs(fp.pos_m.z - (4+3.4+1.3)) > 0.1;
|
||||
};
|
||||
auto only1H = [&] (const WiFiFingerprint& fp) -> bool {return !bboxes1H.contains(fp.pos_m);};
|
||||
auto only1O = [&] (const WiFiFingerprint& fp) -> bool {return !bboxes1O.contains(fp.pos_m);};
|
||||
auto only1I = [&] (const WiFiFingerprint& fp) -> bool {return !bboxes1I.contains(fp.pos_m);};
|
||||
|
||||
auto only2H = [&] (const WiFiFingerprint& fp) -> bool {return !bboxes2H.contains(fp.pos_m);};
|
||||
|
||||
auto only3H = [&] (const WiFiFingerprint& fp) -> bool {return !bboxes3H.contains(fp.pos_m);};
|
||||
|
||||
auto only3rd = [] (const WiFiFingerprint& fp) -> bool {
|
||||
return std::abs(fp.pos_m.z - (4+3.4+3.4+1.3)) > 0.1;
|
||||
};
|
||||
|
||||
// use fingerprints?
|
||||
EvalCompareOpt2 opt1(Settings::fMap, Settings::fCalib, removeNone);
|
||||
|
||||
|
||||
// optimize using all floors
|
||||
EvalCompareOpt2::Result s1 = opt1.fixedPosFixedParamsForAll(); //BREAK;
|
||||
EvalCompareOpt2::Result s2 = opt1.fixedPosOptParamsForAll(); //BREAK;
|
||||
EvalCompareOpt2::Result s3 = opt1.fixedPosOptParamsForEach(); //BREAK;
|
||||
EvalCompareOpt2::Result s4 = opt1.optPosOptParamsForEach(); //BREAK;
|
||||
|
||||
// optimize only for the 0th floor
|
||||
|
||||
// optimize per floor
|
||||
EvalCompareOpt2 opt_f0(Settings::fMap, Settings::fCalib, only0th);
|
||||
EvalCompareOpt2::Result sf0 = opt_f0.optPosOptParamsForEach();
|
||||
EvalCompareOpt2 opt_f1(Settings::fMap, Settings::fCalib, only1st);
|
||||
@@ -124,6 +177,30 @@ void paperOutputs() {
|
||||
EvalCompareOpt2 opt_f3(Settings::fMap, Settings::fCalib, only3rd);
|
||||
EvalCompareOpt2::Result sf3 = opt_f3.optPosOptParamsForEach();
|
||||
|
||||
|
||||
// optimize per bbox
|
||||
EvalCompareOpt2 opt_0H(Settings::fMap, Settings::fCalib, only0H);
|
||||
EvalCompareOpt2::Result sf0H = opt_0H.optPosOptParamsForEach();
|
||||
EvalCompareOpt2 opt_0O(Settings::fMap, Settings::fCalib, only0O);
|
||||
EvalCompareOpt2::Result sf0O = opt_0O.optPosOptParamsForEach();
|
||||
EvalCompareOpt2 opt_0I(Settings::fMap, Settings::fCalib, only0I);
|
||||
EvalCompareOpt2::Result sf0I = opt_0I.optPosOptParamsForEach();
|
||||
|
||||
EvalCompareOpt2 opt_1H(Settings::fMap, Settings::fCalib, only1H);
|
||||
EvalCompareOpt2::Result sf1H = opt_1H.optPosOptParamsForEach();
|
||||
EvalCompareOpt2 opt_1O(Settings::fMap, Settings::fCalib, only1O);
|
||||
EvalCompareOpt2::Result sf1O = opt_1O.optPosOptParamsForEach();
|
||||
EvalCompareOpt2 opt_1I(Settings::fMap, Settings::fCalib, only1I);
|
||||
EvalCompareOpt2::Result sf1I = opt_1I.optPosOptParamsForEach();
|
||||
|
||||
EvalCompareOpt2 opt_2H(Settings::fMap, Settings::fCalib, only2H);
|
||||
EvalCompareOpt2::Result sf2H = opt_2H.optPosOptParamsForEach();
|
||||
|
||||
EvalCompareOpt2 opt_3H(Settings::fMap, Settings::fCalib, only3H);
|
||||
EvalCompareOpt2::Result sf3H = opt_3H.optPosOptParamsForEach();
|
||||
|
||||
|
||||
|
||||
// save models to file
|
||||
s1.model.saveXML(Settings::wifiAllFixed);
|
||||
s2.model.saveXML(Settings::wifiAllOptPar);
|
||||
@@ -142,6 +219,18 @@ void paperOutputs() {
|
||||
wmpf.add(&sf3.model, map->floors[3]);
|
||||
wmpf.saveXML(Settings::wifiEachOptParPos_multimodel);
|
||||
|
||||
// ultra fancy combined model
|
||||
WiFiModelPerBBox wmbb(map);
|
||||
wmbb.add(&sf0H.model, bboxes0H);
|
||||
wmbb.add(&sf0O.model, bboxes0O);
|
||||
wmbb.add(&sf0I.model, bboxes0I);
|
||||
wmbb.add(&sf1H.model, bboxes1H);
|
||||
wmbb.add(&sf1O.model, bboxes1O);
|
||||
wmbb.add(&sf1I.model, bboxes1I);
|
||||
wmbb.add(&sf2H.model, bboxes2H);
|
||||
wmbb.add(&sf3H.model, bboxes3H);
|
||||
wmbb.saveXML(Settings::wifiEachOptParPos_perBBox);
|
||||
|
||||
PlotErrFunc pef("\\small{error (dB)}", "\\small{fingerprints (\\%)}");
|
||||
pef.add("\\small{empiric}", &s1.errSingle);
|
||||
pef.add("\\small{real pos, opt params}", &s2.errSingle);
|
||||
@@ -160,12 +249,10 @@ void paperOutputs() {
|
||||
//return;
|
||||
//sleep(1000);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/** plot wifi eval results */
|
||||
if (1 == 1) {
|
||||
if (1 == 0) {
|
||||
|
||||
WiFiFingerprints fps;
|
||||
fps.load(Settings::fCalib);
|
||||
@@ -176,7 +263,7 @@ void paperOutputs() {
|
||||
EvalWiFiOptResult eval2(Settings::fMap);
|
||||
eval2.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiAllFixed, fps);
|
||||
|
||||
|
||||
// advanced model [1 model per floor]
|
||||
EvalWiFiOptResult evalfloor(Settings::fMap);
|
||||
evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only0th, fps);
|
||||
evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only1st, fps);
|
||||
@@ -184,6 +271,10 @@ void paperOutputs() {
|
||||
evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only3rd, fps);
|
||||
evalfloor.showErrorPerFingerprint<WiFiModelPerFloor>(Settings::wifiEachOptParPos_multimodel, fps);
|
||||
|
||||
// more advanved model [1 model per bbox-region]
|
||||
EvalWiFiOptResult evalBBox(Settings::fMap);
|
||||
evalBBox.showErrorPerFingerprint<WiFiModelPerBBox>(Settings::wifiEachOptParPos_perBBox, fps);
|
||||
|
||||
int i = 0; (void) i;
|
||||
|
||||
}
|
||||
@@ -279,12 +370,95 @@ void testWAF() {
|
||||
|
||||
}
|
||||
|
||||
void showFingerprintsFor(const std::string& mapFile, const std::string& fpFile, const std::string& smac) {
|
||||
|
||||
WiFiFingerprints calib(fpFile);
|
||||
VAPGrouper vap(VAPGrouper::Mode::LAST_MAC_DIGIT_TO_ZERO, VAPGrouper::Aggregation::AVERAGE);
|
||||
for (WiFiFingerprint& fp : calib.getFingerprints()) {
|
||||
fp.measurements = vap.group(fp.measurements);
|
||||
}
|
||||
|
||||
const MACAddress mac(smac);
|
||||
|
||||
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(mapFile);
|
||||
|
||||
|
||||
Plotty p(map);
|
||||
p.buildFloorplan();
|
||||
|
||||
std::vector<WiFiFingerprint> fps = calib.getFingerprintsFor(mac);
|
||||
|
||||
for (const WiFiFingerprint& fp : fps) {
|
||||
if (fp.measurements.entries.size() != 1) {throw "123";}
|
||||
const float rssi = fp.measurements.entries[0].getRSSI();
|
||||
const float s = (rssi-100) / (-40 - -100);
|
||||
const Color c = Color::fromHSV(s*100, 255, 255);
|
||||
p.addFloorRect(fp.pos_m, 3, c);
|
||||
}
|
||||
|
||||
p.plot();
|
||||
sleep(1);
|
||||
|
||||
}
|
||||
|
||||
void showModelFor(const std::string& mapFile, const std::string& modelXml, const std::string& smac) {
|
||||
|
||||
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(mapFile);
|
||||
WiFiModelFactory fac(map);
|
||||
|
||||
WiFiModel* model = fac.loadXML(modelXml);
|
||||
|
||||
const MACAddress mac(smac);
|
||||
|
||||
Plotty p(map);
|
||||
p.buildFloorplan();
|
||||
|
||||
const float ss = 2.0;
|
||||
for (Floorplan::Floor* floor : map->floors) {
|
||||
for (float y = -20; y < 70; y+=ss) {
|
||||
for (float x = -10; x < 130; x+=ss) {
|
||||
|
||||
const Point3 pos(x,y,floor->atHeight+1.3);
|
||||
|
||||
// limit estimations to the floorplan's outline
|
||||
bool contained = false;
|
||||
for (Floorplan::FloorOutlinePolygon* poly : floor->outline) {
|
||||
HelperPoly hp(*poly);
|
||||
if (hp.contains(pos.xy()*100)) {
|
||||
if (poly->method == Floorplan::OutlineMethod::ADD) {
|
||||
contained = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!contained) {continue;}
|
||||
|
||||
const float rssi = model->getRSSI(mac, pos);
|
||||
const float s = (rssi-100) / (-40 - -100);
|
||||
const Color c = Color::fromHSV(s*100, 255, 255);
|
||||
p.addFloorRect(pos, 3, c);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
p.plot();
|
||||
sleep(1);
|
||||
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
|
||||
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(Settings::fMap);
|
||||
|
||||
//testWAF();
|
||||
|
||||
paperOutputs(); // return 0;
|
||||
//paperOutputs(); return 0;
|
||||
|
||||
//showFingerprintsFor(Settings::fMap, Settings::fCalib, "D8:84:66:4A:4A:D0");
|
||||
//showModelFor(Settings::fMap, Settings::wifiEachOptParPos_multimodel, "D8:84:66:4A:4A:D0");
|
||||
//showFingerprintsFor(Settings::fMap, Settings::fCalib, "D8:84:66:4A:4A:E0");
|
||||
//showModelFor(Settings::fMap, Settings::wifiEachOptParPos_multimodel, "D8:84:66:4A:4A:E0");
|
||||
|
||||
// calib error in/out
|
||||
if (1 == 0) {
|
||||
@@ -313,12 +487,21 @@ int main(void) {
|
||||
EvalCompareOpt::Result s2 = opt2.optPosOptParamsForEach();
|
||||
std::cout << s2.errAbs.asString() << std::endl;
|
||||
|
||||
}
|
||||
|
||||
// prob on ground
|
||||
if (1 == 0) {
|
||||
|
||||
EvalWiFiGround eval(map, Settings::wifiEachOptParPos_multimodel);
|
||||
//eval.show(Settings::path1a);
|
||||
eval.show(Settings::path2a);
|
||||
|
||||
int i = 0; (void) i;
|
||||
|
||||
}
|
||||
|
||||
// walks
|
||||
if (1 == 1) {
|
||||
if (1 == 0) {
|
||||
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(Settings::fMap);;
|
||||
EvalWalk walk(map);
|
||||
walk.walk1();
|
||||
@@ -343,24 +526,69 @@ int main(void) {
|
||||
|
||||
|
||||
// test wifi within data files
|
||||
if (1 == 1) {
|
||||
if (1 == 0) {
|
||||
//EvalWiFi ew1(Settings::fMap, Settings::path1a, Settings::GroundTruth::path1);
|
||||
EvalWiFi ew1(Settings::fMap, Settings::path1a, Settings::GroundTruth::path1);
|
||||
//EvalWiFi ew1(Settings::fMap, Settings::path2a, Settings::GroundTruth::path2);
|
||||
//ew1.fixedParams(-40, 2.5, -8); BREAK;
|
||||
//ew1.fixedParams(-64.5905, 1.25988, -2.47863); BREAK;
|
||||
//ew1.fixedParams(-59.4903,1.52411,-3.25077); BREAK;
|
||||
//ew1.load(Settings::wifiEachOptParPos);
|
||||
//ew1.load<WiFiModelLogDistCeiling>(Settings::wifiAllFixed, "empirc");
|
||||
ew1.load(Settings::wifiAllFixed, "empirc");
|
||||
//ew1.load(Settings::wifiAllOptPar, "opt params all APs");
|
||||
//ew1.load(Settings::wifiEachOptPar, "opt params each AP");
|
||||
ew1.load(Settings::wifiEachOptParPos, "everything opt");
|
||||
ew1.load(Settings::wifiEachOptParPos, "normal model");
|
||||
ew1.load(Settings::wifiEachOptParPos_multimodel, "model per floor");
|
||||
ew1.load(Settings::wifiEachOptParPos_perBBox, "model per region");
|
||||
//ew1.load<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only1st, "everything opt");
|
||||
//ew1.writeTeX("path1");
|
||||
|
||||
sleep(1000);
|
||||
|
||||
}
|
||||
|
||||
if (1 == 1) {
|
||||
|
||||
std::vector<std::string> files = {
|
||||
Settings::path1a, //Settings::path1b,
|
||||
//Settings::path2a, Settings::path2b,
|
||||
//Settings::path_toni_all_1a, Settings::path_toni_all_1b,
|
||||
//Settings::path_toni_all_2a, Settings::path_toni_all_2b,
|
||||
//Settings::path_toni_inst_1a, Settings::path_toni_inst_1b,
|
||||
//Settings::path_toni_inst_2a, Settings::path_toni_inst_2b,
|
||||
//Settings::path_toni_inst_3a, Settings::path_toni_inst_3b,
|
||||
};
|
||||
std::vector<std::vector<int>> gtIndices = {
|
||||
Settings::GroundTruth::path1, //Settings::GroundTruth::path1,
|
||||
//Settings::GroundTruth::path2, Settings::GroundTruth::path2,
|
||||
//Settings::GroundTruth::path_toni_all_1, Settings::GroundTruth::path_toni_all_1,
|
||||
//Settings::GroundTruth::path_toni_all_2, Settings::GroundTruth::path_toni_all_2,
|
||||
//Settings::GroundTruth::path_toni_inst_1, Settings::GroundTruth::path_toni_inst_1,
|
||||
//Settings::GroundTruth::path_toni_inst_2, Settings::GroundTruth::path_toni_inst_2,
|
||||
//Settings::GroundTruth::path_toni_inst_3, Settings::GroundTruth::path_toni_inst_3,
|
||||
};
|
||||
|
||||
// EvalWiFiPaths ewp(Settings::fMap);
|
||||
// ewp.loadModel(Settings::wifiAllFixed, "empirc");
|
||||
// ewp.walks(files, gtIndices);
|
||||
|
||||
// ewp.loadModel(Settings::wifiEachOptParPos, "normal model");
|
||||
// ewp.walks(files, gtIndices);
|
||||
|
||||
// ewp.loadModel(Settings::wifiEachOptParPos_multimodel, "model per floor");
|
||||
// ewp.walks(files, gtIndices);
|
||||
|
||||
// ewp.loadModel(Settings::wifiEachOptParPos_perBBox, "model per region");
|
||||
// ewp.walks(files, gtIndices);
|
||||
|
||||
EvalWiFiPathMethods ewpm(Settings::fMap);
|
||||
ewpm.loadModel(Settings::wifiEachOptParPos_perBBox, "model per region", "original", "alternative");
|
||||
ewpm.walks(files, gtIndices);
|
||||
ewpm.writeGP(Settings::fPathGFX, "normalVsExp");
|
||||
|
||||
|
||||
sleep(10000);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user