GSLAM  3.0.0
Map.h
1 // GSLAM - A general SLAM framework and benchmark
2 // Copyright 2018 PILAB Inc. All rights reserved.
3 // https://github.com/zdzhaoyong/GSLAM
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 //
8 // * Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright notice,
11 // this list of conditions and the following disclaimer in the documentation
12 // and/or other materials provided with the distribution.
13 // * Neither the name of Google Inc. nor the names of its contributors may be
14 // used to endorse or promote products derived from this software without
15 // specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 // POSSIBILITY OF SUCH DAMAGE.
28 //
29 // Author: zd5945@126.com (Yong Zhao)
30 //
31 // A Map is constructed by MapPoints and MapFrames, relationship between point
32 // and frame calls observation, relationship between frames calls connection.
33 // This header only provides interface but no implementation.
34 
35 #ifndef GSLAM_MAP_H
36 #define GSLAM_MAP_H
37 
38 #include "SIM3.h"
39 #include "GImage.h"
40 #include "Camera.h"
41 #include "Svar.h"
42 
43 namespace GSLAM {
44 
45 class GObject;
46 class MapFrame;
47 class MapPoint;
48 class Map;
49 class SLAM;
50 class FrameConnection;
51 
52 typedef size_t NodeId;
53 typedef size_t WordId;
54 typedef float WordValue;
55 typedef std::map<WordId,float> BowVector;
56 typedef std::map<WordId,std::vector<unsigned int> > FeatureVector;
57 typedef Point3d Point3Type;
58 typedef Point3ub ColorType;
59 typedef size_t PointID;
60 typedef size_t FrameID;
61 typedef std::shared_ptr<GObject> GObjectPtr;
62 typedef std::shared_ptr<MapFrame> FramePtr;
63 typedef std::shared_ptr<MapPoint> PointPtr;
64 typedef std::shared_ptr<FrameConnection> FrameConnectionPtr;
65 typedef std::shared_ptr<Map> MapPtr;
66 typedef std::shared_ptr<SLAM> SLAMPtr;
67 typedef std::vector<FramePtr> FrameArray;
68 typedef std::vector<PointPtr> PointArray;
69 typedef std::map<GSLAM::FrameID, FrameConnectionPtr > FrameConnectionMap;
70 typedef std::vector<std::pair<FrameID,size_t> > MapPointObsVec;
71 typedef GSLAM::Point3d CameraAnchor; // for both Pinhole projection and Sphere projection
72 typedef GSLAM::Point2d IdepthEstimation; // [idepth,invSqSigma]^T
73 typedef GSLAM::SLAMPtr (*funcCreateSLAMInstance)();
74 typedef std::mutex MutexRW;
75 typedef std::unique_lock<std::mutex> ReadMutex;
76 typedef ReadMutex WriteMutex;
77 
78 enum ImageChannelFlags{
79  IMAGE_UNDEFINED =0,
80  // For colorful or depth camera
81  IMAGE_RGBA =1<<0,// when channals()==3 means RGB, Alpha means the image mask
82  IMAGE_BGRA =1<<1,
83  IMAGE_GRAY =1<<2,
84  IMAGE_DEPTH =1<<3,// the depth image cam be obtained from lidar or depth camera such as Kinect
85  IMAGE_IDEPTH =1<<4,// this is usually obtained with
86 
87  IMAGE_RGBD =IMAGE_BGRA|IMAGE_DEPTH,
88 
89  // For multispectral camera
90  IMAGE_GRE =1<<5,// Green
91  IMAGE_NIR =1<<6,// Near
92  IMAGE_RED =1<<7,// Red
93  IMAGE_REG =1<<8,// Red Edge
94 
95  IMAGE_LIDAR =1<<9,
96  IMAGE_SONAR =1<<10,
97  IMAGE_SAR =1<<11,
98 
99  IMAGE_THUMBNAIL =1<<12// The thumbnail should be in format RGBA
100 };
101 
102 class GObject
103 {
104 public:
105  virtual ~GObject(){}
106  virtual std::string type()const{return "GObject";}
107  virtual void call(const std::string& command,void* arg=NULL){}
108  virtual void draw(){}
109  virtual bool toByteArray(std::vector<uchar>& array){return false;}
110  virtual bool fromByteArray(std::vector<uchar>& array){return false;}
111 
112 };
113 
115 {
116 public:
117  virtual ~GObjectHandle(){}
118  virtual void handle(const GObjectPtr& obj){}
119  void handle(GObject* obj){handle(GObjectPtr(obj));}
120 };
121 
122 class KeyPoint {
123  public:
124  KeyPoint()
125  : pt(0, 0), size(0), angle(-1), response(0), octave(0), class_id(-1) {}
126 
127  KeyPoint(Point2f _pt, float _size, float _angle = -1, float _response = 0,
128  int _octave = 0, int _class_id = -1)
129  : pt(_pt),
130  size(_size),
131  angle(_angle),
132  response(_response),
133  octave(_octave),
134  class_id(_class_id) {}
135 
136  KeyPoint(float x, float y, float _size, float _angle = -1,
137  float _response = 0, int _octave = 0, int _class_id = -1)
138  : pt(x, y),
139  size(_size),
140  angle(_angle),
141  response(_response),
142  octave(_octave),
143  class_id(_class_id) {}
144 
145 #ifdef __OPENCV_FEATURES_2D_HPP__
146  explicit KeyPoint(const cv::KeyPoint& kp)
147  : pt(kp.pt.x, kp.pt.y),
148  size(kp.size),
149  angle(kp.angle),
150  response(kp.response),
151  octave(kp.octave),
152  class_id(kp.class_id) {}
153 
154  operator cv::KeyPoint() const {
155  return cv::KeyPoint(pt.x, pt.y, size, angle, response, octave, class_id);
156  }
157 #endif
158  typedef union Cv32suf {
159  int i;
160  unsigned u;
161  float f;
162  } Cv32suf;
163 
164  size_t hash() const {
165  size_t _Val = 2166136261U, scale = 16777619U;
166  Cv32suf u;
167  u.f = pt.x;
168  _Val = (scale * _Val) ^ u.u;
169  u.f = pt.y;
170  _Val = (scale * _Val) ^ u.u;
171  u.f = size;
172  _Val = (scale * _Val) ^ u.u;
173  u.f = angle;
174  _Val = (scale * _Val) ^ u.u;
175  u.f = response;
176  _Val = (scale * _Val) ^ u.u;
177  _Val = (scale * _Val) ^ ((size_t)octave);
178  _Val = (scale * _Val) ^ ((size_t)class_id);
179  return _Val;
180  }
181 
182  Point2f pt; //!< coordinates of the keypoints
183  float size; //!< diameter of the meaningful keypoint neighborhood
184  float
185  angle; //!< computed orientation of the keypoint (-1 if not applicable);
186  //!< it's in [0,360) degrees and measured relative to
187  //!< image coordinate system, ie in clockwise.
188  float response; //!< the response by which the most strong keypoints have
189  //! been selected. Can be used for the further sorting or
190  //! subsampling
191  int octave; //!< octave (pyramid layer) from which the keypoint has been
192  //! extracted
193  int class_id; //!< object class (if the keypoints need to be clustered by an
194  //! object they belong to)
195 };
196 
197 /**
198  * @brief The MapPoint class
199  */
200 class MapPoint : public GObject
201 {
202 public:
203  MapPoint(const PointID& id,const Point3Type& position=Point3Type(0,0,0));
204  virtual ~MapPoint(){}
205  virtual std::string type()const{return "InvalidPoint";}
206  const PointID& id()const{return _id;}
207 
208  Point3Type getPose()const;
209  void setPose(const Point3Type& pt);
210 
211  virtual Point3Type getNormal()const{return Point3Type(0,0,0);}
212  virtual bool setNormal(const Point3Type& nVec){return false;}
213 
214  virtual ColorType getColor()const{return ColorType(255,255,255);}
215  virtual bool setColor(const ColorType& color)const{return false;}
216 
217  virtual bool setDescriptor(const GImage& des){return false;}
218  virtual GImage getDescriptor()const{return GImage();}
219 
220  virtual bool isPoseRelative()const{return false;} // Default use world coordinate
221  virtual FrameID refKeyframeID()const{return 0;} // If using relative pose, which keyframe referencing
222  virtual FramePtr refKeyframe()const{return FramePtr();}
223 
224  virtual int observationNum()const{return -1;}
225  virtual bool getObservations(std::map<FrameID,size_t>& obs)const{return false;}
226  virtual MapPointObsVec getObservations()const{
227  MapPointObsVec r;
228  std::map<FrameID,size_t> m;
229  getObservations(m);
230  r.insert(r.end(),m.begin(),m.end());
231  return r;
232  }
233  virtual bool addObservation(GSLAM::FrameID frId,size_t featId){return false;}
234  virtual bool eraseObservation(GSLAM::FrameID frId){return false;}
235  virtual bool clearObservation(){return false;}
236 
237 protected:
238  mutable MutexRW _mutexPt;
239 
240 private:
241  const PointID _id;
242  Point3Type _pt;
243 };
244 
245 // MapFrame <-> MapFrame : MapFrame connections for Pose Graph
246 class FrameConnection : public GObject
247 {
248 public:
249  virtual std::string type()const{return "FrameConnection";}
250  virtual int matchesNum(){return 0;}
251 
252  virtual bool getMatches(std::vector<std::pair<int,int> >& matches){return false;}
253  std::vector<std::pair<int,int> > getMatches(){std::vector<std::pair<int,int> > r;getMatches(r);return r;}
254  virtual bool getChild2Parent(GSLAM::SIM3& sim3){return false;}
255  virtual bool getChild2Parent(GSLAM::SE3& se3){return false;}
256  virtual bool getInformation(double* info){return false;}
257 
258  virtual bool setMatches(std::vector<std::pair<int,int> >& matches){return false;}
259  virtual bool setChild2Parent(GSLAM::SIM3& sim3){return false;}
260  virtual bool setChild2Parent(GSLAM::SE3& se3){return false;}
261  virtual bool setInformation(double* info){return false;}
262 };
263 
264 class MapFrame : public GObject
265 {
266 public:
267  MapFrame(const FrameID& id=0,const double& timestamp=0);
268  virtual ~MapFrame(){}
269  virtual std::string type()const{return "InvalidFrame";}
270 
271  // Basic things, ID, Timestamp, Image, CameraModel, IMU, GPS informations
272  const PointID& id()const{return _id;}
273  const double& timestamp()const{return _timestamp;}
274 
275  // Frame transform from local to world, this is essential
276  void setPose(const SE3& pose);
277  void setPose(const SIM3& pose);
278  SE3 getPose()const;
279  bool getPose(SIM3& pose)const;
280  SIM3 getPoseScale()const;
281 
282  // When the frame contains one or more images captured from cameras
283  virtual int cameraNum()const{return 0;} // Camera number
284  virtual SE3 getCameraPose(int idx=0) const{return SE3();} // The transform from camera to local
285  virtual int imageChannels(int idx=0) const{return IMAGE_BGRA;} // Default is a colorful camera
286  virtual Camera getCamera(int idx=0){return Camera();} // The camera model
287  virtual GImage getImage(int idx=0,int channalMask=IMAGE_UNDEFINED){return GImage();} // Just return the image if only one channel is available
288  virtual bool setImage(const GImage& img,int idx=0,int channalMask=IMAGE_UNDEFINED){return false;}
289  virtual bool setCamera(const Camera& camera,int idx=0){return false;}
290 
291  // When the frame contains IMUs or GPSs
292  virtual int getIMUNum()const{return 0;}
293  virtual SE3 getIMUPose(int idx=0)const{return SE3();}
294  virtual bool getAcceleration(Point3d& acc,int idx=0)const{return false;} // m/s^2
295  virtual bool getAngularVelocity(Point3d& angularV,int idx=0)const{return false;}// rad/s
296  virtual bool getMagnetic(Point3d& mag,int idx=0)const{return false;} // gauss
297  virtual bool getAccelerationNoise(Point3d& accN,int idx=0)const{return false;}
298  virtual bool getAngularVNoise(Point3d& angularVN,int idx=0)const{return false;}
299  virtual bool getPitchYawRoll(Point3d& pyr,int idx=0)const{return false;} // in rad
300  virtual bool getPYRSigma(Point3d& pyrSigma,int idx=0)const{return false;} // in rad
301 
302  virtual int getGPSNum()const{return 0;}
303  virtual SE3 getGPSPose(int idx=0)const{return SE3();}
304  virtual bool getGPSLLA(Point3d& LonLatAlt,int idx=0)const{return false;} // WGS84 [longtitude latitude altitude]
305  virtual bool getGPSLLASigma(Point3d& llaSigma,int idx=0)const{return false;} // meter
306  virtual bool getGPSECEF(Point3d& xyz,int idx=0)const{return false;} // meter
307  virtual bool getHeight2Ground(Point2d& height,int idx=0)const{return false;} // height against ground
308 
309  // Tracking things for feature based methods
310  virtual int keyPointNum()const{return 0;}
311  virtual bool setKeyPoints(const std::vector<GSLAM::KeyPoint>& keypoints,
312  const GSLAM::GImage& descriptors=GSLAM::GImage()){return false;}
313  virtual bool getKeyPoint(int idx, Point2f& pt)const{return false;}
314  virtual bool getKeyPoint(int idx, KeyPoint &pt) const{return false;}
315  virtual bool getKeyPoints(std::vector<Point2f>& keypoints)const{return false;}
316  virtual bool getKeyPoints(std::vector<KeyPoint>& keypoints) const{return false;}
317  virtual std::vector<KeyPoint> getKeyPoints() const{std::vector<KeyPoint> r;getKeyPoints(r);return r;}
318  virtual bool getKeyPointColor(int idx,ColorType& color){return false;}
319  virtual bool getKeyPointIDepthInfo(int idx,Point2d& idepth){return false;}
320  virtual PointID getKeyPointObserve(int idx){return 0;}
321  virtual GImage getDescriptor(int idx=-1)const{return GImage();} // idx<0: return all descriptors
322  virtual bool getBoWVector(BowVector& bowvec)const{return false;}
323  virtual BowVector getBoWVector()const{BowVector r;getBoWVector(r);return r;}
324  virtual bool getFeatureVector(FeatureVector& featvec)const{return false;}
325  virtual FeatureVector getFeatureVector()const{FeatureVector r;getFeatureVector(r);return r;}
326  virtual std::vector<size_t> getFeaturesInArea(const float& x,const float& y,
327  const float& r,bool precisely=true)const{return std::vector<size_t>();}
328 
329  // MapPoint <-> KeyPoint : MapPoint Observation usually comes along Mappoint::*obs*
330  virtual int observationNum()const{return 0;}
331  virtual bool getObservations(std::map<GSLAM::PointID,size_t>& obs)const{return false;}
332  virtual std::map<GSLAM::PointID,size_t> getObservations()const{std::map<GSLAM::PointID,size_t> r;getObservations(r);return r;}
333  virtual bool addObservation(const GSLAM::PointPtr& pt,size_t featId,bool add2Point=false){return false;}
334  virtual bool eraseObservation(const GSLAM::PointPtr& pt,bool erasePoint=false){return false;}
335  virtual bool clearObservations(){return false;}
336 
337  virtual std::shared_ptr<FrameConnection> getParent(GSLAM::FrameID parentId)const{return std::shared_ptr<FrameConnection>();}
338  virtual std::shared_ptr<FrameConnection> getChild(GSLAM::FrameID childId)const{return std::shared_ptr<FrameConnection>();}
339  virtual bool getParents(FrameConnectionMap& parents)const{return false;}
340  virtual bool getChildren(FrameConnectionMap& children)const{return false;}
341  FrameConnectionMap getParents()const{FrameConnectionMap r;getParents(r);return r;}
342  FrameConnectionMap getChildren()const{FrameConnectionMap r;getChildren(r);return r;}
343  virtual bool addParent(GSLAM::FrameID parentId, const std::shared_ptr<FrameConnection>& parent){return false;}
344  virtual bool addChildren(GSLAM::FrameID childId, const std::shared_ptr<FrameConnection>& child){return false;}
345  virtual bool eraseParent(GSLAM::FrameID parentId){return false;}
346  virtual bool eraseChild(GSLAM::FrameID childId){return false;}
347  virtual bool clearParents(){return false;}
348  virtual bool clearChildren(){return false;}
349 
350  // Extra utils
351  virtual double getMedianDepth(){return getPoseScale().get_scale();}
352 
353  static std::string channelTypeString(const int channels);
354  std::string channelString(int idx=0) const{return channelTypeString(imageChannels(idx));}
355 
356 public:
357  const FrameID _id;
358  double _timestamp;
359 
360 protected:
361  mutable MutexRW _mutexPose;
362 
363 private:
364  SIM3 _c2w;//worldPt=c2w*cameraPt;
365 };
366 
368 {
369  LoopCandidate(const FrameID& frameId_,const double& score_)
370  :frameId(frameId_),score(score_){}
371 
372  FrameID frameId;
373  double score;
374  friend bool operator<(const LoopCandidate& l,const LoopCandidate& r)
375  {
376  return l.score<r.score;
377  }
378 };
379 typedef std::vector<LoopCandidate> LoopCandidates;
380 
381 // The LoopDetector is used to detect loops with Poses or Descriptors information
382 class LoopDetector: public GObject
383 {
384 public:
385  virtual std::string type()const{return "LoopDetector";}
386  virtual bool insertMapFrame(const FramePtr& frame){return false;}
387  virtual bool eraseMapFrame(const FrameID& frame){return false;}
388  virtual bool obtainCandidates(const FramePtr& frame,LoopCandidates& candidates){return false;}
389  virtual LoopCandidates obtainCandidates(const FramePtr& frame){
390  LoopCandidates c;
391  obtainCandidates(frame,c);
392  return c;
393  }
394 };
395 typedef std::shared_ptr<LoopDetector> LoopDetectorPtr;
396 
397 class Map : public GObject
398 {
399 public:
400  Map();
401  virtual ~Map(){}
402  virtual std::string type()const{return "InvalidMap";}
403 
404  /// MapFrame & MapPoint interface
405  virtual bool insertMapPoint(const PointPtr& point){return false;}
406  virtual bool insertMapFrame(const FramePtr& frame){return false;}
407  virtual bool eraseMapPoint(const PointID& pointId){return false;}
408  virtual bool eraseMapFrame(const FrameID& frameId){return false;}
409  virtual void clear(){}
410 
411  virtual std::size_t frameNum()const{return 0;}
412  virtual std::size_t pointNum()const{return 0;}
413 
414  virtual FramePtr getFrame(const FrameID& id)const{return FramePtr();}
415  virtual PointPtr getPoint(const PointID& id)const{return PointPtr();}
416  virtual bool getFrames(FrameArray& frames)const{return false;}
417  virtual bool getPoints(PointArray& points)const{return false;}
418  virtual FrameArray getFrames()const{FrameArray r;getFrames(r);return r;}
419  virtual PointArray getPoints()const{PointArray r;getPoints(r);return r;}
420 
421  virtual bool setLoopDetector(const LoopDetectorPtr& loopdetector){return false;}
422  virtual LoopDetectorPtr getLoopDetector()const{return LoopDetectorPtr();}
423  virtual bool obtainCandidates(const FramePtr& frame,LoopCandidates& candidates){return false;}
424  virtual LoopCandidates obtainCandidates(const FramePtr& frame){
425  LoopCandidates c;
426  obtainCandidates(frame,c);
427  return c;
428  }
429 
430  /// Save or load the map from/to the file
431  virtual bool save(std::string path)const{return false;}
432  virtual bool load(std::string path){return false;}
433 
434  /// 0 is reserved for INVALID
435  PointID getPid(){return _ptId++;}//obtain an unique point id
436  FrameID getFid(){return _frId++;}//obtain an unique frame id
437 
438 protected:
439  PointID _ptId;
440  FrameID _frId;
441 };
442 
443 typedef std::shared_ptr<Map> MapPtr;
444 
445 
446 inline MapPoint::MapPoint(const PointID& id,const Point3Type& position)
447  :_id(id),_pt(position)
448 {
449 }
450 
451 inline Point3Type MapPoint::getPose()const
452 {
453  ReadMutex lock(_mutexPt);
454  return _pt;
455 }
456 
457 inline void MapPoint::setPose(const Point3Type& pt)
458 {
459  WriteMutex lock(_mutexPt);
460  _pt=pt;
461 }
462 
463 inline MapFrame::MapFrame(const FrameID& id,const double& timestamp)
464  :_id(id),_timestamp(timestamp)
465 {
466 }
467 
468 inline SE3 MapFrame::getPose()const
469 {
470  ReadMutex lock(_mutexPose);
471  return _c2w.get_se3();
472 }
473 
474 inline SIM3 MapFrame::getPoseScale()const
475 {
476  ReadMutex lock(_mutexPose);
477  return _c2w;
478 }
479 
480 inline bool MapFrame::getPose(SIM3& pose)const
481 {
482  pose=getPoseScale();
483  return true;
484 }
485 
486 inline void MapFrame::setPose(const SE3& pose)
487 {
488  WriteMutex lock(_mutexPose);
489  _c2w.get_se3()=pose;
490 }
491 
492 
493 inline void MapFrame::setPose(const SIM3& pose)
494 {
495  WriteMutex lock(_mutexPose);
496  _c2w=pose;
497 }
498 
499 inline std::string MapFrame::channelTypeString(const int channels)
500 {
501  static std::string _type[32]={"RGBA","BGRA","GRAY","DEPTH","IDEPTH","GRE","NIR","RED","REG","LIDAR","SONAR","SAR","THUMBNAIL"};
502  std::string type="";
503  if(channels == 0) {
504  return "IMAGE_UNDEFINED";
505  }
506  else
507  {
508  for(uint i=0; i<sizeof(channels)*8;i++)
509  {
510  int j = channels & (0x00000001<<i);
511  if(j !=0)
512  {
513  type+=(type.empty()?"":"|")+_type[i];
514  }
515  }
516  return type;
517  }
518 }
519 
520 
521 inline Map::Map():_ptId(1),_frId(1)
522 {
523 
524 }
525 
526 
527 } //end of namespace GSLAM
528 
529 #endif
int class_id
object class (if the keypoints need to be clustered by an object they belong to)
Definition: Map.h:193
Definition: Map.h:382
Point2f pt
coordinates of the keypoints
Definition: Map.h:182
Definition: Map.h:397
Definition: Map.h:367
PointID getPid()
0 is reserved for INVALID
Definition: Map.h:435
The GImage class is a tiny implementation of image for removing dependency of opencv.
Definition: GImage.h:160
Definition: Map.h:114
Definition: Point.h:48
Definition: Point.h:162
Definition: Camera.h:175
int octave
octave (pyramid layer) from which the keypoint has been extracted
Definition: Map.h:191
Definition: Map.h:102
Definition: Camera.h:45
The MapPoint class.
Definition: Map.h:200
Definition: Map.h:246
Definition: Map.h:158
virtual bool insertMapPoint(const PointPtr &point)
MapFrame & MapPoint interface.
Definition: Map.h:405
float size
diameter of the meaningful keypoint neighborhood
Definition: Map.h:183
Definition: Map.h:122
Represent a three-dimensional similarity transformation,7 degrees of freedom a rotation: R (Here is r...
Definition: SIM3.h:57
Definition: Map.h:264
float angle
computed orientation of the keypoint (-1 if not applicable); < it&#39;s in [0,360) degrees and measured r...
Definition: Map.h:185
Represent a three-dimensional Euclidean transformation (a rotation and a translation).
Definition: SE3.h:69
virtual bool save(std::string path) const
Save or load the map from/to the file.
Definition: Map.h:431
float response
the response by which the most strong keypoints have been selected. Can be used for the further sorti...
Definition: Map.h:188