g2o
edge_se2_line2d.h
Go to the documentation of this file.
1 // g2o - General Graph Optimization
2 // Copyright (C) 2011 R. Kuemmerle, G. Grisetti, W. Burgard
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright notice,
10 // this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above copyright
12 // notice, this list of conditions and the following disclaimer in the
13 // documentation and/or other materials provided with the distribution.
14 //
15 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16 // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17 // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
18 // PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19 // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21 // TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 
27 #ifndef G2O_EDGE_SE2_LINE2D_H
28 #define G2O_EDGE_SE2_LINE2D_H
29 
30 #include "g2o/config.h"
32 #include "vertex_line2d.h"
34 #include "g2o/stuff/misc.h"
36 
37 namespace g2o {
38 
39  class G2O_TYPES_SLAM2D_ADDONS_API EdgeSE2Line2D : public BaseBinaryEdge<2, Line2D, VertexSE2, VertexLine2D>
40  {
41  public:
42  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
43  EdgeSE2Line2D();
44 
45  void computeError()
46  {
47  const VertexSE2* v1 = static_cast<const VertexSE2*>(_vertices[0]);
48  const VertexLine2D* l2 = static_cast<const VertexLine2D*>(_vertices[1]);
49  Vector2D prediction=l2->estimate();
50  SE2 iT=v1->estimate().inverse();
51  prediction[0] += iT.rotation().angle();
52  prediction[0] = normalize_theta(prediction[0]);
53  Vector2D n(cos(prediction[0]), sin(prediction[0]));
54  prediction[1] += n.dot(iT.translation());
55  _error = prediction - _measurement;
56  _error [0] = normalize_theta(_error[0]);
57  }
58 
59  virtual bool setMeasurementData(const double* d){
60  _measurement[0]=d[0];
61  _measurement[1]=d[1];
62  return true;
63  }
64 
65  virtual bool getMeasurementData(double* d) const{
66  d[0] = _measurement[0];
67  d[1] = _measurement[1];
68  return true;
69  }
70 
71  virtual int measurementDimension() const {return 2;}
72 
73  virtual bool setMeasurementFromState(){
74  const VertexSE2* v1 = static_cast<const VertexSE2*>(_vertices[0]);
75  const VertexLine2D* l2 = static_cast<const VertexLine2D*>(_vertices[1]);
76  Vector2D prediction=l2->estimate();
77  SE2 iT=v1->estimate().inverse();
78  prediction[0] += iT.rotation().angle();
79  prediction[0] = normalize_theta(prediction[0]);
80  Vector2D n(cos(prediction[0]), sin(prediction[0]));
81  prediction[1] += n.dot(iT.translation());
82  _measurement = prediction;
83  return true;
84  }
85 
86  virtual bool read(std::istream& is);
87  virtual bool write(std::ostream& os) const;
88 
89  virtual void initialEstimate(const OptimizableGraph::VertexSet& from, OptimizableGraph::Vertex* to);
90  virtual double initialEstimatePossible(const OptimizableGraph::VertexSet& from, OptimizableGraph::Vertex* to) { (void) to; return (from.count(_vertices[0]) == 1 ? 1.0 : -1.0);}
91 /* #ifndef NUMERIC_JACOBIAN_TWO_D_TYPES */
92 /* virtual void linearizeOplus(); */
93 /* #endif */
94  };
95 
96 /* class G2O_TYPES_SLAM2D_ADDONS_API EdgeSE2Line2DWriteGnuplotAction: public WriteGnuplotAction { */
97 /* public: */
98 /* EdgeSE2Line2DWriteGnuplotAction(); */
99 /* virtual HyperGraphElementAction* operator()(HyperGraph::HyperGraphElement* element, */
100 /* HyperGraphElementAction::Parameters* params_); */
101 /* }; */
102 
103 /* #ifdef G2O_HAVE_OPENGL */
104 /* class G2O_TYPES_SLAM2D_ADDONS_API EdgeSE2Line2DDrawAction: public DrawAction{ */
105 /* public: */
106 /* EdgeSE2Line2DDrawAction(); */
107 /* virtual HyperGraphElementAction* operator()(HyperGraph::HyperGraphElement* element, */
108 /* HyperGraphElementAction::Parameters* params_); */
109 /* }; */
110 /* #endif */
111 
112 } // end namespace
113 
114 #endif
Eigen::Matrix< double, 2, 1, Eigen::ColMajor > Vector2D
Definition: eigen_types.h:45
some general case utility functions
std::set< Vertex * > VertexSet
Definition: hyper_graph.h:136
represent SE2
Definition: se2.h:40
2D pose Vertex, (x,y,theta)
Definition: vertex_se2.h:41
virtual bool setMeasurementData(const double *d)
const Eigen::Rotation2Dd & rotation() const
rotational component
Definition: se2.h:58
virtual int measurementDimension() const
double normalize_theta(double theta)
Definition: misc.h:94
A general case Vertex for optimization.
virtual bool setMeasurementFromState()
#define G2O_TYPES_SLAM2D_ADDONS_API
const EstimateType & estimate() const
return the current estimate of the vertex
Definition: base_vertex.h:99
SE2 inverse() const
invert :-)
Definition: se2.h:82
const Vector2D & translation() const
translational component
Definition: se2.h:54
virtual double initialEstimatePossible(const OptimizableGraph::VertexSet &from, OptimizableGraph::Vertex *to)
virtual bool getMeasurementData(double *d) const