My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
HolisticFusion.h
Go to the documentation of this file.
1/*
2Copyright 2024 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 HOLISTIC_FUSION_H
9#define HOLISTIC_FUSION_H
10
11// C++
12#include <atomic>
13#include <mutex>
14#include <stdexcept>
15#include <thread>
16#include <unordered_set>
17
18// Package
27
28namespace holistic_fusion {
29
30// Forward Declarations
31class GraphManager;
32
33// Actual Class
35 public: // Interface
36 // Constructor
38 // Destructor
39 virtual ~HolisticFusion();
40
41 // Setup
42 void setup(const std::shared_ptr<GraphConfig> graphConfigPtr, const std::shared_ptr<StaticTransforms> staticTransformsPtr);
43
44 // Initialization Interface
45 bool initYawAndPositionInWorld(const double yaw_W_frame1, const Eigen::Vector3d& W_t_W_frame2, const std::string& frame1,
46 const std::string& frame2);
48 bool initWorldFrameToFixedFrameTransform(const Eigen::Isometry3d& T_W_F, const std::string& fixedFrame);
49
50 // Trigger offline smoother optimization
51 // Writes the optimized states to files in savePath. Returns false if the slow batch smoother is disabled.
52 bool optimizeSlowBatchSmoother(int maxIterations, const std::string& savePath, const bool saveCovarianceFlag);
53 // Returns the optimized navigation states without writing files. Returns std::nullopt if the slow batch smoother is disabled.
54 // Computing the pose covariances is slow for long trajectories.
55 std::optional<BatchOptimizationResult> optimizeSlowBatchSmoother(int maxIterations, const bool computePoseCovarianceFlag);
56
57 // Logging of the real-time states
58 bool logRealTimeNavStates(const std::string& savePath);
59
60 // Getter functions
61 bool areYawAndPositionInited() const;
62 bool areRollAndPitchInited() const;
63 bool isGraphInited() const;
65
66 // Main: IMU
67 bool addCoreImuMeasurementAndGetState(const Eigen::Vector3d& linearAcc, const Eigen::Vector3d& angularVel, const double imuTimeK,
68 std::shared_ptr<SafeIntegratedNavState>& returnPreIntegratedNavStatePtr,
69 std::shared_ptr<SafeNavStateWithCovarianceAndBias>& returnOptimizedStateWithCovarianceAndBiasPtr,
70 Eigen::Matrix<double, 6, 1>& returnAddedImuMeasurements);
71
72 // Pure Virtual Methods
76 const bool addToOnlineSmootherFlag = true) = 0;
84
87 const int landmarkCreationCounter) = 0;
89
92
93 // Ambiguous Measurements
94 bool addZeroMotionFactor(double timeKm1, double timeK, double noiseDensity);
95 bool addZeroVelocityFactor(double timeK, double noiseDensity);
96
97 protected:
98 // Methods -------------
100 template <int DIM>
101 bool isCovarianceViolated_(const Eigen::Matrix<double, DIM, 1>& covariance, const double covarianceViolationThreshold) {
102 if (covarianceViolationThreshold > 0.0) {
103 for (int i = 0; i < DIM; i++) {
104 if (covariance(i) > covarianceViolationThreshold) {
105 return true;
106 }
107 }
108 }
109 return false;
110 }
111
112 // Initialization
114
115 // Check whether measurement violated covariance, if yes, add to set and print once, if not, remove from set and print that returned
116 bool checkAndPrintCovarianceViolation_(const std::string& measurementName, const bool violatedFlag);
117
118 // Members
119 // Graph Config
120 std::shared_ptr<GraphConfig> graphConfigPtr_ = nullptr;
121 // Extrinsics
122 std::shared_ptr<StaticTransforms> staticTransformsPtr_ = nullptr;
123
124 // Factor graph
125 std::shared_ptr<GraphManager> graphMgrPtr_ = nullptr;
126 // Imu Buffer
127 std::shared_ptr<holistic_fusion::ImuBuffer> coreImuBufferPtr_;
128
129 // Mutex
131
134 bool alignedImuFlag_ = false;
136 bool initedGraphFlag_ = false;
139 bool optimizeGraphFlag_ = false;
141
142 // Counter
144
145 // Set of measurements that have violated the covariance
146 std::unordered_set<std::string> measurementsWithViolatedCovariance_;
147
148 private:
151 bool alignImu_(double& imuAttitudeRoll, double& imuAttitudePitch);
153 void initGraph_(const double timeStamp_k, const Eigen::Vector3d& imuAngularVelocity);
155 void optimizeGraph_();
156
159 Eigen::Vector3d W_t_W_Frame1_to_W_t_W_Frame2_(const Eigen::Vector3d& W_t_W_frame1, const std::string& frame1, const std::string& frame2,
160 const Eigen::Matrix3d& R_W_frame2);
161
162 // Threads
165 std::atomic<bool> stopOptimizeGraphThread_{false};
166
167 // Mutex
169
171 std::shared_ptr<SafeIntegratedNavState> preIntegratedNavStatePtr_ = nullptr;
172};
173
174} // namespace holistic_fusion
175
176#endif // HOLISTIC_FUSION_H
Eigen::Vector3d W_t_W_Frame1_to_W_t_W_Frame2_(const Eigen::Vector3d &W_t_W_frame1, const std::string &frame1, const std::string &frame2, const Eigen::Matrix3d &R_W_frame2)
Utility functions / Geometric transformation to IMU in world frame.
bool addZeroMotionFactor(double timeKm1, double timeK, double noiseDensity)
void setup(const std::shared_ptr< GraphConfig > graphConfigPtr, const std::shared_ptr< StaticTransforms > staticTransformsPtr)
std::shared_ptr< GraphConfig > graphConfigPtr_
std::shared_ptr< SafeIntegratedNavState > preIntegratedNavStatePtr_
State Containers.
virtual void addUnaryVelocity3LocalMeasurement(UnaryMeasurementXD< Eigen::Vector3d, 3 > &S_v_R_S)=0
bool initYawAndPositionInWorld(const double yaw_W_frame1, const Eigen::Vector3d &W_t_W_frame2, const std::string &frame1, const std::string &frame2)
std::atomic< bool > stopOptimizeGraphThread_
bool initWorldFrameToFixedFrameTransform(const Eigen::Isometry3d &T_W_F, const std::string &fixedFrame)
virtual void addBinaryPose3Measurement(const BinaryMeasurementXD< Eigen::Isometry3d, 6 > &delta)=0
Binary Measurements.
virtual void addUnaryPosition3LandmarkMeasurement(UnaryMeasurementXDLandmark< Eigen::Vector3d, 3 > &S_t_S_L, const int landmarkCreationCounter)=0
Landmark Measurements.
bool logRealTimeNavStates(const std::string &savePath)
std::shared_ptr< holistic_fusion::ImuBuffer > coreImuBufferPtr_
virtual void addUnaryVelocity3AbsoluteMeasurement(UnaryMeasurementXDAbsolute< Eigen::Vector3d, 3 > &R_v_R_S)=0
bool alignedImuFlag_
Flags / Initialization.
bool addZeroVelocityFactor(double timeK, double noiseDensity)
bool addCoreImuMeasurementAndGetState(const Eigen::Vector3d &linearAcc, const Eigen::Vector3d &angularVel, const double imuTimeK, std::shared_ptr< SafeIntegratedNavState > &returnPreIntegratedNavStatePtr, std::shared_ptr< SafeNavStateWithCovarianceAndBias > &returnOptimizedStateWithCovarianceAndBiasPtr, Eigen::Matrix< double, 6, 1 > &returnAddedImuMeasurements)
Main: IMU --------------------—.
bool alignImu_(double &imuAttitudeRoll, double &imuAttitudePitch)
Worker functions / Set Imu Attitude.
virtual void addUnaryBearing3LandmarkMeasurement(UnaryMeasurementXDLandmark< Eigen::Vector3d, 3 > &S_bearing_S_L)=0
virtual ~HolisticFusion()
Destructor --------—.
std::shared_ptr< GraphManager > graphMgrPtr_
virtual void addUnaryYawAbsoluteMeasurement(const UnaryMeasurementXDAbsolute< double, 1 > &yaw_R_S)=0
bool optimizeSlowBatchSmoother(int maxIterations, const std::string &savePath, const bool saveCovarianceFlag)
std::shared_ptr< StaticTransforms > staticTransformsPtr_
bool checkAndPrintCovarianceViolation_(const std::string &measurementName, const bool violatedFlag)
virtual void addUnaryPose3AbsoluteMeasurement(const UnaryMeasurementXDAbsolute< Eigen::Isometry3d, 6 > &R_T_R_S, const bool addToOnlineSmootherFlag=true)=0
Unary Measurements / Absolute Measurements.
void initGraph_(const double timeStamp_k, const Eigen::Vector3d &imuAngularVelocity)
virtual void addUnaryPosition3AbsoluteMeasurement(UnaryMeasurementXDAbsolute< Eigen::Vector3d, 3 > &R_t_R_S)=0
bool isCovarianceViolated_(const Eigen::Matrix< double, DIM, 1 > &covariance, const double covarianceViolationThreshold)
Convenience functions.
HolisticFusion()
Constructor --------—.
std::unordered_set< std::string > measurementsWithViolatedCovariance_
virtual void addUnaryPitchAbsoluteMeasurement(const UnaryMeasurementXDAbsolute< double, 1 > &pitch_R_S)=0
virtual void addUnaryRollAbsoluteMeasurement(const UnaryMeasurementXDAbsolute< double, 1 > &roll_R_S)=0
bool initYawAndPosition(const UnaryMeasurementXD< Eigen::Isometry3d, 6 > &unary6DMeasurement)
Class to represent x-dimensional absolute unary measurement in the graph.
Class to represent x-dimensional landmark unary measurement in the graph.
Class to represent x-dimensional unary measurement in the graph.