current TeX
minor code changes for GFX
This commit is contained in:
@@ -50,17 +50,19 @@ public:
|
|||||||
/**
|
/**
|
||||||
* plot the error for every fingerprint
|
* plot the error for every fingerprint
|
||||||
*/
|
*/
|
||||||
template <typename Model> void showErrorPerFingerprint(const std::string& modelParamsXML, const WiFiFingerprints& fps) {
|
template <typename Model> Plotty* showErrorPerFingerprint(const std::string& modelParamsXML, const WiFiFingerprints& fps) {
|
||||||
|
|
||||||
Plotty* plot = new Plotty(map);
|
Plotty* plot = new Plotty(map);
|
||||||
|
|
||||||
plot->settings.obstacles = true;
|
plot->settings.obstacles = true;
|
||||||
plot->settings.outline = false;
|
plot->settings.outline = false;
|
||||||
plot->settings.stairs = false;
|
plot->settings.stairs = false;
|
||||||
|
plot->settings.outlineColorCustom = true;
|
||||||
plot->settings.outlineColor = K::GnuplotColor::fromRGB(0,0,0);
|
plot->settings.outlineColor = K::GnuplotColor::fromRGB(0,0,0);
|
||||||
plot->buildFloorplan();
|
plot->buildFloorplan();
|
||||||
plot->equalXY();
|
plot->equalXY();
|
||||||
//plot.gp << "unset border\n";
|
|
||||||
|
plot->gp << "unset border\n";
|
||||||
plot->splot.getAxisX().setTicsVisible(false);
|
plot->splot.getAxisX().setTicsVisible(false);
|
||||||
plot->splot.getAxisY().setTicsVisible(false);
|
plot->splot.getAxisY().setTicsVisible(false);
|
||||||
plot->splot.getAxisZ().setTicsVisible(false);
|
plot->splot.getAxisZ().setTicsVisible(false);
|
||||||
@@ -109,6 +111,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// enqueue AVG error
|
// enqueue AVG error
|
||||||
|
//errors.push_back(ErrPoint(fp.pos_m, errAbs.getAvg()));
|
||||||
|
|
||||||
|
// enqueue MAX error
|
||||||
errors.push_back(ErrPoint(fp.pos_m, errAbs.getMax()));
|
errors.push_back(ErrPoint(fp.pos_m, errAbs.getMax()));
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -117,7 +122,7 @@ public:
|
|||||||
std::vector<ErrPoint> errorsInt;
|
std::vector<ErrPoint> errorsInt;
|
||||||
K::Statistics<float> errStats;
|
K::Statistics<float> errStats;
|
||||||
const float oz = 1.3;
|
const float oz = 1.3;
|
||||||
const float ss = 1.5;
|
const float ss = 4.0;
|
||||||
|
|
||||||
for (Floorplan::Floor* floor : map->floors) {
|
for (Floorplan::Floor* floor : map->floors) {
|
||||||
|
|
||||||
@@ -175,22 +180,23 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
const float minErr = 0.0;//errStats.getMin();
|
const float minErr = 0.0;//errStats.getMin();
|
||||||
const float maxErr = 18.0;//errStats.getQuantile(0.9);
|
const float maxErr = 20.0;//errStats.getQuantile(0.9);
|
||||||
|
|
||||||
plot->splot.setTitle("max error: " + std::to_string(errStats.getQuantile(0.9)) + " dB");
|
//plot->splot.setTitle("max error: " + std::to_string(errStats.getMax()) + " dB");
|
||||||
|
|
||||||
// draw interpolated errors between min/max
|
// draw interpolated errors between min/max
|
||||||
for (const ErrPoint& ep : errorsInt) {
|
for (const ErrPoint& ep : errorsInt) {
|
||||||
|
|
||||||
float factor = (ep.err - minErr) / (maxErr-minErr);
|
float factor = (ep.err - minErr) / (maxErr-minErr);
|
||||||
if (factor > 1) {factor = 1;}
|
if (factor > 1) {factor = 1;}
|
||||||
|
if (factor < 0) {factor = 0;}
|
||||||
|
|
||||||
// hsv green->yellow->red
|
// hsv green->yellow->red
|
||||||
// const float h = 90 * (1 - std::pow(factor, 1.0));
|
// const float h = 90 * (1 - std::pow(factor, 1.0));
|
||||||
// K::GnuplotColor color = K::GnuplotColor::fromHSV(h, 255, 255);
|
// K::GnuplotColor color = K::GnuplotColor::fromHSV(h, 255, 255);
|
||||||
|
|
||||||
// hsv white->red
|
// hsv white->red
|
||||||
const float sat = 255 * (std::pow(factor, 1.5));
|
const float sat = 255 * factor;
|
||||||
K::GnuplotColor color = K::GnuplotColor::fromHSV(0, sat, 255);
|
K::GnuplotColor color = K::GnuplotColor::fromHSV(0, sat, 255);
|
||||||
|
|
||||||
K::GnuplotObjectPolygon* poly = new K::GnuplotObjectPolygon(
|
K::GnuplotObjectPolygon* poly = new K::GnuplotObjectPolygon(
|
||||||
@@ -205,13 +211,16 @@ public:
|
|||||||
poly->add(K::GnuplotCoordinate3(ep.pos.x+s, ep.pos.y+s, ep.pos.z-oz, K::GnuplotCoordinateSystem::FIRST));
|
poly->add(K::GnuplotCoordinate3(ep.pos.x+s, ep.pos.y+s, ep.pos.z-oz, K::GnuplotCoordinateSystem::FIRST));
|
||||||
poly->add(K::GnuplotCoordinate3(ep.pos.x-s, ep.pos.y+s, ep.pos.z-oz, K::GnuplotCoordinateSystem::FIRST));
|
poly->add(K::GnuplotCoordinate3(ep.pos.x-s, ep.pos.y+s, ep.pos.z-oz, K::GnuplotCoordinateSystem::FIRST));
|
||||||
poly->close();
|
poly->close();
|
||||||
poly->setZIndex(ep.pos.z);
|
poly->setZIndex(ep.pos.z - 1.5);
|
||||||
plot->splot.getObjects().add(poly);
|
plot->splot.getObjects().add(poly);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
plot->splot.getObjects().reOrderByZIndex();
|
||||||
plot->plot();
|
plot->plot();
|
||||||
|
|
||||||
|
return plot;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
12
bboxes.h
12
bboxes.h
@@ -39,6 +39,18 @@ BBoxes3 bboxes1H({floor1Ha, floor1Hb});
|
|||||||
const BBox3 floor2Ha(Point3( 0.0, 0.0, 7.4), Point3(111.6, 50.7, 10.79));
|
const BBox3 floor2Ha(Point3( 0.0, 0.0, 7.4), Point3(111.6, 50.7, 10.79));
|
||||||
BBoxes3 bboxes2H({floor2Ha});
|
BBoxes3 bboxes2H({floor2Ha});
|
||||||
|
|
||||||
|
// floor 2 for plot
|
||||||
|
const BBox3 _floor2Ha(Point3( 0.0, 0.0, 7.4), Point3( 18.6, 31.3, 10.79));
|
||||||
|
const BBox3 _floor2Hb(Point3( 0.0, 31.3, 7.4), Point3( 77.5, 50.7, 10.79));
|
||||||
|
BBoxes3 _bboxes2H({_floor2Ha, _floor2Hb});
|
||||||
|
|
||||||
|
|
||||||
// floor 3
|
// floor 3
|
||||||
const BBox3 floor3Ha(Point3( 0.0, 0.0, 10.8), Point3(111.6, 50.7, 14.2));
|
const BBox3 floor3Ha(Point3( 0.0, 0.0, 10.8), Point3(111.6, 50.7, 14.2));
|
||||||
BBoxes3 bboxes3H({floor3Ha});
|
BBoxes3 bboxes3H({floor3Ha});
|
||||||
|
|
||||||
|
// floor 3 for plot
|
||||||
|
const BBox3 _floor3Ha(Point3( 0.0, 0.0, 10.8), Point3( 18.6, 31.3, 14.2));
|
||||||
|
const BBox3 _floor3Hb(Point3( 0.0, 31.3, 10.8), Point3( 77.5, 50.7, 14.2));
|
||||||
|
BBoxes3 _bboxes3H({_floor3Ha, _floor3Hb});
|
||||||
|
|
||||||
|
|||||||
104
main.cpp
104
main.cpp
@@ -392,10 +392,13 @@ void plotAllFingerprints(Floorplan::IndoorMap* map) {
|
|||||||
const float size = fp.measurements.entries.size() / 10.0 * 1.0;
|
const float size = fp.measurements.entries.size() / 10.0 * 1.0;
|
||||||
const Point3 pos = fp.pos_m - Point3(0,0,1.2);
|
const Point3 pos = fp.pos_m - Point3(0,0,1.2);
|
||||||
Color c;
|
Color c;
|
||||||
if (pos.z < 4) {c = Color::fromRGB(128,128,128);}
|
|
||||||
else if (pos.z < 6) {c = Color::fromRGB(255,96,96);}
|
// if (pos.z < 4) {c = Color::fromRGB(128,128,128);}
|
||||||
else if (pos.z < 9) {c = Color::fromRGB(128,255,128);}
|
// else if (pos.z < 6) {c = Color::fromRGB(255,96,96);}
|
||||||
else {c = Color::fromRGB(128,128,255);}
|
// else if (pos.z < 9) {c = Color::fromRGB(128,255,128);}
|
||||||
|
// else {c = Color::fromRGB(128,128,255);}
|
||||||
|
c = Color::fromRGB(0,0,0);
|
||||||
|
|
||||||
K::GnuplotObjectPolygon* poly = p->addFloorRect(pos, size, c);
|
K::GnuplotObjectPolygon* poly = p->addFloorRect(pos, size, c);
|
||||||
poly->setZIndex(pos.z + 0.1); // above the floor
|
poly->setZIndex(pos.z + 0.1); // above the floor
|
||||||
|
|
||||||
@@ -620,9 +623,7 @@ void paperOutputs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// perform varios AP-param optimizations
|
// plot the configured bboxes
|
||||||
// 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) {
|
if (1 == 0) {
|
||||||
|
|
||||||
#include "bboxes.h"
|
#include "bboxes.h"
|
||||||
@@ -632,26 +633,46 @@ void paperOutputs() {
|
|||||||
pt.buildFloorplan();
|
pt.buildFloorplan();
|
||||||
|
|
||||||
// coloring
|
// coloring
|
||||||
K::GnuplotColor cH = K::GnuplotColor::fromRGB(220,220,220);
|
K::GnuplotColor cH0 = K::GnuplotColor::fromRGB(130,130,130);
|
||||||
|
K::GnuplotColor cH1 = K::GnuplotColor::fromRGB(170,170,170);
|
||||||
|
|
||||||
K::GnuplotColor cO = K::GnuplotColor::fromRGB(0,128,0);
|
K::GnuplotColor cO = K::GnuplotColor::fromRGB(0,128,0);
|
||||||
K::GnuplotColor cI = K::GnuplotColor::fromRGB(190,190,190);
|
|
||||||
|
K::GnuplotColor cI0 = K::GnuplotColor::fromRGB(150,150,150);
|
||||||
|
K::GnuplotColor cI1 = K::GnuplotColor::fromRGB(190,190,190);
|
||||||
|
K::GnuplotColor cI2 = K::GnuplotColor::fromRGB(210,210,210);
|
||||||
|
K::GnuplotColor cI3 = K::GnuplotColor::fromRGB(230,230,230);
|
||||||
|
|
||||||
// floor 0
|
// floor 0
|
||||||
pt.addBBoxes(bboxes0H, cH);
|
pt.addBBoxes(bboxes0H, cH0);
|
||||||
pt.addBBoxes(bboxes0O, cO);
|
pt.addBBoxes(bboxes0O, cO);
|
||||||
pt.addBBoxes(bboxes0I, cI);
|
pt.addBBoxes(bboxes0I, cI0);
|
||||||
|
|
||||||
// floor 1
|
// floor 1
|
||||||
pt.addBBoxes(bboxes1H, cH);
|
pt.addBBoxes(bboxes1H, cH1);
|
||||||
pt.addBBoxes(bboxes1O, cO);
|
pt.addBBoxes(bboxes1O, cO);
|
||||||
pt.addBBoxes(bboxes1I, cI);
|
pt.addBBoxes(bboxes1I, cI1);
|
||||||
|
|
||||||
// floor 2
|
// floor 2
|
||||||
pt.addBBoxes(bboxes2H, cH);
|
pt.addBBoxes(_bboxes2H, cI2);
|
||||||
|
|
||||||
// floor 3
|
// floor 3
|
||||||
pt.addBBoxes(bboxes3H, cH);
|
pt.addBBoxes(_bboxes3H, cI3);
|
||||||
|
|
||||||
|
pt.splot.getObjects().reOrderByZIndex();
|
||||||
|
pt.plot();
|
||||||
|
|
||||||
|
pt.gp << "unset border\n";
|
||||||
|
pt.gp << "set view equal xy\n";
|
||||||
|
pt.splot.getView().setCamera(74, 30);
|
||||||
|
pt.splot.getView().setScaleAll(3.8);
|
||||||
|
pt.splot.getAxisZ().setRange(-8.000000,19.500000);
|
||||||
|
pt.splot.getAxisX().setTicsVisible(false);
|
||||||
|
pt.splot.getAxisY().setTicsVisible(false);
|
||||||
|
pt.splot.getAxisZ().setTicsVisible(false);
|
||||||
|
pt.gp.writePlotToFile(Settings::fPathGFX + "/model-bboxes.gp");
|
||||||
|
pt.gp.setTerminal("epslatex", K::GnuplotSize(8.3, 4.5));
|
||||||
|
pt.gp.setOutput(Settings::fPathGFX + "/model-bboxes.tex");
|
||||||
pt.plot();
|
pt.plot();
|
||||||
|
|
||||||
int i = 0; (void) i;
|
int i = 0; (void) i;
|
||||||
@@ -673,7 +694,7 @@ void paperOutputs() {
|
|||||||
// perform varios AP-param optimizations
|
// perform varios AP-param optimizations
|
||||||
// generate error plot showing the performance of each
|
// generate error plot showing the performance of each
|
||||||
// save the resulting wifi-models to XML for later re-use during the walk-eval <<<<<< !!!!
|
// save the resulting wifi-models to XML for later re-use during the walk-eval <<<<<< !!!!
|
||||||
if (1 == 1) {
|
if (1 == 0) {
|
||||||
rebuildAllModels(map, 0);
|
rebuildAllModels(map, 0);
|
||||||
/** detailled error analysis for above optimization routine */
|
/** detailled error analysis for above optimization routine */
|
||||||
|
|
||||||
@@ -716,28 +737,53 @@ void paperOutputs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** plot wifi eval results */
|
/** plot wifi eval results */
|
||||||
if (1 == 0) {
|
if (1 == 1) {
|
||||||
|
|
||||||
WiFiFingerprints fps;
|
WiFiFingerprints fps;
|
||||||
fps.load(Settings::fCalib);
|
fps.load(Settings::fCalib);
|
||||||
|
|
||||||
EvalWiFiOptResult eval1(Settings::fMap);
|
|
||||||
eval1.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos, fps);
|
|
||||||
|
|
||||||
EvalWiFiOptResult eval2(Settings::fMap);
|
EvalWiFiOptResult eval2(Settings::fMap);
|
||||||
eval2.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiAllFixed, fps);
|
Plotty* p1 = eval2.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiAllFixed, fps);
|
||||||
|
|
||||||
|
EvalWiFiOptResult eval1(Settings::fMap);
|
||||||
|
Plotty* p2 = eval1.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos, fps);
|
||||||
|
|
||||||
// advanced model [1 model per floor]
|
// advanced model [1 model per floor]
|
||||||
EvalWiFiOptResult evalfloor(Settings::fMap);
|
//EvalWiFiOptResult evalfloor(Settings::fMap);
|
||||||
evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only0th, fps);
|
//evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only0th, fps);
|
||||||
evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only1st, fps);
|
//evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only1st, fps);
|
||||||
evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only2nd, fps);
|
//evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only2nd, fps);
|
||||||
evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only3rd, fps);
|
//evalfloor.showErrorPerFingerprint<WiFiModelLogDistCeiling>(Settings::wifiEachOptParPos_only3rd, fps);
|
||||||
evalfloor.showErrorPerFingerprint<WiFiModelPerFloor>(Settings::wifiEachOptParPos_multimodel, fps);
|
//evalfloor.showErrorPerFingerprint<WiFiModelPerFloor>(Settings::wifiEachOptParPos_multimodel, fps);
|
||||||
|
|
||||||
// more advanved model [1 model per bbox-region]
|
// more advanved model [1 model per bbox-region]
|
||||||
EvalWiFiOptResult evalBBox(Settings::fMap);
|
EvalWiFiOptResult evalBBox(Settings::fMap);
|
||||||
evalBBox.showErrorPerFingerprint<WiFiModelPerBBox>(Settings::wifiEachOptParPos_perBBox, fps);
|
Plotty* p3 = evalBBox.showErrorPerFingerprint<WiFiModelPerBBox>(Settings::wifiEachOptParPos_perBBox, fps);
|
||||||
|
|
||||||
|
K::GnuplotSize size(3.75, 2.8);
|
||||||
|
const float s = 4.6;
|
||||||
|
|
||||||
|
auto adjust = [&] (Plotty* pp) {
|
||||||
|
pp->gp.setTerminal("epslatex", size);
|
||||||
|
pp->splot.setTitle("");
|
||||||
|
pp->splot.getView().setCamera(74, 30);
|
||||||
|
pp->splot.getView().setScaleAll(s);
|
||||||
|
pp->splot.getAxisZ().setRange(K::GnuplotAxis::Range(-3, 15.5));
|
||||||
|
pp->plot();
|
||||||
|
};
|
||||||
|
|
||||||
|
p1->gp.writePlotToFile(Settings::fPathGFX + "wifiMaxErrorNN_opt0.gp");
|
||||||
|
p1->gp.setOutput(Settings::fPathGFX + "wifiMaxErrorNN_opt0.tex");
|
||||||
|
adjust(p1);
|
||||||
|
|
||||||
|
p2->gp.writePlotToFile(Settings::fPathGFX + "wifiMaxErrorNN_opt3.gp");
|
||||||
|
p2->gp.setOutput(Settings::fPathGFX + "wifiMaxErrorNN_opt3.tex");
|
||||||
|
adjust(p2);
|
||||||
|
|
||||||
|
p3->gp.writePlotToFile(Settings::fPathGFX + "wifiMaxErrorNN_opt5.gp");
|
||||||
|
p3->gp.setOutput(Settings::fPathGFX + "wifiMaxErrorNN_opt5.tex");
|
||||||
|
adjust(p3);
|
||||||
|
|
||||||
|
|
||||||
int i = 0; (void) i;
|
int i = 0; (void) i;
|
||||||
|
|
||||||
@@ -902,7 +948,7 @@ int main(void) {
|
|||||||
//const float rssi = LogDistanceModel::distanceToRssi(-100, 0, 999);
|
//const float rssi = LogDistanceModel::distanceToRssi(-100, 0, 999);
|
||||||
//int i = 0; (void) i;
|
//int i = 0; (void) i;
|
||||||
|
|
||||||
//paperOutputs(); return 0;
|
paperOutputs(); return 0;
|
||||||
|
|
||||||
//showFingerprintsFor(Settings::fMap, Settings::fCalib, "D8:84:66:4A:4A:D0");
|
//showFingerprintsFor(Settings::fMap, Settings::fCalib, "D8:84:66:4A:4A:D0");
|
||||||
//showModelFor(Settings::fMap, Settings::wifiEachOptParPos_multimodel, "D8:84:66:4A:4A:D0");
|
//showModelFor(Settings::fMap, Settings::wifiEachOptParPos_multimodel, "D8:84:66:4A:4A:D0");
|
||||||
|
|||||||
@@ -337,6 +337,7 @@ public:
|
|||||||
pefAll->writePlotToFile(Settings::fPathGFX + "/overall-system-error.gp");
|
pefAll->writePlotToFile(Settings::fPathGFX + "/overall-system-error.gp");
|
||||||
pefAll->getPlot().getMargin().set(4, 0.2, 0.1, 1.8);
|
pefAll->getPlot().getMargin().set(4, 0.2, 0.1, 1.8);
|
||||||
pefAll->getPlot().setStringMod(new K::GnuplotStringModLaTeX());
|
pefAll->getPlot().setStringMod(new K::GnuplotStringModLaTeX());
|
||||||
|
|
||||||
pefAll->getPlot().getKey().setVisible(true);
|
pefAll->getPlot().getKey().setVisible(true);
|
||||||
pefAll->getPlot().getKey().setPosition(K::GnuplotKey::Hor::RIGHT, K::GnuplotKey::Ver::BOTTOM);
|
pefAll->getPlot().getKey().setPosition(K::GnuplotKey::Hor::RIGHT, K::GnuplotKey::Ver::BOTTOM);
|
||||||
pefAll->getPlot().getKey().setWidthIncrement(7);
|
pefAll->getPlot().getKey().setWidthIncrement(7);
|
||||||
|
|||||||
100
plots/Plotty.h
100
plots/Plotty.h
@@ -118,6 +118,7 @@ public:
|
|||||||
bool stairs = true;
|
bool stairs = true;
|
||||||
bool obstacles = true;
|
bool obstacles = true;
|
||||||
bool outline = true;
|
bool outline = true;
|
||||||
|
bool outlineColorCustom = false;
|
||||||
K::GnuplotColor outlineColor = K::GnuplotColor::fromRGB(128,128,128);
|
K::GnuplotColor outlineColor = K::GnuplotColor::fromRGB(128,128,128);
|
||||||
float minZ = -9999;
|
float minZ = -9999;
|
||||||
float maxZ = +9999;
|
float maxZ = +9999;
|
||||||
@@ -168,34 +169,89 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void addBBoxes(const BBoxes3& boxes, const K::GnuplotColor& c) {
|
void addBBoxes(const BBoxes3& boxes, const K::GnuplotColor& c) {
|
||||||
for (const BBox3& bb : boxes.get()) {
|
for (BBox3 bb : boxes.get()) {
|
||||||
addBBoxPoly(bb, c);
|
//&&addBBoxPoly(bb, c);
|
||||||
|
//bb.shrink(0.98);
|
||||||
|
addBBoxPoly2(bb, c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void addBBoxPoly2(const BBox3& bb, const K::GnuplotColor& color) {
|
||||||
|
|
||||||
|
|
||||||
|
K::GnuplotFill filler = K::GnuplotFill(K::GnuplotFillStyle::SOLID, color);
|
||||||
|
K::GnuplotStroke stroke(K::GnuplotDashtype::NONE, 1, color);
|
||||||
|
|
||||||
|
K::GnuplotObjectPolygon* gpol1 = new K::GnuplotObjectPolygon(filler, stroke);
|
||||||
|
gpol1->add(K::GnuplotCoordinate3(bb.getMin().x, bb.getMin().y, bb.getMin().z, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol1->add(K::GnuplotCoordinate3(bb.getMax().x, bb.getMin().y, bb.getMin().z, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol1->add(K::GnuplotCoordinate3(bb.getMax().x, bb.getMax().y, bb.getMin().z, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol1->add(K::GnuplotCoordinate3(bb.getMin().x, bb.getMax().y, bb.getMin().z, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol1->close();
|
||||||
|
gpol1->setZIndex(bb.getMin().z - 0.1);
|
||||||
|
splot.getObjects().add(gpol1);
|
||||||
|
|
||||||
|
K::GnuplotColor color2 = K::GnuplotColor::fromRGB(128,128,128);
|
||||||
|
K::GnuplotStroke stroke2(K::GnuplotDashtype::NONE, 1, color2);
|
||||||
|
K::GnuplotFill noFiller = K::GnuplotFill(K::GnuplotFillStyle::EMPTY_BORDER, color2);
|
||||||
|
|
||||||
|
K::GnuplotObjectPolygon* gpol2 = new K::GnuplotObjectPolygon(noFiller, stroke2);
|
||||||
|
gpol2->add(K::GnuplotCoordinate3(bb.getMin().x, bb.getMin().y, bb.getMax().z-2, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol2->add(K::GnuplotCoordinate3(bb.getMax().x, bb.getMin().y, bb.getMax().z-2, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol2->add(K::GnuplotCoordinate3(bb.getMax().x, bb.getMax().y, bb.getMax().z-2, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol2->add(K::GnuplotCoordinate3(bb.getMin().x, bb.getMax().y, bb.getMax().z-2, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol2->close();
|
||||||
|
gpol2->setZIndex(bb.getMin().z + 3.1);
|
||||||
|
splot.getObjects().add(gpol2);
|
||||||
|
|
||||||
|
K::GnuplotObjectPolygon* gpol3a = new K::GnuplotObjectPolygon(noFiller, stroke2);
|
||||||
|
gpol3a->add(K::GnuplotCoordinate3(bb.getMin().x, bb.getMin().y, bb.getMin().z, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol3a->add(K::GnuplotCoordinate3(bb.getMin().x, bb.getMin().y, bb.getMax().z-2, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol3a->setZIndex(bb.getMin().z + 1.1);
|
||||||
|
splot.getObjects().add(gpol3a);
|
||||||
|
K::GnuplotObjectPolygon* gpol3b = new K::GnuplotObjectPolygon(noFiller, stroke2);
|
||||||
|
gpol3b->add(K::GnuplotCoordinate3(bb.getMax().x, bb.getMin().y, bb.getMin().z, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol3b->add(K::GnuplotCoordinate3(bb.getMax().x, bb.getMin().y, bb.getMax().z-2, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol3b->setZIndex(bb.getMin().z + 1.1);
|
||||||
|
splot.getObjects().add(gpol3b);
|
||||||
|
K::GnuplotObjectPolygon* gpol3c = new K::GnuplotObjectPolygon(noFiller, stroke2);
|
||||||
|
gpol3c->add(K::GnuplotCoordinate3(bb.getMin().x, bb.getMax().y, bb.getMin().z, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol3c->add(K::GnuplotCoordinate3(bb.getMin().x, bb.getMax().y, bb.getMax().z-2, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol3c->setZIndex(bb.getMin().z + 1.1);
|
||||||
|
splot.getObjects().add(gpol3c);
|
||||||
|
K::GnuplotObjectPolygon* gpol3d = new K::GnuplotObjectPolygon(noFiller, stroke2);
|
||||||
|
gpol3d->add(K::GnuplotCoordinate3(bb.getMax().x, bb.getMax().y, bb.getMin().z, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol3d->add(K::GnuplotCoordinate3(bb.getMax().x, bb.getMax().y, bb.getMax().z-2, K::GnuplotCoordinateSystem::FIRST));
|
||||||
|
gpol3d->setZIndex(bb.getMin().z + 1.1);
|
||||||
|
splot.getObjects().add(gpol3d);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void addBBox(const BBox3& bb) {
|
void addBBox(const BBox3& bb) {
|
||||||
|
|
||||||
// floor
|
|
||||||
mapBBoxes.add({bb.getMin().x, bb.getMin().y, bb.getMin().z});
|
|
||||||
mapBBoxes.add({bb.getMax().x, bb.getMin().y, bb.getMin().z});
|
|
||||||
mapBBoxes.add({bb.getMax().x, bb.getMax().y, bb.getMin().z});
|
|
||||||
mapBBoxes.add({bb.getMin().x, bb.getMax().y, bb.getMin().z});
|
|
||||||
mapBBoxes.add({bb.getMin().x, bb.getMin().y, bb.getMin().z});
|
|
||||||
mapBBoxes.splitFace(); mapBBoxes.splitFace();
|
|
||||||
|
|
||||||
// ceil
|
// // floor
|
||||||
mapBBoxes.add({bb.getMin().x, bb.getMin().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMin().x, bb.getMin().y, bb.getMin().z});
|
||||||
mapBBoxes.add({bb.getMax().x, bb.getMin().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMax().x, bb.getMin().y, bb.getMin().z});
|
||||||
mapBBoxes.add({bb.getMax().x, bb.getMax().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMax().x, bb.getMax().y, bb.getMin().z});
|
||||||
mapBBoxes.add({bb.getMin().x, bb.getMax().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMin().x, bb.getMax().y, bb.getMin().z});
|
||||||
mapBBoxes.add({bb.getMin().x, bb.getMin().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMin().x, bb.getMin().y, bb.getMin().z});
|
||||||
mapBBoxes.splitFace(); mapBBoxes.splitFace();
|
// mapBBoxes.splitFace(); mapBBoxes.splitFace();
|
||||||
|
|
||||||
// up
|
// // ceil
|
||||||
mapBBoxes.addSegment({bb.getMin().x, bb.getMin().y, bb.getMin().z}, {bb.getMin().x, bb.getMin().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMin().x, bb.getMin().y, bb.getMax().z});
|
||||||
mapBBoxes.addSegment({bb.getMax().x, bb.getMin().y, bb.getMin().z}, {bb.getMax().x, bb.getMin().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMax().x, bb.getMin().y, bb.getMax().z});
|
||||||
mapBBoxes.addSegment({bb.getMin().x, bb.getMax().y, bb.getMin().z}, {bb.getMin().x, bb.getMax().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMax().x, bb.getMax().y, bb.getMax().z});
|
||||||
mapBBoxes.addSegment({bb.getMax().x, bb.getMax().y, bb.getMin().z}, {bb.getMax().x, bb.getMax().y, bb.getMax().z});
|
// mapBBoxes.add({bb.getMin().x, bb.getMax().y, bb.getMax().z});
|
||||||
|
// mapBBoxes.add({bb.getMin().x, bb.getMin().y, bb.getMax().z});
|
||||||
|
// mapBBoxes.splitFace(); mapBBoxes.splitFace();
|
||||||
|
|
||||||
|
// // up
|
||||||
|
// mapBBoxes.addSegment({bb.getMin().x, bb.getMin().y, bb.getMin().z}, {bb.getMin().x, bb.getMin().y, bb.getMax().z});
|
||||||
|
// mapBBoxes.addSegment({bb.getMax().x, bb.getMin().y, bb.getMin().z}, {bb.getMax().x, bb.getMin().y, bb.getMax().z});
|
||||||
|
// mapBBoxes.addSegment({bb.getMin().x, bb.getMax().y, bb.getMin().z}, {bb.getMin().x, bb.getMax().y, bb.getMax().z});
|
||||||
|
// mapBBoxes.addSegment({bb.getMax().x, bb.getMax().y, bb.getMin().z}, {bb.getMax().x, bb.getMax().y, bb.getMax().z});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,7 +548,7 @@ public:
|
|||||||
const float v = 140 + vo;
|
const float v = 140 + vo;
|
||||||
|
|
||||||
// drawing outlines as polygon is a hack for correct depth-order in gnuplot
|
// drawing outlines as polygon is a hack for correct depth-order in gnuplot
|
||||||
K::GnuplotColor color = K::GnuplotColor::fromRGB(v,v,v);
|
K::GnuplotColor color = (settings.outlineColorCustom) ? (settings.outlineColor) : (K::GnuplotColor::fromRGB(v,v,v));
|
||||||
K::GnuplotFill filler = K::GnuplotFill(K::GnuplotFillStyle::EMPTY_BORDER, color);
|
K::GnuplotFill filler = K::GnuplotFill(K::GnuplotFillStyle::EMPTY_BORDER, color);
|
||||||
K::GnuplotStroke stroke(K::GnuplotDashtype::NONE, 1, color);
|
K::GnuplotStroke stroke(K::GnuplotDashtype::NONE, 1, color);
|
||||||
//K::GnuplotObjectPolygon* gpol = new K::GnuplotObjectPolygon(K::GnuplotFill::NONE(), stroke);
|
//K::GnuplotObjectPolygon* gpol = new K::GnuplotObjectPolygon(K::GnuplotFill::NONE(), stroke);
|
||||||
|
|||||||
@@ -4,12 +4,12 @@
|
|||||||
|
|
||||||
All optimizations and evaluations took place within two adjacent buildings (4 and 2 floors, respectively)
|
All optimizations and evaluations took place within two adjacent buildings (4 and 2 floors, respectively)
|
||||||
and two connected outdoor regions (entrance and inner courtyard),
|
and two connected outdoor regions (entrance and inner courtyard),
|
||||||
yielding a total size of \SI{110}{\meter} x \SI{60}{\meter}.
|
\SI{110}{\meter} x \SI{60}{\meter} in size.
|
||||||
|
|
||||||
Within all \docWIFI{} observations we only consider the \docAP{}s that are permanently installed,
|
Within all \docWIFI{} observations we only consider the \docAP{}s that are permanently installed,
|
||||||
and can be identified by their well-known MAC address.
|
and can be identified by their well-known MAC address.
|
||||||
Temporal and movable transmitters are ignored as they might cause estimation errors.
|
Temporal and movable transmitters like smart TVs or smartphone hotspots are ignored as they might cause estimation errors.
|
||||||
|
%
|
||||||
Unfortunately, due to non-disclosure agreements, we are not allowed to depict the actual location
|
Unfortunately, due to non-disclosure agreements, we are not allowed to depict the actual location
|
||||||
of installed transmitters within the following figures.
|
of installed transmitters within the following figures.
|
||||||
|
|
||||||
@@ -28,37 +28,58 @@
|
|||||||
|
|
||||||
\subsection{Model optimization}
|
\subsection{Model optimization}
|
||||||
|
|
||||||
As the signal strength prediction model is the heart of the absolute positioning component
|
As the signal strength prediction model is the core of the absolute positioning component
|
||||||
described in \ref{sec:system} we start with the model parameter estimation (see \ref{sec:optimization}) for
|
described in section \ref{sec:system}, we start with the model parameter estimation (see \ref{sec:optimization}) for
|
||||||
\mTXP, \mPLE and \mWAF based on some reference measurements and compare the results
|
\mTXP{}, \mPLE{} and \mWAF{} based on some reference measurements and compare the results
|
||||||
between various optimization strategies and a basic empiric choice of \mTXP = \SI{-40}{\decibel{}m} @ \SI{1}{\meter}
|
between various optimization strategies and a basic empiric choice of \mTXP{} = \SI{-40}{\decibel{}m} @ \SI{1}{\meter}
|
||||||
(defined by the usual \docAPshort{} transmit power for europe), a path loss exponent $\mPLE \approx $ \SI{2.5} and
|
(defined by the usual \docAPshort{} transmit power for europe), a path loss exponent $\mPLE{} \approx $ \SI{2.5} and
|
||||||
$\mWAF \approx$ \SI{-8}{\decibel} per floor/ceiling (made of reinforced concrete) \todo{cite für werte}.
|
$\mWAF{} \approx$ \SI{-8}{\decibel} per floor / ceiling (made of reinforced concrete) \todo{cite für werte}.
|
||||||
|
|
||||||
Figure \ref{fig:referenceMeasurements} depicts the location of the used 121 reference measurements.
|
Figure \ref{fig:referenceMeasurements} depicts the location of the used 121 reference measurements.
|
||||||
Each location was scanned 30 times ($\approx$ \SI{25}{\second} scan time),
|
Each location was scanned 30 times ($\approx$ \SI{25}{\second} scan time),
|
||||||
non permanent \docAP{}s were removed, the values were grouped per physical transmitter (see \ref{sec:vap})
|
non permanent \docAP{}s were removed, the values were grouped per physical transmitter (see \ref{sec:vap})
|
||||||
and aggregated to form the average signal strength per transmitter.
|
and aggregated to form the average signal strength per transmitter.
|
||||||
|
|
||||||
% used reference measurements
|
|
||||||
\begin{figure}
|
\begin{figure}
|
||||||
{
|
\begin{subfigure}[t!]{0.48\textwidth}
|
||||||
\centering
|
\input{gfx2/all_fingerprints.tex}
|
||||||
\input{gfx/all_fingerprints.tex}
|
\caption{
|
||||||
}
|
The size of each square denotes the number of permanently installed \docAPshort{}s
|
||||||
\caption{
|
that were visible while scanning, and ranges between 2 and 22 with an average of 9.
|
||||||
Locations of the 121 reference measurements.
|
}
|
||||||
The size of each square denotes the number of permanently installed \docAPshort{}s
|
\label{fig:referenceMeasurements}
|
||||||
that are visible at this location,
|
\end{subfigure}
|
||||||
and ranges between 2 and 22 with an average of 9.
|
\enskip\enskip
|
||||||
}
|
\begin{subfigure}[t!]{0.48\textwidth}
|
||||||
\label{fig:referenceMeasurements}
|
\input{gfx2/model-bboxes.tex}
|
||||||
|
\caption{
|
||||||
|
More than one bounding box is needed for each model to approximate the building's shape.
|
||||||
|
Each distinct floor-color denotes a single model (7 in total).
|
||||||
|
}
|
||||||
|
\label{fig:modelBBoxes}
|
||||||
|
\end{subfigure}
|
||||||
|
\caption{Locations of the 121 reference measurements (left) and bounding-boxes used for {\em \optPerRegion{}} (right).}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
% used reference measurements
|
||||||
|
%\begin{figure}
|
||||||
|
% {
|
||||||
|
% \centering
|
||||||
|
% \input{gfx/all_fingerprints.tex}
|
||||||
|
% }
|
||||||
|
% \caption{
|
||||||
|
% Locations of the 121 reference measurements.
|
||||||
|
% The size of each square denotes the number of permanently installed \docAPshort{}s
|
||||||
|
% that are visible at this location,
|
||||||
|
% and ranges between 2 and 22 with an average of 9.
|
||||||
|
% }
|
||||||
|
% \label{fig:referenceMeasurements}
|
||||||
|
%\end{figure}
|
||||||
|
|
||||||
% visible APs:
|
% visible APs:
|
||||||
% cnt(121) min(2.000000) max(22.000000) range(20.000000) med(8.000000) avg(9.322314) stdDev(4.386709)
|
% cnt(121) min(2.000000) max(22.000000) range(20.000000) med(8.000000) avg(9.322314) stdDev(4.386709)
|
||||||
|
|
||||||
\begin{figure}[b]
|
\begin{figure}
|
||||||
\centering
|
\centering
|
||||||
\input{gfx/compare-wifi-in-out.tex}
|
\input{gfx/compare-wifi-in-out.tex}
|
||||||
\caption{
|
\caption{
|
||||||
@@ -83,7 +104,7 @@
|
|||||||
with its position, which is well known from the floorplan.
|
with its position, which is well known from the floorplan.
|
||||||
|
|
||||||
{\em\optParamsAllAP{}} is the same as above, except that the three parameters are optimized
|
{\em\optParamsAllAP{}} is the same as above, except that the three parameters are optimized
|
||||||
using the reference measurements.
|
using the reference measurements. However, all transmitters share the same three parameters.
|
||||||
|
|
||||||
{\em\optParamsEachAP{}} optimizes the three parameters per \docAP{} instead of using the same
|
{\em\optParamsEachAP{}} optimizes the three parameters per \docAP{} instead of using the same
|
||||||
parameters for all.
|
parameters for all.
|
||||||
@@ -93,8 +114,7 @@
|
|||||||
|
|
||||||
{\em\optPerFloor{}} and {\em\optPerRegion{}} are just like \optParamsPosEachAP{} except that
|
{\em\optPerFloor{}} and {\em\optPerRegion{}} are just like \optParamsPosEachAP{} except that
|
||||||
there are several sub-models that are optimized for one floor / region instead of the whole building.
|
there are several sub-models that are optimized for one floor / region instead of the whole building.
|
||||||
|
The chosen bounding boxes and resulting sub-models are depicted in figure \ref{fig:modelBBoxes}.
|
||||||
\todo{grafik, die die regionen zeigt???}
|
|
||||||
|
|
||||||
Figure \ref{fig:wifiModelError} shows the optimization results for all strategies, which are as expected:
|
Figure \ref{fig:wifiModelError} shows the optimization results for all strategies, which are as expected:
|
||||||
The estimation error is indirectly proportional to the number of optimized parameters.
|
The estimation error is indirectly proportional to the number of optimized parameters.
|
||||||
@@ -108,15 +128,40 @@
|
|||||||
For \SI{68}{\percent} of all installed transmitters, the estimated floor-number matched the real location.
|
For \SI{68}{\percent} of all installed transmitters, the estimated floor-number matched the real location.
|
||||||
|
|
||||||
\begin{figure}
|
\begin{figure}
|
||||||
\input{gfx/wifi_model_error_0_95.tex}
|
\begin{subfigure}{0.52\textwidth}
|
||||||
%\input{gfx/wifi_model_error_95_100.tex}
|
\input{gfx2/wifi_model_error_0_95.tex}
|
||||||
|
\end{subfigure}
|
||||||
|
\begin{subfigure}{0.23\textwidth}
|
||||||
|
\input{gfx/wifiMaxErrorNN_opt0.tex}
|
||||||
|
\caption{\em \noOptEmpiric{}}
|
||||||
|
\end{subfigure}
|
||||||
|
%\begin{subfigure}{0.25\textwidth}
|
||||||
|
% \input{gfx/wifiMaxErrorNN_opt3.tex}
|
||||||
|
%\end{subfigure}
|
||||||
|
\begin{subfigure}{0.23\textwidth}
|
||||||
|
\input{gfx/wifiMaxErrorNN_opt5.tex}
|
||||||
|
\caption{\em \optPerRegion{}}
|
||||||
|
\end{subfigure}
|
||||||
\caption{
|
\caption{
|
||||||
Comparison between different optimization strategies by examining the error (in \decibel) at each reference measurement.
|
Comparison between different optimization strategies by examining the error (in \decibel) at each reference measurement.
|
||||||
The higher the number of variable parameters, the better the model resembles real world conditions.
|
The higher the number of variable parameters, the better the model resembles real world conditions.
|
||||||
|
Both figures on the right depict the highest error for each reference measurement, where full red means $\ge$ \SI{20}{\decibel}.
|
||||||
}
|
}
|
||||||
\label{fig:wifiModelError}
|
\label{fig:wifiModelError}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%\begin{figure}
|
||||||
|
% \input{gfx/wifi_model_error_0_95.tex}
|
||||||
|
% %\input{gfx/wifi_model_error_95_100.tex}
|
||||||
|
% \caption{
|
||||||
|
% Comparison between different optimization strategies by examining the error (in \decibel) at each reference measurement.
|
||||||
|
% The higher the number of variable parameters, the better the model resembles real world conditions.
|
||||||
|
% }
|
||||||
|
% \label{fig:wifiModelError}
|
||||||
|
%\end{figure}
|
||||||
|
|
||||||
% statds:
|
% statds:
|
||||||
%TXP: cnt(34) min(-67.698959) max(4.299183) range(71.998146) med(-41.961170) avg(-41.659286) stdDev(17.742294)
|
%TXP: cnt(34) min(-67.698959) max(4.299183) range(71.998146) med(-41.961170) avg(-41.659286) stdDev(17.742294)
|
||||||
%EXP: cnt(34) min(0.932817) max(4.699000) range(3.766183) med(2.380410) avg(2.546959) stdDev(1.074687)
|
%EXP: cnt(34) min(0.932817) max(4.699000) range(3.766183) med(2.380410) avg(2.546959) stdDev(1.074687)
|
||||||
@@ -149,17 +194,34 @@
|
|||||||
(average \SIrange{2.0}{6.2}{\decibel}), as it needs at least a certain number of measurements for each
|
(average \SIrange{2.0}{6.2}{\decibel}), as it needs at least a certain number of measurements for each
|
||||||
of its regions for the optimization to converge.
|
of its regions for the optimization to converge.
|
||||||
|
|
||||||
\begin{figure}[b]
|
\begin{figure}
|
||||||
\input{gfx/wifi_model_error_num_fingerprints_method_5_0_90.tex}
|
\begin{subfigure}{0.49\textwidth}
|
||||||
\input{gfx/wifi_model_error_num_fingerprints_method_5_90_100.tex}
|
\input{gfx2/wifi_model_error_num_fingerprints_method_5_0_90.tex}
|
||||||
\caption{%
|
\end{subfigure}
|
||||||
Impact of reducing the number of reference measurements during optimization on {\em \optPerRegion{}}.
|
\begin{subfigure}{0.49\textwidth}
|
||||||
The model's cumulative error distribution is determined by comparing the its signal strength prediction against all 121 measurements.
|
\input{gfx2/wifi_model_error_num_fingerprints_method_5_90_100.tex}
|
||||||
|
\end{subfigure}
|
||||||
|
\caption{
|
||||||
|
Impact of reducing the number of reference measurements for optimizing {\em \optPerRegion{}}.
|
||||||
|
The cumulative error distribution is determined by comparing its signal strength prediction against all 121 measurements.
|
||||||
While using only \SI{50}{\percent} of the 121 scans has barely an impact on the error,
|
While using only \SI{50}{\percent} of the 121 scans has barely an impact on the error,
|
||||||
30 measurements (\SI{25}{\percent}) are clearly insufficient.
|
30 measurements (\SI{25}{\percent}) are clearly insufficient.
|
||||||
}%
|
}
|
||||||
\label{fig:wifiNumFingerprints}%
|
\label{fig:wifiNumFingerprints}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
%\begin{figure}[b]
|
||||||
|
% \input{gfx/wifi_model_error_num_fingerprints_method_5_0_90.tex}
|
||||||
|
% \input{gfx/wifi_model_error_num_fingerprints_method_5_90_100.tex}
|
||||||
|
% \caption{%
|
||||||
|
% Impact of reducing the number of reference measurements during optimization on {\em \optPerRegion{}}.
|
||||||
|
% The model's cumulative error distribution is determined by comparing the its signal strength prediction against all 121 measurements.
|
||||||
|
% While using only \SI{50}{\percent} of the 121 scans has barely an impact on the error,
|
||||||
|
% 30 measurements (\SI{25}{\percent}) are clearly insufficient.
|
||||||
|
% }%
|
||||||
|
% \label{fig:wifiNumFingerprints}%
|
||||||
|
%\end{figure}
|
||||||
|
|
||||||
Figure \ref{fig:wifiNumFingerprints} depicts the impact of reducing the number of reference measurements
|
Figure \ref{fig:wifiNumFingerprints} depicts the impact of reducing the number of reference measurements
|
||||||
during the optimization process for the {\em \optPerRegion{}} strategy.
|
during the optimization process for the {\em \optPerRegion{}} strategy.
|
||||||
|
|||||||
@@ -147,7 +147,7 @@
|
|||||||
\centering
|
\centering
|
||||||
\begin{subfigure}{0.48\textwidth}
|
\begin{subfigure}{0.48\textwidth}
|
||||||
%\centering
|
%\centering
|
||||||
\input{gfx/wifiop_show_optfunc_params}
|
\input{gfx2/wifiop_show_optfunc_params}
|
||||||
\caption{
|
\caption{
|
||||||
Modifying \docTXP{} \mTXP{} and \docEXP{} \mPLE{}
|
Modifying \docTXP{} \mTXP{} and \docEXP{} \mPLE{}
|
||||||
[known position $\mPosAPVec{}$, fixed \mWAF{}] denotes a convex function.
|
[known position $\mPosAPVec{}$, fixed \mWAF{}] denotes a convex function.
|
||||||
@@ -157,7 +157,7 @@
|
|||||||
\enskip\enskip
|
\enskip\enskip
|
||||||
\begin{subfigure}{0.48\textwidth}
|
\begin{subfigure}{0.48\textwidth}
|
||||||
%\centering
|
%\centering
|
||||||
\input{gfx/wifiop_show_optfunc_pos_yz}
|
\input{gfx2/wifiop_show_optfunc_pos_yz}
|
||||||
\caption{
|
\caption{
|
||||||
Modifying $y$- and $z$-position [fixed $x$, \mTXP{}, \mPLE{} and \mWAF{}]
|
Modifying $y$- and $z$-position [fixed $x$, \mTXP{}, \mPLE{} and \mWAF{}]
|
||||||
denotes a non-convex function with multiple local minima.
|
denotes a non-convex function with multiple local minima.
|
||||||
|
|||||||
Reference in New Issue
Block a user