added missing code-changes (mainly eval)

This commit is contained in:
2016-03-17 17:27:08 +01:00
parent 00d3033eef
commit 4c1e73e3cf
12 changed files with 801 additions and 121 deletions

View File

@@ -64,7 +64,7 @@ ADD_DEFINITIONS(
-fstack-protector-all -fstack-protector-all
-g -g
-O0 -O2
-DWITH_TESTS -DWITH_TESTS
-DWITH_ASSERTIONS -DWITH_ASSERTIONS
@@ -72,6 +72,14 @@ ADD_DEFINITIONS(
endif() endif()
# allow OMP
find_package(OpenMP)
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()
# build a binary file # build a binary file
ADD_EXECUTABLE( ADD_EXECUTABLE(
${PROJECT_NAME} ${PROJECT_NAME}

View File

@@ -21,7 +21,8 @@ public:
float getWeightBetween(const MyGridNode& n1, const MyGridNode& n2) const { float getWeightBetween(const MyGridNode& n1, const MyGridNode& n2) const {
float d = ((Point3)n1 - (Point3)n2).length(2) ; float d = ((Point3)n1 - (Point3)n2).length(2) ;
//if (d > 20) {d*= 1.30;} //if (d > 20) {d*= 1.30;}
d /= std::pow(n2.imp, 3); //d /= std::pow(n2.imp, 3);
d /= n2.imp;
return d; return d;
} }

View File

@@ -47,8 +47,9 @@ public:
} }
/** align the given value onto the grid */ /** align the given value onto the grid */
static int align(const int val) { template <typename T> static int align(Grid<T>& grid, const int val) {
return val / MiscSettings::gridSize_cm * MiscSettings::gridSize_cm; volatile const float gridSize_cm = grid.getGridSize_cm();
return std::round(val / gridSize_cm) * gridSize_cm;
} }
/** all floors within the building */ /** all floors within the building */
@@ -58,23 +59,20 @@ public:
Stairs s01, s12, s23; Stairs s01, s12, s23;
const LengthF h0 = LengthF::cm(align(getHeight(0))); LengthF h0, h1, h2, h3;
const LengthF h1 = LengthF::cm(align(getHeight(1)));
const LengthF h2 = LengthF::cm(align(getHeight(2)));
const LengthF h3 = LengthF::cm(align(getHeight(3)));
// all ground-truth points // all ground-truth points
std::unordered_map<int, Point3> gtwp; std::unordered_map<int, Point3> gtwp;
FHWSFloors() {;} FHWSFloors(LengthF h0, LengthF h1, LengthF h2, LengthF h3) : h0(h0), h1(h1), h2(h2), h3(h3) {;}
}; };
/** load the entire floorplan */ /** load the entire floorplan */
static FHWSFloors getFloors() { template <typename T> static FHWSFloors getFloors(Grid<T>& grid) {
FloorplanFactorySVG fpFac(MiscSettings::floorplan, 2.822222); FloorplanFactorySVG fpFac(MiscSettings::floorplan, 2.822222);
FHWSFloors f; FHWSFloors f(LengthF::cm(align(grid, getHeight(0))), LengthF::cm(align(grid, getHeight(1))), LengthF::cm(align(grid, getHeight(2))), LengthF::cm(align(grid, getHeight(3))));
f.f0 = fpFac.getFloor("floor_0"); f.f0 = fpFac.getFloor("floor_0");
f.f1 = fpFac.getFloor("floor_1"); f.f1 = fpFac.getFloor("floor_1");

View File

@@ -41,6 +41,9 @@ public:
vis.estPath.clear(); vis.estPath.clear();
vis.particles.clear(); vis.particles.clear();
vis.particles.add(K::GnuplotPoint3(this->centerOfMass.x, this->centerOfMass.y, this->centerOfMass.z)); vis.particles.add(K::GnuplotPoint3(this->centerOfMass.x, this->centerOfMass.y, this->centerOfMass.z));
const int advance = this->stdDevDist / grid.getGridSize_cm();
const T& d = *this->path->getFromStart(advance).element;
vis.particles.add(K::GnuplotPoint3(d.x_cm, d.y_cm, d.z_cm));
for (int i = 0; i < (int)this->path->size()-1; ++i) { for (int i = 0; i < (int)this->path->size()-1; ++i) {
const DijkstraNode<T>& dn1 = (*this->path)[i+0]; const DijkstraNode<T>& dn1 = (*this->path)[i+0];
const DijkstraNode<T>& dn2 = (*this->path)[i+1]; const DijkstraNode<T>& dn2 = (*this->path)[i+1];

View File

@@ -243,6 +243,10 @@ public:
} }
void bergwerk_path1_nexus_simple() { void bergwerk_path1_nexus_simple() {
runName = "bergwerk_path1_nexus_simple"; runName = "bergwerk_path1_nexus_simple";
@@ -253,11 +257,385 @@ public:
srs = new SensorReaderStep("./measurements/bergwerk/path1/nexus/vor/Steps2.txt"); srs = new SensorReaderStep("./measurements/bergwerk/path1/nexus/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path1dbl); gtw = getGroundTruthWay(*sr, floors.gtwp, path1dbl);
for (auto& n : grid) {n.imp = 1;}
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path1_nexus_imp() {
runName = "bergwerk_path1_nexus_importance";
BarometerEvaluation::barometerSigma = 0.10;
sr = new SensorReader("./measurements/bergwerk/path1/nexus/vor/1454775984079.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path1/nexus/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path1/nexus/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path1dbl);
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>(); GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) ); pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
} }
void bergwerk_path1_nexus_multi() {
runName = "bergwerk_path1_nexus_multi";
BarometerEvaluation::barometerSigma = 0.10;
sr = new SensorReader("./measurements/bergwerk/path1/nexus/vor/1454775984079.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path1/nexus/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path1/nexus/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path1dbl);
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path1dbl.back()]) );
GridWalkPathControl<MyGridNode>* walk = new GridWalkPathControl<MyGridNode>(grid, DijkstraMapper(grid), end);
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path1_nexus_shortest() {
runName = "bergwerk_path1_nexus_shortest";
BarometerEvaluation::barometerSigma = 0.10;
sr = new SensorReader("./measurements/bergwerk/path1/nexus/vor/1454775984079.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path1/nexus/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path1/nexus/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path1dbl);
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path1dbl.back()]) );
DebugShortestPath<MyGridNode>* walk = new DebugShortestPath<MyGridNode>(grid, DijkstraMapper(grid), end, this->floors);
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
/* ------------------------------------------------------------------------------------------------------------------------------- */
void bergwerk_path2_nexus() {
BarometerEvaluation::barometerSigma = 0.10;
sr = new SensorReader("./measurements/bergwerk/path2/nexus/vor/1454779863041.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path2/nexus/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path2/nexus/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path2dbl);
}
void bergwerk_path2_nexus_simple() {
runName = "bergwerk_path2_nexus_simple";
bergwerk_path2_nexus();
for (auto& n : grid) {n.imp = 1;} // remove importance
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path2_nexus_imp() {
runName = "bergwerk_path2_nexus_importance";
bergwerk_path2_nexus();
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path2_nexus_multi() {
runName = "bergwerk_path2_nexus_multi";
bergwerk_path2_nexus();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path2dbl.back()]) );
GridWalkPathControl<MyGridNode>* walk = new GridWalkPathControl<MyGridNode>(grid, DijkstraMapper(grid), end);
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path2_nexus_shortest() {
runName = "bergwerk_path2_nexus_shortest";
bergwerk_path2_nexus();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path2dbl.back()]) );
DebugShortestPath<MyGridNode>* walk = new DebugShortestPath<MyGridNode>(grid, DijkstraMapper(grid), end, this->floors);
walk->times = 4;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
/* ------------------------------------------------------------------------------------------------------------------------------- */
void bergwerk_path3_nexus() {
BarometerEvaluation::barometerSigma = 0.10;
sr = new SensorReader("./measurements/bergwerk/path3/nexus/vor/1454782562231.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path3/nexus/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path3/nexus/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path3dbl);
}
void bergwerk_path3_nexus_simple() {
runName = "bergwerk_path3_nexus_simple";
bergwerk_path3_nexus();
for (auto& n : grid) {n.imp = 1;} // remove importance
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path3_nexus_imp() {
runName = "bergwerk_path3_nexus_importance";
bergwerk_path3_nexus();
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path3_nexus_multi() {
runName = "bergwerk_path3_nexus_multi";
bergwerk_path3_nexus();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path3dbl.back()]) );
GridWalkPathControl<MyGridNode>* walk = new GridWalkPathControl<MyGridNode>(grid, DijkstraMapper(grid), end);
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path3_nexus_shortest() {
runName = "bergwerk_path3_nexus_shortest";
bergwerk_path3_nexus();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path3dbl.back()]) );
DebugShortestPath<MyGridNode>* walk = new DebugShortestPath<MyGridNode>(grid, DijkstraMapper(grid), end, this->floors);
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
/* ------------------------------------------------------------------------------------------------------------------------------- */
void bergwerk_path4_nexus() {
BarometerEvaluation::barometerSigma = 0.10;
sr = new SensorReader("./measurements/bergwerk/path4/nexus/vor/1454776525797.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path4/nexus/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path4/nexus/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path4dbl);
//for (const K::Particle<MyState>& _p : pf->getParticles()) {
// K::Particle<MyState>& p = (K::Particle<MyState>&) _p;
// p.state.pCur = floors.gtwp[path4dbl.front()];
// p.state.pOld = p.state.pCur;
// p.state.walkState.node = grid.getNodePtrFor( conv(p.state.pCur) );
// p.state.walkState.heading = Angle::degToRad(90);
//}
}
void bergwerk_path4_nexus_simple() {
runName = "bergwerk_path4_nexus_simple";
bergwerk_path4_nexus();
for (auto& n : grid) {n.imp = 1;} // remove importance
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path4_nexus_imp() {
runName = "bergwerk_path4_nexus_importance";
bergwerk_path4_nexus();
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path4_nexus_multi() {
runName = "bergwerk_path4_nexus_multi";
bergwerk_path4_nexus();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path4dbl.back()]) );
GridWalkPathControl<MyGridNode>* walk = new GridWalkPathControl<MyGridNode>(grid, DijkstraMapper(grid), end);
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path4_nexus_shortest() {
runName = "bergwerk_path4_nexus_shortest";
bergwerk_path4_nexus();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path4dbl.back()]) );
DebugShortestPath<MyGridNode>* walk = new DebugShortestPath<MyGridNode>(grid, DijkstraMapper(grid), end, this->floors);
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
/* ------------------------------------------------------------------------------------------------------------------------------- */
void bergwerk_path1_galaxy() {
BarometerEvaluation::barometerSigma = 0.20;
stepSize = 0.9;
sr = new SensorReader("./measurements/bergwerk/path1/galaxy/vor/1454776168794.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path1/galaxy/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path1/galaxy/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path1dbl);
}
void bergwerk_path1_galaxy_simple() {
runName = "bergwerk_path1_galaxy_simple";
bergwerk_path1_galaxy();
for (auto& n : grid) {n.imp = 1;} // remove importance
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path1_galaxy_multi() {
runName = "bergwerk_path1_galaxy_multi";
bergwerk_path1_galaxy();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path1dbl.back()]) );
GridWalkPathControl<MyGridNode>* walk = new GridWalkPathControl<MyGridNode>(grid, DijkstraMapper(grid), end);
walk->pOther = 0.15;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path1_galaxy_shortest() {
runName = "bergwerk_path1_galaxy_shortest";
bergwerk_path1_galaxy();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path1dbl.back()]) );
DebugShortestPath<MyGridNode>* walk = new DebugShortestPath<MyGridNode>(grid, DijkstraMapper(grid), end, this->floors);
walk->pOther = 0.15;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
/* ------------------------------------------------------------------------------------------------------------------------------- */
void bergwerk_path2_galaxy() {
BarometerEvaluation::barometerSigma = 0.20;
stepSize = 0.9;
sr = new SensorReader("./measurements/bergwerk/path2/galaxy/vor/1454780113404.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path2/galaxy/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path2/galaxy/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path2dbl);
}
void bergwerk_path2_galaxy_simple() {
runName = "bergwerk_path2_galaxy_simple";
bergwerk_path2_galaxy();
for (auto& n : grid) {n.imp = 1;} // remove importance
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path2_galaxy_multi() {
runName = "bergwerk_path2_galaxy_multi";
bergwerk_path2_galaxy();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path2dbl.back()]) );
GridWalkPathControl<MyGridNode>* walk = new GridWalkPathControl<MyGridNode>(grid, DijkstraMapper(grid), end);
walk->pOther = 0.15;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path2_galaxy_shortest() {
runName = "bergwerk_path2_galaxy_shortest";
bergwerk_path2_galaxy();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path2dbl.back()]) );
DebugShortestPath<MyGridNode>* walk = new DebugShortestPath<MyGridNode>(grid, DijkstraMapper(grid), end, this->floors);
walk->pOther = 0.15;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
/* ------------------------------------------------------------------------------------------------------------------------------- */
void bergwerk_path3_galaxy() {
BarometerEvaluation::barometerSigma = 0.20;
stepSize = 0.9;
sr = new SensorReader("./measurements/bergwerk/path3/galaxy/vor/1454782896548.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path3/galaxy/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path3/galaxy/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path3dbl);
}
void bergwerk_path3_galaxy_simple() {
runName = "bergwerk_path3_galaxy_simple";
bergwerk_path3_galaxy();
for (auto& n : grid) {n.imp = 1;} // remove importance
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path3_galaxy_multi() {
runName = "bergwerk_path3_galaxy_multi";
bergwerk_path3_galaxy();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path3dbl.back()]) );
GridWalkPathControl<MyGridNode>* walk = new GridWalkPathControl<MyGridNode>(grid, DijkstraMapper(grid), end);
walk->pOther = 0.15;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path3_galaxy_shortest() {
runName = "bergwerk_path3_galaxy_shortest";
bergwerk_path3_galaxy();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path3dbl.back()]) );
DebugShortestPath<MyGridNode>* walk = new DebugShortestPath<MyGridNode>(grid, DijkstraMapper(grid), end, this->floors);
walk->pOther = 0.15;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
/* ------------------------------------------------------------------------------------------------------------------------------- */
void bergwerk_path4_galaxy() {
BarometerEvaluation::barometerSigma = 0.20;
stepSize = 0.9;
sr = new SensorReader("./measurements/bergwerk/path4/galaxy/vor/1454779020844.csv"); // forward
srt = new SensorReaderTurn("./measurements/bergwerk/path4/galaxy/vor/Turns.txt");
srs = new SensorReaderStep("./measurements/bergwerk/path4/galaxy/vor/Steps2.txt");
gtw = getGroundTruthWay(*sr, floors.gtwp, path4dbl);
}
void bergwerk_path4_galaxy_simple() {
runName = "bergwerk_path4_galaxy_simple";
bergwerk_path4_galaxy();
for (auto& n : grid) {n.imp = 1;} // remove importance
GridWalkSimpleControl<MyGridNode>* walk = new GridWalkSimpleControl<MyGridNode>();
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path4_galaxy_multi() {
runName = "bergwerk_path4_galaxy_multi";
bergwerk_path4_galaxy();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path4dbl.back()]) );
GridWalkPathControl<MyGridNode>* walk = new GridWalkPathControl<MyGridNode>(grid, DijkstraMapper(grid), end);
walk->pOther = 0.15;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
void bergwerk_path4_galaxy_shortest() {
runName = "bergwerk_path4_galaxy_shortest";
bergwerk_path4_galaxy();
MyGridNode& end = (MyGridNode&)grid.getNodeFor( conv(floors.gtwp[path4dbl.back()]) );
DebugShortestPath<MyGridNode>* walk = new DebugShortestPath<MyGridNode>(grid, DijkstraMapper(grid), end, this->floors);
//walk->times = 2;
walk->pOther = 0.15;
pf->setTransition( std::unique_ptr<MyTransition>( new MyTransition(grid, *walk)) );
}
}; };

