51#include <visp3/core/vpConfig.h>
52#include <visp3/core/vpDebug.h>
54#if defined(VISP_HAVE_DISPLAY)
59#include <visp3/core/vpCameraParameters.h>
60#include <visp3/core/vpHomogeneousMatrix.h>
61#include <visp3/core/vpImage.h>
62#include <visp3/core/vpImagePoint.h>
63#include <visp3/core/vpIoTools.h>
64#include <visp3/core/vpMath.h>
65#include <visp3/core/vpMeterPixelConversion.h>
66#include <visp3/gui/vpDisplayFactory.h>
67#include <visp3/gui/vpProjectionDisplay.h>
68#include <visp3/io/vpParseArgv.h>
69#include <visp3/robot/vpSimulatorCamera.h>
70#include <visp3/visual_features/vpFeatureBuilder.h>
71#include <visp3/visual_features/vpFeaturePointPolar.h>
72#include <visp3/vs/vpServo.h>
73#include <visp3/vs/vpServoDisplay.h>
76#define GETOPTARGS "cdh"
78#ifdef ENABLE_VISP_NAMESPACE
82void usage(
const char *name,
const char *badparam);
83bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display);
93void usage(
const char *name,
const char *badparam)
96Tests a control law with the following characteristics:\n\
97- eye-in-hand control\n\
98- articular velocity are computed\n\
99- servo on 4 points,\n\
100- internal and external camera view displays.\n\
103 %s [-c] [-d] [-h]\n",
109 Disable the mouse click. Useful to automate the \n\
110 execution of this program without human intervention.\n\
113 Turn off the display.\n\
119 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
133bool getOptions(
int argc,
const char **argv,
bool &click_allowed,
bool &display)
141 click_allowed =
false;
147 usage(argv[0],
nullptr);
151 usage(argv[0], optarg_);
156 if ((c == 1) || (c == -1)) {
158 usage(argv[0],
nullptr);
159 std::cerr <<
"ERROR: " << std::endl;
160 std::cerr <<
" Bad argument " << optarg_ << std::endl << std::endl;
167int main(
int argc,
const char **argv)
170#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
171 std::shared_ptr<vpDisplay> displayInt;
172 std::shared_ptr<vpDisplay> displayExt;
184 std::string username;
189 std::string logdirname;
191 logdirname =
"C:/temp/" + username;
193 logdirname =
"/tmp/" + username;
203 std::cerr << std::endl <<
"ERROR:" << std::endl;
204 std::cerr <<
" Cannot create " << logdirname << std::endl;
208 std::string logfilename;
209 logfilename = logdirname +
"/log.dat";
212 std::ofstream flog(logfilename.c_str());
214 bool opt_click_allowed =
true;
215 bool opt_display =
true;
218 if (getOptions(argc, argv, opt_click_allowed, opt_display) ==
false) {
230#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
240 double px = 500, py = 500;
241 double u0 = 150, v0 = 160;
248 std::cout << std::endl;
249 std::cout <<
"----------------------------------------------" << std::endl;
250 std::cout <<
" Test program for vpServo " << std::endl;
251 std::cout <<
" Eye-in-hand task control, articular velocity are computed" << std::endl;
252 std::cout <<
" Simulation " << std::endl;
253 std::cout <<
" task : servo 4 points " << std::endl;
254 std::cout <<
"----------------------------------------------" << std::endl;
255 std::cout << std::endl;
264#if defined(TRANS_Z_PURE)
269#elif defined(TRANS_X_PURE)
275#elif defined(ROT_Z_PURE)
281#elif defined(ROT_X_PURE)
287#elif defined(COMPLEX)
293#elif defined(PROBLEM)
303 robot.getPosition(wMc);
315 for (
unsigned int i = 0;
i < 4;
i++)
316 externalview.
insert(point[i]);
323 for (
unsigned int i = 0;
i < 4;
i++) {
332 for (
unsigned int i = 0;
i < 4;
i++)
337 for (
unsigned int i = 0;
i < 4;
i++) {
362 for (
unsigned int i = 0;
i < 4;
i++)
363 task.addFeature(p[i], pd[i]);
368 std::cout <<
"\nDisplay task information: " << std::endl;
371 unsigned int iter = 0;
373 while (iter++ < 200) {
374 std::cout <<
"---------------------------------------------" <<
iter << std::endl;
383 robot.getPosition(wMc);
388 for (
unsigned int i = 0;
i < 4;
i++) {
405 v =
task.computeControlLaw();
408 std::cout <<
"Display task information: " << std::endl;
420 flog <<
v[0] <<
" " <<
v[1] <<
" " <<
v[2] <<
" " <<
v[3] <<
" " <<
v[4] <<
" " <<
v[5] <<
" ";
422 std::cout <<
"v: " <<
v.t() << std::endl;
424 std::cout <<
"|| s - s* || = " << (
task.getError()).sumSquare() << std::endl;
429 flog << (
task.getError()).t() <<
" ";
430 std::cout <<
"|| s - s* || = " << (
task.getError()).sumSquare() << std::endl;
433 for (
unsigned int i = 0;
i < 4;
i++) {
434 flog <<
p[
i].get_rho() <<
" " <<
p[
i].get_theta() <<
" ";
437 for (
unsigned int i = 0;
i < 4;
i++) {
438 flog << point[
i].
get_x() <<
" " << point[
i].
get_y() <<
" ";
447 std::cout <<
"\nClick in the internal camera view to continue..." << std::endl;
461 std::cout <<
"Final robot position with respect to the object frame:\n";
464 if (opt_display && opt_click_allowed) {
469#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
470 if (displayInt !=
nullptr) {
473 if (displayExt !=
nullptr) {
480 std::cout <<
"Catch a ViSP exception: " <<
e << std::endl;
481#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
482 if (displayInt !=
nullptr) {
485 if (displayExt !=
nullptr) {
495 std::cout <<
"You do not have X11, or GTK, or GDI (Graphical Device Interface) functionalities to display images..."
497 std::cout <<
"Tip if you are on a unix-like system:" << std::endl;
498 std::cout <<
"- Install X11, configure again ViSP using cmake and build again this example" << std::endl;
499 std::cout <<
"Tip if you are on a windows-like system:" << std::endl;
500 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
Class that defines generic functionalities for display.
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 corke09a.
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 ...
Definition of the vpImage class member functions.
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 insert(vpForwardProjection &fp)
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)
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)
@ FEATURE_CURRENT
Print the current features .
@ FEATURE_DESIRED
Print the desired features .
Class that defines the simplest robot: a free flying camera.
std::shared_ptr< vpDisplay > createDisplay()
Return a smart pointer vpDisplay specialization if a GUI library is available or nullptr otherwise.
vpDisplay * allocateDisplay()
Return a newly allocated vpDisplay specialization if a GUI library is available or nullptr otherwise.