Visual Servoing Platform  version 3.1.0
vpMbTracker.h
1 /****************************************************************************
2  *
3  * This file is part of the ViSP software.
4  * Copyright (C) 2005 - 2017 by Inria. All rights reserved.
5  *
6  * This software is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * See the file LICENSE.txt at the root directory of this source
11  * distribution for additional information about the GNU GPL.
12  *
13  * For using ViSP with software that can not be combined with the GNU
14  * GPL, please contact Inria about acquiring a ViSP Professional
15  * Edition License.
16  *
17  * See http://visp.inria.fr for more information.
18  *
19  * This software was developed at:
20  * Inria Rennes - Bretagne Atlantique
21  * Campus Universitaire de Beaulieu
22  * 35042 Rennes Cedex
23  * France
24  *
25  * If you have questions regarding the use of this file, please contact
26  * Inria at visp@inria.fr
27  *
28  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30  *
31  * Description:
32  * Generic model based tracker. This class declares the methods to implement
33  *in order to have a model based tracker.
34  *
35  * Authors:
36  * Romain Tallonneau
37  * Aurelien Yol
38  *
39  *****************************************************************************/
40 
45 #ifndef vpMbTracker_hh
46 #define vpMbTracker_hh
47 
48 #include <algorithm>
49 #include <cctype>
50 #include <fstream>
51 #include <functional> // std::not1
52 #include <locale>
53 #include <map>
54 #include <sstream>
55 #include <string>
56 #include <vector>
57 
58 #include <visp3/core/vpCameraParameters.h>
59 #include <visp3/core/vpColVector.h>
60 #include <visp3/core/vpHomogeneousMatrix.h>
61 #include <visp3/core/vpImage.h>
62 #include <visp3/core/vpImagePoint.h>
63 #include <visp3/core/vpMatrix.h>
64 #include <visp3/core/vpPoint.h>
65 #include <visp3/core/vpPolygon.h>
66 #include <visp3/core/vpRGBa.h>
67 #include <visp3/core/vpRobust.h>
68 #include <visp3/mbt/vpMbHiddenFaces.h>
69 #include <visp3/mbt/vpMbtPolygon.h>
70 
71 #ifdef VISP_HAVE_COIN3D
72 // Work around to avoid type redefinition int8_t with Coin
73 // #if defined(_WIN32) && defined(VISP_HAVE_OGRE) && (_MSC_VER >= 1600) //
74 // Visual Studio 2010
75 // #define HAVE_INT8_T 1
76 // #endif
77 
78 // Inventor includes
79 #include <Inventor/VRMLnodes/SoVRMLGroup.h>
80 #include <Inventor/VRMLnodes/SoVRMLIndexedFaceSet.h>
81 #include <Inventor/VRMLnodes/SoVRMLIndexedLineSet.h>
82 #endif
83 
106 class VISP_EXPORT vpMbTracker
107 {
108 public:
109  typedef enum { GAUSS_NEWTON_OPT = 0, LEVENBERG_MARQUARDT_OPT = 1 } vpMbtOptimizationMethod;
110 
111 protected:
122  std::string modelFileName;
128  std::string poseSavingFilename;
143 
147  double angleAppears;
151  double distNearClip;
153  double distFarClip;
155  unsigned int clippingFlag;
157  bool useOgre;
162  unsigned int nbPoints;
164  unsigned int nbLines;
166  unsigned int nbPolygonLines;
168  unsigned int nbPolygonPoints;
170  unsigned int nbCylinders;
172  unsigned int nbCircles;
184  std::map<std::string, std::string> mapOfParameterNames;
189  double m_lambda;
191  unsigned int m_maxIter;
195  double m_initialMu;
196 
197 public:
198  vpMbTracker();
199  virtual ~vpMbTracker();
200 
203 
205  virtual inline double getAngleAppear() const { return angleAppears; }
206 
208  virtual inline double getAngleDisappear() const { return angleDisappears; }
209 
215  virtual void getCameraParameters(vpCameraParameters &camera) const { camera = this->cam; }
216 
223  virtual inline unsigned int getClipping() const { return clippingFlag; }
224 
233  {
234  if (!computeCovariance) {
235  // vpTRACE("Warning : The covariance matrix has not been computed.
236  // See setCovarianceComputation() to do it.");
237  std::cerr << "Warning : The covariance matrix has not been computed. "
238  "See setCovarianceComputation() to do it."
239  << std::endl;
240  }
241 
242  return covarianceMatrix;
243  }
244 
251  virtual inline double getInitialMu() const { return m_initialMu; }
252 
258  virtual inline double getLambda() const { return m_lambda; }
259 
265  virtual inline unsigned int getMaxIter() const { return m_maxIter; }
266 
277  virtual double getProjectionError() const { return projectionError; }
278 
279  virtual vpColVector getEstimatedDoF() const;
280 
296  virtual vpColVector getError() const = 0;
297 
299  virtual inline vpMbHiddenFaces<vpMbtPolygon> &getFaces() { return faces; }
300 
306  virtual inline double getFarClippingDistance() const { return distFarClip; }
307 
328  virtual vpColVector getRobustWeights() const = 0;
329 
335  virtual inline unsigned int getNbPolygon() const { return static_cast<unsigned int>(faces.size()); }
336 
342  virtual inline double getNearClippingDistance() const { return distNearClip; }
343 
351  virtual inline vpMbtOptimizationMethod getOptimizationMethod() const { return m_optimizationMethod; }
352 
362  virtual inline vpMbtPolygon *getPolygon(const unsigned int index)
363  {
364  if (index >= static_cast<unsigned int>(faces.size())) {
365  throw vpException(vpException::dimensionError, "index out of range");
366  }
367 
368  return faces[index];
369  }
370 
371  virtual std::pair<std::vector<vpPolygon>, std::vector<std::vector<vpPoint> > >
372  getPolygonFaces(const bool orderPolygons = true, const bool useVisibility = true, const bool clipPolygon = false);
373 
381  virtual inline void getPose(vpHomogeneousMatrix &cMo_) const { cMo_ = this->cMo; }
382 
390  virtual inline vpHomogeneousMatrix getPose() const { return this->cMo; }
391 
392  virtual inline double getStopCriteriaEpsilon() const { return m_stopCriteriaEpsilon; }
393 
394 // Intializer
395 
396 #ifdef VISP_HAVE_MODULE_GUI
397  virtual void initClick(const vpImage<unsigned char> &I, const std::string &initFile, const bool displayHelp = false);
398  virtual void initClick(const vpImage<unsigned char> &I, const std::vector<vpPoint> &points3D_list,
399  const std::string &displayFile = "");
400 #endif
401 
402  virtual void initFromPoints(const vpImage<unsigned char> &I, const std::string &initFile);
403  virtual void initFromPoints(const vpImage<unsigned char> &I, const std::vector<vpImagePoint> &points2D_list,
404  const std::vector<vpPoint> &points3D_list);
405 
406  virtual void initFromPose(const vpImage<unsigned char> &I, const std::string &initFile);
407  virtual void initFromPose(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cMo);
408  virtual void initFromPose(const vpImage<unsigned char> &I, const vpPoseVector &cPo);
409 
410  virtual void loadModel(const char *modelFile, const bool verbose = false);
411  virtual void loadModel(const std::string &modelFile, const bool verbose = false);
412 
422  virtual inline void setAngleAppear(const double &a) { angleAppears = a; }
423 
433  virtual inline void setAngleDisappear(const double &a) { angleDisappears = a; }
434 
440  virtual void setCameraParameters(const vpCameraParameters &camera) { this->cam = camera; }
441 
442  virtual void setClipping(const unsigned int &flags);
443 
452  virtual void setCovarianceComputation(const bool &flag) { computeCovariance = flag; }
453 
470  virtual void setDisplayFeatures(const bool displayF) { displayFeatures = displayF; }
471 
472  virtual void setEstimatedDoF(const vpColVector &v);
473 
474  virtual void setFarClippingDistance(const double &dist);
475 
481  virtual inline void setInitialMu(const double mu) { m_initialMu = mu; }
482 
488  virtual inline void setLambda(const double gain) { m_lambda = gain; }
489 
490  virtual void setLod(const bool useLod, const std::string &name = "");
491 
497  virtual inline void setMaxIter(const unsigned int max) { m_maxIter = max; }
498 
499  virtual void setMinLineLengthThresh(const double minLineLengthThresh, const std::string &name = "");
500 
501  virtual void setMinPolygonAreaThresh(const double minPolygonAreaThresh, const std::string &name = "");
502 
503  virtual void setNearClippingDistance(const double &dist);
504 
510  virtual inline void setOptimizationMethod(const vpMbtOptimizationMethod &opt) { m_optimizationMethod = opt; }
511 
518  virtual inline void setStopCriteriaEpsilon(const double eps) { m_stopCriteriaEpsilon = eps; }
519 
531  virtual void setProjectionErrorComputation(const bool &flag) { computeProjError = flag; }
532 
533  virtual void setScanLineVisibilityTest(const bool &v) { useScanLine = v; }
534 
535  virtual void setOgreVisibilityTest(const bool &v);
536 
537  void savePose(const std::string &filename) const;
538 
539 #ifdef VISP_HAVE_OGRE
540 
549  virtual void setGoodNbRayCastingAttemptsRatio(const double &ratio) { faces.setGoodNbRayCastingAttemptsRatio(ratio); }
559  virtual void setNbRayCastingAttemptsForVisibility(const unsigned int &attempts)
560  {
561  faces.setNbRayCastingAttemptsForVisibility(attempts);
562  }
563 #endif
564 
575  inline virtual void setOgreShowConfigDialog(const bool showConfigDialog) { ogreShowConfigDialog = showConfigDialog; }
576 
587  inline void setPoseSavingFilename(const std::string &filename) { poseSavingFilename = filename; }
588 
589  /* PURE VIRTUAL METHODS */
590 
603  virtual void display(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
604  const vpColor &col, const unsigned int thickness = 1, const bool displayFullModel = false) = 0;
617  virtual void display(const vpImage<vpRGBa> &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam,
618  const vpColor &col, const unsigned int thickness = 1, const bool displayFullModel = false) = 0;
619 
625  virtual void init(const vpImage<unsigned char> &I) = 0;
626 
634  virtual void loadConfigFile(const std::string &configFile) = 0;
635 
639  virtual void resetTracker() = 0;
640 
651  virtual void setPose(const vpImage<unsigned char> &I, const vpHomogeneousMatrix &cdMo) = 0;
652 
658  virtual void testTracking() = 0;
659 
665  virtual void track(const vpImage<unsigned char> &I) = 0;
667 
668 protected:
671  void addPolygon(const std::vector<vpPoint> &corners, const int idFace = -1, const std::string &polygonName = "",
672  const bool useLod = false, const double minPolygonAreaThreshold = 2500.0,
673  const double minLineLengthThreshold = 50.0);
674  void addPolygon(const vpPoint &p1, const vpPoint &p2, const vpPoint &p3, const double radius, const int idFace = -1,
675  const std::string &polygonName = "", const bool useLod = false,
676  const double minPolygonAreaThreshold = 2500.0);
677  void addPolygon(const vpPoint &p1, const vpPoint &p2, const int idFace = -1, const std::string &polygonName = "",
678  const bool useLod = false, const double minLineLengthThreshold = 50);
679  void addPolygon(const std::vector<std::vector<vpPoint> > &listFaces, const int idFace = -1,
680  const std::string &polygonName = "", const bool useLod = false,
681  const double minLineLengthThreshold = 50);
682 
683  void createCylinderBBox(const vpPoint &p1, const vpPoint &p2, const double &radius,
684  std::vector<std::vector<vpPoint> > &listFaces);
685 
686  virtual void computeCovarianceMatrixVVS(const bool isoJoIdentity_, const vpColVector &w_true,
687  const vpHomogeneousMatrix &cMoPrev, const vpMatrix &L_true,
688  const vpMatrix &LVJ_true, const vpColVector &error);
689 
690  void computeJTR(const vpMatrix &J, const vpColVector &R, vpColVector &JTR) const;
691 
692  virtual void computeVVSCheckLevenbergMarquardt(const unsigned int iter, vpColVector &error,
693  const vpColVector &m_error_prev, const vpHomogeneousMatrix &cMoPrev,
694  double &mu, bool &reStartFromLastIncrement,
695  vpColVector *const w = NULL, const vpColVector *const m_w_prev = NULL);
696  virtual void computeVVSInit() = 0;
697  virtual void computeVVSInteractionMatrixAndResidu() = 0;
698  virtual void computeVVSPoseEstimation(const bool isoJoIdentity_, const unsigned int iter, vpMatrix &L, vpMatrix &LTL,
699  vpColVector &R, const vpColVector &error, vpColVector &error_prev,
700  vpColVector &LTR, double &mu, vpColVector &v, const vpColVector *const w = NULL,
701  vpColVector *const m_w_prev = NULL);
702  virtual void computeVVSWeights(vpRobust &robust, const vpColVector &error, vpColVector &w);
703 
704 #ifdef VISP_HAVE_COIN3D
705  virtual void extractGroup(SoVRMLGroup *sceneGraphVRML2, vpHomogeneousMatrix &transform, int &idFace);
706  virtual void extractFaces(SoVRMLIndexedFaceSet *face_set, vpHomogeneousMatrix &transform, int &idFace,
707  const std::string &polygonName = "");
708  virtual void extractLines(SoVRMLIndexedLineSet *line_set, int &idFace, const std::string &polygonName = "");
709  virtual void extractCylinders(SoVRMLIndexedFaceSet *face_set, vpHomogeneousMatrix &transform, int &idFace,
710  const std::string &polygonName = "");
711 #endif
712 
713  vpPoint getGravityCenter(const std::vector<vpPoint> &_pts) const;
714 
727  virtual void initCircle(const vpPoint &p1, const vpPoint &p2, const vpPoint &p3, const double radius,
728  const int idFace = 0, const std::string &name = "") = 0;
739  virtual void initCylinder(const vpPoint &p1, const vpPoint &p2, const double radius, const int idFace = 0,
740  const std::string &name = "") = 0;
741 
754  virtual void initFaceFromCorners(vpMbtPolygon &polygon) = 0;
755  virtual void initFaceFromLines(vpMbtPolygon &polygon) = 0;
756 
757  virtual void loadVRMLModel(const std::string &modelFile);
758  virtual void loadCAOModel(const std::string &modelFile, std::vector<std::string> &vectorOfModelFilename,
759  int &startIdFace, const bool verbose = false, const bool parent = true);
760 
761  void removeComment(std::ifstream &fileId);
762 
763  inline bool parseBoolean(std::string &input)
764  {
765  std::transform(input.begin(), input.end(), input.begin(), ::tolower);
766  std::istringstream is(input);
767  bool b;
768  // Parse string to boolean either in the textual representation
769  // (True/False) or in numeric representation (1/0)
770  is >> (input.size() > 1 ? std::boolalpha : std::noboolalpha) >> b;
771  return b;
772  }
773 
774  std::map<std::string, std::string> parseParameters(std::string &endLine);
775 
776  inline std::string &ltrim(std::string &s) const
777  {
778  s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
779  return s;
780  }
781 
782  inline std::string &rtrim(std::string &s) const
783  {
784  s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
785  return s;
786  }
787 
788  inline std::string &trim(std::string &s) const { return ltrim(rtrim(s)); }
790 };
791 
792 #endif
virtual unsigned int getClipping() const
Definition: vpMbTracker.h:223
bool m_computeInteraction
Definition: vpMbTracker.h:187
virtual double getStopCriteriaEpsilon() const
Definition: vpMbTracker.h:392
bool computeProjError
Definition: vpMbTracker.h:135
virtual void setDisplayFeatures(const bool displayF)
Definition: vpMbTracker.h:470
virtual void setCovarianceComputation(const bool &flag)
Definition: vpMbTracker.h:452
virtual void setOgreShowConfigDialog(const bool showConfigDialog)
Definition: vpMbTracker.h:575
Implementation of a matrix and operations on matrices.
Definition: vpMatrix.h:104
vpMatrix covarianceMatrix
Covariance matrix.
Definition: vpMbTracker.h:132
bool parseBoolean(std::string &input)
Definition: vpMbTracker.h:763
virtual void getPose(vpHomogeneousMatrix &cMo_) const
Definition: vpMbTracker.h:381
unsigned int nbLines
Number of lines in CAO model.
Definition: vpMbTracker.h:164
unsigned int size() const
virtual void setAngleDisappear(const double &a)
Definition: vpMbTracker.h:433
unsigned int nbCircles
Number of circles in CAO model.
Definition: vpMbTracker.h:172
vpMbHiddenFaces< vpMbtPolygon > faces
Set of faces describing the object.
Definition: vpMbTracker.h:145
virtual unsigned int getMaxIter() const
Definition: vpMbTracker.h:265
Implementation of an homogeneous matrix and operations on such kind of matrices.
std::map< std::string, std::string > mapOfParameterNames
Definition: vpMbTracker.h:184
unsigned int nbCylinders
Number of cylinders in CAO model.
Definition: vpMbTracker.h:170
unsigned int nbPoints
Number of points in CAO model.
Definition: vpMbTracker.h:162
virtual void setOptimizationMethod(const vpMbtOptimizationMethod &opt)
Definition: vpMbTracker.h:510
Class to define colors available for display functionnalities.
Definition: vpColor.h:120
virtual double getInitialMu() const
Definition: vpMbTracker.h:251
vpHomogeneousMatrix cMo
The current pose.
Definition: vpMbTracker.h:115
bool modelInitialised
Definition: vpMbTracker.h:125
virtual double getProjectionError() const
Definition: vpMbTracker.h:277
error that can be emited by ViSP classes.
Definition: vpException.h:71
bool useOgre
Use Ogre3d for visibility tests.
Definition: vpMbTracker.h:157
virtual vpMbtOptimizationMethod getOptimizationMethod() const
Definition: vpMbTracker.h:351
std::string modelFileName
Definition: vpMbTracker.h:122
virtual void setMaxIter(const unsigned int max)
Definition: vpMbTracker.h:497
bool computeCovariance
Flag used to specify if the covariance matrix has to be computed or not.
Definition: vpMbTracker.h:130
virtual void setInitialMu(const double mu)
Definition: vpMbTracker.h:481
void setGoodNbRayCastingAttemptsRatio(const double &ratio)
Class that defines what is a point.
Definition: vpPoint.h:58
vpCameraParameters cam
The camera parameters.
Definition: vpMbTracker.h:113
double distFarClip
Distance for near clipping.
Definition: vpMbTracker.h:153
double projectionError
Definition: vpMbTracker.h:138
virtual vpHomogeneousMatrix getPose() const
Definition: vpMbTracker.h:390
virtual double getAngleDisappear() const
Definition: vpMbTracker.h:208
vpMatrix oJo
The Degrees of Freedom to estimate.
Definition: vpMbTracker.h:117
virtual void setGoodNbRayCastingAttemptsRatio(const double &ratio)
Definition: vpMbTracker.h:549
Implementation of a polygon of the model used by the model-based tracker.
Definition: vpMbtPolygon.h:66
virtual void setCameraParameters(const vpCameraParameters &camera)
Definition: vpMbTracker.h:440
bool useScanLine
Use Scanline for visibility tests.
Definition: vpMbTracker.h:160
double minLineLengthThresholdGeneral
Minimum line length threshold for LOD mode (general setting)
Definition: vpMbTracker.h:179
virtual void setStopCriteriaEpsilon(const double eps)
Definition: vpMbTracker.h:518
void setNbRayCastingAttemptsForVisibility(const unsigned int &attempts)
Generic class defining intrinsic camera parameters.
Main methods for a model-based tracker.
Definition: vpMbTracker.h:106
std::string & trim(std::string &s) const
Definition: vpMbTracker.h:788
double m_initialMu
Initial Mu for Levenberg Marquardt optimization loop.
Definition: vpMbTracker.h:195
double m_lambda
Gain of the virtual visual servoing stage.
Definition: vpMbTracker.h:189
unsigned int nbPolygonLines
Number of polygon lines in CAO model.
Definition: vpMbTracker.h:166
virtual void setAngleAppear(const double &a)
Definition: vpMbTracker.h:422
vpMbtOptimizationMethod m_optimizationMethod
Optimization method used.
Definition: vpMbTracker.h:142
virtual void setLambda(const double gain)
Definition: vpMbTracker.h:488
double angleAppears
Angle used to detect a face appearance.
Definition: vpMbTracker.h:147
virtual void setNbRayCastingAttemptsForVisibility(const unsigned int &attempts)
Definition: vpMbTracker.h:559
unsigned int m_maxIter
Maximum number of iterations of the virtual visual servoing stage.
Definition: vpMbTracker.h:191
std::string poseSavingFilename
Definition: vpMbTracker.h:128
unsigned int nbPolygonPoints
Number of polygon points in CAO model.
Definition: vpMbTracker.h:168
double m_stopCriteriaEpsilon
Epsilon threshold to stop the VVS optimization loop.
Definition: vpMbTracker.h:193
double minPolygonAreaThresholdGeneral
Minimum polygon area threshold for LOD mode (general setting)
Definition: vpMbTracker.h:181
bool displayFeatures
If true, the features are displayed.
Definition: vpMbTracker.h:140
virtual void getCameraParameters(vpCameraParameters &camera) const
Definition: vpMbTracker.h:215
bool ogreShowConfigDialog
Definition: vpMbTracker.h:158
virtual unsigned int getNbPolygon() const
Definition: vpMbTracker.h:335
bool applyLodSettingInConfig
Definition: vpMbTracker.h:177
Implementation of column vector and the associated operations.
Definition: vpColVector.h:72
virtual vpMatrix getCovarianceMatrix() const
Definition: vpMbTracker.h:232
Implementation of a pose vector and operations on poses.
Definition: vpPoseVector.h:92
virtual vpMbtPolygon * getPolygon(const unsigned int index)
Definition: vpMbTracker.h:362
Contains an M-Estimator and various influence function.
Definition: vpRobust.h:58
double angleDisappears
Angle used to detect a face disappearance.
Definition: vpMbTracker.h:149
virtual double getLambda() const
Definition: vpMbTracker.h:258
std::string & rtrim(std::string &s) const
Definition: vpMbTracker.h:782
void setPoseSavingFilename(const std::string &filename)
Definition: vpMbTracker.h:587
virtual void setScanLineVisibilityTest(const bool &v)
Definition: vpMbTracker.h:533
virtual double getNearClippingDistance() const
Definition: vpMbTracker.h:342
unsigned int clippingFlag
Flags specifying which clipping to used.
Definition: vpMbTracker.h:155
double distNearClip
Distance for near clipping.
Definition: vpMbTracker.h:151
bool useLodGeneral
True if LOD mode is enabled.
Definition: vpMbTracker.h:174
virtual vpMbHiddenFaces< vpMbtPolygon > & getFaces()
Definition: vpMbTracker.h:299
std::string & ltrim(std::string &s) const
Definition: vpMbTracker.h:776
bool isoJoIdentity
Boolean to know if oJo is identity (for fast computation)
Definition: vpMbTracker.h:119
virtual double getFarClippingDistance() const
Definition: vpMbTracker.h:306
virtual void setProjectionErrorComputation(const bool &flag)
Definition: vpMbTracker.h:531
virtual double getAngleAppear() const
Definition: vpMbTracker.h:205