8#ifndef GMSF_UNARY_EXPRESSION_H
9#define GMSF_UNARY_EXPRESSION_H
15#include <gtsam/base/types.h>
16#include <gtsam/linear/NoiseModel.h>
17#include <gtsam/navigation/NavState.h>
18#include <gtsam/nonlinear/expressions.h>
19#include <gtsam/slam/BetweenFactor.h>
20#include <gtsam/slam/PriorFactor.h>
32 return gtsam::Pose3_(T_frame1_frame2, >sam::Pose3::transformPoseFrom, T_frame2_frame3);
37 return gtsam::Rot3_(>sam::LieGroup<gtsam::Rot3, 3>::inverse, R);
50template <
class GTSAM_MEASUREMENT_TYPE, UnaryExpressionType TYPE,
char CALIBRATION_CHAR>
57 GmsfUnaryExpression(
const std::shared_ptr<UnaryMeasurement>& gmsfBaseUnaryMeasurementPtr,
const std::string& imuFrameName,
58 const Eigen::Isometry3d& T_I_sensorFrame)
67 const gtsam::NavState& W_imuPropagatedState,
68 const bool optimizeReferenceFramePosesWrtWorldFlag,
69 const bool centerMeasurementsAtKeyframePositionBeforeAlignmentFlag,
70 const bool optimizeExtrinsicSensorToSensorCorrectedOffsetFlag) {
79 if (optimizeReferenceFramePosesWrtWorldFlag) {
81 centerMeasurementsAtKeyframePositionBeforeAlignmentFlag);
91 if (gmsfUnaryMeasurement.sensorFrameName() !=
imuFrame_) {
96 if (optimizeExtrinsicSensorToSensorCorrectedOffsetFlag) {
143 const gtsam::NavState& W_currentPropagatedState,
144 const bool centerMeasurementsAtKeyframePositionBeforeAlignmentFlag) = 0;
148 const gtsam::NavState& W_currentPropagatedState) = 0;
156 std::lock_guard<std::mutex> modifyGraphKeysLock(gtsamDynamicExpressionKeys.
get<gtsam::Pose3>().mutex());
159 GTSAM_MEASUREMENT_TYPE initialGuess = GTSAM_MEASUREMENT_TYPE::Identity();
162 bool newGraphKeyAddedFlag =
false;
169 gtsam::Expression<GTSAM_MEASUREMENT_TYPE> exp_C_sensorFrame_sensorFrameCorrected(graphKey.
key());
175 if (newGraphKeyAddedFlag) {
193 <<
" was inactive. Activating it again and adding a prior to the online graph." << std::endl;
198 GTSAM_MEASUREMENT_TYPE priorBeliefConverted =
convertFromPose3(priorBelief);
199 gtsam::Matrix priorCovarianceConverted = priorCovariance.bottomRightCorner<6, 6>();
202 gtsam::noiseModel::Gaussian::Covariance(priorCovarianceConverted));
213 <<
" is deactivated but was never optimized. Hence, Removing it from the graph." << std::endl;
218 keyToRemoveOrDeactivate);
223 const gtsam::Expression<GTSAM_MEASUREMENT_TYPE>& exp_C_sensorFrame_sensorFrameCorrected) = 0;
227 virtual gtsam::Pose3
convertToPose3(
const GTSAM_MEASUREMENT_TYPE& measurement) = 0;
DynamicTransformDictionary< GTSAM_DYNAMIC_STATE_TYPE > & get()
void activateVariable()
Status.
int getNumberStepsOptimized() const
const gtsam::Key key() const
const gtsam::Matrix66 & getCovarianceAfterOptimization() const
const GTSAM_TRANSFORM_TYPE & getTransformationAfterOptimization() const
bool isVariableActive() const
void resetNumberStepsOptimized()
const std::shared_ptr< UnaryMeasurement > gmsfBaseUnaryMeasurementPtr_
gtsam::Values newOnlineStateValues_
virtual void transformImuStateToSensorFrameState()=0
gtsam::Values newOfflineStateValues_
const std::vector< gtsam::BetweenFactor< gtsam::Pose3 > > & getNewOnlineAndOfflinePoseBetweenFactors() const
const gtsam::Values & getNewOfflineGraphStateValues() const
virtual void transformLandmarkInWorldToImuFrame(DynamicDictionaryContainer >samDynamicExpressionKeys, const gtsam::NavState &W_currentPropagatedState)=0
virtual const gtsam::Vector getNoiseDensity() const =0
const std::string imuFrame_
virtual void transformImuStateFromWorldToReferenceFrame(DynamicDictionaryContainer >samDynamicExpressionKeys, const gtsam::NavState &W_currentPropagatedState, const bool centerMeasurementsAtKeyframePositionBeforeAlignmentFlag)=0
virtual void applyExtrinsicCalibrationCorrection(const gtsam::Expression< GTSAM_MEASUREMENT_TYPE > &exp_C_sensorFrame_sensorFrameCorrected)=0
std::vector< gtsam::BetweenFactor< gtsam::Pose3 > > newOnlineAndOfflinePoseBetweenFactors_
virtual GTSAM_MEASUREMENT_TYPE convertFromPose3(const gtsam::Pose3 &pose)=0
double getTimestamp() const
virtual gtsam::Pose3 convertToPose3(const GTSAM_MEASUREMENT_TYPE &measurement)=0
GTSAM_MEASUREMENT_TYPE template_type
virtual void generateImuStateInWorldFrameAtKey(const gtsam::Key &closestGeneralKey)=0
GmsfUnaryExpression(const std::shared_ptr< UnaryMeasurement > &gmsfBaseUnaryMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame)
const std::vector< gtsam::PriorFactor< gtsam::Pose3 > > & getNewOnlinePosePriorFactors() const
const std::vector< gtsam::PriorFactor< GTSAM_MEASUREMENT_TYPE > > & getNewOnlineDynamicPriorFactors() const
virtual const GTSAM_MEASUREMENT_TYPE getGtsamMeasurementValue() const =0
std::vector< gtsam::PriorFactor< GTSAM_MEASUREMENT_TYPE > > newOnlineDynamicPriorFactors_
Eigen::Isometry3d T_I_sensorFrameInit_
const gtsam::Values & getNewOnlineGraphStateValues() const
~GmsfUnaryExpression()=default
virtual void transformSensorFrameStateToSensorFrameCorrectedState(DynamicDictionaryContainer >samDynamicExpressionKeys)
virtual const std::shared_ptr< UnaryMeasurement > & getGmsfBaseUnaryMeasurementPtr()
virtual const gtsam::Expression< GTSAM_MEASUREMENT_TYPE > getGtsamExpression() const =0
const Eigen::Isometry3d & getT_I_sensorFrameInit() const
gtsam::Expression< GTSAM_MEASUREMENT_TYPE > createAndReturnExpression(const gtsam::Key &closestGeneralKey, DynamicDictionaryContainer >samDynamicExpressionKeys, const gtsam::NavState &W_imuPropagatedState, const bool optimizeReferenceFramePosesWrtWorldFlag, const bool centerMeasurementsAtKeyframePositionBeforeAlignmentFlag, const bool optimizeExtrinsicSensorToSensorCorrectedOffsetFlag)
std::vector< gtsam::PriorFactor< gtsam::Pose3 > > newOnlinePosePriorFactors_
gtsam::Rot3_ inverseRot3(const gtsam::Rot3_ &R)
gtsam::Pose3_ composeRigidTransformations(const gtsam::Pose3_ &T_frame1_frame2, const gtsam::Pose3_ &T_frame2_frame3)
static DynamicVariableType Global(const double variableCreationTime)