/usr/include/visp/vpGenericFeature.h is in libvisp-dev 2.8.0-4.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 | /****************************************************************************
*
* $Id: vpGenericFeature.h 4056 2013-01-05 13:04:42Z fspindle $
*
* This file is part of the ViSP software.
* Copyright (C) 2005 - 2013 by INRIA. All rights reserved.
*
* This software is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* ("GPL") version 2 as published by the Free Software Foundation.
* See the file LICENSE.txt at the root directory of this source
* distribution for additional information about the GNU GPL.
*
* For using ViSP with software that can not be combined with the GNU
* GPL, please contact INRIA about acquiring a ViSP Professional
* Edition License.
*
* See http://www.irisa.fr/lagadic/visp/visp.html for more information.
*
* This software was developed at:
* INRIA Rennes - Bretagne Atlantique
* Campus Universitaire de Beaulieu
* 35042 Rennes Cedex
* France
* http://www.irisa.fr/lagadic
*
* If you have questions regarding the use of this file, please contact
* INRIA at visp@inria.fr
*
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
*
* Description:
* Generic feature (used to create new feature not implemented in ViSP).
*
* Authors:
* Eric Marchand
*
*****************************************************************************/
#ifndef vpGenericFeature_hh
#define vpGenericFeature_hh
/*!
\file vpGenericFeature.h
\brief class that defines what is a generic feature (used to create new
feature not implemented in ViSP2
*/
#include <visp/vpMatrix.h>
#include <visp/vpBasicFeature.h>
#include <visp/vpRGBa.h>
#include <math.h>
/*!
\class vpGenericFeature
\ingroup VsFeatureGeneric
\brief Class that enables to define a feature or a set of features which are not implemented in ViSP as a specific class. It is indeed possible to create its own features, to use the corresponding interaction matrix, and to compute an error between the current and the desired feature. Moreover the created features can be mixed with features already implemented.
The following example shows how to use the vpGenericFeature class to create and use the feature \f$ log(Z) \f$ where Z corresponds to the depth of a point whose 2D coordinates in the camera frame are \f$ x \f$ and \f$ y \f$. The interaction matrix corresponding to this feature is \f[ L = \left[\begin{array}{cccccc} 0 & 0 & -1/Z & -y & x & 0 \end{array}\right]\f].
\code
#include <visp/vpGenericFeature.h>
#include <visp/vpServo.h>
int main()
{
vpServo task; // Visual servoing task
//First we have to define the desired feature log(Z*) corresponding to the desired point.
double xd = 0; //The x coordinate of the desired point.
double yd = 0; //The y coordinate of the desired point.
double Zd = 1; //The depth of the desired point.
vpGenericFeature logZd(1); //The dimension of the feature is 1.
logZd.set_s( log(Zd) );
//Then we have to define the current feature log(Z) corresponding to the current point.
double x = 1; //The x coordinate of the current point.
double y = 1; //The y coordinate of the current point.
double Z = 2; //The depth of the current point.
vpGenericFeature logZ(1); //The dimension of the feature is 1.
logZ.set_s( log(Z) );
// Set eye-in-hand control law.
// The computed velocities will be expressed in the camera frame
task.setServo(vpServo::EYEINHAND_CAMERA);
// Interaction matrix is computed with the current visual features sd
task.setInteractionMatrixType(vpServo::CURRENT);
// Add the point feature to the task
task.addFeature(logZ, logZd);
// Control loop
for ( ; ; ) {
// The new parameters x, y and Z must be computed here.
// Update the current point visual feature
logZ.set_s( log(Z) ) ;
// We have to compute the interaction matrix corresponding to the feature.
vpMatrix LlogZ(1,6) ;
LlogZ[0][0] = LlogZ[0][1] = LlogZ[0][5] = 0 ;
LlogZ[0][2] = -1/Z;
LlogZ[0][3] = -y;
LlogZ[0][4] = x;
logZ.setInteractionMatrix(LlogZ) ;
// compute the control law
vpColVector v = task.computeControlLaw(); // camera velocity
}
return 0;
}
\endcode
The second example shows how to create and use a feature whose specificity is to have a desired feature fixed to zero. It is the case for the feature \f$ log( \frac{Z}{Z^*}) \f$.
\code
#include <visp/vpGenericFeature.h>
#include <visp/vpServo.h>
int main()
{
vpServo task; // Visual servoing task
//First we have to define the desired feature log(Z*) corresponding to the desired point.
double xd = 0; //The x coordinate of the desired point.
double yd = 0; //The y coordinate of the desired point.
double Zd = 1; //The depth of the desired point.
//Then we have to define the current feature log(Z) corresponding to the current point.
double x = 1; //The x coordinate of the current point.
double y = 1; //The y coordinate of the current point.
double Z = 2; //The depth of the current point.
vpGenericFeature logZ(1); //The dimension of the feature is 1.
logZ.set_s( log(Z/Zd) );
// Set eye-in-hand control law.
// The computed velocities will be expressed in the camera frame
task.setServo(vpServo::EYEINHAND_CAMERA);
// Interaction matrix is computed with the current visual features sd
task.setInteractionMatrixType(vpServo::CURRENT);
// Add the point feature to the task
task.addFeature(logZ);
// Control loop
for ( ; ; ) {
// The new parameters x, y and Z must be computed here.
// Update the current point visual feature
logZ.set_s( log(Z/Zd) ) ;
// We have to compute the interaction matrix corresponding to the feature.
vpMatrix LlogZ(1,6) ;
LlogZ[0][0] = LlogZ[0][1] = LlogZ[0][5] = 0 ;
LlogZ[0][2] = -1/Z;
LlogZ[0][3] = -y;
LlogZ[0][4] = x;
logZ.setInteractionMatrix(LlogZ) ;
// compute the control law
vpColVector v = task.computeControlLaw(); // camera velocity
}
return 0;
}
\endcode
If the feature needs to be use with other features, the example servoSimuPoint2DhalfCamVelocity2.cpp shows how to do it.
*/
class VISP_EXPORT vpGenericFeature : public vpBasicFeature
{
private:
vpGenericFeature() ;
public:
void init() ;
vpGenericFeature(unsigned int dim) ;
virtual ~vpGenericFeature() ;
public:
vpMatrix interaction(const unsigned int select = FEATURE_ALL);
vpColVector error(const vpBasicFeature &s_star,
const unsigned int select = FEATURE_ALL) ;
vpColVector error(const unsigned int select = FEATURE_ALL) ;
void print(const unsigned int select = FEATURE_ALL ) const ;
vpGenericFeature *duplicate() const ;
private:
typedef enum
{
errorNotInitalized,
errorInitialized,
errorHasToBeUpdated
} vpGenericFeatureErrorType;
vpMatrix L ;
vpColVector err ;
vpGenericFeatureErrorType errorStatus ;
public:
void setInteractionMatrix(const vpMatrix &L) ;
vpMatrix getInteractionMatrix() const { return L ; }
void setError(vpColVector &error) ;
void set_s(const vpColVector &s) ;
void set_s(const double s0) ;
void set_s(const double s0, const double s1) ;
void set_s(const double s0, const double s1, const double s2) ;
void get_s(vpColVector &s) const;
void get_s(double &s0) const;
void get_s(double &s0, double &s1) const;
void get_s(double &s0, double &s1, double &s2) const;
public:
void display(const vpCameraParameters &cam,
const vpImage<unsigned char> &I,
const vpColor &color=vpColor::green,
unsigned int thickness=1) const ;
void display(const vpCameraParameters &cam,
const vpImage<vpRGBa> &I,
const vpColor &color=vpColor::green,
unsigned int thickness=1) const ;
} ;
#endif
/*
* Local variables:
* c-basic-offset: 2
* End:
*/
|