FeatureMomentCommon

class FeatureMomentCommon(self, moments: visp._visp.core.MomentDatabase, A: float = 0.0, B: float = 0.0, C: float = 1.0)

Bases: FeatureMomentDatabase

This class allows to access common vpFeatureMoments in a pre-filled database.

It is a vpMomentDatabase filled with the following moments:

  • vpFeatureMomentGravityCenter

  • vpFeatureMomentGravityCenterNormalized

  • vpFeatureMomentAreaNormalized

  • vpFeatureMomentCInvariant

  • vpFeatureMomentAlpha

  • vpFeatureMomentCentered

  • vpFeatureMomentBasic

There is no need to do the linkTo operations manually nor is it necessary to care about the order of feature computation.

This class has an vpMomentCommon::updateAll method capable of updating the plane parameters AND computing interaction matrices inside the features.

The moment features computed by this class are classical moments features used in moment-based visual servoing. For more information see [42] .

To initialize this feature set, the user needs to supply a vpMomentDatabase containing at least the contents of vpMomentCommon .

The features can be retrieved like from a normal vpFeatureMomentDatabase . However, some shortcuts to retrieve the features are provided.

Warning

Make sure your object is at least of order 6 when using this pre-filled database.

The following code demonstrates the construction of a 6x6 interaction matrix as described in [1].

#include <iostream>
#include <vector>
#include <visp3/core/vpMomentCommon.h>
#include <visp3/core/vpMomentObject.h>
#include <visp3/core/vpPoint.h>
#include <visp3/visual_features/vpFeatureMoment.h>
#include <visp3/visual_features/vpFeatureMomentCommon.h>
#include <visp3/vs/vpServo.h>

#ifdef ENABLE_VISP_NAMESPACE
using namespace VISP_NAMESPACE_NAME;
#endif

int main()
{
 // Define source polygon
  vpPoint p;
  std::vector<vpPoint> vec_p; // vector that contains the vertices of the contour polygon

  p.set_x(-0.2); p.set_y(0.1); // coordinates in meters in the image plane (vertex 1)
  vec_p.push_back(p);
  p.set_x(+0.3); p.set_y(0.1); // coordinates in meters in the image plane (vertex 2)
  vec_p.push_back(p);
  p.set_x(+0.2); p.set_y(-0.1); // coordinates in meters in the image plane (vertex 3)
  vec_p.push_back(p);
  p.set_x(-0.2); p.set_y(-0.15); // coordinates in meters in the image plane (vertex 4)
  vec_p.push_back(p);
  p.set_x(-0.2); p.set_y(0.1); // close the contour (vertex 5 = vertex 1)
  vec_p.push_back(p);

  vpMomentObject src(6); // Create a source moment object with 6 as maximum order
  src.setType(vpMomentObject::DENSE_POLYGON); // The object is defined by a contour polygon
  src.fromVector(vec_p); // Init the dense object with the source polygon
  vec_p.clear();

  //Define destination polygon. This is the source polygon translated
  //of 0.1 on x-axis
  p.set_x(-0.1); p.set_y(0.1); // coordinates in meters in the image plane (vertex 1)
  vec_p.push_back(p);
  p.set_x(+0.4); p.set_y(0.1); // coordinates in meters in the image plane (vertex 2)
  vec_p.push_back(p);
  p.set_x(+0.3); p.set_y(-0.1); // coordinates in meters in the image plane (vertex 3)
  vec_p.push_back(p);
  p.set_x(-0.1); p.set_y(-0.15); // coordinates in meters in the image plane (vertex 4)
  vec_p.push_back(p);
  p.set_x(-0.1); p.set_y(0.1); // close the contour (vertex 5 = vertex 1)
  vec_p.push_back(p);

  vpMomentObject dst(6); // Create a destination moment object with 6 as maximum order
  dst.setType(vpMomentObject::DENSE_POLYGON); // The object is defined by a contour polygon
  dst.fromVector(vec_p); // Init the dense object with the destination
                        // polygon

  //init classic moment primitives (for source)
  vpMomentCommon mdb_src(vpMomentCommon::getSurface(dst),vpMomentCommon::getMu3(dst),vpMomentCommon::getAlpha(dst),1.);
  //Init classic features
  vpFeatureMomentCommon fmdb_src(mdb_src);

  ////init classic moment primitives (for destination)
  vpMomentCommon mdb_dst(vpMomentCommon::getSurface(dst),vpMomentCommon::getMu3(dst),vpMomentCommon::getAlpha(dst),1.);
  //Init classic features
  vpFeatureMomentCommon fmdb_dst(mdb_dst);

  //update+compute moment primitives from object (for source)
  mdb_src.updateAll(src);
  //update+compute features (+interaction matrices) from plane
  fmdb_src.updateAll(0.,0.,1.);

  //update+compute moment primitives from object (for destination)
  mdb_dst.updateAll(dst);
  //update+compute features (+interaction matrices) from plane
  fmdb_dst.updateAll(0.,0.,1.);

  //define visual servoing task
  vpServo task;
  task.setServo(vpServo::EYEINHAND_CAMERA);
  task.setInteractionMatrixType(vpServo::CURRENT);

  //Add all classic features to the task
  //In this example, source and destination features are translated by 0.1
  //will produce a movement of 0.1 on x-axis.
  task.addFeature(fmdb_src.getFeatureGravityNormalized(),fmdb_dst.getFeatureGravityNormalized());
  task.addFeature(fmdb_src.getFeatureAn(),fmdb_dst.getFeatureAn());
  //the object is NOT symmetric
  //select C4 and C6
  task.addFeature(fmdb_src.getFeatureCInvariant(),fmdb_dst.getFeatureCInvariant(),(1 << 3) | (1 << 5));
  task.addFeature(fmdb_src.getFeatureAlpha(),fmdb_dst.getFeatureAlpha());

  task.setLambda(1) ;
  vpColVector v = task.computeControlLaw() ;

  task.print();

  return 0;
}

