This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Indoor/tests/sensors/pressure/TestBarometer.cpp
frank ca6fed5371 worked on grid-walking
worked on grid-generation
added helper library for nav-meshes
started working on nav meshes
2018-01-08 20:55:50 +01:00

244 lines
5.6 KiB
C++

#ifdef TODO_______WITH_TESTS
#include "../../Tests.h"
#include "../../../sensors/pressure/RelativePressure.h"
#include "../../../sensors/pressure/PressureTendence.h"
#include "../../../sensors/activity/ActivityButterPressure.h"
#include "../../../sensors/activity/ActivityButterPressurePercent.h"
#include <random>
TEST(Barometer, relCalib) {
RelativePressure baro;
baro.setCalibrationTimeframe(Timestamp::fromMS(3000));
ASSERT_EQ(0, baro.getBaseAvg());
ASSERT_EQ(0, baro.getSigma());
std::minstd_rand gen;
std::normal_distribution<float> dist(930, 0.15);
for (int i = 0; i <= 4000; i += 25) {
const Timestamp ts = Timestamp::fromMS(i);
baro.add(ts, BarometerData(dist(gen)));
if (i < 3000) { // not yet calibrated
ASSERT_EQ(0, baro.getBaseAvg());
ASSERT_EQ(0, baro.getSigma());
ASSERT_EQ(0, baro.getPressureRealtiveToStart());
} else { // calibrated
ASSERT_NEAR(930, baro.getBaseAvg(), 0.1);
ASSERT_NEAR(0.15, baro.getSigma(), 0.02);
}
}
// calibration OK?
ASSERT_NEAR(930, baro.getBaseAvg(), 0.1);
ASSERT_NEAR(0.15, baro.getSigma(), 0.02);
// get a HUGE value realtive to the calibration
baro.add(Timestamp::fromMS(9000), BarometerData(2000));
ASSERT_NEAR(2000-930, baro.getPressureRealtiveToStart(), 0.1);
// has no impact on calibration
ASSERT_NEAR(930, baro.getBaseAvg(), 0.1);
ASSERT_NEAR(0.15, baro.getSigma(), 0.02);
baro.reset();
// everything back to zero
ASSERT_EQ(0, baro.getBaseAvg());
ASSERT_EQ(0, baro.getSigma());
ASSERT_EQ(0, baro.getPressureRealtiveToStart());
}
#include <fstream>
TEST(Barometer, LIVE_tendence) {
std::ifstream inp ("/tmp/baro1.dat");
const float timeframe = 5.0;
PressureTendence tend(Timestamp::fromSec(timeframe));
while (inp.is_open() && !inp.eof()) {
int msec;
float hPa;
inp >> msec;
inp >> hPa;
tend.add(Timestamp::fromMS(msec), BarometerData(hPa));
tend.get();
}
sleep(1);
}
TEST(Barometer, LIVE_tendence2) {
const float timeframe = 5.0;
PressureTendence tend(Timestamp::fromSec(timeframe));
ASSERT_EQ(0, tend.get());
const float noiseSigma = 0.04; // typical barometer noise
const float start = 930; // start at 930 hPa
const float incPerSec = 0.100; // and incremrent the pressure by 0.1 hPa per second
float curhPa = start;
// add zero-mean noise
std::minstd_rand gen;
std::normal_distribution<float> dist(0, noiseSigma);
// 10 Hz for 30 seconds
for (int i = 0; i < 30000; i += 100) {
// next pressure (add increment)
curhPa += sin(i/1200.0f) * 0.02;//incPerSec * 100 / 1000;
// add noise
float curhPaNoised = curhPa + dist(gen) + sin(i/200.0f)*0.1;
// calculate tendence
tend.add(Timestamp::fromMS(i), BarometerData(curhPaNoised));
std::cout << "w/o noise: " << curhPa << "\twith noise: " << curhPaNoised << "\ttendence/sec:" << (tend.get()/timeframe) << std::endl;
}
sleep(1);
// tendence must be clear and smaller than the sigma
ASSERT_NEAR(incPerSec * timeframe, tend.get(), noiseSigma);
}
TEST(Barometer, Activity) {
ActivityButterPressure act;
//read file
std::string line;
std::string filename = getDataFile("barometer/baro1.dat");
std::ifstream infile(filename);
std::vector<ActivityButterPressure::History> actHist;
std::vector<ActivityButterPressure::History> rawHist;
while (std::getline(infile, line))
{
std::istringstream iss(line);
int ts;
double value;
while (iss >> ts >> value) {
ActivityButterPressure::Activity currentAct = act.add(Timestamp::fromMS(ts), BarometerData(value));
rawHist.push_back(ActivityButterPressure::History(Timestamp::fromMS(ts), BarometerData(value)));
actHist.push_back(ActivityButterPressure::History(Timestamp::fromMS(ts), BarometerData(currentAct)));
}
}
K::Gnuplot gp;
K::Gnuplot gpRaw;
K::GnuplotPlot plot;
K::GnuplotPlot plotRaw;
K::GnuplotPlotElementLines rawLines;
K::GnuplotPlotElementLines resultLines;
for(int i=0; i < actHist.size()-1; ++i){
//raw
K::GnuplotPoint2 raw_p1(rawHist[i].ts.sec(), rawHist[i].data.hPa);
K::GnuplotPoint2 raw_p2(rawHist[i+1].ts.sec(), rawHist[i+1].data.hPa);
rawLines.addSegment(raw_p1, raw_p2);
//results
K::GnuplotPoint2 input_p1(actHist[i].ts.sec(), actHist[i].data.hPa);
K::GnuplotPoint2 input_p2(actHist[i+1].ts.sec(), actHist[i+1].data.hPa);
resultLines.addSegment(input_p1, input_p2);
}
plotRaw.add(&rawLines);
plot.add(&resultLines);
gp.draw(plot);
gp.flush();
gpRaw.draw(plotRaw);
gpRaw.flush();
sleep(5);
}
TEST(Barometer, ActivityPercent) {
ActivityButterPressurePercent act;
//read file
std::string line;
std::string filename = getDataFile("barometer/baro1.dat");
std::ifstream infile(filename);
std::vector<ActivityButterPressurePercent::ActivityProbabilities> actHist;
std::vector<double> rawHist;
while (std::getline(infile, line))
{
std::istringstream iss(line);
int ts;
double value;
while (iss >> ts >> value) {
ActivityButterPressurePercent::ActivityProbabilities activity = act.add(Timestamp::fromMS(ts), BarometerData(value));
rawHist.push_back(value);
actHist.push_back(activity);
}
}
K::Gnuplot gp;
K::Gnuplot gpRaw;
K::GnuplotPlot plot;
K::GnuplotPlot plotRaw;
K::GnuplotPlotElementLines rawLines;
K::GnuplotPlotElementLines resultLines;
for(int i=0; i < actHist.size()-1; ++i){
K::GnuplotPoint2 raw_p1(i, rawHist[i]);
K::GnuplotPoint2 raw_p2(i+1, rawHist[i+1]);
rawLines.addSegment(raw_p1, raw_p2);
K::GnuplotPoint2 input_p1(i, actHist[i].elevatorDown);
K::GnuplotPoint2 input_p2(i+1, actHist[i+1].elevatorDown);
resultLines.addSegment(input_p1, input_p2);
}
plotRaw.add(&rawLines);
plot.add(&resultLines);
gp.draw(plot);
gp.flush();
gpRaw.draw(plotRaw);
gpRaw.flush();
sleep(5);
}
#endif