My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
GmsfUnaryExpressionLandmark.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 GMSF_UNARY_EXPRESSION_LANDMARK_H
9#define GMSF_UNARY_EXPRESSION_LANDMARK_H
10
11// C++
12#include <mutex>
13
14// GTSAM
15#include <gtsam/base/types.h>
16
17// Workspace
20
21namespace holistic_fusion {
22
23template <class GTSAM_MEASUREMENT_TYPE, char CALIBRATION_CHAR>
24class GmsfUnaryExpressionLandmark : public GmsfUnaryExpression<GTSAM_MEASUREMENT_TYPE, UnaryExpressionType::Landmark, CALIBRATION_CHAR> {
25 public:
26 // Constructor
27 GmsfUnaryExpressionLandmark(const std::shared_ptr<UnaryMeasurementLandmark>& gmsfUnaryLandmarkMeasurementPtr,
28 const std::string& imuFrameName, const Eigen::Isometry3d& T_I_sensorFrame, const long landmarkCreationCounter)
29 : GmsfUnaryExpression<GTSAM_MEASUREMENT_TYPE, UnaryExpressionType::Landmark, CALIBRATION_CHAR>(gmsfUnaryLandmarkMeasurementPtr,
30 imuFrameName, T_I_sensorFrame),
31 landmarkName_(this->gmsfBaseUnaryMeasurementPtr_->measurementName()),
32 landmarkCreationCounter_(landmarkCreationCounter),
33 exp_T_W_I_(gtsam::Pose3::Identity()),
34 exp_sensorFrame_t_sensorFrame_landmark_(gtsam::Point3::Zero()),
35 gmsfUnaryLandmarkMeasurementPtr_(gmsfUnaryLandmarkMeasurementPtr) {}
36
37 // Destructor
39
40 protected:
41 // Virtual Methods
42 // i) Generate Expression for Basic IMU State in World Frame at Key
43 void generateImuStateInWorldFrameAtKey(const gtsam::Key& closestGeneralKey) final {
44 // Get robot state
45 exp_T_W_I_ = gtsam::Expression<gtsam::Pose3>(gtsam::symbol_shorthand::X(closestGeneralKey)); // T_W_I
46 }
47
48 // ii.A) Holistically Optimize over Fixed Frames
50 const gtsam::NavState& W_currentPropagatedState,
51 const bool centerMeasurementsAtKeyframePositionBeforeAlignmentFlag) final {
52 // Do nothing as this is a landmark measurement
53 throw std::logic_error("GmsfUnaryExpressionLandmark: transformStateFromWorldToFixedFrame not implemented for Landmark Measurements.");
54 }
55
56 // ii.B) Adding Landmark State in Dynamic Memory
58 const gtsam::NavState& W_currentPropagatedState) final {
59 // Mutex because we are changing the dynamically allocated graphKeys
60 std::lock_guard<std::mutex> modifyGraphKeysLock(gtsamDynamicExpressionKeys.get<gtsam::Pose3>().mutex());
61
62 // Get initial guess (computed geometrically)
63 gtsam::Point3 W_t_W_L_initial = computeW_t_W_L_initial(W_currentPropagatedState);
64
65 // Landmark names
66 const std::string newLandmarkName = landmarkName_ + "_" + std::to_string(landmarkCreationCounter_);
67 const std::string previousLandmarkName = landmarkName_ + "_" + std::to_string(landmarkCreationCounter_ - 1);
68
69 // Create new graph key for landmark dynamically
70 bool newGraphKeyAddedFlag = false;
72 const DynamicFactorGraphStateKey newGraphKey = gtsamDynamicExpressionKeys.get<gtsam::Pose3>().getTransformationKey<'l'>(
73 newGraphKeyAddedFlag, gmsfUnaryLandmarkMeasurementPtr_->worldFrameName(), newLandmarkName,
74 this->gmsfBaseUnaryMeasurementPtr_->timeK(), gtsam::Pose3(gtsam::Rot3::Identity(), W_t_W_L_initial), variableType);
75 // Make sure that the variable at the key is active (landmarks always have to be active or removed)
76 assert(newGraphKey.isVariableActive());
77
78 // Remove previous landmark with same landmark name;
79 if (newGraphKeyAddedFlag) {
80 std::ignore = gtsamDynamicExpressionKeys.get<gtsam::Pose3>().removeOrDeactivateTransform(
81 gmsfUnaryLandmarkMeasurementPtr_->worldFrameName(), previousLandmarkName);
82 }
83
84 // Create expression for landmark
85 const gtsam::Point3_ exp_W_t_W_L = gtsam::Point3_(newGraphKey.key());
86
87 // Convert to Imu frame
88 exp_sensorFrame_t_sensorFrame_landmark_ = gtsam::transformTo(exp_T_W_I_, exp_W_t_W_L); // I_t_I_L at this point
89
90 // Add values, if a new state was created
91 if (newGraphKeyAddedFlag) {
92 // Add initial guess
93 this->newOnlineStateValues_.insert(newGraphKey.key(), W_t_W_L_initial);
94 this->newOfflineStateValues_.insert(newGraphKey.key(), W_t_W_L_initial);
95 }
96 }
97
98 // Sub Functions that have to be implemented in derived classes --------------------------------
99 virtual gtsam::Point3 computeW_t_W_L_initial(const gtsam::NavState& W_currentPropagatedState) = 0;
100
101 // Variables ----------------------------------------------------------------------------------
102 // Landmark Identifier
103 const std::string& landmarkName_;
105
106 // Expression
107 gtsam::Pose3_ exp_T_W_I_; // Robot Pose
108 gtsam::Point3_ exp_sensorFrame_t_sensorFrame_landmark_; // Measurement --> this is what h(x) has to be
109
110 private:
111 // Pointer to the GMSF Unary Landmark Measurement
112 std::shared_ptr<UnaryMeasurementLandmark> gmsfUnaryLandmarkMeasurementPtr_;
113};
114
115} // namespace holistic_fusion
116
117#endif // GMSF_UNARY_EXPRESSION_LANDMARK_H
virtual gtsam::Point3 computeW_t_W_L_initial(const gtsam::NavState &W_currentPropagatedState)=0
std::shared_ptr< UnaryMeasurementLandmark > gmsfUnaryLandmarkMeasurementPtr_
void generateImuStateInWorldFrameAtKey(const gtsam::Key &closestGeneralKey) final
GmsfUnaryExpressionLandmark(const std::shared_ptr< UnaryMeasurementLandmark > &gmsfUnaryLandmarkMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame, const long landmarkCreationCounter)
void transformImuStateFromWorldToReferenceFrame(DynamicDictionaryContainer &gtsamDynamicExpressionKeys, const gtsam::NavState &W_currentPropagatedState, const bool centerMeasurementsAtKeyframePositionBeforeAlignmentFlag) final
void transformLandmarkInWorldToImuFrame(DynamicDictionaryContainer &gtsamDynamicExpressionKeys, const gtsam::NavState &W_currentPropagatedState) final
GmsfUnaryExpression(const std::shared_ptr< UnaryMeasurement > &gmsfBaseUnaryMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame)
static DynamicVariableType Landmark(const double variableCreationTime)