/** * @file planarSLAM.h * @brief: bearing/range measurements in 2D plane * @authors Frank Dellaert **/ #pragma once #include "Key.h" #include "Pose2.h" #include "Point2.h" #include "NonlinearFactor.h" #include "TupleConfig.h" #include "NonlinearEquality.h" #include "BetweenFactor.h" #include "NonlinearFactorGraph.h" #include "NonlinearOptimizer.h" // We use gtsam namespace for generally useful factors namespace gtsam { /** * Binary factor for a bearing measurement */ template class BearingFactor: public NonlinearFactor2 { private: Rot2 z_; /** measurement */ typedef NonlinearFactor2 Base; public: BearingFactor(); /* Default constructor */ BearingFactor(const PoseKey& i, const PointKey& j, const Rot2& z, const SharedGaussian& model) : Base(model, i, j), z_(z) { } /** h(x)-z -> between(z,h(x)) for Rot2 manifold */ Vector evaluateError(const Pose2& pose, const Point2& point, boost::optional H1, boost::optional H2) const { Rot2 hx = bearing(pose, point, H1, H2); return logmap(between(z_, hx)); } }; // BearingFactor /** * Binary factor for a range measurement */ template class RangeFactor: public NonlinearFactor2 { private: double z_; /** measurement */ typedef NonlinearFactor2 Base; public: RangeFactor(); /* Default constructor */ RangeFactor(const PoseKey& i, const PointKey& j, double z, const SharedGaussian& model) : Base(model, i, j), z_(z) { } /** h(x)-z */ Vector evaluateError(const Pose2& pose, const Point2& point, boost::optional H1, boost::optional H2) const { double hx = gtsam::range(pose, point, H1, H2); return Vector_(1, hx - z_); } }; // RangeFactor // Use planarSLAM namespace for specific SLAM instance namespace planarSLAM { // Keys and Config typedef TypedSymbol PoseKey; typedef TypedSymbol PointKey; typedef PairConfig Config; // Factors typedef NonlinearEquality Constraint; typedef BetweenFactor Odometry; typedef BearingFactor Bearing; typedef RangeFactor Range; // Graph struct Graph: public NonlinearFactorGraph { void addPoseConstraint(const PoseKey& i, const Pose2& p); void addOdometry(const PoseKey& i, const PoseKey& j, const Pose2& z, const SharedGaussian& model); void addBearing(const PoseKey& i, const PointKey& j, const Rot2& z, const SharedGaussian& model); void addRange(const PoseKey& i, const PointKey& j, double z, const SharedGaussian& model); }; // Optimizer typedef NonlinearOptimizer Optimizer; } // planarSLAM } // namespace gtsam