eval final version jopooooooooo
This commit is contained in:
@@ -212,6 +212,7 @@ struct ModeProbabilityTransitionNormal : public K::MarkovTransitionProbability<M
|
|||||||
//create the matrix
|
//create the matrix
|
||||||
Eigen::MatrixXd m(2,2);
|
Eigen::MatrixXd m(2,2);
|
||||||
m << expKld, 1.0 - expKld, 1 - qualityWifi, qualityWifi;
|
m << expKld, 1.0 - expKld, 1 - qualityWifi, qualityWifi;
|
||||||
|
//m << expKld, 1.0 - expKld, 0.00000000000000000001, 0.99999999999999999999;
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
|
|
||||||
|
|||||||
@@ -175,13 +175,13 @@ struct PFTransSimple : public K::ParticleFilterTransition<MyState, MyControl>{
|
|||||||
p.state.position = newPosition;
|
p.state.position = newPosition;
|
||||||
}else{
|
}else{
|
||||||
//no new position!
|
//no new position!
|
||||||
#pragma omp atomic
|
//#pragma omp atomic
|
||||||
noNewPositionCounter++;
|
//noNewPositionCounter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << noNewPositionCounter << std::endl;
|
//std::cout << noNewPositionCounter << std::endl;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -323,8 +323,8 @@ struct PFEval : public K::ParticleFilterEvaluation<MyState, MyObs> {
|
|||||||
// Point3 posOld_m = p.state.positionOld.inMeter();
|
// Point3 posOld_m = p.state.positionOld.inMeter();
|
||||||
|
|
||||||
const double pWifi = getWIFI(observation, wifiObs, p.state.position);
|
const double pWifi = getWIFI(observation, wifiObs, p.state.position);
|
||||||
const double pBaroPressure = getStairProb(p, observation.activity);
|
//const double pBaroPressure = getStairProb(p, observation.activity);
|
||||||
//const double pBaroPressure = getBaroPressure(observation, p.state.relativePressure);
|
const double pBaroPressure = getBaroPressure(observation, p.state.relativePressure);
|
||||||
//const double pBeacon = getBEACON(observation, p.state.position);
|
//const double pBeacon = getBEACON(observation, p.state.position);
|
||||||
|
|
||||||
//small checks
|
//small checks
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
struct MyState : public WalkState, public WalkStateHeading, public WalkStateSpread, public WalkStateFavorZ {
|
struct MyState : public WalkState, public WalkStateHeading, public WalkStateSpread, public WalkStateFavorZ {
|
||||||
|
|
||||||
static Floorplan::IndoorMap* map;
|
//static Floorplan::IndoorMap* map;
|
||||||
|
|
||||||
float relativePressure = 0.0f;
|
float relativePressure = 0.0f;
|
||||||
|
|
||||||
|
|||||||
147
code/main.cpp
147
code/main.cpp
@@ -76,7 +76,7 @@ struct Data {
|
|||||||
|
|
||||||
DataSetup IPIN2017 = {
|
DataSetup IPIN2017 = {
|
||||||
|
|
||||||
mapDir + "SHL38.xml",
|
mapDir + "SHL39.xml",
|
||||||
|
|
||||||
{
|
{
|
||||||
dataDir + "ipin2017/nogps/i-building/path1/1489769326868.csv",
|
dataDir + "ipin2017/nogps/i-building/path1/1489769326868.csv",
|
||||||
@@ -96,22 +96,22 @@ struct Data {
|
|||||||
mapDir + "wifi_fp_all.dat",
|
mapDir + "wifi_fp_all.dat",
|
||||||
40,
|
40,
|
||||||
VAPGrouper::Mode::LAST_MAC_DIGIT_TO_ZERO,
|
VAPGrouper::Mode::LAST_MAC_DIGIT_TO_ZERO,
|
||||||
mapDir + "grid_SHL38.dat"
|
mapDir + "grid_SHL39.dat"
|
||||||
};
|
};
|
||||||
|
|
||||||
} data;
|
} data;
|
||||||
|
|
||||||
|
|
||||||
Floorplan::IndoorMap* MyState::map;
|
//Floorplan::IndoorMap* MyState::map;
|
||||||
|
|
||||||
void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPath) {
|
K::Statistics<float> run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPath) {
|
||||||
|
|
||||||
std::vector<double> kld_data;
|
std::vector<double> kld_data;
|
||||||
std::vector<double> quality_data;
|
std::vector<double> quality_data;
|
||||||
|
|
||||||
// load the floorplan
|
// load the floorplan
|
||||||
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(setup.map);
|
Floorplan::IndoorMap* map = Floorplan::Reader::readFromFile(setup.map);
|
||||||
MyState::map = map;
|
//MyState::map = map;
|
||||||
|
|
||||||
WiFiModelLogDistCeiling WiFiModel(map);
|
WiFiModelLogDistCeiling WiFiModel(map);
|
||||||
WiFiModel.loadAPs(map, Settings::WiFiModel::TXP, Settings::WiFiModel::EXP, Settings::WiFiModel::WAF);
|
WiFiModel.loadAPs(map, Settings::WiFiModel::TXP, Settings::WiFiModel::EXP, Settings::WiFiModel::WAF);
|
||||||
@@ -121,7 +121,6 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
beaconModel.loadBeaconsFromMap(map, Settings::BeaconModel::TXP, Settings::BeaconModel::EXP, Settings::BeaconModel::WAF);
|
beaconModel.loadBeaconsFromMap(map, Settings::BeaconModel::TXP, Settings::BeaconModel::EXP, Settings::BeaconModel::WAF);
|
||||||
//Assert::isFalse(beaconModel.getAllBeacons().empty(), "no Beacons stored within the map.xml");
|
//Assert::isFalse(beaconModel.getAllBeacons().empty(), "no Beacons stored within the map.xml");
|
||||||
|
|
||||||
|
|
||||||
// build the grid
|
// build the grid
|
||||||
std::ifstream inp(setup.grid, std::ifstream::binary);
|
std::ifstream inp(setup.grid, std::ifstream::binary);
|
||||||
Grid<MyNode> grid(20);
|
Grid<MyNode> grid(20);
|
||||||
@@ -132,18 +131,15 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
onp.open(setup.grid);
|
onp.open(setup.grid);
|
||||||
GridFactory<MyNode> factory(grid);
|
GridFactory<MyNode> factory(grid);
|
||||||
factory.build(map);
|
factory.build(map);
|
||||||
|
|
||||||
|
Importance::addImportance(grid);
|
||||||
|
WiFiGridEstimator::estimate(grid, WiFiModel, Settings::smartphoneAboveGround);
|
||||||
|
|
||||||
grid.write(onp);
|
grid.write(onp);
|
||||||
} else {
|
} else {
|
||||||
grid.read(inp);
|
grid.read(inp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// add node-importance
|
|
||||||
Importance::addImportance(grid);
|
|
||||||
|
|
||||||
// stamp WiFi signal-strengths onto the grid
|
|
||||||
WiFiGridEstimator::estimate(grid, WiFiModel, Settings::smartphoneAboveGround);
|
|
||||||
|
|
||||||
// reading file
|
// reading file
|
||||||
Offline::FileReader fr(setup.training[numFile]);
|
Offline::FileReader fr(setup.training[numFile]);
|
||||||
|
|
||||||
@@ -170,9 +166,8 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
//std::shared_ptr<K::ParticleFilterInitializer<MyState>> init(new PFInitFixed(grid, GridPoint(1120.0f, 750.0f, 740.0f), 90.0f));
|
//std::shared_ptr<K::ParticleFilterInitializer<MyState>> init(new PFInitFixed(grid, GridPoint(1120.0f, 750.0f, 740.0f), 90.0f));
|
||||||
|
|
||||||
// mode 1
|
// mode 1
|
||||||
//std::shared_ptr<K::ParticleFilterInitializer<MyState>> initMode1(new PFInit(grid, 1));
|
std::shared_ptr<K::ParticleFilterInitializer<MyState>> initMode1(new PFInit(grid, 1));
|
||||||
std::shared_ptr<K::ParticleFilterInitializer<MyState>> initMode1(new PFInitFixed(grid, GridPoint(1120.0f, 750.0f, 740.0f), 90.0f, 1));
|
//std::shared_ptr<K::ParticleFilterInitializer<MyState>> initMode1(new PFInitFixed(grid, GridPoint(1120.0f, 750.0f, 740.0f), 90.0f, 1));
|
||||||
|
|
||||||
K::ParticleFilterMixing<MyState, MyControl, MyObs> mode1(Settings::numParticles, initMode1, Settings::Mode1::modeProbability);
|
K::ParticleFilterMixing<MyState, MyControl, MyObs> mode1(Settings::numParticles, initMode1, Settings::Mode1::modeProbability);
|
||||||
mode1.setTransition(std::shared_ptr<PFTrans>(new PFTrans(grid, &ctrl)));
|
mode1.setTransition(std::shared_ptr<PFTrans>(new PFTrans(grid, &ctrl)));
|
||||||
mode1.setEvaluation(std::shared_ptr<PFEval>(new PFEval(WiFiModel, beaconModel, grid)));
|
mode1.setEvaluation(std::shared_ptr<PFEval>(new PFEval(WiFiModel, beaconModel, grid)));
|
||||||
@@ -183,8 +178,8 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
modes.push_back(mode1);
|
modes.push_back(mode1);
|
||||||
|
|
||||||
// mode 2
|
// mode 2
|
||||||
//std::shared_ptr<K::ParticleFilterInitializer<MyState>> initMode2(new PFInit(grid, 2));
|
std::shared_ptr<K::ParticleFilterInitializer<MyState>> initMode2(new PFInit(grid, 2));
|
||||||
std::shared_ptr<K::ParticleFilterInitializer<MyState>> initMode2(new PFInitFixed(grid, GridPoint(1120.0f, 750.0f, 740.0f), 90.0f, 2));
|
//std::shared_ptr<K::ParticleFilterInitializer<MyState>> initMode2(new PFInitFixed(grid, GridPoint(1120.0f, 750.0f, 740.0f), 90.0f, 2));
|
||||||
K::ParticleFilterMixing<MyState, MyControl, MyObs> mode2(Settings::numParticles, initMode2, Settings::Mode2::modeProbability);
|
K::ParticleFilterMixing<MyState, MyControl, MyObs> mode2(Settings::numParticles, initMode2, Settings::Mode2::modeProbability);
|
||||||
mode2.setTransition(std::shared_ptr<PFTransSimple>(new PFTransSimple(grid)));
|
mode2.setTransition(std::shared_ptr<PFTransSimple>(new PFTransSimple(grid)));
|
||||||
mode2.setEvaluation(std::shared_ptr<PFEval>(new PFEval(WiFiModel, beaconModel, grid)));
|
mode2.setEvaluation(std::shared_ptr<PFEval>(new PFEval(WiFiModel, beaconModel, grid)));
|
||||||
@@ -201,8 +196,8 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
K::InteractingMultipleModelParticleFilter<MyState, MyControl, MyObs> IMMAPF(modes, transitionProbabilityMatrix);
|
K::InteractingMultipleModelParticleFilter<MyState, MyControl, MyObs> IMMAPF(modes, transitionProbabilityMatrix);
|
||||||
IMMAPF.setMixingSampler(std::unique_ptr<K::MixingSamplerDivergency<MyState, MyControl, MyObs>>(new K::MixingSamplerDivergency<MyState, MyControl, MyObs>()));
|
IMMAPF.setMixingSampler(std::unique_ptr<K::MixingSamplerDivergency<MyState, MyControl, MyObs>>(new K::MixingSamplerDivergency<MyState, MyControl, MyObs>()));
|
||||||
IMMAPF.setJointEstimation(std::unique_ptr<K::JointEstimationPosteriorOnly<MyState, MyControl, MyObs>>(new K::JointEstimationPosteriorOnly<MyState, MyControl, MyObs>()));
|
IMMAPF.setJointEstimation(std::unique_ptr<K::JointEstimationPosteriorOnly<MyState, MyControl, MyObs>>(new K::JointEstimationPosteriorOnly<MyState, MyControl, MyObs>()));
|
||||||
IMMAPF.setMarkovTransitionProbability(std::unique_ptr<ModeProbabilityTransition>(new ModeProbabilityTransition(grid, Settings::Mixing::lambda)));
|
//IMMAPF.setMarkovTransitionProbability(std::unique_ptr<ModeProbabilityTransition>(new ModeProbabilityTransition(grid, Settings::Mixing::lambda)));
|
||||||
//IMMAPF.setMarkovTransitionProbability(std::unique_ptr<ModeProbabilityTransitionNormal>(new ModeProbabilityTransitionNormal(Settings::Mixing::lambda)));
|
IMMAPF.setMarkovTransitionProbability(std::unique_ptr<ModeProbabilityTransitionNormal>(new ModeProbabilityTransitionNormal(Settings::Mixing::lambda)));
|
||||||
|
|
||||||
|
|
||||||
Timestamp lastTimestamp = Timestamp::fromMS(0);
|
Timestamp lastTimestamp = Timestamp::fromMS(0);
|
||||||
@@ -216,10 +211,9 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
|
|
||||||
K::Statistics<float> errorStats;
|
K::Statistics<float> errorStats;
|
||||||
|
|
||||||
|
|
||||||
//file writing for error data
|
//file writing for error data
|
||||||
const long int t = static_cast<long int>(time(NULL));
|
const long int t = static_cast<long int>(time(NULL));
|
||||||
const std::string evalDir = errorDir + std::to_string(t);
|
const std::string evalDir = errorDir + "final_" + std::to_string(t);
|
||||||
if(mkdir(evalDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1){
|
if(mkdir(evalDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1){
|
||||||
Assert::doThrow("Eval folder couldn't be created!");
|
Assert::doThrow("Eval folder couldn't be created!");
|
||||||
}
|
}
|
||||||
@@ -227,6 +221,12 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
std::ofstream errorFile;
|
std::ofstream errorFile;
|
||||||
errorFile.open (evalDir + "/" + std::to_string(numFile) + "_" + std::to_string(t) + ".csv");
|
errorFile.open (evalDir + "/" + std::to_string(numFile) + "_" + std::to_string(t) + ".csv");
|
||||||
|
|
||||||
|
std::ofstream kldFile;
|
||||||
|
kldFile.open (evalDir + "/kld_" + std::to_string(numFile) + "_" + std::to_string(t) + ".csv");
|
||||||
|
|
||||||
|
std::ofstream wifiFile;
|
||||||
|
wifiFile.open (evalDir + "/wifi_" + std::to_string(numFile) + "_" + std::to_string(t) + ".csv");
|
||||||
|
|
||||||
// parse each sensor-value within the offline data
|
// parse each sensor-value within the offline data
|
||||||
for (const Offline::Entry& e : fr.getEntries()) {
|
for (const Offline::Entry& e : fr.getEntries()) {
|
||||||
|
|
||||||
@@ -297,30 +297,30 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
|
|
||||||
//turn angle plot
|
//turn angle plot
|
||||||
static float angleSumTurn = 0; angleSumTurn += ctrl.turnSinceLastTransition_rad;
|
static float angleSumTurn = 0; angleSumTurn += ctrl.turnSinceLastTransition_rad;
|
||||||
plot.showAngle(1, angleSumTurn + M_PI, Point2(0.9, 0.9), "Turn: ");
|
//plot.showAngle(1, angleSumTurn + M_PI, Point2(0.9, 0.9), "Turn: ");
|
||||||
|
|
||||||
//motion angle plot
|
//motion angle plot
|
||||||
static float angleSumMotion = 0; angleSumMotion += ctrl.motionDeltaAngle_rad;
|
static float angleSumMotion = 0; angleSumMotion += ctrl.motionDeltaAngle_rad;
|
||||||
plot.showAngle(2, angleSumMotion + M_PI, Point2(0.9, 0.8), "Motion: ");
|
//plot.showAngle(2, angleSumMotion + M_PI, Point2(0.9, 0.8), "Motion: ");
|
||||||
|
|
||||||
plot.setEst(estPos);
|
//plot.setEst(estPos);
|
||||||
plot.setGT(gtPos);
|
//plot.setGT(gtPos);
|
||||||
plot.addParticles1(IMMAPF.getModes()[0].getParticles());
|
//plot.addParticles1(IMMAPF.getModes()[0].getParticles());
|
||||||
plot.addParticles2(IMMAPF.getModes()[1].getParticles());
|
//plot.addParticles2(IMMAPF.getModes()[1].getParticles());
|
||||||
plot.addEstimationNode(estPos);
|
plot.addEstimationNode(estPos);
|
||||||
plot.addEstimationNodeSmoothed(IMMAPF.getModes()[1].getEstimation().position.inMeter());
|
//plot.addEstimationNodeSmoothed(IMMAPF.getModes()[1].getEstimation().position.inMeter());
|
||||||
|
|
||||||
//plot.gp << "set arrow 919 from " << tt.pos.x << "," << tt.pos.y << "," << tt.pos.z << " to "<< tt.pos.x << "," << tt.pos.y << "," << tt.pos.z+1 << "lw 3\n";
|
//plot.gp << "set arrow 919 from " << tt.pos.x << "," << tt.pos.y << "," << tt.pos.z << " to "<< tt.pos.x << "," << tt.pos.y << "," << tt.pos.z+1 << "lw 3\n";
|
||||||
|
|
||||||
//plot.gp << "set label 1001 at screen 0.02, 0.98 'base:" << relBaro.getBaseAvg() << " sigma:" << relBaro.getSigma() << " cur:" << relBaro.getPressureRealtiveToStart() << " hPa " << -relBaro.getPressureRealtiveToStart()/0.10/4.0f << " floor'\n";
|
//plot.gp << "set label 1001 at screen 0.02, 0.98 'base:" << relBaro.getBaseAvg() << " sigma:" << relBaro.getSigma() << " cur:" << relBaro.getPressureRealtiveToStart() << " hPa " << -relBaro.getPressureRealtiveToStart()/0.10/4.0f << " floor'\n";
|
||||||
int minutes = static_cast<int>(ts.sec()) / 60;
|
//int minutes = static_cast<int>(ts.sec()) / 60;
|
||||||
plot.gp << "set label 1002 at screen 0.02, 0.94 'Time: " << minutes << ":" << static_cast<int>(static_cast<int>(ts.sec())%60) << "'\n";
|
//plot.gp << "set label 1002 at screen 0.02, 0.94 'Time: " << minutes << ":" << static_cast<int>(static_cast<int>(ts.sec())%60) << "'\n";
|
||||||
plot.gp << "set label 1003 at screen 0.02, 0.92 'KLD: " << ":" << kld_data.back() << "'\n";
|
//plot.gp << "set label 1003 at screen 0.02, 0.92 'KLD: " << ":" << kld_data.back() << "'\n";
|
||||||
plot.gp << "set label 1004 at screen 0.90, 0.98 'act:" << obs.activity << "'\n";
|
//plot.gp << "set label 1004 at screen 0.90, 0.98 'act:" << obs.activity << "'\n";
|
||||||
|
|
||||||
plot.gp << "set label 1011 at screen 0.90, 0.10 'Wifi Quality:" << __QUALITY << "'\n";
|
//plot.gp << "set label 1011 at screen 0.90, 0.10 'Wifi Quality:" << __QUALITY << "'\n";
|
||||||
plot.gp << "set label 1005 at screen 0.90, 0.08 'Prob. Mode1:" << IMMAPF.getModes()[0].getModePosteriorProbability() << "'\n";
|
//plot.gp << "set label 1005 at screen 0.90, 0.08 'Prob. Mode1:" << IMMAPF.getModes()[0].getModePosteriorProbability() << "'\n";
|
||||||
plot.gp << "set label 1006 at screen 0.90, 0.06 'Prob. Mode2:" << IMMAPF.getModes()[1].getModePosteriorProbability() << "'\n";
|
//plot.gp << "set label 1006 at screen 0.90, 0.06 'Prob. Mode2:" << IMMAPF.getModes()[1].getModePosteriorProbability() << "'\n";
|
||||||
|
|
||||||
int ones = 0;
|
int ones = 0;
|
||||||
int twos = 0;
|
int twos = 0;
|
||||||
@@ -342,16 +342,20 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plot.gp << "set label 1007 at screen 0.90, 0.04 'Part. Mode1:" << ones << "'\n";
|
//plot.gp << "set label 1007 at screen 0.90, 0.04 'Part. Mode1:" << ones << "'\n";
|
||||||
plot.gp << "set label 1008 at screen 0.90, 0.02 'Part. Mode2:" << twos << "'\n";
|
//plot.gp << "set label 1008 at screen 0.90, 0.02 'Part. Mode2:" << twos << "'\n";
|
||||||
|
|
||||||
// error between GT and estimation
|
// error between GT and estimation
|
||||||
float err_m = gtPos.getDistance(estPos);
|
float err_m = gtPos.getDistance(estPos);
|
||||||
errorStats.add(err_m);
|
errorStats.add(err_m);
|
||||||
errorFile << err_m << "\n";
|
errorFile << err_m << "\n";
|
||||||
|
|
||||||
plot.show();
|
kldFile << kld_data.back() << "\n";
|
||||||
usleep(10*10);
|
|
||||||
|
wifiFile << __QUALITY << "\n";
|
||||||
|
|
||||||
|
//plot.show();
|
||||||
|
//usleep(10*10);
|
||||||
|
|
||||||
lastTimestamp = ts;
|
lastTimestamp = ts;
|
||||||
|
|
||||||
@@ -362,13 +366,15 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
}
|
}
|
||||||
|
|
||||||
errorFile.close();
|
errorFile.close();
|
||||||
|
kldFile.close();
|
||||||
|
wifiFile.close();
|
||||||
|
|
||||||
std::cout << "Statistical Analysis: " << std::endl;
|
std::cout << "Statistical Analysis: " << std::endl;
|
||||||
std::cout << "Median: " << errorStats.getMedian() << " Average: " << errorStats.getAvg() << std::endl;
|
std::cout << "Median: " << errorStats.getMedian() << " Average: " << errorStats.getAvg() << " Std: " << errorStats.getStdDev() << std::endl;
|
||||||
|
|
||||||
//Write the current plotti buffer into file
|
//Write the current plotti buffer into file
|
||||||
std::ofstream plotFile;
|
std::ofstream plotFile;
|
||||||
plotFile.open(errorDir + std::to_string(numFile) + "_" + std::to_string(t) + ".gp");
|
plotFile.open(evalDir + "/gnuplot_" + std::to_string(numFile) + "_" + std::to_string(t) + ".gp");
|
||||||
plot.saveToFile(plotFile);
|
plot.saveToFile(plotFile);
|
||||||
plotFile.close();
|
plotFile.close();
|
||||||
|
|
||||||
@@ -435,6 +441,8 @@ void run(DataSetup setup, int numFile, std::string folder, std::vector<int> gtPa
|
|||||||
std::cout << "finished" << std::endl;
|
std::cout << "finished" << std::endl;
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
||||||
|
return errorStats;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
@@ -442,23 +450,56 @@ int main(int argc, char** argv) {
|
|||||||
//Testing files
|
//Testing files
|
||||||
//run(data.BERKWERK, 6, "EVALBERGWERK"); // Nexus vor
|
//run(data.BERKWERK, 6, "EVALBERGWERK"); // Nexus vor
|
||||||
|
|
||||||
//for(int i = 0; i < 5; ++i){
|
K::Statistics<float> statsAVG;
|
||||||
|
K::Statistics<float> statsMedian;
|
||||||
|
K::Statistics<float> statsSTD;
|
||||||
|
K::Statistics<float> statsQuantil;
|
||||||
|
K::Statistics<float> tmp;
|
||||||
|
|
||||||
|
for(int i = 0; i < 25; ++i){
|
||||||
// Settings::useKLB = false;
|
// Settings::useKLB = false;
|
||||||
// //run(data.IPIN2017, 0, "ipin2017", Settings::Paths_IPIN2017::path1);
|
// errorPair = run(data.IPIN2017, 1, "ipin2017", Settings::Paths_IPIN2017::path1);
|
||||||
// run(data.IPIN2017, 1, "ipin2017", Settings::Paths_IPIN2017::path1);
|
// run(data.IPIN2017, 0, "ipin2017", Settings::Paths_IPIN2017::path1);
|
||||||
// run(data.IPIN2017, 2, "ipin2017", Settings::Paths_IPIN2017::path2);
|
// errorPair = run(data.IPIN2017, 2, "ipin2017", Settings::Paths_IPIN2017::path2);
|
||||||
// //run(data.IPIN2017, 3, "ipin2017", Settings::Paths_IPIN2017::path2);
|
// //run(data.IPIN2017, 3, "ipin2017", Settings::Paths_IPIN2017::path2);
|
||||||
// run(data.IPIN2017, 5, "ipin2017", Settings::Paths_IPIN2017::path3);
|
// run(data.IPIN2017, 5, "ipin2017", Settings::Paths_IPIN2017::path3);
|
||||||
// //run(data.IPIN2017, 4, "ipin2017", Settings::Paths_IPIN2017::path3);
|
// //run(data.IPIN2017, 4, "ipin2017", Settings::Paths_IPIN2017::path3);
|
||||||
|
|
||||||
//run(data.IPIN2017, 0, "ipin2017", Settings::Paths_IPIN2017::path1);
|
tmp = run(data.IPIN2017, 4, "ipin2017", Settings::Paths_IPIN2017::path3);
|
||||||
|
statsMedian.add(tmp.getMedian());
|
||||||
|
statsAVG.add(tmp.getAvg());
|
||||||
|
statsSTD.add(tmp.getStdDev());
|
||||||
|
statsQuantil.add(tmp.getQuantile(0.75));
|
||||||
|
|
||||||
run(data.IPIN2017, 5, "ipin2017", Settings::Paths_IPIN2017::path3);
|
tmp = run(data.IPIN2017, 5, "ipin2017", Settings::Paths_IPIN2017::path3);
|
||||||
//run(data.IPIN2017, 1, "ipin2017", Settings::Paths_IPIN2017::path1);
|
statsMedian.add(tmp.getMedian());
|
||||||
//run(data.IPIN2017, 2, "ipin2017", Settings::Paths_IPIN2017::path2);
|
statsAVG.add(tmp.getAvg());
|
||||||
//run(data.IPIN2017, 3, "ipin2017", Settings::Paths_IPIN2017::path2);
|
statsSTD.add(tmp.getStdDev());
|
||||||
|
statsQuantil.add(tmp.getQuantile(0.75));
|
||||||
|
|
||||||
//run(data.IPIN2017, 4, "ipin2017", Settings::Paths_IPIN2017::path3);
|
std::cout << "Iteration " << i << " completed" << std::endl;;
|
||||||
//}
|
}
|
||||||
|
|
||||||
|
std::cout << "==========================================================" << std::endl;
|
||||||
|
std::cout << "Average of all statistical data: " << std::endl;
|
||||||
|
std::cout << "Median: " << statsMedian.getAvg() << std::endl;
|
||||||
|
std::cout << "Average: " << statsAVG.getAvg() << std::endl;
|
||||||
|
std::cout << "Standard Deviation: " << statsSTD.getAvg() << std::endl;
|
||||||
|
std::cout << "75 Quantil: " << statsQuantil.getAvg() << std::endl;
|
||||||
|
std::cout << "==========================================================" << std::endl;
|
||||||
|
|
||||||
|
//EDIT THIS EDIT THIS EDIT THIS EDIT THIS EDIT THIS EDIT THIS EDIT THIS EDIT THIS
|
||||||
|
std::ofstream finalStatisticFile;
|
||||||
|
finalStatisticFile.open (errorDir + "/finalResults_Path3_AbsBaro.csv");
|
||||||
|
|
||||||
|
finalStatisticFile << "Average of all statistical data: \n";
|
||||||
|
finalStatisticFile << "Median: " << statsMedian.getAvg() << "\n";
|
||||||
|
finalStatisticFile << "Average: " << statsAVG.getAvg() << "\n";
|
||||||
|
finalStatisticFile << "Standard Deviation: " << statsSTD.getAvg() << "\n";
|
||||||
|
finalStatisticFile << "75 Quantil: " << statsQuantil.getAvg() << "\n";
|
||||||
|
|
||||||
|
finalStatisticFile.close();
|
||||||
|
//EDIT THIS EDIT THIS EDIT THIS EDIT THIS EDIT THIS EDIT THIS EDIT THIS EDIT THIS
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
\section{Experiments}
|
\section{Experiments}
|
||||||
|
|
||||||
|
% allgemeine infos über pfade und gebäude. wo
|
||||||
|
% bild: mit pfaden drauf und eventl. wifi qualität in jeweiligen bereichen? (kann frank das)
|
||||||
All upcoming experiments were carried out on four floors of a \SI{77}{m} x \SI{55}{m} sized faculty building.
|
All upcoming experiments were carried out on four floors of a \SI{77}{m} x \SI{55}{m} sized faculty building.
|
||||||
It includes several staircases and elevators and has a ceiling height of about \SI{3}{m}.
|
It includes several staircases and elevators and has a ceiling height of about \SI{3}{m}.
|
||||||
Nevertheless, the grid was generated for the complete campus and thus outdoor areas like the courtyard are also walkable.
|
Nevertheless, the grid was generated for the complete campus and thus outdoor areas like the courtyard are also walkable.
|
||||||
@@ -11,40 +13,49 @@ As mentioned before, we omit any time-consuming calibration processes and use th
|
|||||||
The position of the access-points (about five per floor) is known beforehand.
|
The position of the access-points (about five per floor) is known beforehand.
|
||||||
Due to legal terms, we are not allowed to depict their positions and therefore omit this information within the figures.
|
Due to legal terms, we are not allowed to depict their positions and therefore omit this information within the figures.
|
||||||
|
|
||||||
|
% gewählte parameter (auch mal die optimieren wifi parameter testen)
|
||||||
We arranged three distinct walks (see also fig. \ref{}).
|
We arranged three distinct walks (see also fig. \ref{}).
|
||||||
The measurements for the walks were recorded using a Motorola Nexus 6 at 2.4 GHz band only.
|
The measurements for the walks were recorded using a Motorola Nexus 6 at 2.4 GHz band only.
|
||||||
The computation was done offline as described in algorithm \ref{}.
|
The computation was done offline as described in algorithm \ref{}.
|
||||||
For each walk we deployed $xx$ MC runs using 5000 Particles.
|
For each walk we deployed $xx$ MC runs using 5000 Particles for each mode.
|
||||||
Instead of an initial position and heading, all walks start with a uniform distribution (random position and heading) as prior.
|
Instead of an initial position and heading, all walks start with a uniform distribution (random position and heading) as prior.
|
||||||
For the filtering we used $\sigma_\text{wifi} = 8.0$ as uncertainties, both growing with each measurement's age.
|
For the filtering we used $\sigma_\text{wifi} = 8.0$ as uncertainties, both growing with each measurement's age.
|
||||||
While the pressure change was assumed to be \SI{0.105}{$\frac{\text{\hpa}}{\text{\meter}}$}, all other barometer-parameters are determined automatically.
|
While the pressure change was assumed to be \SI{0.105}{$\frac{\text{\hpa}}{\text{\meter}}$}, all other barometer-parameters are determined automatically.
|
||||||
The step size $\mStepSize$ for the transition was configured to be \SI{70}{\centimeter} with an allowed derivation of \SI{10}{\percent}. The heading deviation was set to \SI{25}{\degree}.
|
The step size $\mStepSize$ for the transition was configured to be \SI{70}{\centimeter} with an allowed derivation of \SI{10}{\percent}. The heading deviation was set to \SI{25}{\degree}.
|
||||||
|
|
||||||
KLD with normal dist and kernel density drawing from grid.
|
% wie für die kld gezogen? begründen warum wir nun keine parzenschätzung machen (weil ähnliche ergebnisse)
|
||||||
|
To calculate \eqref{equ:KLD} and thus the Kullback-Leibler divergence, we need to sample densities from both modes likewise.
|
||||||
|
The grid is suitable for this purpose.
|
||||||
|
However, sampling at any vertex $\mVertexA$ of the grid, given just a set of random variables (particles), is not the easiest task.
|
||||||
|
We need to estimate the posterior distribution given by the respective particle sets.
|
||||||
|
A common way is to deploy a kernel density estimation using a Gaussian distribution as kernel.
|
||||||
|
The density of a specific point $\hat\mStateVec_{t} = \fPos{\mVertexA}$ is then given by
|
||||||
|
%
|
||||||
|
\begin{equation}
|
||||||
|
p(\hat\mStateVec_{t} \mid m_t, \mObsVec_{1:t}) = \sum_{i=1}^{N_{m_t}} \mathcal{N}(d^i_{\text{KL}} \mid 0, \sigma_{\text{KL}})
|
||||||
|
\enspace ,
|
||||||
|
\end{equation}
|
||||||
|
%
|
||||||
|
while $d^i_{\text{KL}}$ is the euclidean distance between the considered point's $\hat\mStateVec_{t}$ and all particles $\fPos{\vec{X}_t^{i,m_t}}$ of the mode. The variance $\sigma_{\text{KL}}$ is set to \SI{1}{m}.
|
||||||
|
It is well known, that the computation of the kernel density estimation is rather slow, thus we also used a much simpler estimation by assuming a multivariate Gaussian distribution for both modes.
|
||||||
|
Here, the mean is given by weighted arithmetic mean of the particles and the variance is defined by the sample covariance matrix.
|
||||||
|
|
||||||
|
% ground truth
|
||||||
The ground truth is measured by recording a timestamp at marked spots on the walking route. When passing a marker, the pedestrian clicked a button on the smartphone application.
|
The ground truth is measured by recording a timestamp at marked spots on the walking route. When passing a marker, the pedestrian clicked a button on the smartphone application.
|
||||||
Between two consecutive points, a constant movement speed is assumed.
|
Between two consecutive points, a constant movement speed is assumed.
|
||||||
Thus, the ground truth might not be \SI{100}{\percent} accurate, but fair enough for error measurements.
|
Thus, the ground truth might not be \SI{100}{\percent} accurate, but fair enough for error measurements.
|
||||||
The approximation error is then calculated by comparing the interpolated ground truth position with the current estimation \cite{Fetzer2016OMC}.
|
The approximation error is then calculated by comparing the interpolated ground truth position with the current estimation \cite{Fetzer2016OMC}.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% allgemeine infos über pfade und gebäude. wo
|
|
||||||
% bild: mit pfaden drauf und eventl. wifi qualität in jeweiligen bereichen? (kann frank das)
|
|
||||||
|
|
||||||
% gewählte parameter (auch mal die optimieren wifi parameter testen)
|
|
||||||
|
|
||||||
% wie für die kld gezogen? begründen warum wir nun keine parzenschätzung machen (weil ähnliche ergebnisse)
|
|
||||||
|
|
||||||
% ground truth
|
|
||||||
|
|
||||||
% maß für die streuung der verteilung (diversity von partikeln)
|
% maß für die streuung der verteilung (diversity von partikeln)
|
||||||
|
|
||||||
|
|
||||||
|
error at the beginning always very high. about 44 meters. therefore the median is better value oder 75 quantil.
|
||||||
|
|
||||||
% zeigen das es stucken verhindert (eventl. hier eine andere aufnahme die mitten drinnen stecken bleibt)
|
% zeigen das es stucken verhindert (eventl. hier eine andere aufnahme die mitten drinnen stecken bleibt)
|
||||||
% bild: stucken im raum + nicht mehr stucken im raum
|
% bild: stucken im raum + nicht mehr stucken im raum + kld mit anzeigen
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% zeigen das schlechtes wi-fi (zu hohe diversity) behoben wird.
|
% zeigen das schlechtes wi-fi (zu hohe diversity) behoben wird.
|
||||||
% bild: lauf auf der rechten seite des gebäudes zeige mit und ohne wifi faktor (schlechtes wifi einzeichnen)
|
% bild: lauf auf der rechten seite des gebäudes zeige mit und ohne wifi faktor (schlechtes wifi einzeichnen)
|
||||||
|
|||||||
Reference in New Issue
Block a user