39 #ifndef vpRobotWireFrameSimulator_HH
40 #define vpRobotWireFrameSimulator_HH
47 #include <visp3/core/vpConfig.h>
49 #if defined(VISP_HAVE_MODULE_GUI) && ((defined(_WIN32) && !defined(WINRT_8_0)) || defined(VISP_HAVE_PTHREAD))
58 #elif defined(VISP_HAVE_PTHREAD)
62 #include <visp3/gui/vpDisplayD3D.h>
63 #include <visp3/gui/vpDisplayGDI.h>
64 #include <visp3/gui/vpDisplayGTK.h>
65 #include <visp3/gui/vpDisplayOpenCV.h>
66 #include <visp3/gui/vpDisplayX.h>
67 #include <visp3/robot/vpRobot.h>
68 #include <visp3/robot/vpRobotSimulator.h>
69 #include <visp3/robot/vpWireFrameSimulator.h>
93 typedef enum { MODEL_3D, MODEL_DH } vpDisplayRobotType;
102 Bound_scene *robotArms;
105 unsigned int size_fMi;
125 HANDLE mutex_artCoord;
126 HANDLE mutex_velocity;
127 HANDLE mutex_display;
128 #elif defined(VISP_HAVE_PTHREAD)
131 pthread_mutex_t mutex_fMi;
132 pthread_mutex_t mutex_artVel;
133 pthread_mutex_t mutex_artCoord;
134 pthread_mutex_t mutex_velocity;
135 pthread_mutex_t mutex_display;
145 unsigned int jointLimitArt;
147 bool singularityManagement;
152 #if defined VISP_HAVE_X11
154 #elif defined VISP_HAVE_GDI
156 #elif defined VISP_HAVE_OPENCV
158 #elif defined VISP_HAVE_D3D9
160 #elif defined VISP_HAVE_GTK
171 bool constantSamplingTimeMode;
175 bool setVelocityCalled;
226 if ((std::fabs(px_ext - 1.) >
vpMath::maximum(px_ext, 1.) * std::numeric_limits<double>::epsilon()) &&
227 (std::fabs(py_ext - 1) >
vpMath::maximum(py_ext, 1.) * std::numeric_limits<double>::epsilon()))
258 void initScene(
const vpSceneObject &obj,
const vpSceneDesiredObject &desiredObject);
259 void initScene(
const char *obj,
const char *desiredObject);
260 void initScene(
const vpSceneObject &obj);
279 inline void setConstantSamplingTimeMode(
const bool _constantSamplingTimeMode)
281 constantSamplingTimeMode = _constantSamplingTimeMode;
317 inline void setDisplayRobotType(
const vpDisplayRobotType dispType) { displayType = dispType; }
348 this->delta_t_ = delta_t;
352 void setSingularityManagement(
const bool sm) { singularityManagement = sm; }
357 void setVerbose(
bool verbose) { this->verbose_ = verbose; }
375 static DWORD WINAPI launcher(LPVOID lpParam)
377 (static_cast<vpRobotWireFrameSimulator *>(lpParam))->updateArticularPosition();
380 #elif defined(VISP_HAVE_PTHREAD)
381 static void *launcher(
void *arg)
383 (reinterpret_cast<vpRobotWireFrameSimulator *>(arg))->updateArticularPosition();
393 virtual void updateArticularPosition() = 0;
395 virtual int isInJointLimit() = 0;
398 virtual void computeArticularVelocity() = 0;
401 void initDisplay() { ; }
402 virtual void initArms() = 0;
407 #if defined(WINRT_8_1)
408 WaitForSingleObjectEx(mutex_artCoord, INFINITE, FALSE);
410 WaitForSingleObject(mutex_artCoord, INFINITE);
413 artCoordTmp = artCoord;
414 ReleaseMutex(mutex_artCoord);
419 #if defined(WINRT_8_1)
420 WaitForSingleObjectEx(mutex_artCoord, INFINITE, FALSE);
422 WaitForSingleObject(mutex_artCoord, INFINITE);
425 ReleaseMutex(mutex_artCoord);
430 #if defined(WINRT_8_1)
431 WaitForSingleObjectEx(mutex_artVel, INFINITE, FALSE);
433 WaitForSingleObject(mutex_artVel, INFINITE);
436 ReleaseMutex(mutex_artVel);
441 #if defined(WINRT_8_1)
442 WaitForSingleObjectEx(mutex_artVel, INFINITE, FALSE);
444 WaitForSingleObject(mutex_artVel, INFINITE);
447 ReleaseMutex(mutex_artVel);
452 #if defined(WINRT_8_1)
453 WaitForSingleObjectEx(mutex_velocity, INFINITE, FALSE);
455 WaitForSingleObject(mutex_velocity, INFINITE);
458 ReleaseMutex(mutex_velocity);
463 #if defined(WINRT_8_1)
464 WaitForSingleObjectEx(mutex_velocity, INFINITE, FALSE);
466 WaitForSingleObject(mutex_velocity, INFINITE);
469 ReleaseMutex(mutex_velocity);
472 void set_displayBusy(
const bool &status)
474 #if defined(WINRT_8_1)
475 WaitForSingleObjectEx(mutex_display, INFINITE, FALSE);
477 WaitForSingleObject(mutex_display, INFINITE);
479 displayBusy = status;
480 ReleaseMutex(mutex_display);
482 bool get_displayBusy()
484 #if defined(WINRT_8_1)
485 WaitForSingleObjectEx(mutex_display, INFINITE, FALSE);
487 WaitForSingleObject(mutex_display, INFINITE);
489 bool status = displayBusy;
492 ReleaseMutex(mutex_display);
496 #elif defined(VISP_HAVE_PTHREAD)
499 pthread_mutex_lock(&mutex_artCoord);
501 artCoordTmp = artCoord;
502 pthread_mutex_unlock(&mutex_artCoord);
507 pthread_mutex_lock(&mutex_artCoord);
509 pthread_mutex_unlock(&mutex_artCoord);
514 pthread_mutex_lock(&mutex_artVel);
516 pthread_mutex_unlock(&mutex_artVel);
521 pthread_mutex_lock(&mutex_artVel);
523 pthread_mutex_unlock(&mutex_artVel);
528 pthread_mutex_lock(&mutex_velocity);
530 pthread_mutex_unlock(&mutex_velocity);
535 pthread_mutex_lock(&mutex_velocity);
537 pthread_mutex_unlock(&mutex_velocity);
540 void set_displayBusy(
const bool &status)
542 pthread_mutex_lock(&mutex_display);
543 displayBusy = status;
544 pthread_mutex_unlock(&mutex_display);
546 bool get_displayBusy()
548 pthread_mutex_lock(&mutex_display);
549 bool status = displayBusy;
552 pthread_mutex_unlock(&mutex_display);