gtsam  4.0.0
gtsam
RangeFactor.h
1 /* ----------------------------------------------------------------------------
2 
3  * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4  * Atlanta, Georgia 30332-0415
5  * All Rights Reserved
6  * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7 
8  * See LICENSE for the license information
9 
10  * -------------------------------------------------------------------------- */
11 
19 #pragma once
20 
21 #include <gtsam/nonlinear/ExpressionFactor.h>
22 
23 namespace gtsam {
24 
25 // forward declaration of Range functor, assumed partially specified
26 template <typename A1, typename A2>
27 struct Range;
28 
34 template <typename A1, typename A2 = A1, typename T = double>
35 class RangeFactor : public ExpressionFactor2<T, A1, A2> {
36  private:
37  typedef RangeFactor<A1, A2> This;
39 
40  public:
43 
44  RangeFactor(Key key1, Key key2, T measured, const SharedNoiseModel& model)
45  : Base(key1, key2, model, measured) {
46  this->initialize(expression(key1, key2));
47  }
48 
50  virtual gtsam::NonlinearFactor::shared_ptr clone() const {
51  return boost::static_pointer_cast<gtsam::NonlinearFactor>(
52  gtsam::NonlinearFactor::shared_ptr(new This(*this)));
53  }
54 
55  // Return measurement expression
56  virtual Expression<T> expression(Key key1, Key key2) const {
57  Expression<A1> a1_(key1);
58  Expression<A2> a2_(key2);
59  return Expression<T>(Range<A1, A2>(), a1_, a2_);
60  }
61 
63  void print(const std::string& s = "",
64  const KeyFormatter& kf = DefaultKeyFormatter) const {
65  std::cout << s << "RangeFactor" << std::endl;
66  Base::print(s, kf);
67  }
68 
69  private:
70  friend class boost::serialization::access;
71  template <class ARCHIVE>
72  void serialize(ARCHIVE& ar, const unsigned int /*version*/) {
73  ar& boost::serialization::make_nvp(
74  "Base", boost::serialization::base_object<Base>(*this));
75  }
76 }; // \ RangeFactor
77 
79 template <typename A1, typename A2, typename T>
80 struct traits<RangeFactor<A1, A2, T> >
81  : public Testable<RangeFactor<A1, A2, T> > {};
82 
87 template <typename A1, typename A2 = A1,
88  typename T = typename Range<A1, A2>::result_type>
89 class RangeFactorWithTransform : public ExpressionFactor2<T, A1, A2> {
90  private:
93 
94  A1 body_T_sensor_;
95 
96  public:
99 
101  const SharedNoiseModel& model,
102  const A1& body_T_sensor)
103  : Base(key1, key2, model, measured), body_T_sensor_(body_T_sensor) {
104  this->initialize(expression(key1, key2));
105  }
106 
107  virtual ~RangeFactorWithTransform() {}
108 
110  virtual gtsam::NonlinearFactor::shared_ptr clone() const {
111  return boost::static_pointer_cast<gtsam::NonlinearFactor>(
112  gtsam::NonlinearFactor::shared_ptr(new This(*this)));
113  }
114 
115  // Return measurement expression
116  virtual Expression<T> expression(Key key1, Key key2) const {
117  Expression<A1> body_T_sensor__(body_T_sensor_);
118  Expression<A1> nav_T_body_(key1);
119  Expression<A1> nav_T_sensor_(traits<A1>::Compose, nav_T_body_,
120  body_T_sensor__);
121  Expression<A2> a2_(key2);
122  return Expression<T>(Range<A1, A2>(), nav_T_sensor_, a2_);
123  }
124 
126  void print(const std::string& s = "",
127  const KeyFormatter& keyFormatter = DefaultKeyFormatter) const {
128  std::cout << s << "RangeFactorWithTransform" << std::endl;
129  this->body_T_sensor_.print(" sensor pose in body frame: ");
130  Base::print(s, keyFormatter);
131  }
132 
133  private:
136  template <typename ARCHIVE>
137  void serialize(ARCHIVE& ar, const unsigned int /*version*/) {
138  ar& boost::serialization::make_nvp(
139  "Base", boost::serialization::base_object<Base>(*this));
140  ar& BOOST_SERIALIZATION_NVP(body_T_sensor_);
141  }
142 }; // \ RangeFactorWithTransform
143 
145 template <typename A1, typename A2, typename T>
146 struct traits<RangeFactorWithTransform<A1, A2, T> >
147  : public Testable<RangeFactorWithTransform<A1, A2, T> > {};
148 
149 } // \ namespace gtsam
This is the base class for all factor types.
Definition: Factor.h:54
const T & measured() const
return the measurement
Definition: ExpressionFactor.h:67
Definition: RangeFactor.h:35
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:57
A helper that implements the traits interface for GTSAM types.
Definition: Testable.h:150
Definition: RangeFactor.h:89
Binary specialization of ExpressionFactor meant as a base class for binary factors.
Definition: ExpressionFactor.h:226
boost::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: Key.h:33
void initialize(const Expression< T > &expression)
Initialize with constructor arguments.
Definition: ExpressionFactor.h:157
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const
print contents
Definition: RangeFactor.h:126
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition: concepts.h:30
friend class boost::serialization::access
Serialization function.
Definition: RangeFactor.h:135
Definition: BearingRange.h:39
Expression class that supports automatic differentiation.
Definition: Expression.h:49
virtual Expression< T > expression(Key key1, Key key2) const
Recreate expression from given keys_ and measured_, used in load Needed to deserialize a derived fact...
Definition: RangeFactor.h:56
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const
print relies on Testable traits being defined for T
Definition: ExpressionFactor.h:70
RangeFactor()
default constructor
Definition: RangeFactor.h:42
Global functions in a separate testing namespace.
Definition: chartTesting.h:28
noiseModel::Base::shared_ptr SharedNoiseModel
Note, deliberately not in noiseModel namespace.
Definition: NoiseModel.h:1072
virtual gtsam::NonlinearFactor::shared_ptr clone() const
Definition: RangeFactor.h:50
virtual gtsam::NonlinearFactor::shared_ptr clone() const
Definition: RangeFactor.h:110
virtual Expression< T > expression(Key key1, Key key2) const
Recreate expression from given keys_ and measured_, used in load Needed to deserialize a derived fact...
Definition: RangeFactor.h:116
void print(const std::string &s="", const KeyFormatter &kf=DefaultKeyFormatter) const
print
Definition: RangeFactor.h:63