45#include <visp3/core/vpConfig.h>
46#include <visp3/core/vpDebug.h>
54#if (defined(VISP_HAVE_VIPER850) && defined(VISP_HAVE_LIBFREENECT_AND_DEPENDENCIES))
56#include <visp3/core/vpDisplay.h>
57#include <visp3/core/vpHomogeneousMatrix.h>
58#include <visp3/core/vpImage.h>
59#include <visp3/core/vpImageConvert.h>
60#include <visp3/core/vpIoTools.h>
61#include <visp3/core/vpMath.h>
62#include <visp3/core/vpPoint.h>
63#include <visp3/gui/vpDisplayFactory.h>
64#include <visp3/robot/vpRobotViper850.h>
65#include <visp3/sensor/vp1394TwoGrabber.h>
66#include <visp3/sensor/vpKinect.h>
67#include <visp3/vision/vpPose.h>
68#include <visp3/visual_features/vpFeatureBuilder.h>
69#include <visp3/visual_features/vpFeaturePoint.h>
70#include <visp3/vs/vpServo.h>
73#include <visp3/core/vpException.h>
74#include <visp3/vs/vpServoDisplay.h>
76#include <visp3/blob/vpDot2.h>
79#ifdef ENABLE_VISP_NAMESPACE
109 for (
int i = 0;
i < ndot;
i++) {
136 std::string username;
141 std::string logdirname;
142 logdirname =
"/tmp/" + username;
151 std::cerr << std::endl <<
"ERROR:" << std::endl;
152 std::cerr <<
" Cannot create " << logdirname << std::endl;
156 std::string logfilename;
157 logfilename = logdirname +
"/log.dat";
160 std::ofstream flog(logfilename.c_str());
162#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
163 std::shared_ptr<vpDisplay> display;
181#ifdef VISP_HAVE_LIBFREENECT_OLD
184 Freenect::Freenect<vpKinect> freenect;
185 vpKinect &kinect = freenect.createDevice(0);
187 Freenect::Freenect freenect;
195#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
204 std::cout << std::endl;
205 std::cout <<
"-------------------------------------------------------" << std::endl;
206 std::cout <<
" Test program for vpServo " << std::endl;
207 std::cout <<
" Eye-in-hand task control, velocity computed in the camera space" << std::endl;
208 std::cout <<
" Use of the Viper850 robot " << std::endl;
209 std::cout <<
" task : servo 4 points on a square with dimension " << L <<
" meters" << std::endl;
210 std::cout <<
"-------------------------------------------------------" << std::endl;
211 std::cout << std::endl;
216 std::cout <<
"Click on the 4 dots clockwise starting from upper/left dot..." << std::endl;
218 for (i = 0;
i < 4;
i++) {
229 robot.getCameraParameters(cam, I);
231 cam.printParameters();
235 for (i = 0;
i < 4;
i++)
251 cMo.buildFrom(cto, cRo);
256 for (
int i = 0;
i < 4;
i++) {
267 for (i = 0;
i < 4;
i++)
268 task.addFeature(p[i], pd[i]);
286 std::cout <<
"\nHit CTRL-C to stop the loop...\n" << std::flush;
287 bool init_pose_from_linear_method =
true;
298 for (i = 0;
i < 4;
i++) {
309 vpTRACE(
"Error detected while tracking visual features");
312#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
313 if (display !=
nullptr) {
323 compute_pose(point, dot, 4, cam, cMo, init_pose_from_linear_method);
324 if (init_pose_from_linear_method) {
325 init_pose_from_linear_method =
false;
327 for (i = 0;
i < 4;
i++) {
339 v =
task.computeControlLaw();
350 flog <<
v[0] <<
" " <<
v[1] <<
" " <<
v[2] <<
" " <<
v[3] <<
" " <<
v[4] <<
" " <<
v[5] <<
" ";
360 flog << qvel[0] <<
" " << qvel[1] <<
" " << qvel[2] <<
" " << qvel[3] <<
" " << qvel[4] <<
" " << qvel[5] <<
" ";
370 flog << q[0] <<
" " << q[1] <<
" " << q[2] <<
" " << q[3] <<
" " << q[4] <<
" " << q[5] <<
" ";
375 flog << (
task.getError()).
t() << std::endl;
385 std::cout <<
"Display task information: " << std::endl;
388#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
389 if (display !=
nullptr) {
397 std::cout <<
"Catch an exception: " <<
e.getMessage() << std::endl;
398#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
399 if (display !=
nullptr) {
410 std::cout <<
"You do not have an Viper 850 robot connected to your computer..." << std::endl;
Generic class defining intrinsic camera parameters.
vpCameraParametersProjType
@ perspectiveProjWithDistortion
Perspective projection with distortion model.
Implementation of column vector and the associated operations.
static const vpColor blue
static const vpColor green
Class that defines generic functionalities for display.
static void display(const vpImage< unsigned char > &I)
static void displayCross(const vpImage< unsigned char > &I, const vpImagePoint &ip, unsigned int size, const vpColor &color, unsigned int thickness=1)
static void flush(const vpImage< unsigned char > &I)
This tracker is meant to track a blob (connex pixels with same gray level) on a vpImage.
void track(const vpImage< unsigned char > &I, bool canMakeTheWindowGrow=true)
vpImagePoint getCog() const
void initTracking(const vpImage< unsigned char > &I, unsigned int size=0)
error that can be emitted by ViSP classes.
static void create(vpFeaturePoint &s, const vpCameraParameters &cam, const vpDot &d)
Class that defines a 2D point visual feature which is composed by two parameters that are the cartes...
Implementation of an homogeneous matrix and operations on such kind of matrices.
static void convert(const vpImage< unsigned char > &src, vpImage< vpRGBa > &dest)
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.
Driver for the Kinect-1 device.
void start(vpKinect::vpDMResolution res=DMAP_LOW_RES)
bool getRGB(vpImage< vpRGBa > &IRGB)
static double rad(double deg)
static void convertPoint(const vpCameraParameters &cam, const double &u, const double &v, double &x, double &y)
Class that defines a 3D point in the object frame and allows forward projection of a 3D point in the ...
void set_x(double x)
Set the point x coordinate in the image plane.
void projection(const vpColVector &_cP, vpColVector &_p) const VP_OVERRIDE
void changeFrame(const vpHomogeneousMatrix &cMo, vpColVector &cP) const VP_OVERRIDE
void setWorldCoordinates(double oX, double oY, double oZ)
void set_y(double y)
Set the point y coordinate in the image plane.
Class used for pose computation from N points (pose from point only). Some of the algorithms implemen...
void addPoint(const vpPoint &P)
@ DEMENTHON_LAGRANGE_VIRTUAL_VS
bool computePose(vpPoseMethodType method, vpHomogeneousMatrix &cMo, FuncCheckValidityPose func=nullptr)
Control of Irisa's Viper S850 robot named Viper850.
@ STATE_VELOCITY_CONTROL
Initialize the velocity controller.
Implementation of a rotation matrix and operations on such kind of matrices.
Implementation of a rotation vector as Euler angle minimal representation.
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)
Class that consider the case of a translation vector.
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.