fixed some issues

added new pose/turn detections
new helper classes
define-flags for libEigen
This commit is contained in:
2018-09-04 10:49:00 +02:00
parent f990485d44
commit 857d7a1553
51 changed files with 2149 additions and 207 deletions

84
math/KahanSum.h Normal file
View File

@@ -0,0 +1,84 @@
#ifndef KAHANSUM_H
#define KAHANSUM_H
#include <vector>
template <typename T> class KahanSum {
private:
const T zero;
/** current sum */
T sum;
/** current compensation */
T comp;
public:
/** ctor with zero element */
KahanSum(const T zero) : zero(zero), sum(zero), comp(zero) {
}
KahanSum& operator += (const T val) {
add(val);
return *this;
}
KahanSum& operator -= (const T val) {
sub(val);
return *this;
}
T get() const {
return sum;
}
private:
#define NO_OPT __attribute__((optimize("-O0")))
/** adjust the sum */
void add(const T val) NO_OPT {
const T y = val - comp;
const T t = sum + y;
comp = (t-sum) - y; // very important line
sum = t;
}
/** adjust the sum */
void sub(const T val) NO_OPT {
const T y = val - comp;
const T t = sum - y;
comp = (t-sum) + y; // very important line
sum = t;
}
public:
static T get(const std::vector<T>& values, const T zero = T()) {
return get(values.data(), values.size(), zero);
}
static T get(const T* values, const size_t cnt, const T zero = T()) {
T sum = zero;
volatile T comp = zero;
for (size_t i = 0; i < cnt; ++i) {
const T inp = values[i];
const volatile T y = inp - comp;
const volatile T t = sum + y;
comp = (t-sum) - y;
sum = t;
}
return sum;
}
};
#endif // KAHANSUM_H