code that runs the final eval

TeX update
This commit is contained in:
2017-05-01 18:44:07 +02:00
parent 60712689cf
commit 92f7cfb530
10 changed files with 379 additions and 155 deletions

View File

@@ -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
ADD_DEFINITIONS(
@@ -58,7 +62,7 @@ ADD_DEFINITIONS(
-fstack-protector-all
-g3
-O2
-O0
-march=native
-DWITH_TESTS

View File

@@ -57,7 +57,7 @@ namespace Settings {
const std::string fPathGFX = pathbase + "/tex/gfx/";
int numParticles = 5000;
int numParticles = 10000;
float smartphoneAboveGround = 1.3;

View File

@@ -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_3a, Settings::GroundTruth::path_toni_inst_3);
int i = 0; (void) i;
}
@@ -996,7 +999,9 @@ int main(void) {
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(Settings::fMap);;
//EvalWalk walk(map);
//walk.walk1();
EvalWalk::walkEverything(map);
//75% quartil > 20 meter -> fehler? [verlaufen irgendwo ab der hälfte]
//EvalWalk::walkEverything(map);
EvalWalk::walkEverythingBuildStats(map);
return 0;
}

View File

@@ -45,7 +45,7 @@
#include <Indoor/sensors/offline/Listener.h>
#define PLOT_LIVE
//#define PLOT_LIVE
//#define PLOT_WIFI
//#define PLOT_ERROR_TIME
//#define PLOT_ERROR_FUNC
@@ -60,10 +60,21 @@ class EvalWalk : public Offline::Listener {
std::string runName;
#ifdef PLOT_LIVE
Plotty plotty;
#endif
#ifdef PLOT_WIFI
PlotWifiMeasurements plotWifi;
#endif
#ifdef PLOT_ERROR_TIME
PlotErrTime pet;
#endif
#ifdef PLOT_ERROR_FUNC
PlotErrFunc pef;
#endif
Offline::FileReader reader;
Offline::FilePlayer player;
@@ -91,15 +102,34 @@ class EvalWalk : public Offline::Listener {
public:
EvalWalk(Floorplan::IndoorMap* map) : plotty(map), map(map), em(map),
pet("\\small{time (sec)}", "\\small{error (m)}", "\\small{APs visible}"),
pef("\\small{error (m)}", "\\small{updates (\\%)}") {
~EvalWalk() {
delete grid;
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";
grid = new Grid<MyGridNode>(Settings::Grid::gridSize_cm);
#ifdef PLOT_LIVE
// once
plotty.buildFloorplan();
#endif
// deserialize grid
std::ifstream inp(saveFile, std::ofstream::binary);
@@ -173,12 +203,13 @@ public:
struct LeModel {
std::string name;
std::string plotKey;
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) {
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);
for (const float f : stats.getAll()) {
out << f << "\n";
@@ -187,7 +218,7 @@ public:
}
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>();
std::ifstream inp(file);
while(inp) {
@@ -221,16 +252,16 @@ public:
static std::vector<LeModel> allModels(Floorplan::IndoorMap* map) {
WiFiModelFactory fac(map);
return {
//LeModel("empiric", fac.loadXML(Settings::wifiAllFixed)),
//LeModel("opt 1", fac.loadXML(Settings::wifiAllOptPar)),
//LeModel("opt 2", fac.loadXML(Settings::wifiEachOptPar)),
//LeModel("opt 3", fac.loadXML(Settings::wifiEachOptParPos)),
//LeModel("per floor", fac.loadXML(Settings::wifiEachOptParPos_multimodel)),
LeModel("per bbox", fac.loadXML(Settings::wifiEachOptParPos_perBBox)),
LeModel("empiric", "\\noOptEmpiric{}", fac.loadXML(Settings::wifiAllFixed)),
LeModel("opt 1", "\\optParamsAllAP{}", fac.loadXML(Settings::wifiAllOptPar)),
LeModel("opt 2", "\\optParamsEachAP{}", fac.loadXML(Settings::wifiEachOptPar)),
LeModel("opt 3", "\\optParamsPosEachAP{}", fac.loadXML(Settings::wifiEachOptParPos)),
LeModel("per floor", "\\optPerFloor{}", fac.loadXML(Settings::wifiEachOptParPos_multimodel)),
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 */
static void walkEverythingBuildStats(Floorplan::IndoorMap* map) {
@@ -239,8 +270,10 @@ public:
const std::vector<LeModel> models = allModels(map);
PlotErrFunc* pefAll = new PlotErrFunc();
int numStuck = 0;
int numTotal = 0;
pefAll->setYRange(0, 90, 5);
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) {
@@ -248,34 +281,71 @@ public:
K::Statistics<float>* modelStatsMed = 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...
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;
++numTotalWalk;
K::Statistics<float>* walkStats = deserialize(walk, mdl, i);
if (walkStats->getMedian() < 10) {
modelStatsSingle->add(*walkStats);
pefAll->plot();
//if (walkStats->getMedian() < 15) {
if (walkStats->getQuantile(0.75) < 20) {
//modelStatsSingle->add(*walkStats);
} else {
++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);
}
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);
@@ -303,7 +373,8 @@ public:
//K::Statistics<float> curWalkRepeatStatsMed;
// ... 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);
ew.walkName = walk.name + " - " + mdl.name + " - " + std::to_string(i);
@@ -530,6 +601,7 @@ private:
std::string path = Settings::fPathGFX;
std::string base = path + "/walks/" + "walk-" + walkName;
#ifdef PLOT_LIVE
plotty.gp << "unset arrow 1\n";
plotty.gp << "unset arrow 2\n";
plotty.gp << "unset colorbox\n";
@@ -546,18 +618,23 @@ private:
plotty.gp.setOutput(base + "-map.tex");
plotty.writeCodeTo(base + "-map.gp");
plotty.plot();
#endif
#ifdef PLOT_ERROR_FUNC
pef.getPlot().getMargin().set(4, 0.2, 0.1, 2.0);
pef.getGP().setTerminal("epslatex", K::GnuplotSize(8.6, 3.0));
pef.getGP().setOutput(base + "-error-cum.tex");
pef.writePlotToFile(base + "-error-cum.gp");
pef.plot();
#endif
#ifdef PLOT_ERROR_TIME
pet.getPlot().getMargin().set(4, 0.2, 0.1, 2.0);
pet.getGP().setTerminal("epslatex", K::GnuplotSize(8.6, 3.0));
pet.getGP().setOutput(base + "-error-time.tex");
pet.writePlotToFile(base + "-error-time.gp");
pet.plot();
#endif
}
@@ -566,10 +643,6 @@ private:
++updateCount;
pef.showMarkers(true, true);
std::cout << "update" << std::endl;
MyControl ctrlCopy = curCtrl;
//static float absHead = relHeadingOffset;
absHead += ctrlCopy.turnSinceLastTransition_rad;
@@ -587,6 +660,7 @@ private:
statsErr.add(estRealErr);
#ifdef PLOT_ERROR_FUNC
pef.showMarkers(true, true);
pef.clear();
pef.add("", &statsErr);
#endif
@@ -597,9 +671,11 @@ private:
pet.addB(lastTransition, getNumFHWSAPs(curObs.wifi));
#endif
#ifdef PLOT_LIVE
// update estimated path
const K::GnuplotPoint3 p3(curEst.position.x_cm, curEst.position.y_cm, curEst.position.z_cm);
plotty.pathEst.add(p3/100);
#endif
}
@@ -611,6 +687,7 @@ private:
std::cout << statsErr.asString() << std::endl;
#ifdef PLOT_LIVE
// estimation and ground-truth
plotty.setCurEst(curEst.position.inMeter());
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";
}
#endif
#ifdef PLOT_LIVE
plotty.plot();

View File

@@ -373,7 +373,7 @@ public:
wqa.add(wifiObs);
float quality = wqa.getQuality();
std::cout << "wifi quality: " << quality << std::endl;
//std::cout << "wifi quality: " << quality << std::endl;
// GPS

View File

@@ -139,7 +139,7 @@
% not capitalized unless they are the first or last word of the title.
% Linebreaks \\ can be used within to get better formatting as desired.
% 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

View File

@@ -1,22 +1,57 @@
\section{Conclusion}
\section{Conclusion and Future Work}
beide ansaetze sind in unserem szenario/gebaeude OK:
bekannte AP-pos + empirische parameter
komplette optimierung über fingerprints
\todo{ueberleitung?}
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]
As denoted within the previous evaluations and discussions, the accuracy of
indoor localization systems based on \docWIFI{} depends on a manifold
of parameters and even minor adjustments can yield huge improvements.
Depending on required accuracy and acceptable setup- and maintenance times,
several approaches are conceivable:
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
laufzeit mehr berechnung, oder muessten vorab auf einem grid berechnet
werden \todo{cite auf competition}
If the use-case does not require utmost accuracy and the locations of permanently
installed transmitters is already well known, just using empiric model parameters
is a viable choice for many situations.
\section{Future Work}
However, when combined with (particle) filtering, a heavily constrained
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]
%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.

View File

@@ -1,21 +1,26 @@
\section{Experiments}
\todo{
alles im FHWS gebäude [korrekte groesse fuer beide gebaeude!] mit nem nexus 6
}
% intro
Within all \docWIFI{} observations (offline and online) we only consider the \docAP{}s that are permanently installed
within the building. Temporal and movable transmitters are ignored as they might cause estimation errors.
All optimizations and evaluations took place within two adjacent buildings (4 and 2 floors, respectively)
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)
der fehler wird zwar kleiner, ist aber immernoch deutlich spürbar. das spricht dafür, dass das modell einfach nicht
gut geeignet ist.
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
%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}
\todo{übergang holprig}
\todo{uebergang holprig?}
%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}:
@@ -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
(see figure \ref{fig:allWalks}).
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
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 building that produce a similar probability \refeq{eq:wifiProb} as the actual ground-truth
@@ -353,96 +358,199 @@
attenuated by ambient conditions like concrete walls.
We therefore examined variations of the probability calculation from \refeq{eq:wifiProb}.
Removing the strongest/weakest \docAPshort{} from $\mRssiVec{}$ yielded similar results.
While some estimations were improved, the overall estimation error increased for our walks,
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.
Using a more strict exponential distribution for the model vs. scan comparison in \refeq{eq:wifiProb}
had a positive effect on the misclassification error for some of the walks, but slightly increased
the estimation error (see figure \ref{fig:normalVsExponential}) and thus produced negative side effects.
Incorporating additional knowledge provided by virtual \docAP{}s (see section \ref{sec:vap}) mitigated this issues.
If only one out of six virtual networks is observed, this observation is likely to be erroneous, no matter
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}
\input{gfx/wifiCompare_normalVsExp_cross.tex}
\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}
Using a smaller $\sigma$ or a more strict exponential distribution for the model vs. scan comparison in \refeq{eq:wifiProb}
had a positive effect on the misclassification error for some of the walks, but also slightly increased the overall estimation error.
%(see figure \ref{fig:normalVsExponential}).
Due to those negative side-effects, the final localization system (\refeq{eq:recursiveDensity}) is unlikely to profit from such changes.
\todo{ueberleitung OK?}
% braucht zu viel platz
%\begin{figure}
% \input{gfx/wifiCompare_normalVsExp_cross.tex}
% \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{
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!
}
%\todo{
% 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!
%}
% -------------------------------- 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
\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.
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
zu kurz draußen um einen guten gps-fix zu bekommen.}
%\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.
%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{
walk1 hat eine issue kurz bevor man zur tuer zum hoersaalgebaude reingeht
je nach resampling killt dieser wlan error evtl alle partikel!
}
\todo{
das bbox modell hat probleme an den uebergängen zwischen bboxes da dort teils starke spruenge sind
die nicht immer in der realität so auch vorliegen. z.B. z-wechsel machen teils probleme.
hier wäre ein kontinuierliches modell hilfreich bzw interpolation in randbereichen
}
\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}
%\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
%}
%ware das grid-model nicht da, wuerde der outdoor teil richtig schlecht laufen,
%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
ware das grid-model nicht da, wuerde der outdoor teil richtig schlecht laufen,
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
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}
@@ -452,13 +560,7 @@ die mittelwert-estimation versagt hier
%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{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{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???
}

View File

@@ -74,7 +74,7 @@
to further enhance the localization. Their values are incorporated by simply
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,
the system's absolute position indoors is solely provided by the \docWIFI{} component.

View File

@@ -255,7 +255,7 @@
\todo{???
aps sind (statistisch) unaebhaengig. d.h., jeder AP kann fuer sich optimiert werden.
optimierung des gesamtsystems ist nicht notwendig.
}
%\todo{???
%aps sind (statistisch) unaebhaengig. d.h., jeder AP kann fuer sich optimiert werden.
%optimierung des gesamtsystems ist nicht notwendig.
%}