My Project 1.0
Holistic Fusion: A Generic Framework for Multimodal Sensor Fusion
Loading...
Searching...
No Matches
GmsfUnaryExpressionLandmarkPosition3.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_POSITION3_LANDMARK_H
9#define GMSF_UNARY_EXPRESSION_POSITION3_LANDMARK_H
10
11// GTSAM
12#include <gtsam/base/types.h>
13#include <gtsam/inference/Symbol.h>
14#include <gtsam/slam/expressions.h>
15#include "gtsam/navigation/NavState.h"
16
17// Workspace
20
21namespace holistic_fusion {
22
23class GmsfUnaryExpressionLandmarkPosition3 final : public GmsfUnaryExpressionLandmark<gtsam::Point3, 'd'> {
24 public:
25 // Constructor
27 const std::shared_ptr<UnaryMeasurementXDLandmark<Eigen::Vector3d, 3>>& positionXDLandmarkMeasurementPtr,
28 const std::string& imuFrameName, const Eigen::Isometry3d& T_I_sensorFrame, const int landmarkCreationCounter)
29 : GmsfUnaryExpressionLandmark(positionXDLandmarkMeasurementPtr, imuFrameName, T_I_sensorFrame, landmarkCreationCounter),
30 positionXDLandmarkMeasurementPtr_(positionXDLandmarkMeasurementPtr) {}
31
32 // Destructor
34
35 // Noise as GTSAM Datatype
36 [[nodiscard]] const gtsam::Vector getNoiseDensity() const override {
37 return positionXDLandmarkMeasurementPtr_->unaryMeasurementNoiseDensity();
38 }
39
40 // Return Measurement as GTSAM Datatype
41 [[nodiscard]] const gtsam::Point3 getGtsamMeasurementValue() const override {
42 return gtsam::Point3(positionXDLandmarkMeasurementPtr_->unaryMeasurement().matrix());
43 }
44
45 protected:
46 // ii.B) Adding Landmark State in Dynamic Memory
47 virtual gtsam::Point3 computeW_t_W_L_initial(const gtsam::NavState& W_currentPropagatedState) final {
48 // Get initial guess (computed geometrically)
49 const gtsam::Pose3& T_W_I_est = W_currentPropagatedState.pose(); // alias
50 const gtsam::Point3& S_t_S_L_meas = gtsam::Point3(positionXDLandmarkMeasurementPtr_->unaryMeasurement()); // alias
51 const gtsam::Pose3 T_W_S_est = T_W_I_est * gtsam::Pose3(T_I_sensorFrameInit_.matrix());
52 const gtsam::Point3 W_t_W_S_est = T_W_S_est.translation();
53 const gtsam::Point3 W_t_S_L_meas = T_W_S_est.rotation().rotate(S_t_S_L_meas);
54 return W_t_W_S_est + W_t_S_L_meas;
55 }
56
57 // iii) Transform state to sensor frame
59 // Gtsam Data Type
60 const gtsam::Pose3 T_sensorFrame_I(T_I_sensorFrameInit_.inverse().matrix());
61
62 // Transform to Sensor Frame
64 gtsam::transformFrom(gtsam::Pose3_(T_sensorFrame_I), exp_sensorFrame_t_sensorFrame_landmark_); // S_t_S_L at this point
65 }
66
67 // iv) Extrinsic Calibration
68 void applyExtrinsicCalibrationCorrection(const gtsam::Point3_&) final {
69 // TODO: Implement
70 // REGULAR_COUT << RED_START << "GmsfUnaryExpressionLandmarkPosition3: Extrinsic Calibration not implemented yet." << COLOR_END
71 // << std::endl;
72 }
73
74 gtsam::Pose3 convertToPose3(const gtsam::Point3& measurement) final { return gtsam::Pose3(gtsam::Rot3::Identity(), measurement); }
75
76 gtsam::Point3 convertFromPose3(const gtsam::Pose3& pose) final { return pose.translation(); }
77
78 // Return Expression
79 [[nodiscard]] const gtsam::Expression<gtsam::Point3> getGtsamExpression() const override {
81 }
82
83 private:
84 // Full Measurement Type
85 std::shared_ptr<UnaryMeasurementXDLandmark<Eigen::Vector3d, 3>> positionXDLandmarkMeasurementPtr_;
86};
87} // namespace holistic_fusion
88
89#endif // GMSF_UNARY_EXPRESSION_POSITION3_LANDMARK_H
virtual gtsam::Point3 computeW_t_W_L_initial(const gtsam::NavState &W_currentPropagatedState) final
const gtsam::Expression< gtsam::Point3 > getGtsamExpression() const override
GmsfUnaryExpressionLandmarkPosition3(const std::shared_ptr< UnaryMeasurementXDLandmark< Eigen::Vector3d, 3 > > &positionXDLandmarkMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame, const int landmarkCreationCounter)
gtsam::Pose3 convertToPose3(const gtsam::Point3 &measurement) final
std::shared_ptr< UnaryMeasurementXDLandmark< Eigen::Vector3d, 3 > > positionXDLandmarkMeasurementPtr_
GmsfUnaryExpressionLandmark(const std::shared_ptr< UnaryMeasurementLandmark > &gmsfUnaryLandmarkMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame, const long landmarkCreationCounter)
Class to represent x-dimensional landmark unary measurement in the graph.