8#ifndef GMSF_UNARY_EXPRESSION_ABSOLUTE_HEADING_H
9#define GMSF_UNARY_EXPRESSION_ABSOLUTE_HEADING_H
15#include <gtsam/base/OptionalJacobian.h>
16#include <gtsam/geometry/Rot2.h>
17#include <gtsam/geometry/Rot3.h>
18#include <gtsam/inference/Symbol.h>
19#include <gtsam/slam/expressions.h>
31 const gtsam::Vector3 rotationVector = gtsam::Rot3::Logmap(R_W_Wmeas, H ? &H_log :
nullptr);
35 return gtsam::Rot2::fromAngle(rotationVector.z());
40inline gtsam::Expression<gtsam::Rot2>
headingInWorld(
const gtsam::Rot3_& exp_R_W_S,
const gtsam::Rot3_& exp_R_W_M,
41 const gtsam::Rot3& R_M_Smeas) {
42 const gtsam::Rot3_ exp_R_W_Wmeas = exp_R_W_S * gtsam::Rot3_(R_M_Smeas.inverse()) *
inverseRot3(exp_R_W_M);
57 const std::string& imuFrameName,
const Eigen::Isometry3d& T_I_sensorFrame,
58 const double createReferenceAlignmentKeyframeEveryNSeconds)
60 createReferenceAlignmentKeyframeEveryNSeconds),
77 exp_R_W_S_ = gtsam::rotation(gtsam::Expression<gtsam::Pose3>(gtsam::symbol_shorthand::X(closestGeneralKey)));
89 throw std::logic_error(
"GmsfUnaryExpressionAbsoluteHeading: a heading measurement has no position.");
102 throw std::logic_error(
"GmsfUnaryExpressionAbsoluteHeading: extrinsic calibration is not supported for heading measurements.");
106 throw std::logic_error(
"GmsfUnaryExpressionAbsoluteHeading: extrinsic calibration is not supported for heading measurements.");
111 throw std::logic_error(
"GmsfUnaryExpressionAbsoluteHeading: extrinsic calibration is not supported for heading measurements.");
115 throw std::logic_error(
"GmsfUnaryExpressionAbsoluteHeading: extrinsic calibration is not supported for heading measurements.");
GmsfUnaryExpressionAbsolut(const std::shared_ptr< UnaryMeasurementAbsolute > &gmsfUnaryAbsoluteMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame, const double createReferenceAlignmentKeyframeEveryNSeconds)
GmsfUnaryExpressionAbsoluteHeading(const std::shared_ptr< UnaryMeasurementXDAbsolute< Eigen::Matrix3d, 1 > > &headingUnaryMeasurementPtr, const std::string &imuFrameName, const Eigen::Isometry3d &T_I_sensorFrame, const double createReferenceAlignmentKeyframeEveryNSeconds)
std::shared_ptr< UnaryMeasurementXDAbsolute< Eigen::Matrix3d, 1 > > headingUnaryMeasurementPtr_
void setMeasurementPosition(const Eigen::Vector3d &) final
gtsam::Pose3 convertToPose3(const gtsam::Rot2 &) final
gtsam::Expression< gtsam::Rot3 > exp_R_W_S_
void transformImuStateToSensorFrameState() final
gtsam::Expression< gtsam::Rot3 > exp_R_W_fixedFrame_
void applyExtrinsicCalibrationCorrection(const gtsam::Expression< gtsam::Rot2 > &) final
void transformSensorFrameStateToSensorFrameCorrectedState(DynamicDictionaryContainer &) final
void generateImuStateInWorldFrameAtKey(const gtsam::Key &closestGeneralKey) final
~GmsfUnaryExpressionAbsoluteHeading()=default
void transformStateToReferenceFrameMeasurement(const gtsam::Pose3_ &exp_T_W_fixedFrame) override
const gtsam::Vector getNoiseDensity() const override
const gtsam::Rot2 getGtsamMeasurementValue() const override
const Eigen::Vector3d getMeasurementPosition() final
gtsam::Rot2 convertFromPose3(const gtsam::Pose3 &) final
gtsam::Pose3 computeT_W_fixedFrame_initial(const gtsam::NavState &) final
const gtsam::Expression< gtsam::Rot2 > getGtsamExpression() const override
bool measuresPosition() const final
Eigen::Isometry3d T_I_sensorFrameInit_
Class to represent x-dimensional absolute unary measurement in the graph.
gtsam::Rot3_ inverseRot3(const gtsam::Rot3_ &R)
gtsam::Rot2 worldRotationErrorAsHeadingError(const gtsam::Rot3 &R_W_Wmeas, gtsam::OptionalJacobian< 1, 3 > H)
gtsam::Expression< gtsam::Rot2 > headingInWorld(const gtsam::Rot3_ &exp_R_W_S, const gtsam::Rot3_ &exp_R_W_M, const gtsam::Rot3 &R_M_Smeas)