code that runs the final eval
TeX update
This commit is contained in:
@@ -44,6 +44,10 @@ FILE(GLOB SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# use openMP
|
||||||
|
find_package(OpenMP REQUIRED)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
|
||||||
|
|
||||||
# system specific compiler flags
|
# system specific compiler flags
|
||||||
ADD_DEFINITIONS(
|
ADD_DEFINITIONS(
|
||||||
@@ -58,7 +62,7 @@ ADD_DEFINITIONS(
|
|||||||
-fstack-protector-all
|
-fstack-protector-all
|
||||||
|
|
||||||
-g3
|
-g3
|
||||||
-O2
|
-O0
|
||||||
-march=native
|
-march=native
|
||||||
|
|
||||||
-DWITH_TESTS
|
-DWITH_TESTS
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ namespace Settings {
|
|||||||
|
|
||||||
const std::string fPathGFX = pathbase + "/tex/gfx/";
|
const std::string fPathGFX = pathbase + "/tex/gfx/";
|
||||||
|
|
||||||
int numParticles = 5000;
|
int numParticles = 10000;
|
||||||
|
|
||||||
float smartphoneAboveGround = 1.3;
|
float smartphoneAboveGround = 1.3;
|
||||||
|
|
||||||
|
|||||||
7
main.cpp
7
main.cpp
@@ -987,6 +987,9 @@ int main(void) {
|
|||||||
//eval.show(Settings::path_toni_inst_2b, Settings::GroundTruth::path_toni_inst_2);
|
//eval.show(Settings::path_toni_inst_2b, Settings::GroundTruth::path_toni_inst_2);
|
||||||
eval.show(Settings::path_toni_inst_3a, Settings::GroundTruth::path_toni_inst_3);
|
eval.show(Settings::path_toni_inst_3a, Settings::GroundTruth::path_toni_inst_3);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int i = 0; (void) i;
|
int i = 0; (void) i;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -996,7 +999,9 @@ int main(void) {
|
|||||||
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(Settings::fMap);;
|
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(Settings::fMap);;
|
||||||
//EvalWalk walk(map);
|
//EvalWalk walk(map);
|
||||||
//walk.walk1();
|
//walk.walk1();
|
||||||
EvalWalk::walkEverything(map);
|
|
||||||
|
//75% quartil > 20 meter -> fehler? [verlaufen irgendwo ab der hälfte]
|
||||||
|
//EvalWalk::walkEverything(map);
|
||||||
EvalWalk::walkEverythingBuildStats(map);
|
EvalWalk::walkEverythingBuildStats(map);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
136
pf/EvalWalk.h
136
pf/EvalWalk.h
@@ -45,7 +45,7 @@
|
|||||||
#include <Indoor/sensors/offline/Listener.h>
|
#include <Indoor/sensors/offline/Listener.h>
|
||||||
|
|
||||||
|
|
||||||
#define PLOT_LIVE
|
//#define PLOT_LIVE
|
||||||
//#define PLOT_WIFI
|
//#define PLOT_WIFI
|
||||||
//#define PLOT_ERROR_TIME
|
//#define PLOT_ERROR_TIME
|
||||||
//#define PLOT_ERROR_FUNC
|
//#define PLOT_ERROR_FUNC
|
||||||
@@ -60,10 +60,21 @@ class EvalWalk : public Offline::Listener {
|
|||||||
|
|
||||||
std::string runName;
|
std::string runName;
|
||||||
|
|
||||||
|
#ifdef PLOT_LIVE
|
||||||
Plotty plotty;
|
Plotty plotty;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PLOT_WIFI
|
||||||
PlotWifiMeasurements plotWifi;
|
PlotWifiMeasurements plotWifi;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PLOT_ERROR_TIME
|
||||||
PlotErrTime pet;
|
PlotErrTime pet;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PLOT_ERROR_FUNC
|
||||||
PlotErrFunc pef;
|
PlotErrFunc pef;
|
||||||
|
#endif
|
||||||
|
|
||||||
Offline::FileReader reader;
|
Offline::FileReader reader;
|
||||||
Offline::FilePlayer player;
|
Offline::FilePlayer player;
|
||||||
@@ -91,15 +102,34 @@ class EvalWalk : public Offline::Listener {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
EvalWalk(Floorplan::IndoorMap* map) : plotty(map), map(map), em(map),
|
~EvalWalk() {
|
||||||
pet("\\small{time (sec)}", "\\small{error (m)}", "\\small{APs visible}"),
|
delete grid;
|
||||||
pef("\\small{error (m)}", "\\small{updates (\\%)}") {
|
delete pf;
|
||||||
|
}
|
||||||
|
|
||||||
|
EvalWalk(Floorplan::IndoorMap* map) :
|
||||||
|
|
||||||
|
#ifdef PLOT_LIVE
|
||||||
|
plotty(map),
|
||||||
|
#endif
|
||||||
|
|
||||||
|
map(map), em(map)
|
||||||
|
|
||||||
|
#ifdef PLOT_ERROR_TIME
|
||||||
|
,pet("\\small{time (sec)}", "\\small{error (m)}", "\\small{APs visible}")
|
||||||
|
#endif
|
||||||
|
#ifdef PLOT_ERROR_FUNC
|
||||||
|
,pef("\\small{error (m)}", "\\small{updates (\\%)}")
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
|
||||||
const std::string saveFile = Settings::pathData + "/grid.dat";
|
const std::string saveFile = Settings::pathData + "/grid.dat";
|
||||||
grid = new Grid<MyGridNode>(Settings::Grid::gridSize_cm);
|
grid = new Grid<MyGridNode>(Settings::Grid::gridSize_cm);
|
||||||
|
|
||||||
// once
|
#ifdef PLOT_LIVE
|
||||||
plotty.buildFloorplan();
|
// once
|
||||||
|
plotty.buildFloorplan();
|
||||||
|
#endif
|
||||||
|
|
||||||
// deserialize grid
|
// deserialize grid
|
||||||
std::ifstream inp(saveFile, std::ofstream::binary);
|
std::ifstream inp(saveFile, std::ofstream::binary);
|
||||||
@@ -173,12 +203,13 @@ public:
|
|||||||
|
|
||||||
struct LeModel {
|
struct LeModel {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
std::string plotKey;
|
||||||
WiFiModel* model;
|
WiFiModel* model;
|
||||||
LeModel(const std::string& name, WiFiModel* model) : name(name), model(model) {;}
|
LeModel(const std::string& name, const std::string& plotKey, WiFiModel* model) : name(name), plotKey(plotKey), model(model) {;}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void serialize(const K::Statistics<float>& stats, const LeWalk& walk, const LeModel& model, const int idx) {
|
static void serialize(const K::Statistics<float>& stats, const LeWalk& walk, const LeModel& model, const int idx) {
|
||||||
const std::string file = Settings::fPathGFX + "/walks/data/" + walk.name + "_" + model.name + "_" + std::to_string(idx) + ".txt";
|
const std::string file = Settings::fPathGFX + "/walks/data/" + model.name + "/" + walk.name + "_" + model.name + "_" + std::to_string(idx) + ".txt";
|
||||||
std::ofstream out(file);
|
std::ofstream out(file);
|
||||||
for (const float f : stats.getAll()) {
|
for (const float f : stats.getAll()) {
|
||||||
out << f << "\n";
|
out << f << "\n";
|
||||||
@@ -187,7 +218,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static K::Statistics<float>* deserialize(const LeWalk& walk, const LeModel& model, const int idx) {
|
static K::Statistics<float>* deserialize(const LeWalk& walk, const LeModel& model, const int idx) {
|
||||||
const std::string file = Settings::fPathGFX + "/walks/data/" + walk.name + "_" + model.name + "_" + std::to_string(idx) + ".txt";
|
const std::string file = Settings::fPathGFX + "/walks/data/" + model.name + "/" + walk.name + "_" + model.name + "_" + std::to_string(idx) + ".txt";
|
||||||
K::Statistics<float>* res = new K::Statistics<float>();
|
K::Statistics<float>* res = new K::Statistics<float>();
|
||||||
std::ifstream inp(file);
|
std::ifstream inp(file);
|
||||||
while(inp) {
|
while(inp) {
|
||||||
@@ -221,16 +252,16 @@ public:
|
|||||||
static std::vector<LeModel> allModels(Floorplan::IndoorMap* map) {
|
static std::vector<LeModel> allModels(Floorplan::IndoorMap* map) {
|
||||||
WiFiModelFactory fac(map);
|
WiFiModelFactory fac(map);
|
||||||
return {
|
return {
|
||||||
//LeModel("empiric", fac.loadXML(Settings::wifiAllFixed)),
|
LeModel("empiric", "\\noOptEmpiric{}", fac.loadXML(Settings::wifiAllFixed)),
|
||||||
//LeModel("opt 1", fac.loadXML(Settings::wifiAllOptPar)),
|
LeModel("opt 1", "\\optParamsAllAP{}", fac.loadXML(Settings::wifiAllOptPar)),
|
||||||
//LeModel("opt 2", fac.loadXML(Settings::wifiEachOptPar)),
|
LeModel("opt 2", "\\optParamsEachAP{}", fac.loadXML(Settings::wifiEachOptPar)),
|
||||||
//LeModel("opt 3", fac.loadXML(Settings::wifiEachOptParPos)),
|
LeModel("opt 3", "\\optParamsPosEachAP{}", fac.loadXML(Settings::wifiEachOptParPos)),
|
||||||
//LeModel("per floor", fac.loadXML(Settings::wifiEachOptParPos_multimodel)),
|
LeModel("per floor", "\\optPerFloor{}", fac.loadXML(Settings::wifiEachOptParPos_multimodel)),
|
||||||
LeModel("per bbox", fac.loadXML(Settings::wifiEachOptParPos_perBBox)),
|
LeModel("per bbox", "\\optPerRegion{}", fac.loadXML(Settings::wifiEachOptParPos_perBBox)),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr int numRepeats = 1;
|
static constexpr int numRepeats = 25;
|
||||||
|
|
||||||
/** create GFX for all previously walked parts */
|
/** create GFX for all previously walked parts */
|
||||||
static void walkEverythingBuildStats(Floorplan::IndoorMap* map) {
|
static void walkEverythingBuildStats(Floorplan::IndoorMap* map) {
|
||||||
@@ -239,8 +270,10 @@ public:
|
|||||||
const std::vector<LeModel> models = allModels(map);
|
const std::vector<LeModel> models = allModels(map);
|
||||||
|
|
||||||
PlotErrFunc* pefAll = new PlotErrFunc();
|
PlotErrFunc* pefAll = new PlotErrFunc();
|
||||||
int numStuck = 0;
|
pefAll->setYRange(0, 90, 5);
|
||||||
int numTotal = 0;
|
pefAll->getPlot().getAxisY().setRange(0, 90);
|
||||||
|
pefAll->getPlot().getAxisY().setTicsStep({0, 25, 50, 75, 90});
|
||||||
|
pefAll->getPlot().getAxisX().setRange(0, 15);
|
||||||
|
|
||||||
for (const LeModel& mdl : models) {
|
for (const LeModel& mdl : models) {
|
||||||
|
|
||||||
@@ -248,34 +281,71 @@ public:
|
|||||||
K::Statistics<float>* modelStatsMed = new K::Statistics<float>();
|
K::Statistics<float>* modelStatsMed = new K::Statistics<float>();
|
||||||
|
|
||||||
K::Statistics<float>* modelStatsSingle = new K::Statistics<float>();
|
K::Statistics<float>* modelStatsSingle = new K::Statistics<float>();
|
||||||
pefAll->add(mdl.name, modelStatsSingle);
|
pefAll->add(mdl.plotKey, modelStatsSingle);
|
||||||
|
|
||||||
|
|
||||||
|
int numStuck = 0;
|
||||||
|
int numTotal = 0;
|
||||||
|
|
||||||
|
std::cout << "model " << mdl.name << std::endl;
|
||||||
|
|
||||||
|
|
||||||
// ... to perform every walk...
|
// ... to perform every walk...
|
||||||
for (const LeWalk& walk : walks) {
|
for (const LeWalk& walk : walks) {
|
||||||
|
|
||||||
for (int i = 0; i < numRepeats; ++i) {
|
int numStuckWalk = 0;
|
||||||
|
int numTotalWalk = 0;
|
||||||
|
|
||||||
|
// stats for all runs of one walk
|
||||||
|
K::Statistics<float> walkStatsAvg;
|
||||||
|
|
||||||
|
for (int i = 0; i < 75; ++i) {
|
||||||
|
|
||||||
++numTotal;
|
++numTotal;
|
||||||
|
++numTotalWalk;
|
||||||
|
|
||||||
K::Statistics<float>* walkStats = deserialize(walk, mdl, i);
|
K::Statistics<float>* walkStats = deserialize(walk, mdl, i);
|
||||||
|
|
||||||
if (walkStats->getMedian() < 10) {
|
//if (walkStats->getMedian() < 15) {
|
||||||
modelStatsSingle->add(*walkStats);
|
if (walkStats->getQuantile(0.75) < 20) {
|
||||||
pefAll->plot();
|
//modelStatsSingle->add(*walkStats);
|
||||||
} else {
|
} else {
|
||||||
++numStuck;
|
++numStuck;
|
||||||
|
++numStuckWalk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
modelStatsSingle->add(*walkStats);
|
||||||
|
walkStatsAvg.add(*walkStats);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (modelStatsSingle->getCount() > 0) {
|
||||||
|
pefAll->plot();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "|" << walk.name << "(" << walkStatsAvg.getMedian() << "@" << (numStuckWalk*100/numTotalWalk) << "%)\t";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::cout << " | OVERALL:" << "(" << modelStatsSingle->getMedian() << "@" << (numStuck*100/numTotal) << "%)" << std::endl;
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "stuck: " << numStuck << " (" << (numStuck*100/numTotal) << "%)" << std::endl;
|
pefAll->getGP().setTerminal("epslatex", K::GnuplotSize(8.6, 3.7));
|
||||||
|
pefAll->getGP().setOutput(Settings::fPathGFX + "/overall-system-error.tex");
|
||||||
|
pefAll->writePlotToFile(Settings::fPathGFX + "/overall-system-error.gp");
|
||||||
|
pefAll->getPlot().getMargin().set(4, 0.2, 0.1, 1.8);
|
||||||
|
pefAll->getPlot().setStringMod(new K::GnuplotStringModLaTeX());
|
||||||
|
pefAll->getPlot().getKey().setVisible(true);
|
||||||
|
pefAll->getPlot().getKey().setPosition(K::GnuplotKey::Hor::RIGHT, K::GnuplotKey::Ver::BOTTOM);
|
||||||
|
pefAll->getPlot().getKey().setWidthIncrement(7);
|
||||||
|
pefAll->getPlot().getAxisX().setTicsLabelFormat("%h m");
|
||||||
|
pefAll->getPlot().getAxisX().setRange(0, 22);
|
||||||
|
pefAll->getPlot().getAxisX().setLabel("");
|
||||||
|
pefAll->getPlot().getAxisY().setLabel("filter updates (%)");
|
||||||
|
pefAll->getPlot().getAxisY().setLabelOffset(3.0, 0);
|
||||||
|
pefAll->plot();
|
||||||
|
|
||||||
sleep(100);
|
sleep(100);
|
||||||
|
|
||||||
@@ -303,7 +373,8 @@ public:
|
|||||||
//K::Statistics<float> curWalkRepeatStatsMed;
|
//K::Statistics<float> curWalkRepeatStatsMed;
|
||||||
|
|
||||||
// ... several times
|
// ... several times
|
||||||
for (int i = 0; i < numRepeats; ++i) {
|
//#pragma omp parallel for num_threads(2)
|
||||||
|
for (int i = numRepeats*2; i < numRepeats*3; ++i) {
|
||||||
|
|
||||||
EvalWalk ew(map);
|
EvalWalk ew(map);
|
||||||
ew.walkName = walk.name + " - " + mdl.name + " - " + std::to_string(i);
|
ew.walkName = walk.name + " - " + mdl.name + " - " + std::to_string(i);
|
||||||
@@ -530,6 +601,7 @@ private:
|
|||||||
std::string path = Settings::fPathGFX;
|
std::string path = Settings::fPathGFX;
|
||||||
std::string base = path + "/walks/" + "walk-" + walkName;
|
std::string base = path + "/walks/" + "walk-" + walkName;
|
||||||
|
|
||||||
|
#ifdef PLOT_LIVE
|
||||||
plotty.gp << "unset arrow 1\n";
|
plotty.gp << "unset arrow 1\n";
|
||||||
plotty.gp << "unset arrow 2\n";
|
plotty.gp << "unset arrow 2\n";
|
||||||
plotty.gp << "unset colorbox\n";
|
plotty.gp << "unset colorbox\n";
|
||||||
@@ -546,18 +618,23 @@ private:
|
|||||||
plotty.gp.setOutput(base + "-map.tex");
|
plotty.gp.setOutput(base + "-map.tex");
|
||||||
plotty.writeCodeTo(base + "-map.gp");
|
plotty.writeCodeTo(base + "-map.gp");
|
||||||
plotty.plot();
|
plotty.plot();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PLOT_ERROR_FUNC
|
||||||
pef.getPlot().getMargin().set(4, 0.2, 0.1, 2.0);
|
pef.getPlot().getMargin().set(4, 0.2, 0.1, 2.0);
|
||||||
pef.getGP().setTerminal("epslatex", K::GnuplotSize(8.6, 3.0));
|
pef.getGP().setTerminal("epslatex", K::GnuplotSize(8.6, 3.0));
|
||||||
pef.getGP().setOutput(base + "-error-cum.tex");
|
pef.getGP().setOutput(base + "-error-cum.tex");
|
||||||
pef.writePlotToFile(base + "-error-cum.gp");
|
pef.writePlotToFile(base + "-error-cum.gp");
|
||||||
pef.plot();
|
pef.plot();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PLOT_ERROR_TIME
|
||||||
pet.getPlot().getMargin().set(4, 0.2, 0.1, 2.0);
|
pet.getPlot().getMargin().set(4, 0.2, 0.1, 2.0);
|
||||||
pet.getGP().setTerminal("epslatex", K::GnuplotSize(8.6, 3.0));
|
pet.getGP().setTerminal("epslatex", K::GnuplotSize(8.6, 3.0));
|
||||||
pet.getGP().setOutput(base + "-error-time.tex");
|
pet.getGP().setOutput(base + "-error-time.tex");
|
||||||
pet.writePlotToFile(base + "-error-time.gp");
|
pet.writePlotToFile(base + "-error-time.gp");
|
||||||
pet.plot();
|
pet.plot();
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -566,10 +643,6 @@ private:
|
|||||||
|
|
||||||
++updateCount;
|
++updateCount;
|
||||||
|
|
||||||
pef.showMarkers(true, true);
|
|
||||||
|
|
||||||
std::cout << "update" << std::endl;
|
|
||||||
|
|
||||||
MyControl ctrlCopy = curCtrl;
|
MyControl ctrlCopy = curCtrl;
|
||||||
//static float absHead = relHeadingOffset;
|
//static float absHead = relHeadingOffset;
|
||||||
absHead += ctrlCopy.turnSinceLastTransition_rad;
|
absHead += ctrlCopy.turnSinceLastTransition_rad;
|
||||||
@@ -587,6 +660,7 @@ private:
|
|||||||
statsErr.add(estRealErr);
|
statsErr.add(estRealErr);
|
||||||
|
|
||||||
#ifdef PLOT_ERROR_FUNC
|
#ifdef PLOT_ERROR_FUNC
|
||||||
|
pef.showMarkers(true, true);
|
||||||
pef.clear();
|
pef.clear();
|
||||||
pef.add("", &statsErr);
|
pef.add("", &statsErr);
|
||||||
#endif
|
#endif
|
||||||
@@ -597,9 +671,11 @@ private:
|
|||||||
pet.addB(lastTransition, getNumFHWSAPs(curObs.wifi));
|
pet.addB(lastTransition, getNumFHWSAPs(curObs.wifi));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef PLOT_LIVE
|
||||||
// update estimated path
|
// update estimated path
|
||||||
const K::GnuplotPoint3 p3(curEst.position.x_cm, curEst.position.y_cm, curEst.position.z_cm);
|
const K::GnuplotPoint3 p3(curEst.position.x_cm, curEst.position.y_cm, curEst.position.z_cm);
|
||||||
plotty.pathEst.add(p3/100);
|
plotty.pathEst.add(p3/100);
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -611,6 +687,7 @@ private:
|
|||||||
|
|
||||||
std::cout << statsErr.asString() << std::endl;
|
std::cout << statsErr.asString() << std::endl;
|
||||||
|
|
||||||
|
#ifdef PLOT_LIVE
|
||||||
// estimation and ground-truth
|
// estimation and ground-truth
|
||||||
plotty.setCurEst(curEst.position.inMeter());
|
plotty.setCurEst(curEst.position.inMeter());
|
||||||
plotty.setGroundTruth(curGT);
|
plotty.setGroundTruth(curGT);
|
||||||
@@ -654,6 +731,7 @@ private:
|
|||||||
plotty.gp << "set arrow 2 from screen " << cen.x << "," << cen.y << " to screen " << arr.x << "," << arr.y << "\n";
|
plotty.gp << "set arrow 2 from screen " << cen.x << "," << cen.y << " to screen " << arr.x << "," << arr.y << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef PLOT_LIVE
|
#ifdef PLOT_LIVE
|
||||||
plotty.plot();
|
plotty.plot();
|
||||||
|
|||||||
2
pf/PF.h
2
pf/PF.h
@@ -373,7 +373,7 @@ public:
|
|||||||
|
|
||||||
wqa.add(wifiObs);
|
wqa.add(wifiObs);
|
||||||
float quality = wqa.getQuality();
|
float quality = wqa.getQuality();
|
||||||
std::cout << "wifi quality: " << quality << std::endl;
|
//std::cout << "wifi quality: " << quality << std::endl;
|
||||||
|
|
||||||
|
|
||||||
// GPS
|
// GPS
|
||||||
|
|||||||
@@ -139,7 +139,7 @@
|
|||||||
% not capitalized unless they are the first or last word of the title.
|
% not capitalized unless they are the first or last word of the title.
|
||||||
% Linebreaks \\ can be used within to get better formatting as desired.
|
% Linebreaks \\ can be used within to get better formatting as desired.
|
||||||
% Do not put math or special symbols in the title.
|
% Do not put math or special symbols in the title.
|
||||||
\title{minimizing system setup times }
|
\title{\docWIFI{} Optimization for Smartphone-based Indoor Localization}
|
||||||
|
|
||||||
|
|
||||||
% author names and affiliations
|
% author names and affiliations
|
||||||
|
|||||||
@@ -1,22 +1,57 @@
|
|||||||
\section{Conclusion}
|
\section{Conclusion and Future Work}
|
||||||
|
|
||||||
beide ansaetze sind in unserem szenario/gebaeude OK:
|
\todo{ueberleitung?}
|
||||||
bekannte AP-pos + empirische parameter
|
|
||||||
komplette optimierung über fingerprints
|
|
||||||
|
|
||||||
100 prozent optimierung ist nicht moeglich, es gibt
|
As denoted within the previous evaluations and discussions, the accuracy of
|
||||||
immer stellen, die, zugunsten von anderen, schlechter werden.
|
indoor localization systems based on \docWIFI{} depends on a manifold
|
||||||
es haengt auch stark davon ab, was man optimiert, das modell,
|
of parameters and even minor adjustments can yield huge improvements.
|
||||||
die uebereinstimmung, welche fingerprints [schlechte vs. gute stellen]
|
Depending on required accuracy and acceptable setup- and maintenance times,
|
||||||
|
several approaches are conceivable:
|
||||||
|
|
||||||
zudem ist das modell fuer unser gebaeude nicht gut ggeeignet.
|
If the use-case does not require utmost accuracy and the locations of permanently
|
||||||
zu viele verschiedene materialien und trennwaende, APs immer in raeumen,
|
installed transmitters is already well known, just using empiric model parameters
|
||||||
nie auf dem flur. viele hindernisse, wenige freie raeume.
|
is a viable choice for many situations.
|
||||||
andere modelle koennten hier helfen, erfordern dann aber zur
|
|
||||||
laufzeit mehr berechnung, oder muessten vorab auf einem grid berechnet
|
However, when combined with (particle) filtering, a heavily constrained
|
||||||
werden \todo{cite auf competition}
|
movement model might be a potential issue, as it might get stuck when
|
||||||
|
sensor observations or model predictions are too erroneous.
|
||||||
|
|
||||||
|
Using a small number of reference measurements will already suffice
|
||||||
|
to improve such errors. Furthermore it also removes the need for prior knowledge
|
||||||
|
like transmitter locations, as those parameters can be estimated via optimization.
|
||||||
|
|
||||||
|
For the best accuracy, more complex signal strength propagation models
|
||||||
|
are required which, in turn, demand for more reference measurements.
|
||||||
|
%
|
||||||
|
However, while using a several instances of a simple propagation model
|
||||||
|
for different regions within a building is able to decrease the estimation
|
||||||
|
error, this approach might require prior guessing of where to place those regions
|
||||||
|
and is still unable to approximate all signal strength variations within the building.
|
||||||
|
|
||||||
|
More complex models that include information about walls and other obstacles should
|
||||||
|
be able to improve the situation at the cost of additional computation.
|
||||||
|
Special data-structures for pre-computation combined with online interpolation might
|
||||||
|
be a viable choice for utmost accuracy while still being able to run on
|
||||||
|
a commodity smartphone in realtime.
|
||||||
|
|
||||||
|
While we were able to improve the performance of the \docWIFI{} sensor component,
|
||||||
|
the filtering process should be more robust against erroneous observations.
|
||||||
|
Getting stuck should be prevented, independent of minor changes in quality for
|
||||||
|
the signal strength prediction model \cite{todo-toni}.
|
||||||
|
|
||||||
|
|
||||||
|
%100 prozent optimierung ist nicht moeglich, es gibt
|
||||||
|
%immer stellen, die, zugunsten von anderen, schlechter werden.
|
||||||
|
%es haengt auch stark davon ab, was man optimiert, das modell,
|
||||||
|
%die uebereinstimmung, welche fingerprints [schlechte vs. gute stellen]
|
||||||
|
|
||||||
\section{Future Work}
|
%zudem ist das modell fuer unser gebaeude nicht gut ggeeignet.
|
||||||
|
%zu viele verschiedene materialien und trennwaende, APs immer in raeumen,
|
||||||
|
%nie auf dem flur. viele hindernisse, wenige freie raeume.
|
||||||
|
%andere modelle koennten hier helfen, erfordern dann aber zur
|
||||||
|
%aufzeit mehr berechnung, oder muessten vorab auf einem grid berechnet
|
||||||
|
%werden \todo{cite auf competition}
|
||||||
|
|
||||||
|
|
||||||
|
%besseres modell mit (leichter) interpolation zwischen den randbereichen?
|
||||||
|
|
||||||
Komplexere Modelle die vorab berechnet werden und dann einfach in einer
|
|
||||||
Datenstruktur abgelegt sind, die z.B. interpolation erlaubt etc.
|
|
||||||
|
|||||||
@@ -1,21 +1,26 @@
|
|||||||
\section{Experiments}
|
\section{Experiments}
|
||||||
|
|
||||||
\todo{
|
% intro
|
||||||
alles im FHWS gebäude [korrekte groesse fuer beide gebaeude!] mit nem nexus 6
|
|
||||||
}
|
|
||||||
|
|
||||||
Within all \docWIFI{} observations (offline and online) we only consider the \docAP{}s that are permanently installed
|
All optimizations and evaluations took place within two adjacent buildings (4 and 2 floors, respectively)
|
||||||
within the building. Temporal and movable transmitters are ignored as they might cause estimation errors.
|
and two connected outdoor regions (entrance and inner courtyard),
|
||||||
|
yielding a total size of \SI{110}{\meter} x \SI{60}{\meter}.
|
||||||
|
|
||||||
|
Within all \docWIFI{} observations we only consider the \docAP{}s that are permanently installed,
|
||||||
|
and can be identified by their well-known MAC address.
|
||||||
|
Temporal and movable transmitters are ignored as they might cause estimation errors.
|
||||||
|
|
||||||
|
Unfortunately, due to non-disclosure agreements, we are not allowed to depict the actual location
|
||||||
|
of installed transmitters within the following figures.
|
||||||
|
|
||||||
|
|
||||||
|
%modell direkt fuer den gelaufenen pfad optimiert (also wirklich jede wifi messung direkt auf den ground-truth)
|
||||||
|
%der fehler wird zwar kleiner, ist aber immernoch deutlich spürbar. das spricht dafür, dass das modell einfach nicht
|
||||||
|
%gut geeignet ist.
|
||||||
|
|
||||||
modell direkt fuer den gelaufenen pfad optimiert (also wirklich jede wifi messung direkt auf den ground-truth)
|
%optimierungs input: alle 4 walks samt ground-truth
|
||||||
der fehler wird zwar kleiner, ist aber immernoch deutlich spürbar. das spricht dafür, dass das modell einfach nicht
|
%dann kommt fuer die 4 typen [fixed, all same par, each par, each par pos]
|
||||||
gut geeignet ist.
|
%log probability 50 75, meter 50, 75
|
||||||
|
|
||||||
optimierungs input: alle 4 walks samt ground-truth
|
|
||||||
dann kommt fuer die 4 typen [fixed, all same par, each par, each par pos]
|
|
||||||
log probability 50 75, meter 50, 75
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -214,7 +219,7 @@
|
|||||||
|
|
||||||
\subsection{Location estimation error}
|
\subsection{Location estimation error}
|
||||||
|
|
||||||
\todo{übergang holprig}
|
\todo{uebergang holprig?}
|
||||||
|
|
||||||
%Using the optimized model setups and the measurements $\mRssiVec$ determined by scanning for nearby \docAPshort{}s,
|
%Using the optimized model setups and the measurements $\mRssiVec$ determined by scanning for nearby \docAPshort{}s,
|
||||||
%we can directly perform a location estimation by rewriting \refeq{eq:wifiProb}:
|
%we can directly perform a location estimation by rewriting \refeq{eq:wifiProb}:
|
||||||
@@ -251,7 +256,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
We therefore conducted 10 walks on 5 different paths within our building,
|
We therefore conducted 13 walks on 5 different paths within our building,
|
||||||
each of which is defined by connecting marker points at well known positions
|
each of which is defined by connecting marker points at well known positions
|
||||||
(see figure \ref{fig:allWalks}).
|
(see figure \ref{fig:allWalks}).
|
||||||
Whenever the pedestrian reached such a marker, the current time was recorded.
|
Whenever the pedestrian reached such a marker, the current time was recorded.
|
||||||
@@ -322,7 +327,7 @@
|
|||||||
|
|
||||||
To reduce the amount such of misclassifications, where other locations within the building are
|
To reduce the amount such of misclassifications, where other locations within the building are
|
||||||
as likely as the pedestrians actual location, we examined various approaches.
|
as likely as the pedestrians actual location, we examined various approaches.
|
||||||
Unfortunately, none of which provided a viable enhancement under all conditions for the performed walks.
|
Unfortunately, most of which did not provided a viable enhancement under all conditions for the performed walks.
|
||||||
|
|
||||||
The misclassification-rate is determined by counting the amount of (random) locations within
|
The misclassification-rate is determined by counting the amount of (random) locations within
|
||||||
the building that produce a similar probability \refeq{eq:wifiProb} as the actual ground-truth
|
the building that produce a similar probability \refeq{eq:wifiProb} as the actual ground-truth
|
||||||
@@ -347,12 +352,11 @@
|
|||||||
The models used within this work will not accurately predict the signal strength for such locations.
|
The models used within this work will not accurately predict the signal strength for such locations.
|
||||||
%%Including \docAPshort{}s unseen by the Smartphone thus often increases the estimation error instead
|
%%Including \docAPshort{}s unseen by the Smartphone thus often increases the estimation error instead
|
||||||
%%of fixing the multimodality.
|
%%of fixing the multimodality.
|
||||||
|
|
||||||
To sum up, while some situations, e.g. outdoors, could greatly be improved,
|
To sum up, while some situations, e.g. outdoors, could greatly be improved,
|
||||||
many other situations are deteriorated, especially when some transmitters are (temporarily)
|
many other situations are deteriorated, especially when some transmitters are (temporarily)
|
||||||
attenuated by ambient conditions like concrete walls.
|
attenuated by ambient conditions like concrete walls.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
We therefore examined variations of the probability calculation from \refeq{eq:wifiProb}.
|
We therefore examined variations of the probability calculation from \refeq{eq:wifiProb}.
|
||||||
Removing the strongest/weakest \docAPshort{} from $\mRssiVec{}$ yielded similar results.
|
Removing the strongest/weakest \docAPshort{} from $\mRssiVec{}$ yielded similar results.
|
||||||
@@ -360,105 +364,203 @@
|
|||||||
as there are many situations where only a handful \docAP{}s can be seen. Removing (valid)
|
as there are many situations where only a handful \docAP{}s can be seen. Removing (valid)
|
||||||
information will highly increase the error for such situations.
|
information will highly increase the error for such situations.
|
||||||
|
|
||||||
Using a more strict exponential distribution for the model vs. scan comparison in \refeq{eq:wifiProb}
|
Incorporating additional knowledge provided by virtual \docAP{}s (see section \ref{sec:vap}) mitigated this issues.
|
||||||
had a positive effect on the misclassification error for some of the walks, but slightly increased
|
If only one out of six virtual networks is observed, this observation is likely to be erroneous, no matter
|
||||||
the estimation error (see figure \ref{fig:normalVsExponential}) and thus produced negative side effects.
|
what the corresponding signal strength indicates. This approach improved the location estimation especially
|
||||||
|
for areas where a transmitter was hardly seen within the reference measurements and its optimization is thus
|
||||||
|
expected to be inaccurate.
|
||||||
|
|
||||||
\begin{figure}
|
Using a smaller $\sigma$ or a more strict exponential distribution for the model vs. scan comparison in \refeq{eq:wifiProb}
|
||||||
\input{gfx/wifiCompare_normalVsExp_cross.tex}
|
had a positive effect on the misclassification error for some of the walks, but also slightly increased the overall estimation error.
|
||||||
\input{gfx/wifiCompare_normalVsExp_meter.tex}
|
%(see figure \ref{fig:normalVsExponential}).
|
||||||
\caption{
|
Due to those negative side-effects, the final localization system (\refeq{eq:recursiveDensity}) is unlikely to profit from such changes.
|
||||||
Comparison between normal- (black) and exponential-distribution (red) for \refeq{eq:wifiProb}.
|
|
||||||
While misclassifications are slightly reduced (upper chart),
|
\todo{ueberleitung OK?}
|
||||||
the median error between ground-truth and estimation (lower chart) increases by
|
|
||||||
about \SI{1}{\meter}.
|
% braucht zu viel platz
|
||||||
}
|
%\begin{figure}
|
||||||
\label{fig:normalVsExponential}
|
% \input{gfx/wifiCompare_normalVsExp_cross.tex}
|
||||||
\end{figure}
|
% \input{gfx/wifiCompare_normalVsExp_meter.tex}
|
||||||
|
% \caption{
|
||||||
|
% Comparison between normal- (black) and exponential-distribution (red) for \refeq{eq:wifiProb}.
|
||||||
|
% While misclassifications are slightly reduced (upper chart),
|
||||||
|
% the median error between ground-truth and estimation (lower chart) increases by
|
||||||
|
% about \SI{1}{\meter}.
|
||||||
|
% }
|
||||||
|
% \label{fig:normalVsExponential}
|
||||||
|
%\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\todo{
|
%\todo{
|
||||||
erwähnen??? sigma je nach signalstärke anpassen bringt leider auch nichts. wenn man das aber macht,
|
% erwähnen??? sigma je nach signalstärke anpassen bringt leider auch nichts. wenn man das aber macht,
|
||||||
dann: fuer grosse signalstaerken ein grosses sigma! andersrum gehts nach hinten los!
|
% dann: fuer grosse signalstaerken ein grosses sigma! andersrum gehts nach hinten los!
|
||||||
}
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% -------------------------------- final system -------------------------------- %
|
% -------------------------------- final system -------------------------------- %
|
||||||
|
|
||||||
|
\subsection{Overall system error}
|
||||||
|
|
||||||
|
After examining the \docWIFI{} component on its own, we will now analyze the impact of aforementioned model
|
||||||
|
optimizations on our smartphone-based indoor localization system described in section \ref{sec:system}.
|
||||||
|
|
||||||
|
Due to other sensors and the transition constraints from the buildings floorplan, we expect the
|
||||||
|
posterior density to often get stuck when the \docWIFI{} component provides erroneous estimations
|
||||||
|
due to bad signal strength predictions:
|
||||||
|
%
|
||||||
|
A pedestrian walks along a hallway, but bad model values indicate that his most likely position
|
||||||
|
is within a room right next to the hallway.
|
||||||
|
If the density (described by the particles) is dragged (completely) into this room,
|
||||||
|
the IMU indicates no change in direction (pedestrian walks straight),
|
||||||
|
and the room has only one single door, the density is trapped within this room.
|
||||||
|
%
|
||||||
|
Such problems can often be solved by simply using more particles to describe the posterior.
|
||||||
|
|
||||||
|
As particle filtering from \refeq{eq:recursiveDensity} is a random process with varying output,
|
||||||
|
we calculated each combination of the {\em 13 walks and optimization strategy},
|
||||||
|
25 times, using 5000, 7500 and 10000 particles resulting in 75 runs per walk, 975 per strategy and 5850 in total.
|
||||||
|
%
|
||||||
|
Figure \ref{fig:overallSystemError} depicts the error distribution per optimization strategy,
|
||||||
|
resulting from all executions for each walk conducted with the smartphone.
|
||||||
|
|
||||||
|
While most values represent the expected results (more optimization yields better results),
|
||||||
|
the values for {\em \noOptEmpiric{}} and {\em \optPerRegion{}} do not.
|
||||||
|
The slightly increased error for both strategies can be explained by having a closer look at the walked
|
||||||
|
paths and relates to exceptional regions like outdoors. In both cases there is some sort of model overadaption.
|
||||||
|
%
|
||||||
|
As mentioned earlier, {\em \noOptEmpiric{}} is unable to accurately model the signal strength for the whole
|
||||||
|
building, resulting in increased estimation errors for outdoor regions, where the filter fails to conclude
|
||||||
|
the walk.
|
||||||
|
%
|
||||||
|
While {\em \optPerRegion{}} does not suffer from such issues due to separated optimization regions for in- and outdoor,
|
||||||
|
its increased error relates to movements between such adjacent regions, as there often is a huge model difference.
|
||||||
|
While this difference is perfectly fine, as it also exists within real world conditions,
|
||||||
|
the filtering process suffers especially at such model-boundaries:
|
||||||
|
The model prevents the particles from moving e.g. from inside the building towards outdoor regions, as the
|
||||||
|
outdoor-model does not match at all. Due to sensor delays and issues with the absolute heading near in- and outdoor boundaries
|
||||||
|
(metal-framed doors) the error is slightly increased and retained for some time until the density stabilizes itself.
|
||||||
|
|
||||||
|
Such situations should be mitigated by the smartphone's GPS sensor. However, within our testing walks, the GPS
|
||||||
|
did rarely provide accurate measurements, as the outdoor-time was to short for the sensor to receive a valid
|
||||||
|
fix. The accuracy indicated by the GPS usually was \SI{50}{\meter} and above.
|
||||||
|
|
||||||
|
Especially for {\em path 1}, the particle-filter often got stuck within the upper right outdoor area between both buildings
|
||||||
|
(see figure \ref{fig:allWalks}). Using the empirical parameters, \SI{40}{\percent} of all runs for this path got stuck at this location.
|
||||||
|
While {\em \optParamsAllAP{}} already reduced the risk to \SI{20}{\percent}, all other optimization strategies did not get stuck at all.
|
||||||
|
|
||||||
|
The same effect holds for all other conducted walks: The better the model optimization, the lower the risk of getting stuck somewhere along the path.
|
||||||
|
|
||||||
|
Varying the number of particles between 5000 and 10000 indicated only a minor increase in accuracy and slightly decreased the risk of getting stuck.
|
||||||
|
|
||||||
|
Comparing the results of figure \ref{fig:modelPerformance} and \ref{fig:overallSystemError} one can
|
||||||
|
denote the positive impact of fusioning multiple sensors with a transition model based on the buildings
|
||||||
|
actual floorplan. Especially the outdoor regions, or other areas with disabled \docWIFI{} component highly
|
||||||
|
profit from the data provided by the smartphones IMU, which prevents the estimation from getting lost.
|
||||||
|
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\input{gfx/overall-system-error.tex}
|
||||||
|
\caption{
|
||||||
|
Cumulative error distribution for each model when used within the final localization system from \refeq{eq:recursiveDensity}.
|
||||||
|
Despite some discussed exceptions, highly optimized models lead to lower localization errors.
|
||||||
|
}
|
||||||
|
\label{fig:overallSystemError}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
% results
|
||||||
|
% 5000 particles
|
||||||
|
%
|
||||||
|
% model empiric
|
||||||
|
% |path1a(5.76715@100%) |path1b(3.73881@4%) |toni-all-1a(6.1505@76%) |toni-all-1b(4.60639@40%) |path2a(7.35355@28%) |path2b(7.4316@0%) |toni-all-2a(10.7068@44%) |toni-all-2b(7.4323@28%) |toni-inst-1b(4.60685@0%) |toni-inst-2a(3.83979@0%) |toni-inst-2b(3.98889@0%) |toni-inst-3a(4.70925@0%) |toni-inst-3b(4.40971@0%) | OVERALL:(5.12463@24%)
|
||||||
|
% model opt 1
|
||||||
|
% |path1a(17.6635@56%) |path1b(9.41882@24%)|toni-all-1a(4.06972@0%) |toni-all-1b(3.83157@0%) |path2a(6.92405@16%) |path2b(8.6365@16%) |toni-all-2a(11.6348@48%) |toni-all-2b(12.029@76%) |toni-inst-1b(5.07535@0%) |toni-inst-2a(4.45517@0%) |toni-inst-2b(3.99025@0%) |toni-inst-3a(8.28201@8%) |toni-inst-3b(5.57021@20%) | OVERALL:(6.57212@20%)
|
||||||
|
% model opt 2
|
||||||
|
% |path1a(2.01602@0%) |path1b(2.90237@0%) |toni-all-1a(2.80293@0%) |toni-all-1b(1.99745@0%) |path2a(5.39013@4%) |path2b(8.13855@0%) |toni-all-2a(9.7462@40%) |toni-all-2b(9.28677@44%) |toni-inst-1b(4.5305@0%) |toni-inst-2a(4.28726@0%) |toni-inst-2b(4.03041@0%) |toni-inst-3a(4.26278@4%) |toni-inst-3b(5.63394@24%) | OVERALL:(4.07822@8%)
|
||||||
|
% model opt 3
|
||||||
|
% |path1a(1.74623@0%) |path1b(2.61609@0%) |toni-all-1a(2.49372@0%) |toni-all-1b(1.90326@0%) |path2a(5.07957@4%) |path2b(7.73973@8%) |toni-all-2a(10.2793@48%) |toni-all-2b(6.48194@16%) |toni-inst-1b(5.73752@4%) |toni-inst-2a(3.76165@0%) |toni-inst-2b(3.51509@0%) |toni-inst-3a(6.06681@16%) |toni-inst-3b(5.27748@24%) | OVERALL:(3.94786@9%)
|
||||||
|
% model per floor
|
||||||
|
% |path1a(1.76139@0%) |path1b(2.22047@0%) |toni-all-1a(2.10094@0%) |toni-all-1b(1.62287@0%) |path2a(5.50715@16%) |path2b(7.1257@0%) |toni-all-2a(10.5138@48%) |toni-all-2b(6.72044@20%) |toni-inst-1b(3.77885@0%) |toni-inst-2a(2.23669@0%) |toni-inst-2b(3.20604@0%) |toni-inst-3a(2.46891@0%) |toni-inst-3b(2.73366@0%) | OVERALL:(3.22315@6%)
|
||||||
|
% model per bbox
|
||||||
|
% |path1a(1.80033@0%) |path1b(2.32875@0%) |toni-all-1a(2.17754@0%) |toni-all-1b(1.6697@0%) |path2a(6.38772@16%) |path2b(5.84004@0%) |toni-all-2a(9.67635@36%) |toni-all-2b(8.3282@24%) |toni-inst-1b(4.11891@0%) |toni-inst-2a(2.64016@0%) |toni-inst-2b(3.36297@0%) |toni-inst-3a(2.15568@0%) |toni-inst-3b(2.98047@0%) | OVERALL:(3.40679@5%)
|
||||||
|
%
|
||||||
|
%
|
||||||
|
% 7500 particles
|
||||||
|
% model empiric
|
||||||
|
% |path1a(8.23256@100%) |path1b(3.91532@0%) |toni-all-1a(7.0666@80%) |toni-all-1b(5.35225@48%) |path2a(6.5708@16%) |path2b(7.53023@0%) |toni-all-2a(10.6246@40%) |toni-all-2b(6.63087@4%) |toni-inst-1b(4.76934@0%) |toni-inst-2a(3.82903@0%) |toni-inst-2b(4.00339@0%) |toni-inst-3a(3.85417@4%) |toni-inst-3b(4.47613@0%) | OVERALL:(5.23337@22%)
|
||||||
|
% model opt 1
|
||||||
|
% |path1a(10.3959@36%) |path1b(8.37674@16%)|toni-all-1a(3.96164@0%) |toni-all-1b(4.24675@4%) |path2a(6.02912@8%) |path2b(8.1804@0%) |toni-all-2a(12.4277@48%) |toni-all-2b(10.4748@56%) |toni-inst-1b(5.49874@4%) |toni-inst-2a(4.09279@0%) |toni-inst-2b(3.87762@0%) |toni-inst-3a(5.10456@0%) |toni-inst-3b(4.52029@4%) | OVERALL:(5.97832@13%)
|
||||||
|
% model opt 2
|
||||||
|
% |path1a(2.04657@0%) |path1b(2.82853@0%) |toni-all-1a(2.93467@0%) |toni-all-1b(1.98463@0%) |path2a(4.66513@8%) |path2b(8.19959@0%) |toni-all-2a(8.34246@12%) |toni-all-2b(7.2456@12%) |toni-inst-1b(4.72651@0%) |toni-inst-2a(4.00208@0%) |toni-inst-2b(3.94811@0%) |toni-inst-3a(3.74498@0%) |toni-inst-3b(5.15519@16%) | OVERALL:(3.99594@3%)
|
||||||
|
% model opt 3
|
||||||
|
% |path1a(1.82148@0%) |path1b(2.7664@0%) |toni-all-1a(2.46073@0%) |toni-all-1b(1.93273@0%) |path2a(5.15394@4%) |path2b(7.53562@0%) |toni-all-2a(8.43582@20%) |toni-all-2b(6.01557@8%) |toni-inst-1b(5.47576@0%) |toni-inst-2a(3.44451@0%) |toni-inst-2b(3.6069@0%) |toni-inst-3a(4.84921@4%) |toni-inst-3b(5.62456@8%) | OVERALL:(3.88747@3%)
|
||||||
|
% model per floor
|
||||||
|
% |path1a(1.79881@0%) |path1b(2.1456@0%) |toni-all-1a(2.17125@0%) |toni-all-1b(1.63247@0%) |path2a(5.37789@8%) |path2b(6.79701@0%) |toni-all-2a(9.29407@32%) |toni-all-2b(6.28292@8%) |toni-inst-1b(3.79967@0%) |toni-inst-2a(2.24007@0%) |toni-inst-2b(3.15768@0%) |toni-inst-3a(2.17671@0%) |toni-inst-3b(2.83445@0%) | OVERALL:(3.16559@3%)
|
||||||
|
% model per bbox
|
||||||
|
% |path1a(1.77473@0%) |path1b(2.2609@0%) |toni-all-1a(2.06814@4%) |toni-all-1b(1.6841@0%) |path2a(6.48652@4%) |path2b(5.79359@0%) |toni-all-2a(9.40116@24%) |toni-all-2b(7.21382@16%) |toni-inst-1b(3.82829@0%) |toni-inst-2a(2.47975@0%) |toni-inst-2b(3.35265@0%) |toni-inst-3a(2.20058@0%) |toni-inst-3b(2.86407@0%) | OVERALL:(3.3381@3%)
|
||||||
|
%
|
||||||
|
% 10000 particles
|
||||||
|
% model empiric
|
||||||
|
% |path1a(6.43082@100%) |path1b(3.58544@0%) |toni-all-1a(6.92747@76%) |toni-all-1b(5.81139@72%) |path2a(5.12683@4%) |path2b(7.91078@0%) |toni-all-2a(10.3958@16%) |toni-all-2b(7.09186@8%) |toni-inst-1b(4.45815@0%) |toni-inst-2a(4.077@0%) |toni-inst-2b(4.02524@0%) |toni-inst-3a(3.35953@0%) |toni-inst-3b(4.40318@0%) | OVERALL:(5.06224@21%)
|
||||||
|
% model opt 1
|
||||||
|
% |path1a(6.47262@16%) |path1b(6.04852@12%)|toni-all-1a(3.97276@0%) |toni-all-1b(3.62778@0%) |path2a(5.48776@8%) |path2b(8.21965@0%) |toni-all-2a(11.3175@44%) |toni-all-2b(11.4499@60%) |toni-inst-1b(5.19827@0%) |toni-inst-2a(4.1351@0%) |toni-inst-2b(3.90291@0%) |toni-inst-3a(4.58096@8%) |toni-inst-3b(4.62723@4%) | OVERALL:(5.47998@11%)
|
||||||
|
% model opt 2
|
||||||
|
% |path1a(2.15007@0%) |path1b(2.80157@0%) |toni-all-1a(2.70849@0%) |toni-all-1b(1.8937@0%) |path2a(4.13743@0%) |path2b(8.20317@0%) |toni-all-2a(7.86448@12%) |toni-all-2b(7.41533@12%) |toni-inst-1b(4.54459@0%) |toni-inst-2a(4.17614@0%) |toni-inst-2b(3.90311@0%) |toni-inst-3a(3.846@4%) |toni-inst-3b(4.84665@8%) | OVERALL:(3.89883@2%)
|
||||||
|
% model opt 3
|
||||||
|
% |path1a(1.79085@0%) |path1b(2.64892@0%) |toni-all-1a(2.33085@0%) |toni-all-1b(1.9533@0%) |path2a(4.40712@4%) |path2b(7.815@0%) |toni-all-2a(8.97738@28%) |toni-all-2b(5.87188@0%) |toni-inst-1b(4.93315@0%) |toni-inst-2a(3.53349@0%) |toni-inst-2b(3.60056@0%) |toni-inst-3a(5.57379@8%) |toni-inst-3b(4.49996@4%) | OVERALL:(3.78756@3%)
|
||||||
|
% model per floor
|
||||||
|
% |path1a(1.7498@0%) |path1b(2.11555@0%) |toni-all-1a(1.89388@0%) |toni-all-1b(1.61323@0%) |path2a(5.06884@0%) |path2b(6.7157@0%) |toni-all-2a(9.54228@36%) |toni-all-2b(6.7699@24%) |toni-inst-1b(3.84709@0%) |toni-inst-2a(2.2789@0%) |toni-inst-2b(3.17625@0%) |toni-inst-3a(2.13417@0%) |toni-inst-3b(2.59095@0%) | OVERALL:(3.08506@4%)
|
||||||
|
% model per bbox
|
||||||
|
% |path1a(1.73406@0%) |path1b(2.30577@0%) |toni-all-1a(2.01979@0%) |toni-all-1b(1.64225@0%) |path2a(6.30713@12%) |path2b(6.02961@0%) |toni-all-2a(9.70206@20%) |toni-all-2b(6.55847@8%) |toni-inst-1b(3.93324@0%) |toni-inst-2a(2.459@0%) |toni-inst-2b(3.3522@0%) |toni-inst-3a(2.13783@0%) |toni-inst-3b(2.63231@0%) | OVERALL:(3.29408@3%)
|
||||||
|
|
||||||
|
% all combined
|
||||||
|
% model empiric
|
||||||
|
% |path1a(6.72661@100%) |path1b(3.74113@1%) |toni-all-1a(6.69696@77%) |toni-all-1b(5.26661@53%) |path2a(6.11286@16%) |path2b(7.63154@0%) |toni-all-2a(10.5765@33%) |toni-all-2b(7.0506@13%) |toni-inst-1b(4.61087@0%) |toni-inst-2a(3.91375@0%) |toni-inst-2b(4.00372@0%) |toni-inst-3a(3.89586@1%) |toni-inst-3b(4.43552@0%) | OVERALL:(5.13701@22%)
|
||||||
|
% model opt 1
|
||||||
|
% |path1a(10.0538@36%) |path1b(7.96075@17%)|toni-all-1a(3.99762@0%) |toni-all-1b(3.89137@1%) |path2a(6.08714@10%) |path2b(8.33165@5%) |toni-all-2a(11.7481@46%) |toni-all-2b(11.2068@64%) |toni-inst-1b(5.25558@1%) |toni-inst-2a(4.23255@0%) |toni-inst-2b(3.92269@0%) |toni-inst-3a(5.62327@5%) |toni-inst-3b(4.82302@9%) | OVERALL:(6.00231@15%)
|
||||||
|
% model opt 2
|
||||||
|
% |path1a(2.07273@0%) |path1b(2.84622@0%) |toni-all-1a(2.81671@0%) |toni-all-1b(1.9553@0%) |path2a(4.66453@4%) |path2b(8.17561@0%) |toni-all-2a(8.60702@21%) |toni-all-2b(7.68813@22%) |toni-inst-1b(4.59132@0%) |toni-inst-2a(4.15243@0%) |toni-inst-2b(3.96315@0%) |toni-inst-3a(3.96402@2%) |toni-inst-3b(5.16219@16%) | OVERALL:(3.99259@5%)
|
||||||
|
% model opt 3
|
||||||
|
% |path1a(1.78819@0%) |path1b(2.67775@0%) |toni-all-1a(2.43527@0%) |toni-all-1b(1.92948@0%) |path2a(4.90009@4%) |path2b(7.70505@2%) |toni-all-2a(9.16313@32%) |toni-all-2b(6.10436@8%) |toni-inst-1b(5.37191@1%) |toni-inst-2a(3.57332@0%) |toni-inst-2b(3.57426@0%) |toni-inst-3a(5.4337@9%) |toni-inst-3b(5.12685@12%) | OVERALL:(3.86918@5%)
|
||||||
|
% model per floor
|
||||||
|
% |path1a(1.77029@0%) |path1b(2.16265@0%) |toni-all-1a(2.05043@0%) |toni-all-1b(1.62289@0%) |path2a(5.29536@8%) |path2b(6.88344@0%) |toni-all-2a(9.75416@38%) |toni-all-2b(6.57473@17%) |toni-inst-1b(3.80742@0%) |toni-inst-2a(2.25183@0%) |toni-inst-2b(3.18067@0%) |toni-inst-3a(2.24992@0%) |toni-inst-3b(2.72835@0%) | OVERALL:(3.15739@4%)
|
||||||
|
% model per bbox
|
||||||
|
% |path1a(1.76908@0%) |path1b(2.30081@0%) |toni-all-1a(2.09503@1%) |toni-all-1b(1.66411@0%) |path2a(6.39346@10%) |path2b(5.8772@0%) |toni-all-2a(9.59953@26%) |toni-all-2b(7.06924@16%) |toni-inst-1b(3.96094@0%) |toni-inst-2a(2.51694@0%) |toni-inst-2b(3.3549@0%) |toni-inst-3a(2.1656@0%) |toni-inst-3b(2.81547@0%) | OVERALL:(3.34847@4%)
|
||||||
|
|
||||||
|
|
||||||
% REAL WALKS
|
% REAL WALKS
|
||||||
\todo{obwohl das angepasste modell doch recht gut laeuft und der fehler recht klein wird, sind immernoch stellen dabei,
|
|
||||||
wo es einfach nicht gut passt, unguenstige mehrdeutigkeiten vorliegen, oder regionen einfach nicht passen wie sie sollten.
|
%\todo{obwohl das angepasste modell doch recht gut laeuft und der fehler recht klein wird, sind immernoch stellen dabei,
|
||||||
das liegt teils auch daran, dass die fingerprints drehend aufgenommen wurden und beim laufen nach hinten durch den
|
%wo es einfach nicht gut passt, unguenstige mehrdeutigkeiten vorliegen, oder regionen einfach nicht passen wie sie sollten.
|
||||||
menschen abgeschottet wird. auch zeitlicher verzug kann ein problem darstellen.}
|
%das liegt teils auch daran, dass die fingerprints drehend aufgenommen wurden und beim laufen nach hinten durch den
|
||||||
|
%menschen abgeschottet wird. auch zeitlicher verzug kann ein problem darstellen.}
|
||||||
|
|
||||||
\todo{GPS ist leider kaum eine hilfe. entweder kein empfang wegen ueberdachung oder abschattung, oder
|
%\todo{
|
||||||
zu kurz draußen um einen guten gps-fix zu bekommen.}
|
% wenn ich beim fingerprinten einen AP an einer stelle NICHT gesehen habe,
|
||||||
|
% ist das auch eine aussage für die model optimierung.. da kann dann sicher keine signatlstaerke > -90 an der stelle raus kommen
|
||||||
|
%}
|
||||||
|
|
||||||
\todo{
|
|
||||||
walk1 hat eine issue kurz bevor man zur tuer zum hoersaalgebaude reingeht
|
|
||||||
je nach resampling killt dieser wlan error evtl alle partikel!
|
|
||||||
}
|
|
||||||
|
|
||||||
\todo{
|
%ware das grid-model nicht da, wuerde der outdoor teil richtig schlecht laufen,
|
||||||
das bbox modell hat probleme an den uebergängen zwischen bboxes da dort teils starke spruenge sind
|
%weil das wlan hier absolut ungenau ist.. da die partikel aber aufgrund des vorherigen
|
||||||
die nicht immer in der realität so auch vorliegen. z.B. z-wechsel machen teils probleme.
|
%walks schon recht dicht beisamen sind, kittet das das ganze sehr gut.
|
||||||
hier wäre ein kontinuierliches modell hilfreich bzw interpolation in randbereichen
|
%kann man testen, indem man z.B. weniger resampling macht und mehr alte partikel aufhebt.
|
||||||
}
|
%geht sofort kaputt sobald man aus dem gebäude raus kommt
|
||||||
|
|
||||||
\todo{
|
|
||||||
wenn ich beim fingerprinten einen AP an einer stelle NICHT gesehen habe,
|
|
||||||
ist das auch eine aussage für die model optimierung.. da kann dann sicher keine signatlstaerke > -90 an der stelle raus kommen
|
|
||||||
}
|
|
||||||
|
|
||||||
\todo{gps wird so schnell nicht warm, versagt denn auf dem hof als hilfestellung}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% was ist das??
|
||||||
|
%\input{gfx/wifi-opt-error-hist-methods.tex}
|
||||||
|
%\input{gfx/wifi-opt-error-hist-stair-outdoor.tex}
|
||||||
|
%outdoor hat insgesamt nicht all zu viel einfluss, da die meisten APs
|
||||||
|
%an den outdoor punkten kaum gesehen werden. auf einzelne APs kann
|
||||||
|
%der einfluss jedoch recht groß sein, siehe den fingerprint plot von
|
||||||
|
%dem einen ausgewählten AP
|
||||||
|
|
||||||
|
|
||||||
ware das grid-model nicht da, wuerde der outdoor teil richtig schlecht laufen,
|
%\todo{anfaenglich falsches heading ist gift, wegen rel. heading, weil sich dann alles verlaeuft. fix: anfaenglich große heading variation erlauben}
|
||||||
weil das wlan hier absolut ungenau ist.. da die partikel aber aufgrund des vorherigen
|
|
||||||
walks schon recht dicht beisamen sind, kittet das das ganze sehr gut.
|
|
||||||
kann man testen, indem man z.B. weniger resampling macht und mehr alte partikel aufhebt.
|
|
||||||
geht sofort kaputt sobald man aus dem gebäude raus kommt
|
|
||||||
|
|
||||||
signalstaerke limitieren, wie : alles was im model oder scan < -90 ist, wird auf -90 abgeschnitten hilft
|
%\todo{NICHT MEHR AKTUELL: abs-head ist in der observation besser, weil es beim resampling mehr bringt und dafuer srogt, dass die richtigen geloescht werden!}
|
||||||
zwar an manchen stellen, im groben und ganzen führt es aber eher zu fehlern als zu verbesserungen.
|
|
||||||
zudem ist zu erwarten, dass diese zahl stark vom geraet/hardware abhaengt
|
|
||||||
|
|
||||||
jeweils beim weighting die niedrigste wifi probability weglassen [je nach particle also ein anderer AP]
|
|
||||||
bringt auch nicht immer was.. killt gelegentlich floor-changes. zudem stehen am ende nur sehr wenige
|
|
||||||
APs zur verfügung. da einen zu ignorieren, macht noch mehr kaputt
|
|
||||||
|
|
||||||
auch ein versuch wie werfe alle APs aus dem handy-scan weg, die kleiner -90 sind, birgt die selben risiken
|
|
||||||
es scheint wirklich am sinnvollsten, die scan-daten einfach 1:1 zu nehmen wie sie sind
|
|
||||||
|
|
||||||
|
|
||||||
kurz vor ende von path 2 will die estimation nicht in die cafeteria, weil ein paar particle
|
|
||||||
die treppe richtung h.1.5 hochgehen und durch das wlan sehr sehr hoch gewichtet werden.
|
|
||||||
die mittelwert-estimation versagt hier
|
|
||||||
|
|
||||||
|
|
||||||
% was ist das??
|
|
||||||
%\input{gfx/wifi-opt-error-hist-methods.tex}
|
|
||||||
%\input{gfx/wifi-opt-error-hist-stair-outdoor.tex}
|
|
||||||
%outdoor hat insgesamt nicht all zu viel einfluss, da die meisten APs
|
|
||||||
%an den outdoor punkten kaum gesehen werden. auf einzelne APs kann
|
|
||||||
%der einfluss jedoch recht groß sein, siehe den fingerprint plot von
|
|
||||||
%dem einen ausgewählten AP
|
|
||||||
|
|
||||||
|
|
||||||
\todo{anfaenglich falsches heading ist gift, wegen rel. heading, weil sich dann alles verlaeuft. fix: anfaenglich große heading variation erlauben}
|
|
||||||
|
|
||||||
\todo{NICHT MEHR AKTUELL: abs-head ist in der observation besser, weil es beim resampling mehr bringt und dafuer srogt, dass die richtigen geloescht werden!}
|
|
||||||
|
|
||||||
\todo{ deutlich machen
|
|
||||||
wenn man nur die fingerprints des floors nimmt in dem gelaufen wird, ist alles gut
|
|
||||||
sobald man andere floors drueber/drunter dazu nimmt, ist es nicht mehr gnaz so gut, oder wird schlechter
|
|
||||||
das spricht dafuer dass das modell nicht gut passt
|
|
||||||
koennte man zeigen indem man den durchschnittlichen fehler je fingerprint plottet???
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@
|
|||||||
to further enhance the localization. Their values are incorporated by simply
|
to further enhance the localization. Their values are incorporated by simply
|
||||||
comparing the sensor readings against a distribution that models the sensor's uncertainty.
|
comparing the sensor readings against a distribution that models the sensor's uncertainty.
|
||||||
|
|
||||||
\todo{neues resampling? je nach dem was sich noch in der eval zeigt}
|
%\todo{neues resampling? je nach dem was sich noch in der eval zeigt}
|
||||||
|
|
||||||
As GPS will only work outdoors, e.g. when moving from one building into another,
|
As GPS will only work outdoors, e.g. when moving from one building into another,
|
||||||
the system's absolute position indoors is solely provided by the \docWIFI{} component.
|
the system's absolute position indoors is solely provided by the \docWIFI{} component.
|
||||||
|
|||||||
@@ -255,7 +255,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
\todo{???
|
%\todo{???
|
||||||
aps sind (statistisch) unaebhaengig. d.h., jeder AP kann fuer sich optimiert werden.
|
%aps sind (statistisch) unaebhaengig. d.h., jeder AP kann fuer sich optimiert werden.
|
||||||
optimierung des gesamtsystems ist nicht notwendig.
|
%optimierung des gesamtsystems ist nicht notwendig.
|
||||||
}
|
%}
|
||||||
|
|||||||
Reference in New Issue
Block a user