53 #include <visp3/core/vpConfig.h>
54 #include <visp3/core/vpDebug.h>
56 #if defined(VISP_HAVE_THREADS) && (defined(VISP_HAVE_X11) || defined(VISP_HAVE_OPENCV) || defined(VISP_HAVE_GDI)) \
57 && (defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
66 #include <visp3/core/vpCameraParameters.h>
67 #include <visp3/core/vpHomogeneousMatrix.h>
68 #include <visp3/core/vpImage.h>
69 #include <visp3/core/vpImagePoint.h>
70 #include <visp3/core/vpIoTools.h>
71 #include <visp3/core/vpMath.h>
72 #include <visp3/core/vpMeterPixelConversion.h>
73 #include <visp3/gui/vpDisplayGDI.h>
74 #include <visp3/gui/vpDisplayGTK.h>
75 #include <visp3/gui/vpDisplayX.h>
76 #include <visp3/io/vpParseArgv.h>
77 #include <visp3/robot/vpSimulatorViper850.h>
78 #include <visp3/visual_features/vpFeatureBuilder.h>
79 #include <visp3/visual_features/vpFeaturePoint.h>
80 #include <visp3/vs/vpServo.h>
83 #define GETOPTARGS "cdh"
85 #ifdef ENABLE_VISP_NAMESPACE
89 void usage(
const char *name,
const char *badparam);
90 bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display);
100 void usage(
const char *name,
const char *badparam)
103 Tests a control law with the following characteristics:\n\
104 - eye-in-hand control\n\
105 - articular velocity are computed\n\
106 - servo on 4 points,\n\
107 - internal and external camera view displays.\n\
110 %s [-c] [-d] [-h]\n",
116 Disable the mouse click. Useful to automate the \n\
117 execution of this program without human intervention.\n\
120 Turn off the display.\n\
126 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
140 bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display)
148 click_allowed =
false;
154 usage(argv[0],
nullptr);
159 usage(argv[0], optarg_);
165 if ((c == 1) || (c == -1)) {
167 usage(argv[0],
nullptr);
168 std::cerr <<
"ERROR: " << std::endl;
169 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
176 int main(
int argc,
const char **argv)
179 bool opt_click_allowed =
true;
180 bool opt_display =
true;
183 if (getOptions(argc, argv, opt_click_allowed, opt_display) ==
false) {
189 #if defined(VISP_HAVE_X11)
190 vpDisplayX displayInt;
191 #elif defined(VISP_HAVE_GDI)
193 #elif defined(HAVE_OPENCV_HIGHGUI)
202 displayInt.init(Iint, 700, 0,
"Internal view");
207 std::cout << std::endl;
208 std::cout <<
"----------------------------------------------" << std::endl;
209 std::cout <<
" Test program for vpServo " << std::endl;
210 std::cout <<
" Eye-in-hand task control, articular velocity are computed" << std::endl;
211 std::cout <<
" Simulation " << std::endl;
212 std::cout <<
" task : servo 4 points " << std::endl;
213 std::cout <<
"----------------------------------------------" << std::endl;
214 std::cout << std::endl;
228 for (
unsigned int i = 0; i < 4; i++)
233 for (
unsigned int i = 0; i < 4; i++)
243 for (
unsigned int i = 0; i < 4; i++)
244 point[i].track(cdMo);
246 for (
unsigned int i = 0; i < 4; i++)
256 for (
unsigned int i = 0; i < 4; i++)
263 vpSimulatorViper850 robot(opt_display);
274 robot.initialiseObjectRelativeToCamera(cMo);
277 robot.setDesiredCameraPosition(cdMo);
281 robot.getCameraParameters(cam, Iint);
286 robot.getInternalView(Iint);
293 unsigned int iter = 0;
295 while (iter++ < 500) {
296 std::cout <<
"---------------------------------------------" << iter << std::endl;
303 cMo = robot.get_cMo();
306 std::cout <<
"Initial robot position with respect to the object frame:\n";
311 for (
unsigned int i = 0; i < 4; i++) {
320 robot.getInternalView(Iint);
324 if (opt_display && opt_click_allowed && iter == 1) {
326 std::cout <<
"Click in the internal view window to continue..." << std::endl;
336 std::cout <<
"|| s - s* || " << (task.
getError()).sumSquare() << std::endl;
345 std::cout <<
"Final robot position with respect to the object frame:\n";
348 if (opt_display && opt_click_allowed) {
350 std::cout <<
"Click in the internal view window to end..." << std::endl;
356 std::cout <<
"Catch a ViSP exception: " << e << std::endl;
360 #elif !(defined(VISP_HAVE_X11) || defined(VISP_HAVE_GTK) || defined(VISP_HAVE_GDI))
363 std::cout <<
"You do not have X11, or GDI (Graphical Device Interface) of OpenCV functionalities to display images..."
365 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
366 std::cout <<
"- Install X11, configure again ViSP using cmake and build again this example" << std::endl;
367 std::cout <<
"Tip if you are on a windows-like system:" << std::endl;
368 std::cout <<
"- Install GDI, configure again ViSP using cmake and build again this example" << std::endl;
371 #elif !(defined(VISP_HAVE_LAPACK) || defined(VISP_HAVE_EIGEN3) || defined(VISP_HAVE_OPENCV))
374 std::cout <<
"Cannot run this example: install Lapack, Eigen3 or OpenCV" << std::endl;
380 std::cout <<
"You do not have threading capabilities" << std::endl;
381 std::cout <<
"Tip:" << std::endl;
382 std::cout <<
"- Install pthread, configure again ViSP using cmake and build again this example" << std::endl;
Generic class defining intrinsic camera parameters.
@ perspectiveProjWithoutDistortion
Perspective projection without distortion model.
Implementation of column vector and the associated operations.
Display for windows using GDI (available on any windows 32 platform).
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
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)
error that can be emitted by ViSP classes.
static void create(vpFeaturePoint &s, const vpCameraParameters &cam, const vpImagePoint &t)
Class that defines a 2D point visual feature which is composed by two parameters that are the cartes...
void track(const vpHomogeneousMatrix &cMo)
Implementation of an homogeneous matrix and operations on such kind of matrices.
static double rad(double deg)
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 ...
void setWorldCoordinates(double oX, double oY, double oZ)
void setVelocity(const vpRobot::vpControlFrameType frame, const vpColVector &vel) VP_OVERRIDE
@ STATE_VELOCITY_CONTROL
Initialize the velocity controller.
virtual vpRobotStateType setRobotState(const vpRobot::vpRobotStateType newState)
void setInteractionMatrixType(const vpServoIteractionMatrixType &interactionMatrixType, const vpServoInversionType &interactionMatrixInversion=PSEUDO_INVERSE)
void addFeature(vpBasicFeature &s_cur, vpBasicFeature &s_star, unsigned int select=vpBasicFeature::FEATURE_ALL)
void print(const vpServo::vpServoPrintType display_level=ALL, std::ostream &os=std::cout)
void setServo(const vpServoType &servo_type)
vpColVector getError() const
vpColVector computeControlLaw()
@ TOOL_PTGREY_FLEA2_CAMERA
VISP_EXPORT int wait(double t0, double t)
VISP_EXPORT double measureTimeMs()