Visual Servoing Platform  version 3.4.0
servoSimu4Points.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  * Demonstration of the wireframe simulator with a simple visual servoing
33  *
34  * Authors:
35  * Nicolas Melchior
36  *
37  *****************************************************************************/
38 
45 #include <stdlib.h>
46 
47 #include <visp3/core/vpCameraParameters.h>
48 #include <visp3/core/vpHomogeneousMatrix.h>
49 #include <visp3/core/vpImage.h>
50 #include <visp3/core/vpIoTools.h>
51 #include <visp3/core/vpMath.h>
52 #include <visp3/core/vpTime.h>
53 #include <visp3/core/vpVelocityTwistMatrix.h>
54 #include <visp3/gui/vpDisplayD3D.h>
55 #include <visp3/gui/vpDisplayGDI.h>
56 #include <visp3/gui/vpDisplayGTK.h>
57 #include <visp3/gui/vpDisplayOpenCV.h>
58 #include <visp3/gui/vpDisplayX.h>
59 #include <visp3/gui/vpPlot.h>
60 #include <visp3/io/vpImageIo.h>
61 #include <visp3/io/vpParseArgv.h>
62 #include <visp3/robot/vpSimulatorCamera.h>
63 #include <visp3/robot/vpWireFrameSimulator.h>
64 #include <visp3/visual_features/vpFeatureBuilder.h>
65 #include <visp3/visual_features/vpFeaturePoint.h>
66 #include <visp3/vs/vpServo.h>
67 
68 #define GETOPTARGS "dhp"
69 
70 #if defined(VISP_HAVE_DISPLAY) \
71  && (defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
72 
82 void usage(const char *name, std::string ipath, const char *badparam)
83 {
84  fprintf(stdout, "\n\
85 Demonstration of the wireframe simulator with a simple visual servoing.\n\
86  \n\
87 The visual servoing consists in bringing the camera at a desired \n\
88 position from the object.\n\
89  \n\
90 The visual features used to compute the pose of the camera and \n\
91 thus the control law are four points.\n\
92  \n\
93 This demonstration explains also how to move the object around a world\n\
94 reference frame. Here, the movement is a rotation around the x and y axis\n\
95 at a given distance from the world frame. In fact the object trajectory\n\
96 is on a sphere whose center is the origin of the world frame.\n\
97  \n\
98 SYNOPSIS\n\
99  %s [-d] [-p] [-h]\n", name);
100 
101  fprintf(stdout, "\n\
102 OPTIONS: Default\n\
103  -i <input image path> %s\n\
104  Set mire.pgm image input path.\n\
105  From this path read \"mire/mire.pgm\" image.\n\
106  Setting the VISP_INPUT_IMAGE_PATH environment variable \n\
107  produces the same behaviour than using this option.\n\
108  \n\
109  -d \n\
110  Turn off the display.\n\
111  \n\
112  -p \n\
113  Turn off the plotter.\n\
114  \n\
115  -h\n\
116  Print the help.\n", ipath.c_str());
117 
118  if (badparam)
119  fprintf(stdout, "\nERROR: Bad parameter [%s]\n", badparam);
120 }
121 
135 bool getOptions(int argc, const char **argv, std::string &ipath, bool &display, bool &plot)
136 {
137  const char *optarg_;
138  int c;
139  while ((c = vpParseArgv::parse(argc, argv, GETOPTARGS, &optarg_)) > 1) {
140 
141  switch (c) {
142  case 'i':
143  ipath = optarg_;
144  break;
145  case 'd':
146  display = false;
147  break;
148  case 'p':
149  plot = false;
150  break;
151  case 'h':
152  usage(argv[0], ipath, NULL);
153  return false;
154 
155  default:
156  usage(argv[0], ipath, optarg_);
157  return false;
158  }
159  }
160 
161  if ((c == 1) || (c == -1)) {
162  // standalone param or error
163  usage(argv[0], ipath, NULL);
164  std::cerr << "ERROR: " << std::endl;
165  std::cerr << " Bad argument " << optarg_ << std::endl << std::endl;
166  return false;
167  }
168 
169  return true;
170 }
171 
172 int main(int argc, const char **argv)
173 {
174  try {
175  bool opt_display = true;
176  bool opt_plot = true;
177  std::string opt_ipath;
178  std::string env_ipath;
179  std::string ipath;
180  std::string filename;
181 
182  // Read the command line options
183  if (getOptions(argc, argv, opt_ipath, opt_display, opt_plot) == false) {
184  exit(-1);
185  }
186 
187  vpImage<vpRGBa> Iint(480, 640, 255);
188  vpImage<vpRGBa> Iext1(480, 640, 255);
189  vpImage<vpRGBa> Iext2(480, 640, 255);
190 
191 #if defined VISP_HAVE_X11
192  vpDisplayX display[3];
193 #elif defined VISP_HAVE_OPENCV
194  vpDisplayOpenCV display[3];
195 #elif defined VISP_HAVE_GDI
196  vpDisplayGDI display[3];
197 #elif defined VISP_HAVE_D3D9
198  vpDisplayD3D display[3];
199 #elif defined VISP_HAVE_GTK
200  vpDisplayGTK display[3];
201 #endif
202 
203  if (opt_display) {
204  // Display size is automatically defined by the image (I) size
205  display[0].init(Iint, 100, 100, "The internal view");
206  display[1].init(Iext1, 100, 100, "The first external view");
207  display[2].init(Iext2, 100, 100, "The second external view");
208  vpDisplay::setWindowPosition(Iint, 0, 0);
209  vpDisplay::setWindowPosition(Iext1, 750, 0);
210  vpDisplay::setWindowPosition(Iext2, 0, 550);
211  vpDisplay::display(Iint);
212  vpDisplay::flush(Iint);
213  vpDisplay::display(Iext1);
214  vpDisplay::flush(Iext1);
215  vpDisplay::display(Iext2);
216  vpDisplay::flush(Iext2);
217  }
218 
219  vpPlot *plotter = NULL;
220 
221  if (opt_plot) {
222  plotter = new vpPlot(2, 480, 640, 750, 550, "Real time curves plotter");
223  plotter->setTitle(0, "Visual features error");
224  plotter->setTitle(1, "Camera velocities");
225  plotter->initGraph(0, 8);
226  plotter->initGraph(1, 6);
227  plotter->setLegend(0, 0, "error_feat_p1_x");
228  plotter->setLegend(0, 1, "error_feat_p1_y");
229  plotter->setLegend(0, 2, "error_feat_p2_x");
230  plotter->setLegend(0, 3, "error_feat_p2_y");
231  plotter->setLegend(0, 4, "error_feat_p3_x");
232  plotter->setLegend(0, 5, "error_feat_p3_y");
233  plotter->setLegend(0, 6, "error_feat_p4_x");
234  plotter->setLegend(0, 7, "error_feat_p4_y");
235  plotter->setLegend(1, 0, "vc_x");
236  plotter->setLegend(1, 1, "vc_y");
237  plotter->setLegend(1, 2, "vc_z");
238  plotter->setLegend(1, 3, "wc_x");
239  plotter->setLegend(1, 4, "wc_y");
240  plotter->setLegend(1, 5, "wc_z");
241  }
242 
243  vpServo task;
244  vpSimulatorCamera robot;
245  float sampling_time = 0.020f; // Sampling period in second
246  robot.setSamplingTime(sampling_time);
247 
248  // Since the task gain lambda is very high, we need to increase default
249  // max velocities
250  robot.setMaxTranslationVelocity(10);
252 
253  // Set initial position of the object in the camera frame
254  vpHomogeneousMatrix cMo(0, 0.1, 2.0, vpMath::rad(35), vpMath::rad(25), 0);
255  // Set desired position of the object in the camera frame
256  vpHomogeneousMatrix cdMo(0.0, 0.0, 1.0, vpMath::rad(0), vpMath::rad(0), vpMath::rad(0));
257  // Set initial position of the object in the world frame
258  vpHomogeneousMatrix wMo(0.0, 0.0, 0.2, 0, 0, 0);
259  // Position of the camera in the world frame
261  wMc = wMo * cMo.inverse();
262 
263  // The four point used as visual features
264  vpPoint point[4];
265  point[0].setWorldCoordinates(-0.1, -0.1, 0);
266  point[3].setWorldCoordinates(-0.1, 0.1, 0);
267  point[2].setWorldCoordinates(0.1, 0.1, 0);
268  point[1].setWorldCoordinates(0.1, -0.1, 0);
269 
270  // Projection of the points
271  for (int i = 0; i < 4; i++)
272  point[i].track(cMo);
273 
274  // Set the current visual feature
275  vpFeaturePoint p[4];
276  for (int i = 0; i < 4; i++)
277  vpFeatureBuilder::create(p[i], point[i]);
278 
279  // Projection of the points
280  for (int i = 0; i < 4; i++)
281  point[i].track(cdMo);
282 
283  vpFeaturePoint pd[4];
284  for (int i = 0; i < 4; i++)
285  vpFeatureBuilder::create(pd[i], point[i]);
286 
289 
290  vpHomogeneousMatrix cMe; // Identity
291  vpVelocityTwistMatrix cVe(cMe);
292  task.set_cVe(cVe);
293 
294  vpMatrix eJe;
295  robot.get_eJe(eJe);
296  task.set_eJe(eJe);
297 
298  for (int i = 0; i < 4; i++)
299  task.addFeature(p[i], pd[i]);
300 
301  task.setLambda(10);
302 
303  std::list<vpImageSimulator> list;
304  vpImageSimulator imsim;
305 
306  vpColVector X[4];
307  for (int i = 0; i < 4; i++)
308  X[i].resize(3);
309  X[0][0] = -0.2;
310  X[0][1] = -0.2;
311  X[0][2] = 0;
312 
313  X[1][0] = 0.2;
314  X[1][1] = -0.2;
315  X[1][2] = 0;
316 
317  X[2][0] = 0.2;
318  X[2][1] = 0.2;
319  X[2][2] = 0;
320 
321  X[3][0] = -0.2;
322  X[3][1] = 0.2;
323  X[3][2] = 0;
324 
325  // Get the visp-images-data package path or VISP_INPUT_IMAGE_PATH
326  // environment variable value
327  env_ipath = vpIoTools::getViSPImagesDataPath();
328 
329  if (!env_ipath.empty())
330  ipath = env_ipath;
331 
332  if (!opt_ipath.empty())
333  ipath = opt_ipath;
334 
335  filename = vpIoTools::createFilePath(ipath, "mire/mire.pgm");
336 
337  imsim.init(filename.c_str(), X);
338 
339  list.push_back(imsim);
340 
342 
343  // Set the scene
345 
346  // Initialize simulator frames
347  sim.set_fMo(wMo); // Position of the object in the world reference frame
348  sim.setCameraPositionRelObj(cMo); // Initial position of the object in the camera frame
349  sim.setDesiredCameraPosition(cdMo); // Desired position of the object in the camera frame
350 
351  // Set the External camera position
352  vpHomogeneousMatrix camMf(vpHomogeneousMatrix(0.0, 0, 3.5, vpMath::rad(0), vpMath::rad(30), 0));
353  sim.setExternalCameraPosition(camMf);
354 
355  // Computes the position of a camera which is fixed in the object frame
356  vpHomogeneousMatrix camoMf(0, 0.0, 1.5, 0, vpMath::rad(140), 0);
357  camoMf = camoMf * (sim.get_fMo().inverse());
358 
359  // Set the parameters of the cameras (internal and external)
360  vpCameraParameters camera(1000, 1000, 320, 240);
361  sim.setInternalCameraParameters(camera);
362  sim.setExternalCameraParameters(camera);
363 
364  int max_iter = 10;
365 
366  if (opt_display) {
367  max_iter = 2500;
368 
369  // Get the internal and external views
370  sim.getInternalImage(Iint);
371  sim.getExternalImage(Iext1);
372  sim.getExternalImage(Iext2, camoMf);
373 
374  // Display the object frame (current and desired position)
375  vpDisplay::displayFrame(Iint, cMo, camera, 0.2, vpColor::none);
376  vpDisplay::displayFrame(Iint, cdMo, camera, 0.2, vpColor::none);
377 
378  // Display the object frame the world reference frame and the camera
379  // frame
380  vpDisplay::displayFrame(Iext1, camMf * sim.get_fMo() * cMo.inverse(), camera, 0.2, vpColor::none);
381  vpDisplay::displayFrame(Iext1, camMf * sim.get_fMo(), camera, 0.2, vpColor::none);
382  vpDisplay::displayFrame(Iext1, camMf, camera, 0.2, vpColor::none);
383 
384  // Display the world reference frame and the object frame
385  vpDisplay::displayFrame(Iext2, camoMf, camera, 0.2, vpColor::none);
386  vpDisplay::displayFrame(Iext2, camoMf * sim.get_fMo(), camera, 0.05, vpColor::none);
387 
388  vpDisplay::displayText(Iint, 20, 20, "Click to start visual servo", vpColor::red);
389 
390  vpDisplay::flush(Iint);
391  vpDisplay::flush(Iext1);
392  vpDisplay::flush(Iext2);
393 
394  std::cout << "Click on a display" << std::endl;
395 
396  while (!vpDisplay::getClick(Iint, false) && !vpDisplay::getClick(Iext1, false) &&
397  !vpDisplay::getClick(Iext2, false)) {
398  };
399  }
400 
401  robot.setPosition(wMc);
402  // Print the task
403  task.print();
404 
405  int iter = 0;
406  bool stop = false;
407  vpColVector v;
408 
409  double t_prev, t = vpTime::measureTimeMs();
410 
411  while (iter++ < max_iter && !stop) {
412  t_prev = t;
413  t = vpTime::measureTimeMs();
414 
415  if (opt_display) {
416  vpDisplay::display(Iint);
417  vpDisplay::display(Iext1);
418  vpDisplay::display(Iext2);
419  }
420 
421  robot.get_eJe(eJe);
422  task.set_eJe(eJe);
423 
424  wMc = robot.getPosition();
425  cMo = wMc.inverse() * wMo;
426  for (int i = 0; i < 4; i++) {
427  point[i].track(cMo);
428  vpFeatureBuilder::create(p[i], point[i]);
429  }
430 
431  v = task.computeControlLaw();
433 
434  // Compute the movement of the object around the world reference frame.
435  vpHomogeneousMatrix a(0, 0, 0.2, 0, 0, 0);
436  vpHomogeneousMatrix b(0, 0, 0, vpMath::rad(1.5 * iter), 0, 0);
437  vpHomogeneousMatrix c(0, 0, 0, 0, vpMath::rad(2.5 * iter), 0);
438 
439  // Move the object in the world frame
440  wMo = b * c * a;
441 
442  sim.set_fMo(wMo); // Move the object in the simulator
443  sim.setCameraPositionRelObj(cMo);
444 
445  // Compute the position of the external view which is fixed in the
446  // object frame
447  camoMf.buildFrom(0, 0.0, 1.5, 0, vpMath::rad(150), 0);
448  camoMf = camoMf * (sim.get_fMo().inverse());
449 
450  if (opt_plot) {
451  plotter->plot(0, iter, task.getError());
452  plotter->plot(1, iter, v);
453  }
454 
455  if (opt_display) {
456  // Get the internal and external views
457  sim.getInternalImage(Iint);
458  sim.getExternalImage(Iext1);
459  sim.getExternalImage(Iext2, camoMf);
460 
461  // Display the object frame (current and desired position)
462  vpDisplay::displayFrame(Iint, cMo, camera, 0.2, vpColor::none);
463  vpDisplay::displayFrame(Iint, cdMo, camera, 0.2, vpColor::none);
464 
465  // Display the camera frame, the object frame the world reference
466  // frame
467  vpDisplay::displayFrame(Iext1, sim.getExternalCameraPosition() * sim.get_fMo() * cMo.inverse(), camera, 0.2,
468  vpColor::none);
469  vpDisplay::displayFrame(Iext1, sim.getExternalCameraPosition() * sim.get_fMo(), camera, 0.2, vpColor::none);
471 
472  // Display the world reference frame and the object frame
473  vpDisplay::displayFrame(Iext2, camoMf, camera, 0.2, vpColor::none);
474  vpDisplay::displayFrame(Iext2, camoMf * sim.get_fMo(), camera, 0.05, vpColor::none);
475 
476  vpDisplay::displayText(Iint, 20, 20, "Click to stop visual servo", vpColor::red);
477 
478  std::stringstream ss;
479  ss << "Loop time: " << t - t_prev << " ms";
480  vpDisplay::displayText(Iint, 40, 20, ss.str(), vpColor::red);
481 
482  if (vpDisplay::getClick(Iint, false)) {
483  stop = true;
484  }
485  vpDisplay::flush(Iint);
486  vpDisplay::flush(Iext1);
487  vpDisplay::flush(Iext2);
488 
489  vpTime::wait(t, sampling_time * 1000); // Wait ms
490  }
491 
492  std::cout << "|| s - s* || = " << (task.getError()).sumSquare() << std::endl;
493  }
494 
495  if (opt_plot && plotter != NULL) {
496  vpDisplay::display(Iint);
497  sim.getInternalImage(Iint);
498  vpDisplay::displayFrame(Iint, cMo, camera, 0.2, vpColor::none);
499  vpDisplay::displayFrame(Iint, cdMo, camera, 0.2, vpColor::none);
500  vpDisplay::displayText(Iint, 20, 20, "Click to quit", vpColor::red);
501  if (vpDisplay::getClick(Iint)) {
502  stop = true;
503  }
504  vpDisplay::flush(Iint);
505 
506  delete plotter;
507  }
508 
509  task.print();
510 
511  return EXIT_SUCCESS;
512  } catch (const vpException &e) {
513  std::cout << "Catch an exception: " << e << std::endl;
514  return EXIT_FAILURE;
515  }
516 }
517 #elif !(defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
518 int main()
519 {
520  std::cout << "Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
521  return EXIT_SUCCESS;
522 }
523 #else
524 int main()
525 {
526  std::cout << "You do not have X11, or GDI (Graphical Device Interface), or GTK functionalities to display images..." << std::endl;
527  std::cout << "Tip if you are on a unix-like system:" << std::endl;
528  std::cout << "- Install X11, configure again ViSP using cmake and build again this example" << std::endl;
529  std::cout << "Tip if you are on a windows-like system:" << std::endl;
530  std::cout << "- Install GDI, configure again ViSP using cmake and build again this example" << std::endl;
531  return EXIT_SUCCESS;
532 }
533 
534 #endif
void setPosition(const vpHomogeneousMatrix &wMc)
Implementation of a matrix and operations on matrices.
Definition: vpMatrix.h:153
VISP_EXPORT int wait(double t0, double t)
Definition: vpTime.cpp:173
void init(const vpImage< unsigned char > &I, vpColVector *X)
void setWorldCoordinates(double oX, double oY, double oZ)
Definition: vpPoint.cpp:113
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
void setVelocity(const vpRobot::vpControlFrameType frame, const vpColVector &vel)
static std::string getViSPImagesDataPath()
Definition: vpIoTools.cpp:1202
Implementation of an homogeneous matrix and operations on such kind of matrices.
Class that defines the simplest robot: a free flying camera.
void addFeature(vpBasicFeature &s, vpBasicFeature &s_star, unsigned int select=vpBasicFeature::FEATURE_ALL)
Definition: vpServo.cpp:490
void set_fMo(const vpHomogeneousMatrix &fMo_)
Display for windows using GDI (available on any windows 32 platform).
Definition: vpDisplayGDI.h:128
void set_eJe(const vpMatrix &eJe_)
Definition: vpServo.h:506
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition: vpDisplayX.h:150
static const vpColor none
Definition: vpColor.h:229
error that can be emited by ViSP classes.
Definition: vpException.h:71
void track(const vpHomogeneousMatrix &cMo)
Class that defines a 2D point visual feature which is composed by two parameters that are the cartes...
void setExternalCameraPosition(const vpHomogeneousMatrix &cam_Mf)
void setDesiredCameraPosition(const vpHomogeneousMatrix &cdMo_)
void setLegend(unsigned int graphNum, unsigned int curveNum, const std::string &legend)
Definition: vpPlot.cpp:547
static void flush(const vpImage< unsigned char > &I)
VISP_EXPORT double measureTimeMs()
Definition: vpTime.cpp:126
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Definition: vpParseArgv.cpp:69
void setMaxRotationVelocity(double maxVr)
Definition: vpRobot.cpp:260
static const vpColor red
Definition: vpColor.h:217
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
Definition: vpPoint.h:81
virtual void setSamplingTime(const double &delta_t)
Display for windows using Direct3D 3rd party. Thus to enable this class Direct3D should be installed...
Definition: vpDisplayD3D.h:106
static std::string createFilePath(const std::string &parent, const std::string &child)
Definition: vpIoTools.cpp:1446
vpColVector getError() const
Definition: vpServo.h:278
vpHomogeneousMatrix get_fMo() const
vpColVector computeControlLaw()
Definition: vpServo.cpp:929
static void display(const vpImage< unsigned char > &I)
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Generic class defining intrinsic camera parameters.
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="")
void setLambda(double c)
Definition: vpServo.h:404
Class which enables to project an image in the 3D space and get the view of a virtual camera...
void setTitle(unsigned int graphNum, const std::string &title)
Definition: vpPlot.cpp:498
void initScene(const vpSceneObject &obj, const vpSceneDesiredObject &desiredObject)
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
Definition: vpDisplayGTK.h:134
vpHomogeneousMatrix getPosition() const
void plot(unsigned int graphNum, unsigned int curveNum, double x, double y)
Definition: vpPlot.cpp:286
void getExternalImage(vpImage< unsigned char > &I)
Implementation of a wire frame simulator. Compared to the vpSimulator class, it does not require thir...
void setInteractionMatrixType(const vpServoIteractionMatrixType &interactionMatrixType, const vpServoInversionType &interactionMatrixInversion=PSEUDO_INVERSE)
Definition: vpServo.cpp:567
static double rad(double deg)
Definition: vpMath.h:110
void setExternalCameraParameters(const vpCameraParameters &cam)
void setCameraPositionRelObj(const vpHomogeneousMatrix &cMo_)
void initGraph(unsigned int graphNum, unsigned int curveNbr)
Definition: vpPlot.cpp:206
void getInternalImage(vpImage< unsigned char > &I)
static void setWindowPosition(const vpImage< unsigned char > &I, int winx, int winy)
Implementation of column vector and the associated operations.
Definition: vpColVector.h:130
static void displayFrame(const vpImage< unsigned char > &I, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, double size, const vpColor &color=vpColor::none, unsigned int thickness=1, const vpImagePoint &offset=vpImagePoint(0, 0))
void set_cVe(const vpVelocityTwistMatrix &cVe_)
Definition: vpServo.h:448
vpHomogeneousMatrix inverse() const
void setInternalCameraParameters(const vpCameraParameters &cam)
void print(const vpServo::vpServoPrintType display_level=ALL, std::ostream &os=std::cout)
Definition: vpServo.cpp:306
This class enables real time drawing of 2D or 3D graphics. An instance of the class open a window whi...
Definition: vpPlot.h:115
static void create(vpFeaturePoint &s, const vpCameraParameters &cam, const vpDot &d)
void get_eJe(vpMatrix &eJe)
void setServo(const vpServoType &servo_type)
Definition: vpServo.cpp:218
void setMaxTranslationVelocity(double maxVt)
Definition: vpRobot.cpp:239
vpHomogeneousMatrix getExternalCameraPosition() const