state-observation 1.7.0
General implementation of observers.
Loading...
Searching...
No Matches
definitions.hpp
Go to the documentation of this file.
1
11
12#ifndef STATEOBSERVATIONDEFINITIONSHPP
13#define STATEOBSERVATIONDEFINITIONSHPP
14
15// #define STATEOBSERVATION_VERBOUS_CONSTRUCTORS
16
17#include <chrono>
18#include <deque>
19#include <stdexcept>
20#include <vector>
21
22#ifdef STATEOBSERVATION_VERBOUS_CONSTRUCTORS
23# include <iostream>
24#endif
25
26#include <boost/assert.hpp>
27#include <boost/timer/timer.hpp>
28
29#include <Eigen/Core>
30#include <Eigen/Geometry>
31
32#ifndef M_PI
33# include <boost/math/constants/constants.hpp>
34# define M_PI boost::math::constants::pi<double>()
35#endif
36
37#include <state-observation/api.h>
38
39// basic file operations
40#include <fstream>
41
42namespace stateObservation
43{
47template<typename T>
48struct isEigen
49{
50 static constexpr bool value = std::is_base_of<Eigen::EigenBase<T>, T>::value;
51};
52
55template<typename T>
56struct isMatrix : std::false_type
57{
58};
59
60template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
61struct isMatrix<Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>> : std::true_type
62{
63};
64
65template<typename T>
66struct EigenType : std::enable_if<isEigen<T>::value, T>
67{
68};
69
70template<typename T>
71struct MatrixType : std::enable_if<isMatrix<T>::value, T>
72{
73};
74
76typedef Eigen::VectorXd Vector;
77
79typedef Eigen::Matrix<double, 1, 1> Vector1;
80
82typedef Eigen::Matrix<double, 2, 1> Vector2;
83
85typedef Eigen::Vector3d Vector3;
86
88typedef Eigen::Matrix<double, 3, 1, Eigen::DontAlign> Vector3Unaligned;
89
91typedef Eigen::Vector4d Vector4;
92
94typedef Eigen::Matrix<double, 5, 1> Vector5;
95
97typedef Eigen::Matrix<double, 6, 1> Vector6;
98
100typedef Eigen::MatrixXd Matrix;
101
103typedef Eigen::Matrix<double, 1, 1> Matrix1;
104
106typedef Eigen::Matrix2d Matrix2;
107
109typedef Eigen::Matrix3d Matrix3;
110
112typedef Eigen::Matrix<double, 3, 3, Eigen::DontAlign> Matrix3Unaligned;
113
115typedef Eigen::Matrix4d Matrix4;
116
118typedef Eigen::Matrix<double, 5, 5> Matrix5;
119
121typedef Eigen::Matrix<double, 6, 6> Matrix6;
122
124typedef Eigen::Matrix<double, 12, 12> Matrix12;
125
127typedef Eigen::Quaterniond Quaternion;
128
130typedef Eigen::Quaternion<double, Eigen::DontAlign> QuaternionUnaligned;
131
133typedef Eigen::AngleAxis<double> AngleAxis;
134
136typedef Eigen::Rotation2D<double> Rotation2D;
137
138typedef Eigen::Index Index;
139typedef long int TimeIndex;
140typedef Index TimeSize;
141
142#ifndef NDEBUG
143static const bool isDebug = true;
144#else
145static const bool isDebug = false;
146#endif // NDEBUG
147
148template<int compileTimeRows = -1, int compileTimeCols = -1>
150{
151public:
152 template<typename CustomNullaryOp>
153 static const Eigen::CwiseNullaryOp<CustomNullaryOp, typename Eigen::Matrix<double, compileTimeRows, compileTimeCols>>
154 nullaryExp(const CustomNullaryOp & func, Index rows = compileTimeRows, Index cols = compileTimeCols)
155 {
157 (void)rows;
158 (void)cols;
159
160 return Eigen::Matrix<double, compileTimeRows, compileTimeCols>::NullaryExpr(func);
161 }
162};
163
164template<int compileTimeCols>
165class FixOrDynMatrixToolsBySize<-1, compileTimeCols>
166{
167public:
168 template<typename CustomNullaryOp>
169 static const Eigen::CwiseNullaryOp<CustomNullaryOp, typename Eigen::Matrix<double, -1, compileTimeCols>> nullaryExp(
170 const CustomNullaryOp & func,
171 Index rows = -1,
172 Index cols = compileTimeCols)
173 {
174 return Eigen::Matrix<double, -1, compileTimeCols>::NullaryExpr(rows, cols, func);
175 }
176};
177
178template<int compileTimeRows>
179class FixOrDynMatrixToolsBySize<compileTimeRows, -1>
180{
181public:
182 template<typename CustomNullaryOp>
183 static const Eigen::CwiseNullaryOp<CustomNullaryOp, typename Eigen::Matrix<double, compileTimeRows, -1>> nullaryExp(
184 const CustomNullaryOp & func,
185 Index rows = compileTimeRows,
186 Index cols = -1)
187 {
188 return Eigen::Matrix<double, compileTimeRows, -1>::NullaryExpr(rows, cols, func);
189 }
190};
191
192template<>
194{
195public:
196 template<typename CustomNullaryOp>
197 static const Eigen::CwiseNullaryOp<CustomNullaryOp, typename Eigen::Matrix<double, -1, -1>> nullaryExp(
198 const CustomNullaryOp & func,
199 Index rows = -1,
200 Index cols = -1)
201 {
202 return Eigen::Matrix<double, -1, -1>::NullaryExpr(rows, cols, func);
203 }
204};
205
206template<typename MatrixT>
207class FixOrDynMatrixTools : public FixOrDynMatrixToolsBySize<MatrixType<MatrixT>::type::RowsAtCompileTime,
208 MatrixType<MatrixT>::type::ColsAtCompileTime>
209{
210};
211
214template<typename T, const T defaultValue = T()>
216{
217public:
218 static const T v;
219};
220
221template<typename T, const T defaultValue>
222const T DebugItemDefaultValue<T, defaultValue>::v = defaultValue;
223
224namespace detail
225{
226typedef DebugItemDefaultValue<bool, true> defaultTrue;
227
228enum errorType
229{
230 message,
231 exception,
232 exceptionAddr
233};
234
235template<errorType i = message, int dummy = 0>
237{
238};
239
240template<int dummy>
241class DebugItemDefaultError<message, dummy>
242{
243public:
244 static const char * v;
245};
246
247template<int dummy>
248class DebugItemDefaultError<exception, dummy>
249{
250public:
251 static const std::runtime_error v;
252};
253
254template<int dummy>
255class DebugItemDefaultError<exceptionAddr, dummy>
256{
257public:
258 static const std::runtime_error * v;
259};
260
261template<int dummy>
262const char * DebugItemDefaultError<message, dummy>::v = "The Object is not initialized. \
263 If this happened during initialization then run command chckitm_set() \
264 to switch it to set. And if the initialization is incomplete, run \
265 chckitm_reset() afterwards.";
266
267template<int dummy>
268const std::runtime_error DebugItemDefaultError<exception, dummy>::v =
269 std::runtime_error(DebugItemDefaultError<message>::v);
270
271template<int dummy>
273
274typedef DebugItemDefaultError<message> defaultErrorMSG;
275typedef DebugItemDefaultError<exception> defaultException;
276typedef DebugItemDefaultError<exceptionAddr> defaultExceptionAddr;
277
278void STATE_OBSERVATION_DLLAPI defaultSum(const Vector & stateVector, const Vector & tangentVector, Vector & sum);
279void STATE_OBSERVATION_DLLAPI defaultDifference(const Vector & stateVector1,
280 const Vector & stateVector2,
281 Vector & difference);
282
283} // namespace detail
284
287template<typename T, typename defaultValue = DebugItemDefaultValue<T>, bool debug = true>
288class DebugItem
289{
290public:
291 DebugItem() : b_(defaultValue::v) {}
292 explicit DebugItem(const T & v) : b_(v) {}
293 inline T & operator=(T v)
294 {
295 return b_ = v;
296 }
297 inline operator T() const
298 {
299 return b_;
300 }
301 inline T set(const T & v)
302 {
303 return b_ = v;
304 }
305 T get() const
306 {
307 return b_;
308 }
309
310private:
311 T b_;
312};
313
315template<typename T, typename defaultValue>
316class DebugItem<T, defaultValue, false>
317{
318public:
319 DebugItem() {}
320 explicit DebugItem(T) {}
321 inline T & operator=(T v)
322 {
324 return v;
325 }
326 inline operator T() const
327 {
328 return defaultValue::v;
329 }
330 inline T set(const T &)
331 {
332 return defaultValue::v;
333 }
334 T get() const
335 {
336 return defaultValue::v;
337 }
338
339private:
341 T b_;
342};
343
347{
348 template<typename T>
349 static bool check(const T &)
350 {
351 return true;
352 }
353 template<typename T>
354 static bool checkAssert(const T &)
355 {
356 return true;
357 }
358 inline static constexpr char errorMessage[] = "";
359 using ExceptionT = std::runtime_error;
360};
361
372template<typename T,
373 bool lazy = false,
374 bool alwaysCheck = false,
375 bool assertion = true,
376 bool eigenAlignedNew = false,
377 typename additionalChecker = EmptyChecker>
379{
380public:
382 CheckedItem(bool initialize = true);
383 explicit CheckedItem(const T &);
384 CheckedItem(const CheckedItem &);
385 virtual ~CheckedItem() {}
386
387 inline CheckedItem & operator=(const CheckedItem &);
388 inline T & operator=(const T &);
389 inline operator T() const;
390 inline operator const T &() const;
391
392 inline const T & chckitm_getValue() const;
393
394 inline T & operator()();
395 inline const T & operator()() const;
396
397 inline T & getRefUnchecked();
398 inline const T & getRefUnchecked() const;
399
400 inline bool isSet() const;
401 inline void reset();
402
404 inline void set(bool value);
405
406 void setAssertMessage(std::string s);
407 void setExceptionPtr(std::exception * e);
408
413 inline T & set();
414
415protected:
416 static const bool do_check_ = !lazy || isDebug;
417 static const bool do_assert_ = do_check_ && assertion;
418 static const bool do_exception_ = do_check_ && !assertion;
419
423
424 IsSet isSet_;
425 AssertMsg assertMsg_;
426 ExceptionPtr exceptionPtr_;
427
428 bool chckitm_check_() const;
429 T v_;
430
431public:
432 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(eigenAlignedNew)
433};
434
437{
438 template<typename T>
439 static bool check(const T & m)
440 {
441 return !m.hasNaN();
442 }
443 template<typename T>
444 static bool checkAssert(const T & m)
445 {
446 BOOST_ASSERT(check(m) && errorMessage);
447 return check(m);
448 }
449 inline static constexpr char errorMessage[] = "Matrix contains a NaN.";
450 using ExceptionT = std::runtime_error;
451};
452
459
468template<typename MatrixType = Matrix, bool lazy = false>
469class IndexedMatrixT : protected DebugItem<bool, detail::defaultTrue, !lazy || isDebug>
470{
471 typedef DebugItem<bool, detail::defaultTrue, !lazy || isDebug> IsSet;
472
473public:
476
478 IndexedMatrixT(const MatrixType & v, TimeIndex k);
479
481 inline IndexedMatrixT & set(const MatrixType & v, TimeIndex k);
482
484 inline void set(bool value = true);
485
487 inline void setIndex(TimeIndex index);
488
490 inline const MatrixType & operator()() const;
491
494
496 inline TimeIndex getTime() const;
497
499 inline bool isSet() const;
500
502 inline void reset();
503
504 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
505
506protected:
509 inline bool check_() const;
510 TimeIndex k_;
511 MatrixType v_;
512};
513
514typedef IndexedMatrixT<Matrix> IndexedMatrix;
515typedef IndexedMatrixT<Vector> IndexedVector;
516typedef IndexedMatrixT<Vector3> IndexedVector3;
517typedef IndexedMatrixT<Matrix3> IndexedMatrix3;
518
525
526template<typename MatrixType = Matrix, typename Allocator = std::allocator<MatrixType>>
528{
529public:
532
537 IndexedMatrixArrayT(TimeSize size, TimeIndex initTime = 0);
538
539 typedef std::vector<MatrixType, Allocator> Array;
540
544 inline void setValue(const MatrixType & v, TimeIndex k);
545
547 inline void pushBack(const MatrixType & v);
548
550 inline void popFront();
551
553 inline MatrixType operator[](TimeIndex index) const;
554
556 inline MatrixType & operator[](TimeIndex index);
557
559 inline const MatrixType & front() const;
560
562 inline MatrixType & front();
563
565 inline const MatrixType & back() const;
566
568 inline MatrixType & back();
569
571 void truncateAfter(TimeIndex timeIndex);
572
574 void truncateBefore(TimeIndex timeIndex);
575
577 inline void resize(TimeSize i, const MatrixType & m = MatrixType());
578
580 inline TimeIndex getLastIndex() const;
581
584 inline TimeIndex getNextIndex() const;
585
587 inline TimeIndex setLastIndex(int index);
588
590 inline TimeIndex getFirstIndex() const;
591
593 inline TimeIndex setFirstIndex(int index);
594
595 inline TimeSize size() const;
596
599 inline void reset();
600
602 inline void clear();
603
605 Array getArray() const;
606
608 inline bool checkIndex(TimeIndex k) const;
609
614 void readFromFile(const char * filename, Index rows, Index cols = 1, bool withTimeStamp = true);
615 void readFromFile(const std::string & filename, Index rows, Index cols = 1, bool withTimeStamp = true);
616
621 void readVectorsFromFile(const std::string & filename, bool withTimeStamp = true);
622 void readVectorsFromFile(const char * filename, bool withTimeStamp = true);
623
629 void writeInFile(const char * filename, bool clear = false, bool append = false);
630
636 void writeInFile(const std::string & filename, bool clear = false, bool append = false);
637
638protected:
639 typedef std::deque<MatrixType, Allocator> Deque;
640
643 inline void check_(TimeIndex time) const;
644
647 inline void check_() const;
648
651 inline void checkNext_(TimeIndex time) const;
652
653 TimeIndex k_;
654
655 Deque v_;
656};
657
658typedef IndexedMatrixArrayT<Matrix> IndexedMatrixArray;
659typedef IndexedMatrixArrayT<Vector> IndexedVectorArray;
660
661namespace cst
662{
663constexpr double gravityConstant = 9.80665;
664
666const Vector gravity = gravityConstant * Vector3::UnitZ();
667
669constexpr double epsilonAngle = 1e-16;
670
672constexpr double epsilon1 = std::numeric_limits<double>::epsilon();
673
674} // namespace cst
675
683inline bool isApprox(double a, double b, double relativePrecision = cst::epsilon1);
684
692inline bool isApproxAbs(double a, double b, double absolutePrecision = cst::epsilon1);
693
694typedef boost::timer::auto_cpu_timer auto_cpu_timer;
695typedef boost::timer::cpu_timer cpu_timer;
696typedef boost::timer::cpu_timer cpu_times;
697
698namespace tools
699{
700struct STATE_OBSERVATION_DLLAPI SimplestStopwatch
701{
703 using clock = typename std::conditional<std::chrono::high_resolution_clock::is_steady,
704 std::chrono::high_resolution_clock,
705 std::chrono::steady_clock>::type;
706 using time_ns = clock::time_point;
707 time_ns startTime;
708
709 inline void start()
710 {
711 startTime = clock::now();
712 }
713
716 inline double stop()
717 {
718 auto elapsed = clock::now() - startTime;
719 return static_cast<double>(elapsed.count());
720 }
721};
722
723std::string STATE_OBSERVATION_DLLAPI matrixToString(const Matrix & mat);
724
725std::string STATE_OBSERVATION_DLLAPI vectorToString(const Vector & v);
726
727Matrix STATE_OBSERVATION_DLLAPI stringToMatrix(const std::string & str, Index rows, Index cols);
728
729Vector STATE_OBSERVATION_DLLAPI stringToVector(const std::string & str, Index length);
730
731Vector STATE_OBSERVATION_DLLAPI stringToVector(const std::string & str);
732} // namespace tools
733
734#include <state-observation/tools/definitions.hxx>
735} // namespace stateObservation
736
737#endif // STATEOBSERVATIONDEFINITIONSHPP
this is a structure allowing for automatically verifying that the item has been initialized or not....
CheckedItem(bool initialize=true)
The parameter initialize sets whether the isSet() parameter is initialized to false.
void set(bool value)
set the value of the initialization check boolean
static const Eigen::CwiseNullaryOp< CustomNullaryOp, typename Eigen::Matrix< double, compileTimeRows, compileTimeCols > > nullaryExp(const CustomNullaryOp &func, Index rows=compileTimeRows, Index cols=compileTimeCols)
This class describes a structure that enables to store array of matrices with time indexation.
TimeIndex setLastIndex(int index)
Set the time index of the last element.
void truncateAfter(TimeIndex timeIndex)
removes all the elements with larger indexes than timeIndex
void checkNext_(TimeIndex time) const
void writeInFile(const std::string &filename, bool clear=false, bool append=false)
TimeIndex setFirstIndex(int index)
set the time index of the first element
MatrixType & back()
gets the last value
void truncateBefore(TimeIndex timeIndex)
removes all the elements with smaller indexes than timeIndex
void clear()
Clears the vector but keeps the last index.
bool checkIndex(TimeIndex k) const
checks whether the index is present in the array
void writeInFile(const char *filename, bool clear=false, bool append=false)
void pushBack(const MatrixType &v)
Pushes back the matrix to the array, the new value will take the next time.
void check_(TimeIndex time) const
MatrixType operator[](TimeIndex index) const
gets the value with the given time index
MatrixType & front()
gets the first value
void popFront()
removes the first (oldest) element of the array
IndexedMatrixArrayT(TimeSize size, TimeIndex initTime=0)
Construct a new Indexed Vector Array T with a predifined size.
void resize(TimeSize i, const MatrixType &m=MatrixType())
resizes the array
const MatrixType & front() const
gets the first value
void setValue(const MatrixType &v, TimeIndex k)
IndexedMatrixArrayT()
Default constructor.
TimeIndex getFirstIndex() const
Get the time index.
void readFromFile(const char *filename, Index rows, Index cols=1, bool withTimeStamp=true)
const MatrixType & back() const
gets the last value
TimeIndex getLastIndex() const
Get the time index.
MatrixType & operator[](TimeIndex index)
gets the value with the given time index, non const version
void readVectorsFromFile(const std::string &filename, bool withTimeStamp=true)
Array getArray() const
converts the array into a standard vector
This class describes a structure composed by a matrix of a given size and a time-index parameter....
void setIndex(TimeIndex index)
set the index of the matrix
IndexedMatrixT & set(const MatrixType &v, TimeIndex k)
Set the value of the matrix and the time sample.
IndexedMatrixT(const MatrixType &v, TimeIndex k)
A constructor with a given matrix value and a time index.
MatrixType & operator()()
Get the matrix value.
IndexedMatrixT()
Default constructor.
TimeIndex getTime() const
Get the time index.
void reset()
Switch off the initalization flag, the value is no longer accessible.
const MatrixType & operator()() const
Get the matrix value (const version).
bool isSet() const
Says whether the matrix is initialized or not.
void set(bool value=true)
Switch the vector to "initialized" state.
constexpr double epsilonAngle
angles considered Zero
const Vector gravity
Gravity Vector along Z.
constexpr double epsilon1
number considered zero when compared to 1
Filtering of divergent component of motion (DCM) and estimation of a bias betweeen the DCM and the co...
Eigen::Matrix4d Matrix4
4x4 Scalar Matrix
Eigen::AngleAxis< double > AngleAxis
Euler Axis/Angle representation of orientation.
Eigen::Quaterniond Quaternion
Quaternion.
bool isApprox(double a, double b, double relativePrecision=cst::epsilon1)
checks if two scalars have approximately the same value up to a given relative precision
Eigen::Matrix< double, 3, 3, Eigen::DontAlign > Matrix3Unaligned
3x3 Scalar Matrix Unaligned
bool isApproxAbs(double a, double b, double absolutePrecision=cst::epsilon1)
checks if two scalars have approximately the same value up to a given absolute precision
Eigen::Rotation2D< double > Rotation2D
2D rotations
Eigen::Matrix2d Matrix2
2D scalar Matrix
Eigen::Vector3d Vector3
3D vector
Eigen::Vector4d Vector4
4D vector
Eigen::Matrix< double, 1, 1 > Vector1
1D Vector
Eigen::Matrix3d Matrix3
3x3 Scalar Matrix
Eigen::MatrixXd Matrix
Dynamic sized Matrix.
Eigen::Matrix< double, 5, 1 > Vector5
5D vector
Eigen::Matrix< double, 6, 1 > Vector6
6D vector
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vector3Unaligned
3D vector unaligned
Eigen::Matrix< double, 6, 6 > Matrix6
6x6 Scalar Matrix
Eigen::Matrix< double, 5, 5 > Matrix5
5x5 Scalar Matrix
Eigen::Matrix< double, 12, 12 > Matrix12
12x12 scalar Matrix
Eigen::Matrix< double, 2, 1 > Vector2
2d Vector
Eigen::VectorXd Vector
Dynamic sized scalar vector.
Eigen::Quaternion< double, Eigen::DontAlign > QuaternionUnaligned
Quaternion Unaligned.
Eigen::Matrix< double, 1, 1 > Matrix1
1D scalar Matrix
Additional checker that allows to check for the presence of NaN values in the item.
This structure is used as an additionalChecker for a CheckedItem that doesn't require additional test...
Checks if it is derived from EigenBase (the base class of all dense functions).
Checks if a class is a specialization of Eigen::Matrix.
typename std::conditional< std::chrono::high_resolution_clock::is_steady, std::chrono::high_resolution_clock, std::chrono::steady_clock >::type clock