53 #include <visp3/core/vpConfig.h>
54 #include <visp3/core/vpDebug.h>
56 #if (defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI) || defined(VISP_HAVE_OPENCV))
61 #include <visp3/core/vpCameraParameters.h>
62 #include <visp3/core/vpHomogeneousMatrix.h>
63 #include <visp3/core/vpImage.h>
64 #include <visp3/core/vpImagePoint.h>
65 #include <visp3/core/vpIoTools.h>
66 #include <visp3/core/vpMath.h>
67 #include <visp3/core/vpMeterPixelConversion.h>
68 #include <visp3/gui/vpDisplayGDI.h>
69 #include <visp3/gui/vpDisplayGTK.h>
70 #include <visp3/gui/vpDisplayOpenCV.h>
71 #include <visp3/gui/vpDisplayX.h>
72 #include <visp3/gui/vpProjectionDisplay.h>
73 #include <visp3/io/vpParseArgv.h>
74 #include <visp3/robot/vpSimulatorCamera.h>
75 #include <visp3/visual_features/vpFeatureBuilder.h>
76 #include <visp3/visual_features/vpFeaturePointPolar.h>
77 #include <visp3/vs/vpServo.h>
78 #include <visp3/vs/vpServoDisplay.h>
81 #define GETOPTARGS "cdh"
83 void usage(
const char *name,
const char *badparam);
84 bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display);
94 void usage(
const char *name,
const char *badparam)
97 Tests a control law with the following characteristics:\n\
98 - eye-in-hand control\n\
99 - articular velocity are computed\n\
100 - servo on 4 points,\n\
101 - internal and external camera view displays.\n\
104 %s [-c] [-d] [-h]\n",
110 Disable the mouse click. Useful to automate the \n\
111 execution of this program without human intervention.\n\
114 Turn off the display.\n\
120 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
134 bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display)
142 click_allowed =
false;
148 usage(argv[0], NULL);
152 usage(argv[0], optarg_);
157 if ((c == 1) || (c == -1)) {
159 usage(argv[0], NULL);
160 std::cerr <<
"ERROR: " << std::endl;
161 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
168 int main(
int argc,
const char **argv)
177 std::string username;
182 std::string logdirname;
184 logdirname =
"C:/temp/" + username;
186 logdirname =
"/tmp/" + username;
195 std::cerr << std::endl <<
"ERROR:" << std::endl;
196 std::cerr <<
" Cannot create " << logdirname << std::endl;
200 std::string logfilename;
201 logfilename = logdirname +
"/log.dat";
204 std::ofstream flog(logfilename.c_str());
206 bool opt_click_allowed =
true;
207 bool opt_display =
true;
210 if (getOptions(argc, argv, opt_click_allowed, opt_display) ==
false) {
216 #if defined(VISP_HAVE_X11)
219 #elif defined(VISP_HAVE_GTK)
222 #elif defined(VISP_HAVE_GDI)
225 #elif defined(HAVE_OPENCV_HIGHGUI)
236 displayInt.
init(Iint, 0, 0,
"Internal view");
237 displayExt.
init(Iext, 330, 000,
"External view");
241 double px = 500, py = 500;
242 double u0 = 150, v0 = 160;
249 std::cout << std::endl;
250 std::cout <<
"----------------------------------------------" << std::endl;
251 std::cout <<
" Test program for vpServo " << std::endl;
252 std::cout <<
" Eye-in-hand task control, articular velocity are computed" << std::endl;
253 std::cout <<
" Simulation " << std::endl;
254 std::cout <<
" task : servo 4 points " << std::endl;
255 std::cout <<
"----------------------------------------------" << std::endl;
256 std::cout << std::endl;
265 #if defined(TRANS_Z_PURE)
270 #elif defined(TRANS_X_PURE)
276 #elif defined(ROT_Z_PURE)
282 #elif defined(ROT_X_PURE)
288 #elif defined(COMPLEX)
294 #elif defined(PROBLEM)
304 robot.getPosition(wMc);
316 for (
unsigned int i = 0; i < 4; i++)
317 externalview.
insert(point[i]);
324 for (
unsigned int i = 0; i < 4; i++) {
325 point[i].
track(cMod);
333 for (
unsigned int i = 0; i < 4; i++)
338 for (
unsigned int i = 0; i < 4; i++) {
363 for (
unsigned int i = 0; i < 4; i++)
369 std::cout <<
"\nDisplay task information: " << std::endl;
372 unsigned int iter = 0;
374 while (iter++ < 200) {
375 std::cout <<
"---------------------------------------------" << iter << std::endl;
384 robot.getPosition(wMc);
389 for (
unsigned int i = 0; i < 4; i++) {
409 std::cout <<
"Display task information: " << std::endl;
421 flog << v[0] <<
" " << v[1] <<
" " << v[2] <<
" " << v[3] <<
" " << v[4] <<
" " << v[5] <<
" ";
423 std::cout <<
"v: " << v.
t() << std::endl;
425 std::cout <<
"|| s - s* || = " << (task.
getError()).sumSquare() << std::endl;
430 flog << (task.
getError()).t() <<
" ";
431 std::cout <<
"|| s - s* || = " << (task.
getError()).sumSquare() << std::endl;
434 for (
unsigned int i = 0; i < 4; i++) {
438 for (
unsigned int i = 0; i < 4; i++) {
439 flog << point[i].
get_x() <<
" " << point[i].
get_y() <<
" ";
448 std::cout <<
"\nClick in the internal camera view to continue..." << std::endl;
462 std::cout <<
"Final robot position with respect to the object frame:\n";
465 if (opt_display && opt_click_allowed) {
472 std::cout <<
"Catch a ViSP exception: " << e << std::endl;
479 std::cout <<
"You do not have X11, or GTK, or GDI (Graphical Device Interface) functionalities to display images..."
481 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
482 std::cout <<
"- Install X11, configure again ViSP using cmake and build again this example" << std::endl;
483 std::cout <<
"Tip if you are on a windows-like system:" << std::endl;
484 std::cout <<
"- Install GDI, configure again ViSP using cmake and build again this example" << std::endl;
Generic class defining intrinsic camera parameters.
Implementation of column vector and the associated operations.
static const vpColor white
static const vpColor green
Display for windows using GDI (available on any windows 32 platform).
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
void init(vpImage< unsigned char > &I, int win_x=-1, int win_y=-1, const std::string &win_title="")
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
error that can be emitted by ViSP classes.
static void create(vpFeaturePoint &s, const vpCameraParameters &cam, const vpDot &d)
Class that defines 2D image point visual feature with polar coordinates described in .
void track(const vpHomogeneousMatrix &cMo)
Implementation of an homogeneous matrix and operations on such kind of matrices.
vpHomogeneousMatrix inverse() const
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
static double rad(double deg)
Implementation of a matrix and operations on matrices.
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
double get_y() const
Get the point y coordinate in the image plane.
double get_x() const
Get the point x coordinate in the image plane.
void setWorldCoordinates(double oX, double oY, double oZ)
interface with the image for feature display
void display(vpImage< unsigned char > &I, const vpHomogeneousMatrix &cextMo, const vpHomogeneousMatrix &cMo, const vpCameraParameters &cam, const vpColor &color, const bool &displayTraj=false, unsigned int thickness=1)
void insert(vpForwardProjection &fp)
void setVelocity(const vpRobot::vpControlFrameType frame, const vpColVector &vel)
void get_eJe(vpMatrix &eJe)
static void display(const vpServo &s, const vpCameraParameters &cam, const vpImage< unsigned char > &I, vpColor currentColor=vpColor::green, vpColor desiredColor=vpColor::red, unsigned int thickness=1)
void setInteractionMatrixType(const vpServoIteractionMatrixType &interactionMatrixType, const vpServoInversionType &interactionMatrixInversion=PSEUDO_INVERSE)
void set_cVe(const vpVelocityTwistMatrix &cVe_)
void print(const vpServo::vpServoPrintType display_level=ALL, std::ostream &os=std::cout)
void set_eJe(const vpMatrix &eJe_)
void setServo(const vpServoType &servo_type)
vpColVector getError() const
vpColVector computeControlLaw()
void addFeature(vpBasicFeature &s, vpBasicFeature &s_star, unsigned int select=vpBasicFeature::FEATURE_ALL)
Class that defines the simplest robot: a free flying camera.