This code produces the following output:

Visual servoing task:
Type of control law
Eye-in-hand configuration
Control in the camera frame
List of visual features : s
0.0166667,-0.00833333,
1,
-0.312148,0.0249916,
-1.43449,
List of desired visual features : s*
0.116667,-0.00833333,
1,
-0.312148,0.0249916,
-1.43449,
Interaction Matrix Ls
-1  0  -6.938893904e-18  0.007291666667  -1.06875  -0.008333333333
0  -1  3.469446952e-18  1.0171875  -0.007291666667  -0.01666666667
0  0  -1  0.0125  0.025  0
0  0  -4.585529113e-15  -0.2983860943  0.5832596643  -4.376751552e-16
0  0  -3.58244462e-15  0.08633028234  -0.2484618767  3.63421192e-16
4.353086256e-17  -1.339411156e-16  -0  -0.03019436997  -0.0168230563  -1
Error vector (s-s*)
-0.1  0  0  1.831867991e-15  -1.072059108e-15  0
Gain : Zero= 1  Inf= 1  Deriv= 0

Constructor which initializes and links all common features in the database

Parameters:
moments: visp._visp.core.MomentDatabase

database for moment primitives

A: float = 0.0

first plane coefficient for a plane equation of the following type Ax+By+C=1/Z

B: float = 0.0

second plane coefficient for a plane equation of the following type Ax+By+C=1/Z

C: float = 1.0

third plane coefficient for a plane equation of the following type Ax+By+C=1/Z

Methods

__init__

Constructor which initializes and links all common features in the database

getFeatureAlpha

Returns alpha.

getFeatureAn

Returns normalized surface.

getFeatureArea

Returns the area.

getFeatureCInvariant

Returns non-symmetric invariants.

getFeatureCentered

Returns centered moments.

getFeatureGravityCenter

Returns gravity center.

getFeatureGravityNormalized

Returns normalized gravity center.

getFeatureMomentBasic

Returns basic moment.

updateAll

Overloaded function.

Inherited Methods

get

param feature_name:

The name of the feature, the one specified when using add

Operators

__doc__

__init__

Constructor which initializes and links all common features in the database

__module__

Attributes

__annotations__

__init__(self, moments: visp._visp.core.MomentDatabase, A: float = 0.0, B: float = 0.0, C: float = 1.0)

Constructor which initializes and links all common features in the database

Parameters:
moments: visp._visp.core.MomentDatabase

database for moment primitives

A: float = 0.0

first plane coefficient for a plane equation of the following type Ax+By+C=1/Z

B: float = 0.0

second plane coefficient for a plane equation of the following type Ax+By+C=1/Z

C: float = 1.0

third plane coefficient for a plane equation of the following type Ax+By+C=1/Z

get(self, feature_name: str, found: bool) tuple[visp._visp.visual_features.FeatureMoment, bool]
Parameters:
feature_name: str

The name of the feature, the one specified when using add

found: bool

true if the type string is found inside the database, false otherwise

Returns:

A tuple containing:

  • the moment feature corresponding to the type string

  • found: true if the type string is found inside the database, false otherwise

getFeatureAlpha(self) visp._visp.visual_features.FeatureMomentAlpha

Returns alpha.

getFeatureAn(self) visp._visp.visual_features.FeatureMomentAreaNormalized

Returns normalized surface.

getFeatureArea(self) visp._visp.visual_features.FeatureMomentArea

Returns the area.

getFeatureCInvariant(self) visp._visp.visual_features.FeatureMomentCInvariant

Returns non-symmetric invariants.

getFeatureCentered(self) visp._visp.visual_features.FeatureMomentCentered

Returns centered moments.

getFeatureGravityCenter(self) visp._visp.visual_features.FeatureMomentGravityCenter

Returns gravity center.

getFeatureGravityNormalized(self) visp._visp.visual_features.FeatureMomentGravityCenterNormalized

Returns normalized gravity center.

getFeatureMomentBasic(self) visp._visp.visual_features.FeatureMomentBasic

Returns basic moment.

updateAll(*args, **kwargs)

Overloaded function.

  1. updateAll(self: visp._visp.visual_features.FeatureMomentCommon, A: float, B: float, C: float) -> None

Update all moment features in the database with plane coefficients

Parameters:
A

first plane coefficient for a plane equation of the following type Ax+By+C=1/Z

B

second plane coefficient for a plane equation of the following type Ax+By+C=1/Z

C

third plane coefficient for a plane equation of the following type Ax+By+C=1/Z

  1. updateAll(self: visp._visp.visual_features.FeatureMomentDatabase, A: float = 0.0, B: float = 0.0, C: float = 1.0) -> None

Update all moment features in the database with plane coefficients

Parameters:
A

first plane coefficient for a plane equation of the following type Ax+By+C=1/Z

B

second plane coefficient for a plane equation of the following type Ax+By+C=1/Z

C

third plane coefficient for a plane equation of the following type Ax+By+C=1/Z