8#ifndef HOLISTIC_FUSION_H
9#define HOLISTIC_FUSION_H
16#include <unordered_set>
42 void setup(
const std::shared_ptr<GraphConfig> graphConfigPtr,
const std::shared_ptr<StaticTransforms> staticTransformsPtr);
46 const std::string& frame2);
55 std::optional<BatchOptimizationResult>
optimizeSlowBatchSmoother(
int maxIterations,
const bool computePoseCovarianceFlag);
68 std::shared_ptr<SafeIntegratedNavState>& returnPreIntegratedNavStatePtr,
69 std::shared_ptr<SafeNavStateWithCovarianceAndBias>& returnOptimizedStateWithCovarianceAndBiasPtr,
70 Eigen::Matrix<double, 6, 1>& returnAddedImuMeasurements);
76 const bool addToOnlineSmootherFlag =
true) = 0;
87 const int landmarkCreationCounter) = 0;
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) {
151 bool alignImu_(
double& imuAttitudeRoll,
double& imuAttitudePitch);
153 void initGraph_(
const double timeStamp_k,
const Eigen::Vector3d& imuAngularVelocity);
160 const Eigen::Matrix3d& R_W_frame2);
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 normalOperationFlag_
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 areYawAndPositionInited() const
bool foundInitialYawAndPositionFlag_
bool addZeroVelocityFactor(double timeK, double noiseDensity)
bool validFirstMeasurementReceivedFlag_
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::thread optimizeGraphThread_
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)
bool areRollAndPitchInited() const
std::mutex optimizeGraphMutex_
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 --------—.
bool getNormalOperationFlag() const
void pretendFirstMeasurementReceived()
std::unordered_set< std::string > measurementsWithViolatedCovariance_
std::mutex initYawAndPositionMutex_
virtual void addUnaryPitchAbsoluteMeasurement(const UnaryMeasurementXDAbsolute< double, 1 > &pitch_R_S)=0
virtual void addUnaryRollAbsoluteMeasurement(const UnaryMeasurementXDAbsolute< double, 1 > &roll_R_S)=0
bool isGraphInited() const
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.