44#include <visp3/core/vpConfig.h>
45#include <visp3/core/vpDebug.h>
53#if (defined(VISP_HAVE_VIPER850) && defined(VISP_HAVE_DC1394) && defined(VISP_HAVE_DISPLAY))
55#include <visp3/blob/vpDot2.h>
56#include <visp3/core/vpDisplay.h>
57#include <visp3/core/vpException.h>
58#include <visp3/core/vpHomogeneousMatrix.h>
59#include <visp3/core/vpImage.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/gui/vpPlot.h>
65#include <visp3/robot/vpRobotViper850.h>
66#include <visp3/sensor/vp1394TwoGrabber.h>
67#include <visp3/visual_features/vpFeatureBuilder.h>
68#include <visp3/visual_features/vpFeaturePoint.h>
69#include <visp3/vs/vpServo.h>
70#include <visp3/vs/vpServoDisplay.h>
74#ifdef ENABLE_VISP_NAMESPACE
78#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
79 std::shared_ptr<vpDisplay> display;
99#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
109 jointMin = robot.getJointMin();
110 jointMax = robot.getJointMax();
118 for (
unsigned int i = 0;
i < 6;
i++) {
119 Qmin[
i] = jointMin[
i] + 0.5 * rho * (jointMax[
i] - jointMin[
i]);
120 Qmax[
i] = jointMax[
i] - 0.5 * rho * (jointMax[
i] - jointMin[
i]);
122 Qmiddle = (Qmin + Qmax) / 2.;
125 for (
unsigned int i = 0;
i < 6;
i++) {
126 tQmin[
i] = Qmin[
i] + 0.5 * (rho1) * (Qmax[i] - Qmin[i]);
127 tQmax[
i] = Qmax[
i] - 0.5 * (rho1) * (Qmax[i] - Qmin[i]);
139 plot.initGraph(0, 10);
141 plot.initGraph(1, 1);
146 plot.initRange(0, 0., 200., -1.2, 1.2);
147 plot.setTitle(0,
"Joint behavior");
154 plot.initRange(1, 0., 200., 0., 1e-4);
155 plot.setTitle(1,
"Cost function");
159 for (
unsigned int i = 0;
i < 6;
i++) {
160 legend =
"q" +
i + 1;
161 plot.setLegend(0, i, legend);
163 plot.setLegend(0, 6,
"tQmin");
164 plot.setLegend(0, 7,
"tQmax");
165 plot.setLegend(0, 8,
"Qmin");
166 plot.setLegend(0, 9,
"Qmax");
175 for (
unsigned int i = 6;
i < 10;
i++)
179 plot.setLegend(1, 0,
"h_s");
184 std::cout <<
" Give the parameters beta (1) : ";
189 std::cout <<
"Click on a dot..." << std::endl;
197 robot.getCameraParameters(cam, I);
216 std::cout << cVe << std::endl;
225 std::cout << std::endl;
226 task.addFeature(p, pd);
237 std::cout <<
"\nHit CTRL-C to stop the loop...\n" << std::flush;
269 prim_task =
task.computeControlLaw();
279 for (
unsigned int i = 0;
i < 6;
i++) {
285 double D = (Qmax[
i] - Qmin[
i]);
289 h_s = beta * h_s / 2.0;
291 std::cout <<
"Cost function h_s: " << h_s << std::endl;
293 sec_task =
task.secondaryTask(e2, de2dt);
297 v = prim_task + sec_task;
309 for (
unsigned int i = 0;
i < 6;
i++) {
311 data[
i] /= (Qmax[
i] - Qmin[
i]);
314 unsigned int joint = 2;
315 data[6] = 2 * (tQmin[joint] - Qmiddle[joint]) / (Qmax[joint] - Qmin[joint]);
316 data[7] = 2 * (tQmax[joint] - Qmiddle[joint]) / (Qmax[joint] - Qmin[joint]);
319 plot.plot(0, iter, data);
320 plot.plot(1, 0, iter, h_s);
328#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
329 if (display !=
nullptr) {
336 std::cout <<
"Catch an exception: " <<
e.getMessage() << std::endl;
337#if (VISP_CXX_STANDARD < VISP_CXX_STANDARD_11)
338 if (display !=
nullptr) {
349 std::cout <<
"You do not have an Viper 850 robot connected to your computer..." << std::endl;
Class for firewire ieee1394 video devices using libdc1394-2.x api.
@ vpVIDEO_MODE_640x480_MONO8
Generic class defining intrinsic camera parameters.
Implementation of column vector and the associated operations.
Class to define RGB colors available for display functionalities.
static const vpColor cyan
static const vpColor orange
static const vpColor blue
static const vpColor black
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...
vpFeaturePoint & buildFrom(const double &x, const double &y, const double &Z)
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 sqr(double x)
Implementation of a matrix and operations on matrices.
This class enables real time drawing of 2D or 3D graphics. An instance of the class open a window whi...
Control of Irisa's Viper S850 robot named Viper850.
@ STATE_VELOCITY_CONTROL
Initialize the velocity controller.
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)
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.