14 #include <gtsam/base/std_optional_serialization.h> 15 #include <gtsam/geometry/concepts.h> 35 using Point =
typename POSE::Translation;
36 using Rot =
typename POSE::Rotation;
38 const Point measured_;
41 std::optional<POSE> body_P_sensor_;
43 static const int MeasDim = Point::RowsAtCompileTime;
48 using shared_ptr = std::shared_ptr<MagPoseFactor<POSE>>;
51 GTSAM_CONCEPT_TESTABLE_TYPE(POSE)
52 GTSAM_CONCEPT_POSE_TYPE(POSE)
75 const Point& measured,
77 const Point& direction,
80 const std::optional<POSE>& body_P_sensor)
81 :
Base(model, pose_key),
82 measured_(body_P_sensor ? body_P_sensor->rotation() * measured : measured),
83 nM_(scale * direction.normalized()),
84 bias_(body_P_sensor ? body_P_sensor->rotation() * bias : bias),
85 body_P_sensor_(body_P_sensor) {}
88 NonlinearFactor::shared_ptr
clone()
const override {
90 NonlinearFactor::shared_ptr(
new This(*
this)));
96 void print(
const std::string& s =
"",
const KeyFormatter& keyFormatter = DefaultKeyFormatter)
const override {
99 gtsam::print(Vector(measured_),
"measured field (bM): ");
105 const This *e =
dynamic_cast<const This*
> (&expected);
121 Matrix H_rot = Matrix::Zero(MeasDim, RotDim);
122 const Point hx = nPb.rotation().unrotate(nM_, H_rot,
OptionalNone) + bias_;
126 *H = Matrix::Zero(MeasDim, PoseDim);
127 const size_t rot_col0 = nPb.rotationInterval().first;
128 (*H).block(0, rot_col0, MeasDim, RotDim) = H_rot;
131 return (hx - measured_);
135 #ifdef GTSAM_ENABLE_BOOST_SERIALIZATION 136 friend class boost::serialization::access; 138 template<
class ARCHIVE>
139 void serialize(ARCHIVE & ar,
const unsigned int ) {
141 ar & boost::serialization::make_nvp(
"NoiseModelFactor1",
142 boost::serialization::base_object<Base>(*
this));
143 ar & BOOST_SERIALIZATION_NVP(measured_);
144 ar & BOOST_SERIALIZATION_NVP(nM_);
145 ar & BOOST_SERIALIZATION_NVP(bias_);
146 ar & BOOST_SERIALIZATION_NVP(body_P_sensor_);
Definition: MagPoseFactor.h:31
Definition: NonlinearFactor.h:431
bool equals(const NonlinearFactor &f, double tol=1e-9) const override
std::string serialize(const T &input)
serializes to a string
Definition: serialization.h:113
virtual Vector evaluateError(const ValueTypes &... x, OptionalMatrixTypeT< ValueTypes >... H) const=0
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Implement functions needed for Testable.
Definition: MagPoseFactor.h:96
Definition: NonlinearFactor.h:68
Vector evaluateError(const POSE &nPb, OptionalMatrixType H) const override
Implement functions needed to derive from Factor.
Definition: MagPoseFactor.h:118
#define OptionalNone
Definition: NonlinearFactor.h:49
Matrix * OptionalMatrixType
Definition: NonlinearFactor.h:55
GTSAM_EXPORT void print(const Matrix &A, const std::string &s, std::ostream &stream)
MagPoseFactor(Key pose_key, const Point &measured, double scale, const Point &direction, const Point &bias, const SharedNoiseModel &model, const std::optional< POSE > &body_P_sensor)
Definition: MagPoseFactor.h:74
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: Key.h:35
bool equal_with_abs_tol(const Eigen::DenseBase< MATRIX > &A, const Eigen::DenseBase< MATRIX > &B, double tol=1e-9)
Definition: Matrix.h:80
Definition: chartTesting.h:28
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
NonlinearFactor::shared_ptr clone() const override
Definition: MagPoseFactor.h:88
Non-linear factor base classes.
MagPoseFactor()
Default constructor - only use for serialization.
Definition: MagPoseFactor.h:62
bool equals(const NonlinearFactor &expected, double tol=1e-9) const override
Equals function.
Definition: MagPoseFactor.h:104
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
noiseModel::Base::shared_ptr SharedNoiseModel
Definition: NoiseModel.h:741