My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
GmsfUnaryExpressionAbsolutePose3.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_POSE3_H
9#define GMSF_UNARY_EXPRESSION_POSE3_H
10
11// GTSAM
12#include <gtsam/base/types.h>
13#include <gtsam/inference/Symbol.h>
14#include <gtsam/slam/expressions.h>
15
16// Workspace
19
20namespace holistic_fusion {
21
23
24class GmsfUnaryExpressionAbsolutePose3 final : public GmsfUnaryExpressionAbsolut<gtsam::Pose3, 'c'> {
25 public:
26 // Constructor
27 GmsfUnaryExpressionAbsolutePose3(const std::shared_ptr<GMSF_MEASUREMENT_CLASS> poseUnaryMeasurementPtr, const std::string& imuFrameName,
28 const Eigen::Isometry3d& T_I_sensorFrame, const double createReferenceAlignmentKeyframeEveryNSeconds)
29 : GmsfUnaryExpressionAbsolut(poseUnaryMeasurementPtr, imuFrameName, T_I_sensorFrame, createReferenceAlignmentKeyframeEveryNSeconds),
30 gmsfPoseUnaryMeasurementPtr_(poseUnaryMeasurementPtr),
31 exp_T_fixedFrame_sensorFrame_(gtsam::Pose3::Identity()) // Placeholder --> will be modified later
32 {}
33
34 // Destructor
36
37 // Return Measurement as GTSAM Datatype
38 [[nodiscard]] const gtsam::Pose3 getGtsamMeasurementValue() const final {
39 return gtsam::Pose3(gmsfPoseUnaryMeasurementPtr_->unaryMeasurement().matrix());
40 }
41
42 // Noise as GTSAM Datatype
43 [[nodiscard]] const gtsam::Vector getNoiseDensity() const final { return gmsfPoseUnaryMeasurementPtr_->unaryMeasurementNoiseDensity(); }
44
45 protected:
46 // i) Generate Expression for Basic IMU State in World Frame at Key -------------------------------------
47 void generateImuStateInWorldFrameAtKey(const gtsam::Key& closestGeneralKey) final {
48 exp_T_fixedFrame_sensorFrame_ = gtsam::Expression<gtsam::Pose3>(gtsam::symbol_shorthand::X(closestGeneralKey)); // T_W_I at this point
49 }
50
51 // Interface with three cases (non-exclusive):
52 // ii) holistically optimize over fixed frames --> All methods needed for this -------------------------------------
53 gtsam::Pose3 computeT_W_fixedFrame_initial(const gtsam::NavState& W_currentPropagatedState) final {
54 const Eigen::Matrix4d& T_W_I_est = W_currentPropagatedState.pose().matrix();
55 const Eigen::Isometry3d& T_fixedFrame_sensorFrame_meas = gmsfPoseUnaryMeasurementPtr_->unaryMeasurement();
56 return gtsam::Pose3(T_W_I_est * T_I_sensorFrameInit_ * T_fixedFrame_sensorFrame_meas.inverse().matrix());
57 }
58
59 bool measuresPosition() const final { return true; }
60
61 const Eigen::Vector3d getMeasurementPosition() final {
62 // Get Measurement
63 return gmsfPoseUnaryMeasurementPtr_->unaryMeasurement().translation();
64 }
65
66 void setMeasurementPosition(const Eigen::Vector3d& position) final {
67 // Set Measurement
68 gmsfPoseUnaryMeasurementPtr_->unaryMeasurement().translation() = position;
69 }
70
71 void transformStateToReferenceFrameMeasurement(const gtsam::Pose3_& exp_T_W_fixedFrame) override {
72 // Transform state to fixed frame
73 // Following: T_fixedFrame_I = T_fixedFrame_W * T_W_I --> transformPoseTo is including the inverse
74 exp_T_fixedFrame_sensorFrame_ = transformPoseTo(exp_T_W_fixedFrame, exp_T_fixedFrame_sensorFrame_); // T_fixedFrame_imu at this point
75 }
76
77 // iii) transform estimate to sensor frame --------------------------------------------------------------
82
83 // iv) extrinsic calibration correction --------------------------------------------------------------
84 void applyExtrinsicCalibrationCorrection(const gtsam::Pose3_& expt_T_sensorFrame_sensorFrameCorrect) final {
85 // Apply calibration correction
87 exp_T_fixedFrame_sensorFrame_ * expt_T_sensorFrame_sensorFrameCorrect; // T_fixedFrame_sensorFrameCorrected
88 }
89
90 gtsam::Pose3 convertToPose3(const gtsam::Pose3& measurement) final { return measurement; }
91
92 gtsam::Pose3 convertFromPose3(const gtsam::Pose3& measurement) final { return measurement; }
93
94 // Return Expression
95 [[nodiscard]] const gtsam::Expression<gtsam::Pose3> getGtsamExpression() const final { return exp_T_fixedFrame_sensorFrame_; }
96
97 private:
98 // Members
99 std::shared_ptr<GMSF_MEASUREMENT_CLASS> gmsfPoseUnaryMeasurementPtr_;
100
101 // Expression
102 gtsam::Expression<gtsam::Pose3> exp_T_fixedFrame_sensorFrame_;
103};
104} // namespace holistic_fusion
105
106#endif // GMSF_UNARY_EXPRESSION_POSE3_H
GmsfUnaryExpressionAbsolut(const std::shared_ptr< UnaryMeasurementAbsolute > &gmsfUnaryAbsoluteMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame, const double createReferenceAlignmentKeyframeEveryNSeconds)
std::shared_ptr< GMSF_MEASUREMENT_CLASS > gmsfPoseUnaryMeasurementPtr_
gtsam::Pose3 computeT_W_fixedFrame_initial(const gtsam::NavState &W_currentPropagatedState) final
void setMeasurementPosition(const Eigen::Vector3d &position) final
void applyExtrinsicCalibrationCorrection(const gtsam::Pose3_ &expt_T_sensorFrame_sensorFrameCorrect) final
gtsam::Pose3 convertToPose3(const gtsam::Pose3 &measurement) final
GmsfUnaryExpressionAbsolutePose3(const std::shared_ptr< GMSF_MEASUREMENT_CLASS > poseUnaryMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame, const double createReferenceAlignmentKeyframeEveryNSeconds)
gtsam::Pose3 convertFromPose3(const gtsam::Pose3 &measurement) final
void transformStateToReferenceFrameMeasurement(const gtsam::Pose3_ &exp_T_W_fixedFrame) override
const gtsam::Expression< gtsam::Pose3 > getGtsamExpression() const final
void generateImuStateInWorldFrameAtKey(const gtsam::Key &closestGeneralKey) final
Class to represent x-dimensional absolute unary measurement in the graph.
UnaryMeasurementXDAbsolute< Eigen::Isometry3d, 6 > GMSF_MEASUREMENT_CLASS
gtsam::Pose3_ composeRigidTransformations(const gtsam::Pose3_ &T_frame1_frame2, const gtsam::Pose3_ &T_frame2_frame3)