53 #include <visp/vpConfig.h>
54 #include <visp/vpDebug.h>
57 #ifdef VISP_HAVE_COIN_AND_GUI
59 #include <visp/vpImage.h>
60 #include <visp/vpCameraParameters.h>
61 #include <visp/vpTime.h>
62 #include <visp/vpSimulator.h>
63 #include <visp/vpMath.h>
64 #include <visp/vpHomogeneousMatrix.h>
65 #include <visp/vpFeaturePointPolar.h>
66 #include <visp/vpServo.h>
67 #include <visp/vpRobotCamera.h>
68 #include <visp/vpFeatureBuilder.h>
69 #include <visp/vpParseArgv.h>
70 #include <visp/vpIoTools.h>
72 #define GETOPTARGS "di:h"
84 void usage(
const char *name,
const char *badparam, std::string ipath)
87 Simulation Servo 4points.\n\
90 %s [-i <input image path>] [-d] [-h]\n", name);
94 -i <input image path> %s\n\
95 Set image input path.\n\
96 From this path read \"ViSP-images/iv/4points.iv\"\n\
98 Setting the VISP_INPUT_IMAGE_PATH environment\n\
99 variable produces the same behaviour than using\n\
103 Disable the image display. This can be useful \n\
104 for automatic tests using crontab under Unix or \n\
105 using the task manager under Windows.\n\
108 Print the help.\n\n", ipath.c_str());
111 fprintf(stdout,
"\nERROR: Bad parameter [%s]\n", badparam);
129 bool getOptions(
int argc,
const char **argv, std::string &ipath,
bool &display)
136 case 'i': ipath = optarg;
break;
137 case 'd': display =
false;
break;
138 case 'h': usage(argv[0], NULL, ipath);
return false;
break;
141 usage(argv[0], optarg, ipath);
return false;
break;
145 if ((c == 1) || (c == -1)) {
147 usage(argv[0], NULL, ipath);
148 std::cerr <<
"ERROR: " << std::endl;
149 std::cerr <<
" Bad argument " << optarg << std::endl << std::endl;
157 void *mainLoop (
void *_simu)
165 float sampling_time = 0.040f;
196 for (
int i = 0 ; i < 4 ; i++) {
203 for (
int i = 0 ; i < 4 ; i++)
206 std::cout <<
"s: \n";
207 for (
int i=0; i < 4; i ++) {
208 printf(
"[%d] rho %f theta %f Z %f\n",
209 i, p[i].get_rho(), p[i].get_theta(), p[i].get_Z());
228 for (
int i=0; i < 4; i ++) {
234 std::cout <<
"s*: \n";
235 for (
int i=0; i < 4; i ++) {
236 printf(
"[%d] rho %f theta %f Z %f\n",
237 i, pd[i].get_rho(), pd[i].get_theta(), pd[i].get_Z());
257 for (
int i = 0 ; i < 4 ; i++)
268 unsigned int iter=0 ;
270 while(iter++ < 200) {
277 for (
int i = 0 ; i < 4 ; i++)
279 point[i].
track(cMo) ;
290 char name[FILENAME_MAX];
291 sprintf(name,
"/tmp/image.%04d.external.png",iter) ;
292 std::cout << name << std::endl ;
294 sprintf(name,
"/tmp/image.%04d.internal.png",iter) ;
305 std::cout <<
"cMo:\n" << cMo << std::endl;
307 std::cout <<
"final pose:\n" << pose.t() << std::endl;
315 int main(
int argc,
const char ** argv)
318 std::string env_ipath;
319 std::string opt_ipath;
321 std::string filename;
322 std::string username;
323 bool opt_display =
true;
329 if (! env_ipath.empty())
333 if (getOptions(argc, argv, opt_ipath, opt_display) ==
false) {
338 if (!opt_ipath.empty())
343 if (!opt_ipath.empty() && !env_ipath.empty()) {
344 if (ipath != env_ipath) {
345 std::cout << std::endl
346 <<
"WARNING: " << std::endl;
347 std::cout <<
" Since -i <visp image path=" << ipath <<
"> "
348 <<
" is different from VISP_IMAGE_PATH=" << env_ipath << std::endl
349 <<
" we skip the environment variable." << std::endl;
354 if (opt_ipath.empty() && env_ipath.empty()){
355 usage(argv[0], NULL, ipath);
356 std::cerr << std::endl
357 <<
"ERROR:" << std::endl;
358 std::cerr <<
" Use -i <visp image path> option or set VISP_INPUT_IMAGE_PATH "
360 <<
" environment variable to specify the location of the " << std::endl
361 <<
" image path where test images are located." << std::endl << std::endl;
379 simu.
load(filename.c_str()) ;
390 std::cout <<
"Catch an exception: " << e << std::endl;
398 {
vpTRACE(
"You should install Coin3D and SoQT or SoWin or SoXt") ;
Definition of the vpMatrix class.
virtual void initInternalViewer(const unsigned int nlig, const unsigned int ncol)
initialize the camera view
void write(const char *fileName)
void setExternalCameraParameters(vpCameraParameters &cam)
set external camera parameters
void setMaxTranslationVelocity(const double maxVt)
void setCameraPosition(vpHomogeneousMatrix &cMf)
set the camera position (from an homogeneous matrix)
The class provides a data structure for the homogeneous matrices as well as a set of operations on th...
void setPosition(const vpHomogeneousMatrix &cMw)
Implementation of a simulator based on Coin3d (www.coin3d.org).
void set_eJe(const vpMatrix &eJe_)
void closeMainApplication()
void addFeature(vpBasicFeature &s, vpBasicFeature &s_star, const unsigned int select=vpBasicFeature::FEATURE_ALL)
error that can be emited by ViSP classes.
void track(const vpHomogeneousMatrix &cMo)
static double measureTimeMs()
virtual void mainLoop()
activate the mainloop
static int wait(double t0, double t)
Class that defines 2D image point visual feature with polar coordinates described in ...
static bool parse(int *argcPtr, const char **argv, vpArgvInfo *argTable, int flags)
Class that defines what is a point.
virtual void setSamplingTime(const double &delta_t)
void initApplication(void *(*start_routine)(void *))
begin the main program
vpColVector computeControlLaw()
void getCameraPosition(vpHomogeneousMatrix &_cMf)
get the camera position (from an homogeneous matrix)
Class that defines the simplest robot: a free flying camera.
void setInternalCameraParameters(vpCameraParameters &cam)
set internal camera parameters
Generic class defining intrinsic camera parameters.
void load(const char *file_name)
load an iv file
Class that consider the particular case of twist transformation matrix that allows to transform a vel...
void setInteractionMatrixType(const vpServoIteractionMatrixType &interactionMatrixType, const vpServoInversionType &interactionMatrixInversion=PSEUDO_INVERSE)
static double rad(double deg)
void getPosition(vpHomogeneousMatrix &cMw) const
void initMainApplication()
perform some initialization in the main program thread
Class that provides a data structure for the column vectors as well as a set of operations on these v...
void get_eJe(vpMatrix &eJe)
void set_cVe(const vpVelocityTwistMatrix &cVe_)
The pose is a complete representation of every rigid motion in the euclidian space.
void print(const vpServo::vpServoPrintType display_level=ALL, std::ostream &os=std::cout)
static void create(vpFeaturePoint &s, const vpCameraParameters &cam, const vpDot &d)
void changeFrame(const vpHomogeneousMatrix &cMo, vpColVector &_cP)
void initExternalViewer(const unsigned int nlig, const unsigned int ncol)
initialize the external view
void setServo(const vpServoType &servo_type)
void setZoomFactor(const float zoom)
set the size of the camera/frame
void setVelocity(const vpRobot::vpControlFrameType frame, const vpColVector &v)
void setWorldCoordinates(const double ox, const double oy, const double oz)
Set the point world coordinates. We mean here the coordinates of the point in the object frame...