Visual Servoing Platform  version 3.2.0 under development (2019-01-22)
servoAfma6Line2DCamVelocity.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  * Eric Marchand
38  *
39  *****************************************************************************/
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/sensor/vp1394TwoGrabber.h>
67 
68 #include <visp3/core/vpHomogeneousMatrix.h>
69 #include <visp3/core/vpLine.h>
70 #include <visp3/core/vpMath.h>
71 #include <visp3/me/vpMeLine.h>
72 #include <visp3/visual_features/vpFeatureBuilder.h>
73 #include <visp3/visual_features/vpFeatureLine.h>
74 #include <visp3/vs/vpServo.h>
75 
76 #include <visp3/robot/vpRobotAfma6.h>
77 
78 // Exception
79 #include <visp3/core/vpException.h>
80 #include <visp3/vs/vpServoDisplay.h>
81 
82 int main()
83 {
84  try {
86 
90 
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
102 
104  vpDisplay::flush(I);
105 
106  vpServo task;
107 
108  std::cout << std::endl;
109  std::cout << "-------------------------------------------------------" << std::endl;
110  std::cout << " Test program for vpServo " << std::endl;
111  std::cout << " Eye-in-hand task control, velocity computed in the camera frame" << std::endl;
112  std::cout << " Simulation " << std::endl;
113  std::cout << " task : servo a line " << std::endl;
114  std::cout << "-------------------------------------------------------" << std::endl;
115  std::cout << std::endl;
116 
117  vpMeLine line;
118 
119  vpMe me;
120  me.setRange(10);
121  me.setPointsToTrack(100);
122  me.setThreshold(100000);
123  me.setSampleStep(10);
125 
126  line.setMe(&me);
127 
128  // Initialize the tracking. Define the line to track.
129  line.initTracking(I);
130  line.track(I);
131 
132  vpRobotAfma6 robot;
133  // robot.move("pos-init.pos") ;
134 
135  vpCameraParameters cam;
136  // Update camera parameters
137  robot.getCameraParameters(cam, I);
138 
139  vpTRACE("sets the current position of the visual feature ");
140  vpFeatureLine p;
141  vpFeatureBuilder::create(p, cam, line);
142 
143  vpTRACE("sets the desired position of the visual feature ");
144  vpLine lined;
145  lined.setWorldCoordinates(1, 0, 0, 0, 0, 0, 1, 0);
146  vpHomogeneousMatrix cMo(0, 0, 0.3, 0, 0, vpMath::rad(0));
147  lined.project(cMo);
148  lined.setRho(-fabs(lined.getRho()));
149  lined.setTheta(0);
150 
151  vpFeatureLine pd;
152  vpFeatureBuilder::create(pd, lined);
153 
154  vpTRACE("define the task");
155  vpTRACE("\t we want an eye-in-hand control law");
156  vpTRACE("\t robot is controlled in the camera frame");
158 
159  vpTRACE("\t we want to see a point on a point..");
160  std::cout << std::endl;
161  task.addFeature(p, pd);
162 
163  vpTRACE("\t set the gain");
164  task.setLambda(0.2);
165 
166  vpTRACE("Display task information ");
167  task.print();
168 
170 
171  unsigned int iter = 0;
172  vpTRACE("\t loop");
173  vpColVector v;
174  for (;;) {
175  std::cout << "---------------------------------------------" << iter << std::endl;
176 
177  try {
178  g.acquire(I);
180 
181  // Track the line
182  line.track(I);
183  line.display(I, vpColor::red);
184 
185  // Update the current line feature
186  vpFeatureBuilder::create(p, cam, line);
187 
188  // displqy the current and the desired features
189  p.display(cam, I, vpColor::red);
190  pd.display(cam, I, vpColor::green);
191 
192  v = task.computeControlLaw();
193 
194  vpDisplay::flush(I);
195  if (iter == 0)
198  } catch (...) {
199  v = 0;
201  robot.stopMotion();
202  exit(1);
203  }
204 
205  vpTRACE("\t\t || s - s* || = %f ", (task.getError()).sumSquare());
206  iter++;
207  }
208 
209  vpTRACE("Display task information ");
210  task.print();
211  task.kill();
212  return EXIT_SUCCESS;
213  } catch (const vpException &e) {
214  std::cout << "Test failed with exception: " << e << std::endl;
215  return EXIT_FAILURE;
216  }
217 }
218 
219 #else
220 int main()
221 {
222  std::cout << "You do not have an afma6 robot connected to your computer..." << std::endl;
223  return EXIT_SUCCESS;
224 }
225 
226 #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 setWorldCoordinates(const double &A1, const double &B1, const double &C1, const double &D1, const double &A2, const double &B2, const double &C2, const double &D2)
Definition: vpLine.cpp:85
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
double getRho() const
Definition: vpLine.h:157
void open(vpImage< unsigned char > &I)
Class that defines a line in the object frame, the camera frame and the image plane. All the parameters must be set in meter.
Definition: vpLine.h:105
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
static double rad(double deg)
Definition: vpMath.h:102
void setRho(const double rho)
Definition: vpLine.h:124
void setTheta(const double theta)
Definition: vpLine.h:134
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