Visual Servoing Platform  version 3.2.0 under development (2019-01-22)
servoAfma6Cylinder2DCamVelocity.cpp
1 /****************************************************************************
2  *
3  * ViSP, open source Visual Servoing Platform software.
4  * Copyright (C) 2005 - 2019 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  * tests the control law
33  * eye-in-hand control
34  * velocity computed in the camera frame
35  *
36  * Authors:
37  * Nicolas Melchior
38  *
39  *****************************************************************************/
40 
54 #include <cmath> // std::fabs
55 #include <limits> // numeric_limits
56 #include <stdlib.h>
57 #include <visp3/core/vpConfig.h>
58 #include <visp3/core/vpDebug.h> // Debug trace
59 #if (defined(VISP_HAVE_AFMA6) && defined(VISP_HAVE_DC1394))
60 
61 #include <visp3/core/vpDisplay.h>
62 #include <visp3/core/vpImage.h>
63 #include <visp3/gui/vpDisplayGTK.h>
64 #include <visp3/gui/vpDisplayOpenCV.h>
65 #include <visp3/gui/vpDisplayX.h>
66 #include <visp3/io/vpImageIo.h>
67 #include <visp3/sensor/vp1394TwoGrabber.h>
68 
69 #include <visp3/core/vpCylinder.h>
70 #include <visp3/core/vpHomogeneousMatrix.h>
71 #include <visp3/core/vpMath.h>
72 #include <visp3/me/vpMeLine.h>
73 #include <visp3/visual_features/vpFeatureBuilder.h>
74 #include <visp3/visual_features/vpFeatureLine.h>
75 #include <visp3/vs/vpServo.h>
76 
77 #include <visp3/robot/vpRobotAfma6.h>
78 
79 // Exception
80 #include <visp3/core/vpException.h>
81 #include <visp3/vs/vpServoDisplay.h>
82 
83 int main()
84 {
85  try {
87 
91  g.open(I);
92 
93  g.acquire(I);
94 
95 #ifdef VISP_HAVE_X11
96  vpDisplayX display(I, 100, 100, "Current image");
97 #elif defined(VISP_HAVE_OPENCV)
98  vpDisplayOpenCV display(I, 100, 100, "Current image");
99 #elif defined(VISP_HAVE_GTK)
100  vpDisplayGTK display(I, 100, 100, "Current image");
101 #endif
103  vpDisplay::flush(I);
104 
105  vpServo task;
106 
107  std::cout << std::endl;
108  std::cout << "-------------------------------------------------------" << std::endl;
109  std::cout << " Test program for vpServo " << std::endl;
110  std::cout << " Eye-in-hand task control, velocity computed in the camera frame" << std::endl;
111  std::cout << " Simulation " << std::endl;
112  std::cout << " task : servo a point " << std::endl;
113  std::cout << "-------------------------------------------------------" << std::endl;
114  std::cout << std::endl;
115 
116  int i;
117  int nbline = 2;
118  vpMeLine line[nbline];
119 
120  vpMe me;
121  me.setRange(10);
122  me.setPointsToTrack(100);
123  me.setThreshold(30000);
124  me.setSampleStep(10);
125 
126  // Initialize the tracking of the two edges of the cylinder
127  for (i = 0; i < nbline; i++) {
129  line[i].setMe(&me);
130 
131  line[i].initTracking(I);
132  line[i].track(I);
133  }
134 
135  vpRobotAfma6 robot;
136  // robot.move("zero.pos") ;
137 
138  vpCameraParameters cam;
139  // Update camera parameters
140  robot.getCameraParameters(cam, I);
141 
142  vpTRACE("sets the current position of the visual feature ");
143  vpFeatureLine p[nbline];
144  for (i = 0; i < nbline; i++)
145  vpFeatureBuilder::create(p[i], cam, line[i]);
146 
147  vpTRACE("sets the desired position of the visual feature ");
148  vpCylinder cyld(0, 1, 0, 0, 0, 0, 0.04);
149 
150  vpHomogeneousMatrix cMo(0, 0, 0.4, 0, 0, vpMath::rad(0));
151 
152  cyld.project(cMo);
153 
154  vpFeatureLine pd[nbline];
157 
158  // Those lines are needed to keep the conventions define in vpMeLine
159  // (Those in vpLine are less restrictive) Another way to have the
160  // coordinates of the desired features is to learn them before executing
161  // the program.
162  pd[0].setRhoTheta(-fabs(pd[0].getRho()), 0);
163  pd[1].setRhoTheta(-fabs(pd[1].getRho()), M_PI);
164 
165  vpTRACE("define the task");
166  vpTRACE("\t we want an eye-in-hand control law");
167  vpTRACE("\t robot is controlled in the camera frame");
170 
171  vpTRACE("\t we want to see a two lines on two lines..");
172  std::cout << std::endl;
173  for (i = 0; i < nbline; i++)
174  task.addFeature(p[i], pd[i]);
175 
176  vpTRACE("\t set the gain");
177  task.setLambda(0.2);
178 
179  vpTRACE("Display task information ");
180  task.print();
181 
183 
184  unsigned int iter = 0;
185  vpTRACE("\t loop");
186  vpColVector v;
187  vpImage<vpRGBa> Ic;
188  double lambda_av = 0.05;
189  double alpha = 0.2;
190  double beta = 3;
191  for (;;) {
192  std::cout << "---------------------------------------------" << iter << std::endl;
193 
194  try {
195  g.acquire(I);
197 
198  // Track the two edges and update the features
199  for (i = 0; i < nbline; i++) {
200  line[i].track(I);
201  line[i].display(I, vpColor::red);
202 
203  vpFeatureBuilder::create(p[i], cam, line[i]);
204  vpTRACE("%f %f ", line[i].getRho(), line[i].getTheta());
205 
206  p[i].display(cam, I, vpColor::red);
207  pd[i].display(cam, I, vpColor::green);
208  }
209 
210  vpDisplay::flush(I);
211 
212  // Adaptative gain
213  double gain;
214  {
215  if (std::fabs(alpha) <= std::numeric_limits<double>::epsilon())
216  gain = lambda_av;
217  else {
218  gain = alpha * exp(-beta * (task.getError()).sumSquare()) + lambda_av;
219  }
220  }
221  task.setLambda(gain);
222 
223  v = task.computeControlLaw();
224 
225  if (iter == 0)
228  } catch (...) {
229  v = 0;
231  robot.stopMotion();
232  exit(1);
233  }
234 
235  vpTRACE("\t\t || s - s* || = %f ", (task.getError()).sumSquare());
236  iter++;
237  }
238 
239  vpTRACE("Display task information ");
240  task.print();
241  task.kill();
242  return EXIT_SUCCESS;
243  }
244  catch (const vpException &e) {
245  std::cout << "Test failed with exception: " << e << std::endl;
246  return EXIT_FAILURE;
247  }
248 }
249 
250 #else
251 int main()
252 {
253  std::cout << "You do not have an afma6 robot connected to your computer..." << std::endl;
254  return EXIT_SUCCESS;
255 }
256 
257 #endif
void getCameraParameters(vpCameraParameters &cam, const unsigned int &image_width, const unsigned int &image_height) const
Definition: vpAfma6.cpp:1190
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
void setPointsToTrack(const int &n)
Definition: vpMe.h:264
Implementation of an homogeneous matrix and operations on such kind of matrices.
void setSampleStep(const double &s)
Definition: vpMe.h:278
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition: vpDisplayX.h:151
void addFeature(vpBasicFeature &s, vpBasicFeature &s_star, const unsigned int select=vpBasicFeature::FEATURE_ALL)
Definition: vpServo.cpp:497
error that can be emited by ViSP classes.
Definition: vpException.h:71
void track(const vpImage< unsigned char > &Im)
Definition: vpMeLine.cpp:747
Definition: vpMe.h:60
static const vpColor green
Definition: vpColor.h:183
void acquire(vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
Control of Irisa&#39;s gantry robot named Afma6.
Definition: vpRobotAfma6.h:212
static const vpColor red
Definition: vpColor.h:180
void display(const vpImage< unsigned char > &I, vpColor col)
Definition: vpMeLine.cpp:224
void open(vpImage< unsigned char > &I)
void kill()
Definition: vpServo.cpp:192
Initialize the velocity controller.
Definition: vpRobot.h:67
vpColVector getError() const
Definition: vpServo.h:282
vpColVector computeControlLaw()
Definition: vpServo.cpp:935
void display(const vpCameraParameters &cam, const vpImage< unsigned char > &I, const vpColor &color=vpColor::green, unsigned int thickness=1) const
#define vpTRACE
Definition: vpDebug.h:416
void setDisplay(vpMeSite::vpMeSiteDisplayType select)
Definition: vpMeTracker.h:104
static void display(const vpImage< unsigned char > &I)
Class that tracks in an image a line moving edges.
Definition: vpMeLine.h:151
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Generic class defining intrinsic camera parameters.
void setLambda(double c)
Definition: vpServo.h:406
Class that defines a 2D line visual feature which is composed by two parameters that are and ...
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
Definition: vpDisplayGTK.h:138
vpRobot::vpRobotStateType setRobotState(vpRobot::vpRobotStateType newState)
void initTracking(const vpImage< unsigned char > &I)
Definition: vpMeLine.cpp:236
void setInteractionMatrixType(const vpServoIteractionMatrixType &interactionMatrixType, const vpServoInversionType &interactionMatrixInversion=PSEUDO_INVERSE)
Definition: vpServo.cpp:574
static double rad(double deg)
Definition: vpMath.h:102
Class that defines what is a cylinder.
Definition: vpCylinder.h:96
Implementation of column vector and the associated operations.
Definition: vpColVector.h:72
void setFramerate(vp1394TwoFramerateType fps)
void setVideoMode(vp1394TwoVideoModeType videomode)
void setThreshold(const double &t)
Definition: vpMe.h:300
void print(const vpServo::vpServoPrintType display_level=ALL, std::ostream &os=std::cout)
Definition: vpServo.cpp:313
Class for firewire ieee1394 video devices using libdc1394-2.x api.
void setVelocity(const vpRobot::vpControlFrameType frame, const vpColVector &velocity)
static void create(vpFeaturePoint &s, const vpCameraParameters &cam, const vpDot &d)
void setRange(const unsigned int &r)
Definition: vpMe.h:271
void setMe(vpMe *p_me)
Definition: vpMeTracker.h:144
void setServo(const vpServoType &servo_type)
Definition: vpServo.cpp:223
void setRhoTheta(const double rho, const double theta)