My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
ImuBuffer.hpp
Go to the documentation of this file.
1/*
2Copyright 2023 by Julian Nubert, Robotic Systems Lab, ETH Zurich.
3All rights reserved.
4This file is released under the "BSD-3-Clause License".
5Please see the LICENSE file that has been included as part of this package.
6 */
7
8#ifndef IMU_MANAGER_HPP_
9#define IMU_MANAGER_HPP_
10
11// C++
12#include <map>
13#include <mutex>
14
15// Eigen
16#include <Eigen/Dense>
17
18// GTSAM
19#include <gtsam/base/Vector.h>
20#include <gtsam/geometry/Pose3.h>
21#include <gtsam/navigation/CombinedImuFactor.h>
22#include <gtsam/navigation/ImuBias.h>
23
24// Workspace
28
29namespace holistic_fusion {
30
31// Datatypes
32// Map from time to 6D IMU measurements
33typedef std::map<double, holistic_fusion::ImuMeasurement, std::less<double>,
34 Eigen::aligned_allocator<std::pair<const double, holistic_fusion::ImuMeasurement>>>
36
37// Actual Class
38class ImuBuffer {
39 public:
40 // Constructor
41 ImuBuffer(const std::shared_ptr<GraphConfig> graphConfigPtr);
42
43 // Destructor
44 ~ImuBuffer() = default;
45
46 // Add to buffers
47 Eigen::Matrix<double, 6, 1> addToImuBuffer(double ts, const Eigen::Vector3d& linearAcc, const Eigen::Vector3d& angularVel);
48 void addToKeyBuffer(double ts, gtsam::Key key);
49
50 // Getters
51 double getImuRate() const { return imuRate_; }
53 bool getImuMeasurementAtTime(holistic_fusion::ImuMeasurement& returnedImuMeasurement, const double ts);
55 bool getClosestKeyAndTimestamp(double& tInGraph, gtsam::Key& key, const std::string& callingName, const double maxSearchDeviation,
56 const double tLidar);
57
58 // Public member functions
60 bool estimateAttitudeFromImu(gtsam::Rot3& initAttitude, double& gravityMagnitude, Eigen::Vector3d& gyrBias);
61
62 // Integrate NavState from Timestamp
63 bool getIMUBufferIteratorsInInterval(const double tsStart, const double tsEnd, TimeToImuMap::iterator& startIterator,
64 TimeToImuMap::iterator& endIterator);
65
66 // Get closest timestamp
67 bool getClosestImuMeasurement(double& returnedImuTimestamp, ImuMeasurement& returnedImuMeasurement, const double maxSearchDeviation,
68 const double tK);
69
70 // Integrate NavState from Timestamp
71 gtsam::NavState integrateNavStateFromTimestamp(const double& tsStart, const double& tsEnd, const gtsam::NavState& stateStart,
72 const gtsam::imuBias::ConstantBias& imuBias, const Eigen::Vector3d& W_gravityVector);
73
74 private:
75 // Member variables
77 double imuRate_ = 100; // Rate of IMU input (Hz) - Used to calculate minimum measurements needed to calculate gravity and init attitude
79 double imuPoseInitWaitSecs_ = 1.0; // Multiplied with _imuRate
81 double tLatestInBuffer_ = 0.0;
84
85 // Low pass filter
86 std::unique_ptr<ImuSignalLowPassFilter> imuSignalLowPassFilterPtr_;
87};
88
89} // namespace holistic_fusion
90
91#endif // IMU_MANAGER_HPP_
ImuBuffer(const std::shared_ptr< GraphConfig > graphConfigPtr)
Definition ImuBuffer.cpp:23
bool getClosestImuMeasurement(double &returnedImuTimestamp, ImuMeasurement &returnedImuMeasurement, const double maxSearchDeviation, const double tK)
TimeToImuMap timeToImuBuffer_
Definition ImuBuffer.hpp:76
bool getClosestKeyAndTimestamp(double &tInGraph, gtsam::Key &key, const std::string &callingName, const double maxSearchDeviation, const double tLidar)
gtsam::NavState integrateNavStateFromTimestamp(const double &tsStart, const double &tsEnd, const gtsam::NavState &stateStart, const gtsam::imuBias::ConstantBias &imuBias, const Eigen::Vector3d &W_gravityVector)
std::unique_ptr< ImuSignalLowPassFilter > imuSignalLowPassFilterPtr_
Definition ImuBuffer.hpp:86
Eigen::Matrix< double, 6, 1 > addToImuBuffer(double ts, const Eigen::Vector3d &linearAcc, const Eigen::Vector3d &angularVel)
Definition ImuBuffer.cpp:40
void getLastTwoMeasurements(TimeToImuMap &imuMap)
double getImuRate() const
Definition ImuBuffer.hpp:51
bool getImuMeasurementAtTime(holistic_fusion::ImuMeasurement &returnedImuMeasurement, const double ts)
Definition ImuBuffer.cpp:92
bool estimateAttitudeFromImu(gtsam::Rot3 &initAttitude, double &gravityMagnitude, Eigen::Vector3d &gyrBias)
Determine initial IMU pose w.r.t to gravity vector pointing up.
bool getIMUBufferIteratorsInInterval(const double tsStart, const double tsEnd, TimeToImuMap::iterator &startIterator, TimeToImuMap::iterator &endIterator)
void addToKeyBuffer(double ts, gtsam::Key key)
std::map< double, holistic_fusion::ImuMeasurement, std::less< double >, Eigen::aligned_allocator< std::pair< const double, holistic_fusion::ImuMeasurement > > > TimeToImuMap
Definition ImuBuffer.hpp:35