base
TransformWithCovariance.hpp
Go to the documentation of this file.
1 #ifndef __BASE_TRANSFORM_WITH_COVARIANCE_HPP__
2 #define __BASE_TRANSFORM_WITH_COVARIANCE_HPP__
3 
4 #include <base/Pose.hpp>
5 #include <base/Eigen.hpp>
6 
7 namespace base {
8 
21  {
22 
23  public:
25 
26  public:
32 
34 
38  Covariance cov;
39 
40  public:
42  : translation(Position::Zero()) , orientation(Quaterniond::Identity())
43  {
44  this->invalidateCovariance();
45  }
46 
47  explicit TransformWithCovariance( const base::Affine3d& trans)
48  {
49  this->setTransform(trans);
50  this->invalidateCovariance();
51  }
52 
53  TransformWithCovariance( const base::Affine3d& trans, const Covariance& cov )
54  {
55  this->setTransform(trans);
56  this->cov = cov;
57  }
58 
59  TransformWithCovariance(const base::Position& translation, const base::Quaterniond& orientation)
60  : translation(translation), orientation(orientation)
61  {
62  this->invalidateCovariance();
63  }
64 
65  TransformWithCovariance(const base::Position& translation, const base::Quaterniond& orientation, const Covariance& cov )
66  : translation(translation), orientation(orientation), cov(cov)
67  {
68 
69  }
70 
72  {
73  return TransformWithCovariance();
74  }
75 
76 
79  friend std::ostream & operator<<(std::ostream &out, const TransformWithCovariance& trans);
80 
85 
91 
97 
101 
104  std::pair<Eigen::Vector3d, Eigen::Matrix3d>
105  composePointWithCovariance( const Eigen::Vector3d& point, const Eigen::Matrix3d& cov ) const;
106 
108 
109  const Covariance& getCovariance() const
110  {
111  return this->cov;
112  }
113 
114  void setCovariance( const Covariance& cov )
115  {
116  this->cov = cov;
117  }
118 
120  {
121  return this->cov.topLeftCorner<3,3>();
122  }
123 
125  {
126  this->cov.topLeftCorner<3,3>() = cov;
127  }
128 
130  {
131  return this->cov.bottomRightCorner<3,3>();
132  }
133 
135  {
136  this->cov.bottomRightCorner<3,3>() = cov;
137  }
138 
140  {
141  Affine3d trans (this->orientation);
142  trans.translation() = this->translation;
143  return trans;
144  }
145 
146  void setTransform( const base::Affine3d& trans )
147  {
148  this->translation = trans.translation();
149  this->orientation = Quaterniond(trans.rotation());
150  }
151 
153  {
154  return this->orientation;
155  }
156 
158  {
159  this->orientation = q;
160  }
161 
162  bool hasValidTransform() const
163  {
164  return !translation.hasNaN() && !orientation.coeffs().hasNaN();
165  }
166 
168  {
169  translation = Position::Ones() * NaN<double>();
170  orientation.coeffs() = Vector4d::Ones() * NaN<double>();
171  }
172 
174  bool hasValidCovariance() const
175  {
176  return !cov.hasNaN();
177  }
178 
180  {
181  cov = Covariance::Ones() * NaN<double>();
182  }
183 
184  protected:
185  // The uncertainty transformations are implemented according to:
186  // Pennec X, Thirion JP. A framework for uncertainty and validation of 3-D
187  // registration methods based on points and frames. International Journal of
188  // Computer Vion. 1997;25(3):203–229. Available at:
189  // http://www.springerlink.com/index/JJ25N2Q23T402682.pdf.
190 
191  static Eigen::Quaterniond r_to_q( const Eigen::Vector3d& r );
192 
193  static Eigen::Vector3d q_to_r( const Eigen::Quaterniond& q );
194 
195  static inline double sign( double v );
196 
197  static Eigen::Matrix<double,3,3> skew_symmetric( const Eigen::Vector3d& r );
198 
199  static Eigen::Matrix<double,4,3> dq_by_dr( const Eigen::Quaterniond& q );
200 
201  static Eigen::Matrix<double,3,4> dr_by_dq( const Eigen::Quaterniond& q );
202 
203  static Eigen::Matrix<double,4,4> dq2q1_by_dq1( const Eigen::Quaterniond& q2 );
204 
205  static Eigen::Matrix<double,4,4> dq2q1_by_dq2( const Eigen::Quaterniond& q1 );
206 
207  static Eigen::Matrix<double,3,3> dr2r1_by_r1( const Eigen::Quaterniond& q, const Eigen::Quaterniond& q1, const Eigen::Quaterniond& q2 );
208 
209  static Eigen::Matrix<double,3,3> dr2r1_by_r2( const Eigen::Quaterniond& q, const Eigen::Quaterniond& q1, const Eigen::Quaterniond& q2 );
210 
211  static Eigen::Matrix<double,3,3> drx_by_dr( const Eigen::Quaterniond& q, const Eigen::Vector3d& x );
212  };
213 
216  std::ostream & operator<<(std::ostream &out, const TransformWithCovariance& trans);
217 } // namespaces
218 
219 #endif
TransformWithCovariance(const base::Affine3d &trans)
Definition: TransformWithCovariance.hpp:47
TransformWithCovariance compositionInv(const TransformWithCovariance &trans) const
Definition: TransformWithCovariance.cpp:20
TransformWithCovariance preCompositionInv(const TransformWithCovariance &trans) const
Definition: TransformWithCovariance.cpp:54
bool hasValidTransform() const
Definition: TransformWithCovariance.hpp:162
TransformWithCovariance inverse() const
Definition: TransformWithCovariance.cpp:147
void invalidateTransform()
Definition: TransformWithCovariance.hpp:167
static Eigen::Quaterniond r_to_q(const Eigen::Vector3d &r)
Definition: TransformWithCovariance.cpp:164
bool hasValidCovariance() const
Definition: TransformWithCovariance.hpp:174
static Eigen::Matrix< double, 3, 3 > dr2r1_by_r1(const Eigen::Quaterniond &q, const Eigen::Quaterniond &q1, const Eigen::Quaterniond &q2)
Definition: TransformWithCovariance.cpp:236
static Eigen::Matrix< double, 3, 3 > drx_by_dr(const Eigen::Quaterniond &q, const Eigen::Vector3d &x)
Definition: TransformWithCovariance.cpp:252
Eigen::Transform< double, 3, Eigen::Affine, Eigen::DontAlign > Affine3d
Definition: Eigen.hpp:35
Eigen::Quaternion< double, Eigen::DontAlign > Quaterniond
Definition: Eigen.cpp:14
base::Quaterniond orientation
Definition: TransformWithCovariance.hpp:33
void setTranslationCov(const base::Matrix3d &cov)
Definition: TransformWithCovariance.hpp:124
static Eigen::Matrix< double, 4, 4 > dq2q1_by_dq1(const Eigen::Quaterniond &q2)
Definition: TransformWithCovariance.cpp:220
base::Quaterniond Orientation
Definition: Pose.hpp:11
void setOrientationCov(const base::Matrix3d &cov)
Definition: TransformWithCovariance.hpp:134
TransformWithCovariance(const base::Affine3d &trans, const Covariance &cov)
Definition: TransformWithCovariance.hpp:53
base::Matrix6d Covariance
Definition: TransformWithCovariance.hpp:24
const base::Affine3d getTransform() const
Definition: TransformWithCovariance.hpp:139
TransformWithCovariance composition(const TransformWithCovariance &trans) const
Definition: TransformWithCovariance.cpp:15
static Eigen::Matrix< double, 4, 4 > dq2q1_by_dq2(const Eigen::Quaterniond &q1)
Definition: TransformWithCovariance.cpp:228
base::Vector3d Position
Definition: Pose.hpp:10
static double sign(double v)
Definition: TransformWithCovariance.cpp:179
Eigen::Quaternion< double, Eigen::DontAlign > Quaterniond
Definition: Eigen.hpp:33
static Eigen::Matrix< double, 3, 4 > dr_by_dq(const Eigen::Quaterniond &q)
Definition: TransformWithCovariance.cpp:207
base::Position translation
Definition: TransformWithCovariance.hpp:31
void setOrientation(const base::Orientation &q)
Definition: TransformWithCovariance.hpp:157
static Eigen::Vector3d q_to_r(const Eigen::Quaterniond &q)
Definition: TransformWithCovariance.cpp:173
TransformWithCovariance(const base::Position &translation, const base::Quaterniond &orientation, const Covariance &cov)
Definition: TransformWithCovariance.hpp:65
static Eigen::Matrix< double, 3, 3 > dr2r1_by_r2(const Eigen::Quaterniond &q, const Eigen::Quaterniond &q1, const Eigen::Quaterniond &q2)
Definition: TransformWithCovariance.cpp:244
const base::Orientation & getOrientation() const
Definition: TransformWithCovariance.hpp:152
Covariance cov
Definition: TransformWithCovariance.hpp:38
Definition: LinearAngular6DCommand.hpp:8
Definition: TransformWithCovariance.hpp:20
friend std::ostream & operator<<(std::ostream &out, const TransformWithCovariance &trans)
Definition: TransformWithCovariance.cpp:268
const Covariance & getCovariance() const
Definition: TransformWithCovariance.hpp:109
void setTransform(const base::Affine3d &trans)
Definition: TransformWithCovariance.hpp:146
void invalidateCovariance()
Definition: TransformWithCovariance.hpp:179
static Eigen::Matrix< double, 3, 3 > skew_symmetric(const Eigen::Vector3d &r)
Definition: TransformWithCovariance.cpp:184
static Eigen::Matrix< double, 4, 3 > dq_by_dr(const Eigen::Quaterniond &q)
Definition: TransformWithCovariance.cpp:193
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vector3d
Definition: Eigen.cpp:12
TransformWithCovariance operator*(const TransformWithCovariance &trans) const
Definition: TransformWithCovariance.cpp:89
const base::Matrix3d getOrientationCov() const
Definition: TransformWithCovariance.hpp:129
Eigen::Matrix< double, 6, 6, Eigen::DontAlign > Matrix6d
Definition: Eigen.hpp:29
TransformWithCovariance()
Definition: TransformWithCovariance.hpp:41
const base::Matrix3d getTranslationCov() const
Definition: TransformWithCovariance.hpp:119
Eigen::Matrix< double, 3, 3, Eigen::DontAlign > Matrix3d
Definition: Eigen.hpp:27
std::pair< Eigen::Vector3d, Eigen::Matrix3d > composePointWithCovariance(const Eigen::Vector3d &point, const Eigen::Matrix3d &cov) const
Definition: TransformWithCovariance.cpp:134
static TransformWithCovariance Identity()
Definition: TransformWithCovariance.hpp:71
void setCovariance(const Covariance &cov)
Definition: TransformWithCovariance.hpp:114
TransformWithCovariance(const base::Position &translation, const base::Quaterniond &orientation)
Definition: TransformWithCovariance.hpp:59