geometry changes/fixes/new features
new grid walkers + fixes new test-cases worked on step/and turn detection android offline-data-reader worked on vap-grouping
This commit is contained in:
@@ -4,11 +4,14 @@
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
|
||||
#include "../../misc/Debug.h"
|
||||
#include "../../Assertions.h"
|
||||
#include "../../math/Interpolator.h"
|
||||
#include "../../geo/Point3.h"
|
||||
#include "../../data/Timestamp.h"
|
||||
#include "../radio/WiFiMeasurements.h"
|
||||
#include "../imu/AccelerometerData.h"
|
||||
#include "../imu/GyroscopeData.h"
|
||||
|
||||
template <typename SensorData> struct OfflineEntry {
|
||||
|
||||
@@ -31,6 +34,15 @@ struct WalkedPath {
|
||||
};
|
||||
|
||||
|
||||
/** listener for event callbacks */
|
||||
class OfflineAndroidListener {
|
||||
public:
|
||||
virtual void onGyroscope(const Timestamp ts, const GyroscopeData data) = 0;
|
||||
virtual void onAccelerometer(const Timestamp ts, const AccelerometerData data) = 0;
|
||||
virtual void onGravity(const Timestamp ts, const AccelerometerData data) = 0;
|
||||
virtual void onWiFi(const Timestamp ts, const WiFiMeasurements data) = 0;
|
||||
};
|
||||
|
||||
/** read recorded android sensor data files */
|
||||
class OfflineAndroid {
|
||||
|
||||
@@ -39,13 +51,20 @@ private:
|
||||
|
||||
std::vector<OfflineEntry<WiFiMeasurements>> wifi;
|
||||
std::vector<OfflineEntry<GroundTruthID>> groundTruth;
|
||||
std::vector<OfflineEntry<GyroscopeData>> gyro;
|
||||
|
||||
std::vector<OfflineEntry<AccelerometerData>> accel;
|
||||
std::vector<OfflineEntry<AccelerometerData>> gravity;
|
||||
|
||||
WalkedPath walkedPath;
|
||||
|
||||
const char* name = "OfflineData";
|
||||
|
||||
public:
|
||||
|
||||
/** ctor */
|
||||
OfflineAndroid(const std::string& file) {
|
||||
parse(file);
|
||||
OfflineAndroid() {
|
||||
;
|
||||
}
|
||||
|
||||
/** get all ground truth readings */
|
||||
@@ -54,6 +73,16 @@ public:
|
||||
/** get all WiFi readings */
|
||||
const std::vector<OfflineEntry<WiFiMeasurements>>& getWiFi() const {return wifi;}
|
||||
|
||||
/** get all gyroscope readings */
|
||||
const std::vector<OfflineEntry<GyroscopeData>>& getGyroscope() const {return gyro;}
|
||||
|
||||
/** get all accelerometer readings */
|
||||
const std::vector<OfflineEntry<AccelerometerData>>& getAccelerometer() const {return accel;}
|
||||
|
||||
/** get all gravity readings */
|
||||
const std::vector<OfflineEntry<AccelerometerData>>& getGravity() const {return gravity;}
|
||||
|
||||
|
||||
/** get the walked path */
|
||||
const WalkedPath& getWalkedPath() const {return walkedPath;}
|
||||
|
||||
@@ -67,10 +96,12 @@ public:
|
||||
return interpol;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
private:
|
||||
void parse(const std::string& file, OfflineAndroidListener* listener = nullptr) {
|
||||
|
||||
void parse(const std::string& file) {
|
||||
Log::add(name, "parsing data file: " + file , false);
|
||||
Log::tick();
|
||||
|
||||
// open the stream
|
||||
std::ifstream inp(file);
|
||||
@@ -96,28 +127,64 @@ private:
|
||||
|
||||
if (delim == 0) {break;}
|
||||
|
||||
parse(Timestamp::fromMS(ts), sensorID, sensorData);
|
||||
|
||||
parse(Timestamp::fromMS(ts), sensorID, sensorData, listener);
|
||||
|
||||
}
|
||||
|
||||
Log::tock();
|
||||
|
||||
Log::add(name,
|
||||
"gyro(" + std::to_string(gyro.size()) + ") " +
|
||||
"accel(" + std::to_string(accel.size()) + ") "
|
||||
"wifi(" + std::to_string(wifi.size()) + ") " +
|
||||
"gt(" + std::to_string(groundTruth.size()) + ") "
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
/** parse the given data */
|
||||
void parse(const Timestamp ts, const int32_t sensorID, const std::string& sensorData) {
|
||||
void parse(const Timestamp ts, const int32_t sensorID, const std::string& sensorData, OfflineAndroidListener* listener) {
|
||||
|
||||
// how to parse
|
||||
switch(sensorID) {
|
||||
|
||||
case 0: {
|
||||
const AccelerometerData data = parseAccelerometer(sensorData);
|
||||
accel.push_back(OfflineEntry<AccelerometerData>(ts, data));
|
||||
if (listener) {listener->onAccelerometer(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 1: {
|
||||
const AccelerometerData data = parseAccelerometer(sensorData);
|
||||
gravity.push_back(OfflineEntry<AccelerometerData>(ts, data));
|
||||
if (listener) {listener->onGravity(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: {
|
||||
const GyroscopeData data = parseGyroscope(sensorData);
|
||||
gyro.push_back(OfflineEntry<GyroscopeData>(ts, data));
|
||||
if (listener) {listener->onGyroscope(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 8: {
|
||||
OfflineEntry<WiFiMeasurements> entry(ts, parseWiFi(sensorData));
|
||||
wifi.push_back(entry);
|
||||
const WiFiMeasurements data = parseWiFi(sensorData);
|
||||
wifi.push_back(OfflineEntry<WiFiMeasurements>(ts, data));
|
||||
if (listener) {listener->onWiFi(ts, data);}
|
||||
break;
|
||||
}
|
||||
|
||||
case 99: {
|
||||
OfflineEntry<GroundTruthID> entry (ts, parseGroundTruthTick(sensorData));
|
||||
groundTruth.push_back(entry);
|
||||
const GroundTruthID data = parseGroundTruthTick(sensorData);
|
||||
groundTruth.push_back(OfflineEntry<GroundTruthID>(ts, data));
|
||||
// TODO listener
|
||||
break;
|
||||
}
|
||||
|
||||
case 100: {
|
||||
walkedPath = parseWalkedPath(sensorData);
|
||||
break;
|
||||
@@ -138,16 +205,19 @@ private:
|
||||
|
||||
const std::string mac = data.substr(0, 17);
|
||||
data = data.substr(17);
|
||||
assert(data[0] == ';'); data = data.substr(1);
|
||||
Assert::isTrue(data[0] == ';', "unexpected character");
|
||||
data = data.substr(1);
|
||||
|
||||
const std::string freq = data.substr(0, 4);
|
||||
data = data.substr(4);
|
||||
assert(data[0] == ';'); data = data.substr(1);
|
||||
Assert::isTrue(data[0] == ';', "unexpected character");
|
||||
data = data.substr(1);
|
||||
|
||||
const int pos = data.find(';');
|
||||
const std::string rssi = data.substr(0, pos);
|
||||
data = data.substr(pos);
|
||||
assert(data[0] == ';'); data = data.substr(1);
|
||||
Assert::isTrue(data[0] == ';', "unexpected character");
|
||||
data = data.substr(1);
|
||||
|
||||
const WiFiMeasurement e(mac, std::stof(rssi));
|
||||
obs.entries.push_back(e);
|
||||
@@ -158,6 +228,43 @@ private:
|
||||
|
||||
}
|
||||
|
||||
static inline GyroscopeData parseGyroscope(const std::string& data) {
|
||||
|
||||
const size_t pos1 = data.find(';', 0);
|
||||
const size_t pos2 = data.find(';', pos1+1);
|
||||
const size_t pos3 = data.find(';', pos2+1);
|
||||
|
||||
Assert::isTrue(pos1 != std::string::npos, "format error");
|
||||
Assert::isTrue(pos2 != std::string::npos, "format error");
|
||||
Assert::isTrue(pos3 != std::string::npos, "format error");
|
||||
|
||||
const std::string sx = data.substr(0, pos1);
|
||||
const std::string sy = data.substr(pos1+1, pos2-pos1-1);
|
||||
const std::string sz = data.substr(pos2+1, pos3-pos2-1);
|
||||
|
||||
return GyroscopeData(std::stof(sx), std::stof(sy), std::stof(sz));
|
||||
|
||||
}
|
||||
|
||||
|
||||
static inline AccelerometerData parseAccelerometer(const std::string& data) {
|
||||
|
||||
const size_t pos1 = data.find(';', 0);
|
||||
const size_t pos2 = data.find(';', pos1+1);
|
||||
const size_t pos3 = data.find(';', pos2+1);
|
||||
|
||||
Assert::isTrue(pos1 != std::string::npos, "format error");
|
||||
Assert::isTrue(pos2 != std::string::npos, "format error");
|
||||
Assert::isTrue(pos3 != std::string::npos, "format error");
|
||||
|
||||
const std::string sx = data.substr(0, pos1);
|
||||
const std::string sy = data.substr(pos1+1, pos2-pos1-1);
|
||||
const std::string sz = data.substr(pos2+1, pos3-pos2-1);
|
||||
|
||||
return AccelerometerData(std::stof(sx), std::stof(sy), std::stof(sz));
|
||||
|
||||
}
|
||||
|
||||
/** parse the given GroundTruth entry */
|
||||
static inline GroundTruthID parseGroundTruthTick(const std::string& data) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user