View File

@@ -29,6 +29,9 @@
#include "../frank/BeaconSensorReader.h" #include "../frank/BeaconSensorReader.h"
#include "../frank/OrientationSensorReader.h" #include "../frank/OrientationSensorReader.h"
#include <Indoor/misc/Time.h>
class EvalBase { class EvalBase {
protected: protected:
@@ -64,9 +67,11 @@ protected:
std::vector<int> path4 = {29, 28, 27, 32, 33, 34, 35, 36, 10, 9, 8, 22, 37, 38, 39, 40, 41, 42, 43, 44}; std::vector<int> path4 = {29, 28, 27, 32, 33, 34, 35, 36, 10, 9, 8, 22, 37, 38, 39, 40, 41, 42, 43, 44};
std::vector<int> path4dbl = {29, 29, 28, 27, 32, 33, 34, 35, 36, 10, 9, 8, 22, 37, 38, 39, 40, 41, 42, 43, 44}; // duplicate 1st waypoint! std::vector<int> path4dbl = {29, 29, 28, 27, 32, 33, 34, 35, 36, 10, 9, 8, 22, 37, 38, 39, 40, 41, 42, 43, 44}; // duplicate 1st waypoint!
float stepSize = 0.71;
public: public:
EvalBase() : grid(MiscSettings::gridSize_cm), floors(Helper::getFloors()) { EvalBase() : grid(MiscSettings::gridSize_cm), floors(Helper::getFloors(grid)) {
// build the grid // build the grid
Helper::buildTheGrid(grid, floors); Helper::buildTheGrid(grid, floors);
@@ -173,9 +178,11 @@ public:
uint64_t lastTransitionTS = 0; uint64_t lastTransitionTS = 0;
int64_t start_time = -1; int64_t start_time = -1;
K::Statistics<float> statsTime;
K::Statistics<double> stats; K::Statistics<double> stats;
int cnt = 0; int cnt = 0;
std::vector<float> errors;
// process each single sensor reading // process each single sensor reading
while(sr->hasNext()) { while(sr->hasNext()) {
@@ -225,7 +232,7 @@ public:
while (!step_observations.empty() && current_time > step_observations.front().ts) { while (!step_observations.empty() && current_time > step_observations.front().ts) {
const StepObservation _so = step_observations.front(); step_observations.pop_front(); (void) _so; const StepObservation _so = step_observations.front(); step_observations.pop_front(); (void) _so;
obs.step->steps++; obs.step->steps++;
ctrl.walked_m = obs.step->steps * 0.71; ctrl.walked_m = obs.step->steps * stepSize;
} }
// process all occurred steps // process all occurred steps
@@ -241,6 +248,8 @@ public:
// time for a transition? // time for a transition?
if (se.ts - lastTransitionTS > MiscSettings::timeSteps) { if (se.ts - lastTransitionTS > MiscSettings::timeSteps) {
auto tick1 = Time::tick();
lastTransitionTS = se.ts; lastTransitionTS = se.ts;
// timed updates // timed updates
@@ -252,16 +261,25 @@ public:
const Point3 curEst = est.pCur; const Point3 curEst = est.pCur;
// error calculation. compare ground-truth to estimation // error calculation. compare ground-truth to estimation
const int offset = 750; const int offset = 0;
const Point3 curGT = gtw.getPosAtTime(se.ts - offset); const Point3 curGT = gtw.getPosAtTime(se.ts - offset);
const Point3 diff = curEst - curGT; const Point3 diff = curEst - curGT;
auto tick2 = Time::tick();
float diffTime = Time::diffMS(tick1, tick2) * 1.25f;
statsTime.add(diffTime);
std::cout << "#" << statsTime.getAvg() << "\t" << diffTime << std::endl;
// skip the first 10 scans due to uniform distribution start // skip the first 10 scans due to uniform distribution start
if (++cnt > 10) {
pathEst.push_back(curEst); pathEst.push_back(curEst);
const float err = diff.length(); const float err = diff.length();
stats.add(err); errors.push_back(err);
std::cout << stats.asString() << std::endl;
// skip the first 24 scans due to uniform distribution start (12 seconds)
if (++cnt > 24) {
stats.add(err);
std::cout << stats.asString() << std::endl;
} }
// plot // plot
@@ -287,17 +305,55 @@ public:
//Point2 p2 = p1 + Angle::getPointer(obs.orientation.values[0]) * 0.05; //Point2 p2 = p1 + Angle::getPointer(obs.orientation.values[0]) * 0.05;
vis.gp << "set arrow 999 from screen " << p1.x<<","<<p1.y << " to screen " << p2.x<<","<<p2.y<<"\n"; vis.gp << "set arrow 999 from screen " << p1.x<<","<<p1.y << " to screen " << p2.x<<","<<p2.y<<"\n";
vis.show(); static int dspCnt = 0;
if (++dspCnt > 0) {
// prevent gnuplot errors vis.show();
usleep(1000*333); usleep(1000*33); // prevent gnuplot errors
dspCnt = 0;
}
} }
} }
sleep(1000); // append error for each run to a file
std::ofstream oTError("/tmp/errors.txt", std::ios_base::app);
oTError << runName << "\n\t"; stats.appendTo(oTError); oTError << "\n\n";
oTError.close();
// detailled error-description
std::ofstream oError("/tmp/err_" + runName + ".dat");
for (float f : errors) {oError << f << "\n";}
oError.close();
// plot-data
std::ofstream oPath("/tmp/path_" + runName + ".dat"); vis.groundTruth.addDataTo(oPath); oPath.close();
std::ofstream oEst("/tmp/est_" + runName + ".dat"); vis.estPath.addDataTo(oEst); oEst.close();
std::ofstream oFloor("/tmp/floors.dat"); vis.floors.addDataTo(oFloor); oFloor.close();
std::ofstream oPlot("/tmp/plot_" + runName + ".gp");
oPlot << "set terminal eps size 3.4,2\n";
oPlot << "set output '" << runName << ".eps'\n";
oPlot << "set termoption dashlength 0.5\n";
oPlot << "set ticslevel 0\n";
oPlot << "set view equal xy\n";
oPlot << "set zrange [0:2200]\n";
oPlot << "set multiplot layout 1,1 scale 2.7,2.7 offset 0,0.23\n";
oPlot << "set view 72,33\n";
oPlot << "unset border\n";
oPlot << "unset xtics\n";
oPlot << "unset ytics\n";
oPlot << "unset ztics\n";
oPlot << "splot \\\n";
oPlot << "'floors.dat' skip 21 notitle with lines lc rgb '#777777', \\\n";
oPlot << "'path_bergwerk_path2_nexus_shortest.dat' skip 21 notitle with lines lw 2.5 dashtype 2 lc rgb '#007700', \\\n";
oPlot << "'est_bergwerk_path2_nexus_shortest.dat' skip 21 notitle with lines lw 2.5 lc rgb '#000099' ";
oPlot.close();
} }

View File

@@ -16,35 +16,68 @@ class PaperPlot {
public: public:
struct Size {
float w;
float h;
Size(const float w, const float h) : w(w), h(h) {;}
};
public:
std::string file;
K::Gnuplot gp; K::Gnuplot gp;
K::GnuplotSplot plot; K::GnuplotSplot plot;
K::GnuplotSplotElementLines floors; K::GnuplotSplotElementLines floors;
K::GnuplotSplotElementColorPoints nodes; K::GnuplotSplotElementColorPoints nodes;
K::GnuplotSplotElementLines edges; K::GnuplotSplotElementLines edgesSame;
K::GnuplotSplotElementLines edgesStair;
public: public:
PaperPlot(const std::string& file, Size s) : file(file) {
toFile(file, s);
setup();
}
PaperPlot() { PaperPlot() {
setup();
}
void toFile(const std::string& file, const Size s) {
gp << "set output '" << file << "'\n";
gp << "set terminal eps size " << s.w << "," << s.h << "\n";
}
void setup() {
floors.setLineWidth(2); floors.setLineWidth(2);
plot.add(&edges); plot.add(&edgesSame);
plot.add(&edgesStair);
plot.add(&nodes); plot.add(&nodes);
plot.add(&floors); plot.add(&floors);
nodes.setPointSize(0.7); nodes.setPointSize(0.2);
edges.setColorHex("#555555");
edgesSame.setColorHex("#555555");
edgesStair.setColorHex("#AAAA55");
gp << "set ticslevel 0\n"; gp << "set ticslevel 0\n";
//gp << "set zrange [0:0]\n";
} }
void show() { void show() {
gp.draw(plot); gp.draw(plot);
if (file.length() != 0) {
std::string dataFile = file + ".dat";
std::ofstream os(dataFile.c_str());
os << gp.getBuffer();
os.close();
}
gp.flush();; gp.flush();;
} }
@@ -95,7 +128,7 @@ public:
} }
/** show all nodes (and edges?) within the given region */ /** show all nodes (and edges?) within the given region */
template <typename T> void debugGrid(Grid<T>& grid, const BBox3& bbox, const bool addNodes, const bool addEdges) { template <typename T> void debugGrid(Grid<T>& grid, const BBox3& bbox, const bool addNodes, const bool addEdges, const bool addAllEdges = false) {
std::set<uint64_t> used; std::set<uint64_t> used;
@@ -107,10 +140,11 @@ public:
} }
if (addEdges) { if (addEdges) {
for (const T& n2 : grid.neighbors(n1)) { for (const T& n2 : grid.neighbors(n1)) {
if (n1.z_cm == n2.z_cm) {continue;} // speedup if (n1.z_cm == n2.z_cm && !addAllEdges) {continue;} // speedup
if (used.find(n2.getIdx()) == used.end()) { if (used.find(n2.getIdx()) == used.end()) {
const K::GnuplotPoint3 p2(n2.x_cm, n2.y_cm, n2.z_cm); const K::GnuplotPoint3 p2(n2.x_cm, n2.y_cm, n2.z_cm);
edges.addSegment(p1, p2); if (p1.z != p2.z) {edgesStair.addSegment(p1, p2);}
else {edgesSame.addSegment(p1, p2);}
} }
} }
used.insert(n1.getIdx()); used.insert(n1.getIdx());

View File

@@ -27,13 +27,47 @@ class PaperVisGrid {
public: public:
static void show() {
// the grid
Grid<MyGridNode> grid(40);
// floors
Helper::FHWSFloors floors = Helper::getFloors(grid);
Helper::buildTheGrid(grid, floors);
PaperPlot plot("/tmp/grid.eps", PaperPlot::Size(4,3));
// stairwell low left
{BBox3 bbox;
bbox.add(Point3(1300, 650,160));
bbox.add(Point3(2000,1300,floors.h2.cm()));
plot.debugGrid(grid, bbox, true, true, true);}
plot.addFloor(floors.f1, floors.h1);
plot.addFloor(floors.f2, floors.h2);
plot.gp << "set view 64, 300\n";
plot.gp << "unset cbrange\n";
plot.gp << "unset colorbox\n";
plot.gp << "unset xtics\n";
plot.gp << "unset ytics\n";
plot.gp << "unset ztics\n";
plot.gp << "unset border\n";
plot.gp << "set xrange[1250:2050]\n";
plot.gp << "set yrange[600:1350]\n";
plot.gp << "set hidden3d front\n";
plot.show();
}
static void showStairs() { static void showStairs() {
// the grid // the grid
Grid<MyGridNode> grid(20); Grid<MyGridNode> grid(20);
// floors // floors
Helper::FHWSFloors floors = Helper::getFloors(); Helper::FHWSFloors floors = Helper::getFloors(grid);
Helper::buildTheGrid(grid, floors); Helper::buildTheGrid(grid, floors);
// // load the floorplan // // load the floorplan

View File

@@ -21,7 +21,8 @@
#include "../Settings.h" #include "../Settings.h"
#include "../DijkstraMapper.h" #include "../DijkstraMapper.h"
PaperPlot2D::Size s1 = PaperPlot2D::Size(2,4); PaperPlot2D::Size s1 = PaperPlot2D::Size(4,1.5);
PaperPlot2D::Size s2 = PaperPlot2D::Size(4,1.7);
class PaperVisImportance { class PaperVisImportance {
@@ -79,9 +80,11 @@ public:
{ {
PaperPlot2D plot("floorplan_importance.eps", s1); PaperPlot2D plot("floorplan_importance.eps", s1);
plot.setRanges(0,2100, 0,5100); plot.setRanges(0,5100, 0,2100);
plot.addFloor(f0); //plot.addFloor(f0);
plot.addGrid(grid, ColorizerImp()); plot.addGrid(grid, ColorizerImp());
plot.gp << "set colorbox\n";
plot.gp << "set lmargin 0\n set tmargin 0\n set bmargin 0\n set rmargin 0.6\n";
plot.show(); plot.show();
} }
@@ -110,8 +113,10 @@ public:
// start and end // start and end
const MyGridNode& gnStart = grid.getNodeFor(GridPoint(1500, 300, 0)); //const MyGridNode& gnStart = grid.getNodeFor(GridPoint(1500, 300, 0));
const MyGridNode& gnEnd = grid.getNodeFor(GridPoint(900, 4600, 0)); //const MyGridNode& gnEnd = grid.getNodeFor(GridPoint(900, 4600, 0));
const MyGridNode& gnStart = grid.getNodeFor(GridPoint(300, 300, 0));
const MyGridNode& gnEnd = grid.getNodeFor(GridPoint(4700, 1300, 0));
// build all shortest path to reach th target // build all shortest path to reach th target
Dijkstra<MyGridNode> dijkstra; Dijkstra<MyGridNode> dijkstra;
@@ -131,23 +136,30 @@ public:
DijkstraPath<MyGridNode> pathImp(dijkstra.getNode(gnEnd), dijkstra.getNode(gnStart)); DijkstraPath<MyGridNode> pathImp(dijkstra.getNode(gnEnd), dijkstra.getNode(gnStart));
// build plot // build plot
K::GnuplotPlotElementLines gpPath1; gpPath1.setLineWidth(2); gpPath1.setColorHex("#444444"); K::GnuplotPlotElementLines gpPath1a; gpPath1a.setLineWidth(6); gpPath1a.setColorHex("#000000");
K::GnuplotPlotElementLines gpPath2; gpPath2.setLineWidth(2); gpPath2.setColorHex("#000000"); K::GnuplotPlotElementLines gpPath1b; gpPath1b.setLineWidth(2); gpPath1b.setColorHex("#ffffff");
K::GnuplotPlotElementLines gpPath2a; gpPath2a.setLineWidth(7); gpPath2a.setColorHex("#000000");
K::GnuplotPlotElementLines gpPath2b; gpPath2b.setLineWidth(2); gpPath2b.setColorHex("#ffffff");
for (DijkstraNode<MyGridNode>* dn : pathNormal) { for (DijkstraNode<MyGridNode>* dn : pathNormal) {
gpPath1.add(K::GnuplotPoint2(dn->element->x_cm, dn->element->y_cm)); gpPath1a.add(K::GnuplotPoint2(dn->element->x_cm, dn->element->y_cm));
gpPath1b.add(K::GnuplotPoint2(dn->element->x_cm, dn->element->y_cm));
} }
for (DijkstraNode<MyGridNode>* dn : pathImp) { for (DijkstraNode<MyGridNode>* dn : pathImp) {
gpPath2.add(K::GnuplotPoint2(dn->element->x_cm, dn->element->y_cm)); gpPath2a.add(K::GnuplotPoint2(dn->element->x_cm, dn->element->y_cm));
gpPath2b.add(K::GnuplotPoint2(dn->element->x_cm, dn->element->y_cm));
} }
// plot the 2 paths // plot the 2 paths
{ {
PaperPlot2D plot("floorplan_paths.eps", s1); PaperPlot2D plot("floorplan_paths.eps", s1);
plot.setRanges(0,2100, 0,5100); plot.floors.setColorHex("#777777");
plot.setRanges(0,5100, 0,2100);
plot.addFloor(f0); plot.addFloor(f0);
plot.plot.add(&gpPath1); gpPath1.setCustomAttr("dashtype 3"); plot.plot.add(&gpPath1a); //gpPath1a.setCustomAttr("dashtype 2");
plot.plot.add(&gpPath2); plot.plot.add(&gpPath1b); gpPath1b.setCustomAttr("dashtype 2");
plot.plot.add(&gpPath2a);
plot.plot.add(&gpPath2b);
plot.show(); plot.show();
} }
@@ -166,21 +178,98 @@ public:
if (i % 250 == 0) {std::cout << i << std::endl;} if (i % 250 == 0) {std::cout << i << std::endl;}
const MyGridNode& nStart = gnEnd; const MyGridNode& nStart = gnEnd;
GridWalkState<MyGridNode> sStart(&nStart, Heading::rnd()); GridWalkState<MyGridNode> sStart(&nStart, Heading::rnd());
//GridWalkState<MyGridNode> sEnd = walk.getDestination(grid, sStart, 135, 0); GridWalkState<MyGridNode> sEnd = walk.getDestination(grid, sStart, 135, 0);
(void) sEnd;
} }
// plot the heat-map // plot the heat-map
{ {
PaperPlot2D plot("floorplan_dijkstra_heatmap.eps", s1); PaperPlot2D plot("floorplan_dijkstra_heatmap.eps", s2);
plot.setRanges(0,2100, 0,5100); plot.setRanges(0,5220, 0,2100);
plot.gp << "set palette gray negative\n"; plot.floors.setColorHex("#000000");
//plot.gp << "set palette gray negative\n";
plot.gp << "set palette defined ( 0 'white', 1 'blue', 2 'orange', 3 'yellow' )\n";
plot.gp << "set lmargin 0\n set tmargin 0\n set bmargin 0\n set rmargin 0\n";
plot.addFloor(f0); plot.addFloor(f0);
plot.addGrid(grid, ColorizeHeat(7000, 50)); plot.addGrid(grid, ColorizeHeat(7000, 50));
plot.plot.add(&gpPath1a); //gpPath1a.setCustomAttr("dashtype 2");
plot.plot.add(&gpPath1b); gpPath1b.setCustomAttr("dashtype 2");
plot.plot.add(&gpPath2a);
plot.plot.add(&gpPath2b);
plot.gp << "set object circle at 300,300 size 40,40 front\n";
plot.gp << "set object circle at 4700,1300 size 40,40 front\n";
plot.show(); plot.show();
} }
}
static void showDijkstraDistance() {
// load the floorplan
FloorplanFactorySVG fpFac(MiscSettings::floorplanPlot, 2.822222);
Floor f0 = fpFac.getFloor("test1");
const LengthF h0 = LengthF::cm(0);
// add the floorplan to the grid
Grid<MyGridNode> grid(20);
GridFactory<MyGridNode> gridFac(grid);
gridFac.addFloor(f0, h0.cm());
// remove all isolated nodes not attached to 300,300,floor0
gridFac.removeIsolated( (MyGridNode&)grid.getNodeFor( GridPoint(300,300,h0.cm()) ) );
// start and end
const MyGridNode& gnStart = grid.getNodeFor(GridPoint(300, 300, 0));
const MyGridNode& gnEnd = grid.getNodeFor(GridPoint(4700, 1300, 0));
// build all shortest path to reach th target
Dijkstra<MyGridNode> dijkstra;
// stamp importance information onto the grid-nodes
GridImportance gridImp;
gridImp.addImportance(grid, h0.cm());
// path WITH importance
DijkstraMapper accImp(grid);
dijkstra.build(gnStart, gnStart, accImp);
DijkstraPath<MyGridNode> pathImp(dijkstra.getNode(gnEnd), dijkstra.getNode(gnStart));
// stamp distance information onto the grid
// attach a corresponding weight-information to each user-grid-node
for (MyGridNode& node : grid) {
const DijkstraNode<MyGridNode>* dn = dijkstra.getNode(node);
node.distToTarget = dn->cumWeight;
}
// plot the heat-map
{
PaperPlot2D plot;
plot.setRanges(0,5220, 0,2100);
plot.floors.setColorHex("#000000");
//plot.gp << "set palette gray negative\n";
plot.gp << "set palette defined ( 0 'white', 1 'blue', 2 'orange', 3 'yellow' )\n";
plot.gp << "set lmargin 0\n set tmargin 0\n set bmargin 0\n set rmargin 0\n";
plot.addFloor(f0);
plot.addGrid(grid, ColorizerDist());
plot.gp << "set object circle at 300,300 size 40,40 front\n";
plot.gp << "set object circle at 4700,1300 size 40,40 front\n";
plot.show();
sleep(1000);
}
} }

View File

@@ -27,7 +27,7 @@ void testModelWalk() {
Grid<MyGridNode> grid(MiscSettings::gridSize_cm); Grid<MyGridNode> grid(MiscSettings::gridSize_cm);
Helper::FHWSFloors floors = Helper::getFloors(); Helper::FHWSFloors floors = Helper::getFloors(grid);
Helper::buildTheGrid(grid, floors); Helper::buildTheGrid(grid, floors);
MyGridNode& start = (MyGridNode&)grid.getNodeFor(GridPoint(500,300,floors.h0.cm())); MyGridNode& start = (MyGridNode&)grid.getNodeFor(GridPoint(500,300,floors.h0.cm()));
@@ -88,23 +88,68 @@ int main(void) {
// testModelWalk(); // testModelWalk();
Eval1 eval; Eval1 eval;
//eval.path2_forward_simple(); // //eval.path2_forward_simple();
//eval.path2_forward_path(); // //eval.path2_forward_path();
//eval.path3_forward_simple(); // //eval.path3_forward_simple();
//eval.path3_forward_path(); // //eval.path3_forward_path();
//eval.path4_nexus_simple(); // //eval.path4_nexus_simple();
//eval.path4_nexus_imp(); // //eval.path4_nexus_imp();
//eval.path4_nexus_path(); // //eval.path4_nexus_path();
//eval.path4_nexus_path_b(); // //eval.path4_nexus_path_b();
eval.bergwerk_path1_nexus_simple(); // {Eval1 eval; eval.bergwerk_path1_nexus_simple(); eval.run();}
// //{Eval1 eval; eval.bergwerk_path1_nexus_imp(); eval.run();}
// {Eval1 eval; eval.bergwerk_path1_nexus_multi(); eval.run();}
// {Eval1 eval; eval.bergwerk_path1_nexus_shortest(); eval.run();}
eval.run(); // {Eval1 eval; eval.bergwerk_path2_nexus_simple(); eval.run();}
// //{Eval1 eval; eval.bergwerk_path2_nexus_imp(); eval.run();}
// {Eval1 eval; eval.bergwerk_path2_nexus_multi(); eval.run();}
// {Eval1 eval; eval.bergwerk_path2_nexus_shortest(); eval.run();}
// {Eval1 eval; eval.bergwerk_path3_nexus_simple(); eval.run();}
// //{Eval1 eval; eval.bergwerk_path3_nexus_imp(); eval.run();}
// {Eval1 eval; eval.bergwerk_path3_nexus_multi(); eval.run();}
// {Eval1 eval; eval.bergwerk_path3_nexus_shortest(); eval.run();}
{Eval1 eval; eval.bergwerk_path4_nexus_simple(); eval.run();}
//{Eval1 eval; eval.bergwerk_path4_nexus_imp(); eval.run();}
{Eval1 eval; eval.bergwerk_path4_nexus_multi(); eval.run();}
{Eval1 eval; eval.bergwerk_path4_nexus_shortest(); eval.run();}
// {Eval1 eval; eval.bergwerk_path1_galaxy_simple(); eval.run();}
// {Eval1 eval; eval.bergwerk_path1_galaxy_multi(); eval.run();}
// {Eval1 eval; eval.bergwerk_path1_galaxy_shortest(); eval.run();}
// {Eval1 eval; eval.bergwerk_path2_galaxy_simple(); eval.run();}
// {Eval1 eval; eval.bergwerk_path2_galaxy_multi(); eval.run();}
// {Eval1 eval; eval.bergwerk_path2_galaxy_shortest(); eval.run();}
// {Eval1 eval; eval.bergwerk_path3_galaxy_simple(); eval.run();}
// {Eval1 eval; eval.bergwerk_path3_galaxy_multi(); eval.run();}
// {Eval1 eval; eval.bergwerk_path3_galaxy_shortest(); eval.run();}
// {Eval1 eval; eval.bergwerk_path4_galaxy_simple(); eval.run();}
// {Eval1 eval; eval.bergwerk_path4_galaxy_multi(); eval.run();}
// {Eval1 eval; eval.bergwerk_path4_galaxy_shortest(); eval.run();}
//eval.run();
//sleep(100);
// PaperVisGrid::show();
// PaperVisGrid::showStairs(); // PaperVisGrid::showStairs();
// PaperVisImportance::createImportance(); // PaperVisImportance::createImportance();
// PaperVisImportance::createPath(); // PaperVisImportance::createPath();
// PaperVisImportance::showDijkstraDistance();
return 0; return 0;

View File

@@ -11,6 +11,8 @@
#include "../lukas/StepEvaluation.h" #include "../lukas/StepEvaluation.h"
#include "../lukas/TurnEvaluation.h" #include "../lukas/TurnEvaluation.h"
#include <atomic>
class MyEvaluation : public K::ParticleFilterEvaluation<MyState, MyObservation> { class MyEvaluation : public K::ParticleFilterEvaluation<MyState, MyObservation> {
private: private:
@@ -47,6 +49,11 @@ public:
double sum = 0; double sum = 0;
for (K::Particle<MyState>& p : particles) { for (K::Particle<MyState>& p : particles) {
// std::atomic<double> sum(0);
// #pragma omp parallel for
// for (int i = 0; i < (int) particles.size(); ++i) {
// K::Particle<MyState>& p = particles[i];
double weight = 1.0; double weight = 1.0;
if (useWifi) { if (useWifi) {

View File

@@ -9,9 +9,9 @@
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="724" width="1820"
height="1800" height="740"
viewBox="0 0 724.00001 1800" viewBox="0 0 1820 740"
id="svg5100" id="svg5100"
version="1.1" version="1.1"
inkscape:version="0.91 r13725" inkscape:version="0.91 r13725"
@@ -25,9 +25,9 @@
borderopacity="1.0" borderopacity="1.0"
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="0.98994949" inkscape:zoom="0.49497475"
inkscape:cx="451.23575" inkscape:cx="776.28701"
inkscape:cy="136.10259" inkscape:cy="236.53547"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="true" showgrid="true"
@@ -65,291 +65,318 @@
inkscape:label="test1" inkscape:label="test1"
inkscape:groupmode="layer" inkscape:groupmode="layer"
id="layer1" id="layer1"
transform="translate(814.21766,568.50997)"> transform="translate(814.21766,-491.49003)">
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -810.32002,-557.59658 0.10236,1785.08658 318.89764,0 0,-162.9922" d="m 994.869,503.38745 -1785.08666,0.10236 0,318.89763 162.9922,0"
id="path11563" id="path11563"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" /> sodipodi:nodetypes="cccc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -491.32002,1021.9782 0,-28.34651 -318.89764,0" d="m -585.21766,822.4898 29,0 -0.1416,-318.99999"
id="path11567" id="path11567"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" /> sodipodi:nodetypes="ccc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -491.32002,993.63169 0,-38.9764" d="m -556.21766,822.4898 38,0"
id="path11569" id="path11569"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -491.32002,919.22219 0,-123.81877" d="m -479.21766,822.4898 121.00004,0"
id="path11571" id="path11571"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -491.32002,320.40335 0,-464.17327" d="m 116.86907,822.38744 464.17326,0"
id="path11577" id="path11577"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -491.32002,-179.203 0,-109.84247" d="m 621.78237,822.4898 104.00003,0"
id="path11581" id="path11581"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,320.40342 -246,0" d="m 117.78238,899.4898 0,-244"
id="path11587" id="path11587"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -711.32002,320.40342 -98.89764,-7e-5" d="m 117.78238,603.48981 0,-100"
id="path11589" id="path11589"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -491.32002,-288.59658 -319,0" d="m 725.869,822.38744 0,-318.99999"
id="path11593" id="path11593"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -475.32002,-345.59665 -235.68504,-0.14174 0,-131.10236" d="m 782.8691,838.38744 0.1417,-235.68503 131.1024,0"
id="path11597" id="path11597"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" /> sodipodi:nodetypes="ccc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -475.32002,-551.59665 0,206" d="M 994.7824,838.4898 782.8691,838.38744"
id="path11605" id="path11605"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -711.00506,-515.81713 0,-42.51968" d="m 953.0896,602.70241 42.5196,0"
id="path11607" id="path11607"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -491.32002,1227.49 287.00787,0 -0.008,-1117.08658" d="m -790.21766,822.38744 0,377.10256 1116.00004,0"
id="path11619" id="path11619"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" /> sodipodi:nodetypes="ccc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -425.32002,795.40342 150,0" d="m -358.131,888.38744 0,150.00016"
id="path11623" id="path11623"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,864.40342 209,0" d="m -426.21762,963.4898 0,236.0002"
id="path11627" id="path11627"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.36727,1032.6081 209.05512,0" d="m -594.21766,899.4898 0,300.0002"
id="path11631" id="path11631"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,864.40342 -0.0472,302.85038" d="m -726.21766,899.4898 236,0"
id="path11633" id="path11633"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,795.40342 0,-207" d="m -358.21762,899.4898 208,0"
id="path11637" id="path11637"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -420.45388,-345.73843 53.14961,0" d="m 783.0108,893.25358 0,53.14961"
id="path11669" id="path11669"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -321.24128,-345.73843 38.97638,0" d="m 783.0108,992.46622 0,38.97648"
id="path11671" id="path11671"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -409.82396,-427.23449 0,81.49606" d="m 864.5069,903.8835 -81.4961,0"
id="path11673" id="path11673"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -409.82396,-427.23449 173.62205,0" d="m 864.5069,903.8835 0,173.6222"
id="path11675" id="path11675"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -321.24128,-345.73843 0,-81.49606" d="m 783.0108,992.46622 81.4961,0"
id="path11677" id="path11677"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -236.20191,-558.33685 0,212.59842 139.88189,0.14185" d="m 993.7824,1077.4899 -212,0 0,142.0001"
id="path11679" id="path11679"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" /> sodipodi:nodetypes="ccc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,-223.59658 0,544" d="m 661.78238,899.4898 -544,0"
id="path11757" id="path11757"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -123.32002,-223.59658 27,0" d="m 661.78238,1191.49 0,28"
id="path11761" id="path11761"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -310.61136,-491.01402 -102.75591,0" d="m 928.2864,1003.0962 0,-102.75601"
id="path11822" id="path11822"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -563.32002,696.40342 150,0" d="m -259.131,750.38744 0,150"
id="path4208" id="path4208"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -392.10742,-427.23449 0,-63.77953" d="m 864.5069,921.60004 63.7795,0"
id="path5833" id="path5833"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -392.10742,-491.01402 0,-67.32283" d="m 928.2864,921.60004 67.3229,0"
id="path5847" id="path5847"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -810.32002,-557.59658 715,0" d="M 994.869,503.38745 993.7824,1219.49"
id="path5902" id="path5902"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -355.32002,110.40342 260,0" d="m 325.78238,963.4898 0,256.0002"
id="path5923" id="path5923"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -96.32002,-557.59658 0,668" d="m 993.7824,1219.49 -668.00002,0"
id="path5925" id="path5925"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -491.32002,660.40339 0,-139.99997" d="m -194.21762,823.4898 112,0"
id="path5929" id="path5929"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -810.32002,384.40342 183,0" d="m 52.869,503.38745 0,182.99999"
id="path5931" id="path5931"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -627.32002,384.40342 60,24 52,52" d="m 52.869,686.38744 -24,60 -52,52"
id="path5933" id="path5933"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" /> sodipodi:nodetypes="ccc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -515.32002,460.40342 24,60" d="M -23.131,798.38744 -82.21762,823.4898"
id="path5935" id="path5935"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,-223.59658 246,0" d="m 661.78238,899.4898 0,244.0001"
id="path5937" id="path5937"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,795.40342 -78,0" d="m -358.131,900.38744 0,-78"
id="path5939" id="path5939"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,600.40339 134,3e-5" d="m -162.21762,899.4898 0,132.0001"
id="path5941" id="path5941"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -563.32002,696.40342 72,98.99997" d="m -259.131,750.38744 -98.99997,72"
id="path5945" id="path5945"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,528.40342 134,0" d="m -90.21762,899.4898 0,132.0001"
id="path5947" id="path5947"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,320.40342 22,0" d="m 117.78238,899.4898 0,24"
id="path5951" id="path5951"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -359.32002,320.40342 155,0" d="m 117.78238,963.4898 0,236.0002"
id="path5953" id="path5953"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,540.40342 0,-156" d="m -106.21762,899.4898 160,0"
id="path5955" id="path5955"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -239.32002,600.40339 35,3e-5" d="m -162.21762,1075.4899 0,124.0001"
id="path5959" id="path5959"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -239.32002,528.40339 35,3e-5" d="m -90.21762,1075.4899 0,124.0001"
id="path5961" id="path5961"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -413.32002,110.40342 22,0" d="m 325.78238,899.4898 0,24"
id="path5965" id="path5965"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path <path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -235.32002,795.40342 31,-3e-5" d="m -358.131,1078.3876 -0.0866,121.1024"
id="path5967" id="path5967"
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" /> sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -790.21756,899.4898 20,0"
id="path5596"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -259.21762,823.4898 21,0"
id="path5598"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -442.21762,947.4898 16,16"
id="path5600"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m -470.21766,919.4898 -20,-20"
id="path5602"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB