Example of eye-in-hand control law. We control here a real robot, the Afma6 robot (cartesian robot, with 6 degrees of freedom). The velocity is computed in the camera frame. Visual features are the four lines of a square.
#include <iostream>
#include <visp3/core/vpConfig.h>
#if defined(VISP_HAVE_REALSENSE2) && defined(VISP_HAVE_DISPLAY) && defined(VISP_HAVE_AFMA6)
#include <visp3/core/vpImage.h>
#include <visp3/core/vpHomogeneousMatrix.h>
#include <visp3/core/vpLine.h>
#include <visp3/core/vpMath.h>
#include <visp3/gui/vpDisplayFactory.h>
#include <visp3/robot/vpRobotAfma6.h>
#include <visp3/sensor/vpRealSense2.h>
#include <visp3/me/vpMeLine.h>
#include <visp3/visual_features/vpFeatureBuilder.h>
#include <visp3/visual_features/vpFeatureLine.h>
#include <visp3/vs/vpServo.h>
#include <visp3/vs/vpServoDisplay.h>
int main()
{
#ifdef ENABLE_VISP_NAMESPACE
#endif
try {
rs2::config config;
unsigned int width = 640, height = 480, fps = 60;
config.enable_stream(RS2_STREAM_COLOR, width, height, RS2_FORMAT_RGBA8, fps);
config.enable_stream(RS2_STREAM_DEPTH, width, height, RS2_FORMAT_Z16, fps);
config.enable_stream(RS2_STREAM_INFRARED, width, height, RS2_FORMAT_Y8, fps);
for (size_t i = 0; i < 10; ++i) {
}
std::cout << "-------------------------------------------------------" << std::endl;
std::cout << " Test program for vpServo " << std::endl;
std::cout << " Eye-in-hand task control, velocity computed in the camera frame" << std::endl;
std::cout << " Simulation " << std::endl;
std::cout << " task : servo a line " << std::endl;
std::cout << "-------------------------------------------------------" << std::endl;
int nb_lines = 4;
std::vector<vpMeLine> line(nb_lines);
for (int i = 0; i < nb_lines; ++i) {
line[i].setMe(&me);
line[i].initTracking(I);
line[i].track(I);
}
robot.getCameraParameters(cam, I);
std::vector<vpFeatureLine> s_line(nb_lines);
for (int i = 0; i < nb_lines; ++i)
std::vector<vpLine> line_d(nb_lines);
line_d[0].setWorldCoordinates(1, 0, 0, 0.05, 0, 0, 1, 0);
line_d[1].setWorldCoordinates(0, 1, 0, 0.05, 0, 0, 1, 0);
line_d[2].setWorldCoordinates(1, 0, 0, -0.05, 0, 0, 1, 0);
line_d[3].setWorldCoordinates(0, 1, 0, -0.05, 0, 0, 1, 0);
line_d[0].project(c_M_o);
line_d[1].project(c_M_o);
line_d[2].project(c_M_o);
line_d[3].project(c_M_o);
line_d[0].setRho(-fabs(line_d[0].getRho()));
line_d[0].setTheta(0);
line_d[1].setRho(-fabs(line_d[1].getRho()));
line_d[1].setTheta(M_PI / 2);
line_d[2].setRho(-fabs(line_d[2].getRho()));
line_d[2].setTheta(M_PI);
line_d[3].setRho(-fabs(line_d[3].getRho()));
line_d[3].setTheta(-M_PI / 2);
std::vector<vpFeatureLine> s_line_d(nb_lines);
for (int i = 0; i < nb_lines; ++i) {
}
bool quit = false;
while (!quit) {
for (int i = 0; i < nb_lines; ++i) {
line[i].track(I);
}
quit = true;
}
}
return EXIT_SUCCESS;
}
std::cout << "Visual servo failed with exception: " << e << std::endl;
return EXIT_FAILURE;
}
}
#else
int main()
{
std::cout << "You do not have an afma6 robot connected to your computer..." << std::endl;
return EXIT_SUCCESS;
}
#endif
Generic class defining intrinsic camera parameters.
@ perspectiveProjWithoutDistortion
Perspective projection without distortion model.
Implementation of column vector and the associated operations.
static const vpColor green
static bool getClick(const vpImage< unsigned char > &I, bool blocking=true)
static void display(const vpImage< unsigned char > &I)
static void flush(const vpImage< unsigned char > &I)
static void displayText(const vpImage< unsigned char > &I, const vpImagePoint &ip, const std::string &s, const vpColor &color)
error that can be emitted by ViSP classes.
static void create(vpFeaturePoint &s, const vpCameraParameters &cam, const vpImagePoint &t)
Implementation of an homogeneous matrix and operations on such kind of matrices.
static double rad(double deg)
void setPointsToTrack(const int &points_to_track)
void setRange(const unsigned int &range)
void setLikelihoodThresholdType(const vpLikelihoodThresholdType likelihood_threshold_type)
void setThreshold(const double &threshold)
void setSampleStep(const double &sample_step)
void acquire(vpImage< unsigned char > &grey, double *ts=nullptr)
bool open(const rs2::config &cfg=rs2::config())
Control of Irisa's gantry robot named Afma6.
void setVelocity(const vpRobot::vpControlFrameType frame, const vpColVector &vel) VP_OVERRIDE
@ STATE_VELOCITY_CONTROL
Initialize the velocity controller.
virtual vpRobotStateType setRobotState(const vpRobot::vpRobotStateType newState)
void setInteractionMatrixType(const vpServoIteractionMatrixType &interactionMatrixType, const vpServoInversionType &interactionMatrixInversion=PSEUDO_INVERSE)
void addFeature(vpBasicFeature &s_cur, vpBasicFeature &s_star, unsigned int select=vpBasicFeature::FEATURE_ALL)
void print(const vpServo::vpServoPrintType display_level=ALL, std::ostream &os=std::cout)
void setServo(const vpServoType &servo_type)
vpColVector computeControlLaw()
std::shared_ptr< vpDisplay > createDisplay()
Return a smart pointer vpDisplay specialization if a GUI library is available or nullptr otherwise.