GTSAM  4.0.2
C++ library for smoothing and mapping (SAM)
RotateFactor.h
1 /*
2  * @file RotateFactor.cpp
3  * @brief RotateFactor class
4  * @author Frank Dellaert
5  * @date December 17, 2013
6  */
7 
8 #pragma once
9 
11 #include <gtsam/geometry/Rot3.h>
12 
13 namespace gtsam {
14 
23 class RotateFactor: public NoiseModelFactorN<Rot3> {
24 
25  Point3 p_, z_;
26 
28  typedef RotateFactor This;
29 
30 public:
31 
32  // Provide access to the Matrix& version of evaluateError:
33  using Base::evaluateError;
34 
36  RotateFactor(Key key, const Rot3& P, const Rot3& Z,
37  const SharedNoiseModel& model) :
38  Base(model, key), p_(Rot3::Logmap(P)), z_(Rot3::Logmap(Z)) {
39  }
40 
42  gtsam::NonlinearFactor::shared_ptr clone() const override {
43  return std::static_pointer_cast<gtsam::NonlinearFactor>(
44  gtsam::NonlinearFactor::shared_ptr(new This(*this))); }
45 
47  void print(const std::string& s = "",
48  const KeyFormatter& keyFormatter = DefaultKeyFormatter) const override {
49  Base::print(s);
50  std::cout << "RotateFactor:]\n";
51  std::cout << "p: " << p_.transpose() << std::endl;
52  std::cout << "z: " << z_.transpose() << std::endl;
53  }
54 
56  Vector evaluateError(const Rot3& R, OptionalMatrixType H) const override {
57  // predict p_ as q = R*z_, derivative H will be filled if not none
58  Point3 q = R.rotate(z_,H);
59  // error is just difference, and note derivative of that wrpt q is I3
60  return (Vector(3) << q.x()-p_.x(), q.y()-p_.y(), q.z()-p_.z()).finished();
61  }
62 
63 };
64 
70 
71  Unit3 i_p_, c_z_;
72 
75 
76 public:
77 
78  // Provide access to the Matrix& version of evaluateError:
79  using Base::evaluateError;
80 
82  RotateDirectionsFactor(Key key, const Unit3& i_p, const Unit3& c_z,
83  const SharedNoiseModel& model) :
84  Base(model, key), i_p_(i_p), c_z_(c_z) {
85  }
86 
88  static Rot3 Initialize(const Unit3& i_p, const Unit3& c_z) {
89  gtsam::Quaternion iRc;
90  // setFromTwoVectors sets iRc to (a) quaternion which transform c_z into i_p
91  iRc.setFromTwoVectors(c_z.unitVector(), i_p.unitVector());
92  return Rot3(iRc);
93  }
94 
96  gtsam::NonlinearFactor::shared_ptr clone() const override {
97  return std::static_pointer_cast<gtsam::NonlinearFactor>(
98  gtsam::NonlinearFactor::shared_ptr(new This(*this))); }
99 
101  void print(const std::string& s = "",
102  const KeyFormatter& keyFormatter = DefaultKeyFormatter) const override {
103  Base::print(s);
104  std::cout << "RotateDirectionsFactor:" << std::endl;
105  i_p_.print("p");
106  c_z_.print("z");
107  }
108 
110  Vector evaluateError(const Rot3& iRc, OptionalMatrixType H) const override {
111  Unit3 i_q = iRc * c_z_;
112  Vector error = i_p_.error(i_q, H);
113  if (H) {
114  Matrix DR;
115  iRc.rotate(c_z_, DR);
116  *H = (*H) * DR;
117  }
118  return error;
119  }
120 
122 };
123 } // namespace gtsam
124 
Definition: NonlinearFactor.h:431
double error(const Values &c) const override
Definition: RotateFactor.h:23
RotateDirectionsFactor(Key key, const Unit3 &i_p, const Unit3 &c_z, const SharedNoiseModel &model)
Constructor.
Definition: RotateFactor.h:82
Definition: Factor.h:69
virtual Vector evaluateError(const ValueTypes &... x, OptionalMatrixTypeT< ValueTypes >... H) const=0
Vector3 unitVector(OptionalJacobian< 3, 2 > H={}) const
Return unit-norm Vector.
Key key() const
Definition: NonlinearFactor.h:582
Definition: NonlinearFactor.h:68
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition: RotateFactor.h:101
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition: RotateFactor.h:42
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition: RotateFactor.h:96
Rot3 is a 3D rotation represented as a rotation matrix if the preprocessor symbol GTSAM_USE_QUATERNIO...
Definition: Rot3.h:58
RotateFactor(Key key, const Rot3 &P, const Rot3 &Z, const SharedNoiseModel &model)
Constructor.
Definition: RotateFactor.h:36
Represents a 3D point on a unit sphere.
Definition: Unit3.h:42
void print(const std::string &s=std::string()) const
The print fuction.
Matrix * OptionalMatrixType
Definition: NonlinearFactor.h:55
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
print
Definition: RotateFactor.h:47
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
Definition: chartTesting.h:28
Vector evaluateError(const Rot3 &R, OptionalMatrixType H) const override
vector of errors returns 2D vector
Definition: RotateFactor.h:56
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Non-linear factor base classes.
#define GTSAM_MAKE_ALIGNED_OPERATOR_NEW
Definition: types.h:284
Vector3 Point3
Definition: Point3.h:38
Vector2 error(const Unit3 &q, OptionalJacobian< 2, 2 > H_q={}) const
Vector evaluateError(const Rot3 &iRc, OptionalMatrixType H) const override
vector of errors returns 2D vector
Definition: RotateFactor.h:110
Point3 rotate(const Point3 &p, OptionalJacobian< 3, 3 > H1={}, OptionalJacobian< 3, 3 > H2={}) const
Definition: RotateFactor.h:69
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
static Rot3 Initialize(const Unit3 &i_p, const Unit3 &c_z)
Initialize rotation iRc such that i_p = iRc * c_z.
Definition: RotateFactor.h:88
noiseModel::Base::shared_ptr SharedNoiseModel
Definition: NoiseModel.h:741
3D rotation represented as a rotation matrix or quaternion