Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
testRobotViper850Pose.cpp
1/*
2 * ViSP, open source Visual Servoing Platform software.
3 * Copyright (C) 2005 - 2024 by Inria. All rights reserved.
4 *
5 * This software is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 * See the file LICENSE.txt at the root directory of this source
10 * distribution for additional information about the GNU GPL.
11 *
12 * For using ViSP with software that can not be combined with the GNU
13 * GPL, please contact Inria about acquiring a ViSP Professional
14 * Edition License.
15 *
16 * See https://visp.inria.fr for more information.
17 *
18 * This software was developed at:
19 * Inria Rennes - Bretagne Atlantique
20 * Campus Universitaire de Beaulieu
21 * 35042 Rennes Cedex
22 * France
23 *
24 * If you have questions regarding the use of this file, please contact
25 * Inria at visp@inria.fr
26 *
27 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 *
30 * Description:
31 * Test for Viper650 6 dof robot.
32 */
33
43
44#include <iostream>
45#include <visp3/blob/vpDot.h>
46#include <visp3/core/vpCameraParameters.h>
47#include <visp3/core/vpConfig.h>
48#include <visp3/core/vpDebug.h>
49#include <visp3/core/vpImage.h>
50#include <visp3/core/vpPixelMeterConversion.h>
51#include <visp3/core/vpPoint.h>
52#include <visp3/gui/vpDisplayGTK.h>
53#include <visp3/gui/vpDisplayOpenCV.h>
54#include <visp3/gui/vpDisplayX.h>
55#include <visp3/robot/vpRobotViper850.h>
56#include <visp3/sensor/vp1394TwoGrabber.h>
57#include <visp3/vision/vpPose.h>
58#if defined(VISP_HAVE_VIPER850) && defined(VISP_HAVE_DC1394)
59
60int main()
61{
62#ifdef ENABLE_VISP_NAMESPACE
63 using namespace VISP_NAMESPACE_NAME;
64#endif
65 try {
66 // Create an image B&W container
68
69 // Create a firewire grabber based on libdc1394-2.x
70 bool reset = false;
71 vp1394TwoGrabber g(reset);
72
73 // Grab an image from the firewire camera
74 g.acquire(I);
75
76// Create an image viewer for the image
77#ifdef VISP_HAVE_X11
78 vpDisplayX display(I, 100, 100, "Current image");
79#elif defined(HAVE_OPENCV_HIGHGUI)
80 vpDisplayOpenCV display(I, 100, 100, "Current image");
81#elif defined(VISP_HAVE_GTK)
82 vpDisplayGTK display(I, 100, 100, "Current image");
83#endif
84
85 // Display the image
88
89 // Define a squared target
90 // The target is made of 4 planar points (square dim = 0.077m)
91 double sdim = 0.077; // square width and height
92 vpPoint target[4];
93 // Set the point world coordinates (x,y,z) in the object frame
94 // o ----> x
95 // |
96 // |
97 // \/
98 // y
99 target[0].setWorldCoordinates(-sdim / 2., -sdim / 2., 0);
100 target[1].setWorldCoordinates(sdim / 2., -sdim / 2., 0);
101 target[2].setWorldCoordinates(sdim / 2., sdim / 2., 0);
102 target[3].setWorldCoordinates(-sdim / 2., sdim / 2., 0);
103
104 // Image processing to extract the 2D coordinates in sub-pixels of the 4
105 // points from the image acquired by the camera
106 // Creation of 4 trackers
107 vpDot dot[4];
108 vpImagePoint cog;
109 for (int i = 0; i < 4; i++) {
110 dot[i].setGraphics(true); // to display the tracking results
111 std::cout << "Click on dot " << i << std::endl;
112 dot[i].initTracking(I);
113 // The tracker computes the sub-pixels coordinates in the image
114 // i ----> u
115 // |
116 // |
117 // \/
118 // v
119 std::cout << " Coordinates: " << dot[i].getCog() << std::endl;
120 // Flush the tracking results in the viewer
122 }
123
124 // Create an intrinsic camera parameters structure
126
127 // Create a robot access
128 vpRobotViper850 robot;
129
130 // Load the end-effector to camera frame transformation obtained
131 // using a camera intrinsic model with distortion
133
134 // Get the intrinsic camera parameters associated to the image
135 robot.getCameraParameters(cam, I);
136
137 // Using the camera parameters, compute the perspective projection
138 // (transform the dot sub-pixel coordinates into coordinates in the camera
139 // frame in meter)
140 for (int i = 0; i < 4; i++) {
141 double x = 0, y = 0; // coordinates of the dots in the camera frame
142 // c ----> x
143 // |
144 // |
145 // \/
146 // y
147 // pixel to meter conversion
148 cog = dot[i].getCog();
150 target[i].set_x(x);
151 target[i].set_y(y);
152 }
153
154 // From now, in target[i], we have the 3D coordinates of a point in the
155 // object frame, and their correspondences in the camera frame. We can now
156 // compute the pose cMo between the camera and the object.
157 vpPose pose;
158 // Add the 4 points to compute the pose
159 for (int i = 0; i < 4; i++) {
160 pose.addPoint(target[i]);
161 }
162 // Create an homogeneous matrix for the camera to object transformation
163 // computed just bellow
167 // Compute the pose: initialisation is done by Dementhon or Lagrange method, and the
168 // final pose is computed by the more accurate Virtual Visual Servoing method.
170
171 std::cout << "Pose cMo: " << std::endl << cMo;
172 cMo.extract(R);
173 r.buildFrom(R);
174 std::cout << " rotation: " << vpMath::deg(r[0]) << " " << vpMath::deg(r[1]) << " " << vpMath::deg(r[2]) << " deg"
175 << std::endl
176 << std::endl;
177
178// Get the robot position in the reference frame
180 vpColVector p; // position x,y,z,rx,ry,rz
181 robot.getPosition(vpRobotViper850::REFERENCE_FRAME, p);
182 std::cout << "Robot pose in reference frame: " << p << std::endl;
184 t[0] = p[0];
185 t[1] = p[1];
186 t[2] = p[2];
187 r[0] = p[3];
188 r[1] = p[4];
189 r[2] = p[5];
190 R.buildFrom(r);
191 rMc.buildFrom(t, R);
192 std::cout << "Pose rMc: " << std::endl << rMc;
193 rMc.extract(R);
194 r.buildFrom(R);
195 std::cout << " rotation: " << vpMath::deg(r[0]) << " " << vpMath::deg(r[1]) << " " << vpMath::deg(r[2]) << " deg"
196 << std::endl
197 << std::endl;
198
199 robot.getPosition(vpRobotViper850::ARTICULAR_FRAME, p);
200 std::cout << "Robot pose in articular: " << p << std::endl;
201
202 robot.get_fMc(p, rMc);
203 std::cout << "Pose rMc from MGD: " << std::endl << rMc;
204 rMc.extract(R);
205 r.buildFrom(R);
206 std::cout << " rotation: " << vpMath::deg(r[0]) << " " << vpMath::deg(r[1]) << " " << vpMath::deg(r[2]) << " deg"
207 << std::endl
208 << std::endl;
209
211 rMo = rMc * cMo;
212 std::cout << "Pose rMo = rMc * cMo: " << std::endl << rMo;
213 rMo.extract(R);
214 r.buildFrom(R);
215 std::cout << " rotation: " << vpMath::deg(r[0]) << " " << vpMath::deg(r[1]) << " " << vpMath::deg(r[2]) << " deg"
216 << std::endl
217 << std::endl;
218 return EXIT_SUCCESS;
219 }
220 catch (const vpException &e) {
221 std::cout << "Catch an exception: " << e << std::endl;
222 return EXIT_FAILURE;
223 }
224}
225#else
226int main()
227{
228 std::cout << "Sorry, test not valid. You should have an Viper850 robot..." << std::endl;
229 return EXIT_SUCCESS;
230}
231
232#endif
Class for firewire ieee1394 video devices using libdc1394-2.x api.
Generic class defining intrinsic camera parameters.
@ perspectiveProjWithDistortion
Perspective projection with distortion model.
Implementation of column vector and the associated operations.
The vpDisplayGTK allows to display image using the GTK 3rd party library. Thus to enable this class G...
The vpDisplayOpenCV allows to display image using the OpenCV library. Thus to enable this class OpenC...
Use the X11 console to display images on unix-like OS. Thus to enable this class X11 should be instal...
Definition vpDisplayX.h:135
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
This tracker is meant to track a dot (connected pixels with same gray level) on a vpImage.
Definition vpDot.h:123
void initTracking(const vpImage< unsigned char > &I)
Definition vpDot.cpp:630
void setGraphics(bool activate)
Definition vpDot.h:362
vpImagePoint getCog() const
Definition vpDot.h:255
error that can be emitted by ViSP classes.
Definition vpException.h:60
Implementation of an homogeneous matrix and operations on such kind of matrices.
vpHomogeneousMatrix & buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)
void extract(vpRotationMatrix &R) 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.
Definition vpImage.h:131
static double deg(double rad)
Definition vpMath.h:119
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 ...
Definition vpPoint.h:79
void set_x(double x)
Set the point x coordinate in the image plane.
Definition vpPoint.cpp:471
void setWorldCoordinates(double oX, double oY, double oZ)
Definition vpPoint.cpp:116
void set_y(double y)
Set the point y coordinate in the image plane.
Definition vpPoint.cpp:473
Class used for pose computation from N points (pose from point only). Some of the algorithms implemen...
Definition vpPose.h:82
void addPoint(const vpPoint &P)
Definition vpPose.cpp:96
@ DEMENTHON_LAGRANGE_VIRTUAL_VS
Definition vpPose.h:103
bool computePose(vpPoseMethodType method, vpHomogeneousMatrix &cMo, FuncCheckValidityPose func=nullptr)
Definition vpPose.cpp:385
Control of Irisa's Viper S850 robot named Viper850.
@ REFERENCE_FRAME
Definition vpRobot.h:75
@ ARTICULAR_FRAME
Definition vpRobot.h:77
Implementation of a rotation matrix and operations on such kind of matrices.
Implementation of a rotation vector as Euler angle minimal representation.
Class that consider the case of a translation vector.
static const vpToolType defaultTool
Default tool attached to the robot end effector.
Definition vpViper850.h:129