50 #include <visp3/core/vpCameraParameters.h> 51 #include <visp3/core/vpDebug.h> 52 #include <visp3/core/vpRotationMatrix.h> 53 #include <visp3/core/vpRxyzVector.h> 54 #include <visp3/core/vpTranslationVector.h> 55 #include <visp3/core/vpVelocityTwistMatrix.h> 56 #include <visp3/core/vpXmlParserCamera.h> 57 #include <visp3/robot/vpAfma6.h> 58 #include <visp3/robot/vpRobotException.h> 64 static const char *opt_Afma6[] = {
"JOINT_MAX",
"JOINT_MIN",
"LONG_56",
"COUPL_56",
65 "CAMERA",
"eMc_ROT_XYZ",
"eMc_TRANS_XYZ", NULL};
67 #ifdef VISP_HAVE_AFMA6_DATA 69 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_Afma6.cnf");
72 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_ccmop_without_distortion_Afma6.cnf");
75 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_ccmop_with_distortion_Afma6.cnf");
78 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_gripper_without_distortion_Afma6.cnf");
81 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_gripper_with_distortion_Afma6.cnf");
84 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_vacuum_without_distortion_Afma6.cnf");
87 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_vacuum_with_distortion_Afma6.cnf");
90 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_generic_without_distortion_Afma6.cnf");
93 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_generic_with_distortion_Afma6.cnf");
96 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_Intel_D435_without_distortion_Afma6.cnf");
99 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_eMc_Intel_D435_with_distortion_Afma6.cnf");
102 std::string(VISP_AFMA6_DATA_PATH) + std::string(
"/include/const_camera_Afma6.xml");
104 #endif // VISP_HAVE_AFMA6_DATA 122 : _coupl_56(0), _long_56(0), _etc(), _erc(), _eMc(), tool_current(
vpAfma6::defaultTool),
178 void vpAfma6::init(
const std::string &camera_extrinsic_parameters,
const std::string &camera_intrinsic_parameters)
278 #ifdef VISP_HAVE_AFMA6_DATA 280 std::string filename_eMc;
368 #else // VISP_HAVE_AFMA6_DATA 490 #endif // VISP_HAVE_AFMA6_DATA 601 const bool &verbose)
const 604 double q_[2][6], d[2], t;
628 if (fMe[2][2] >= .99999f) {
630 q_[0][4] = q_[1][4] = M_PI / 2.f;
631 t = atan2(fMe[0][0], fMe[0][1]);
632 q_[1][3] = q_[0][3] = q[3];
633 q_[1][5] = q_[0][5] = t - q_[0][3];
645 }
else if (fMe[2][2] <= -.99999) {
647 q_[0][4] = q_[1][4] = -M_PI / 2;
648 t = atan2(fMe[1][1], fMe[1][0]);
649 q_[1][3] = q_[0][3] = q[3];
650 q_[1][5] = q_[0][5] = q_[0][3] - t;
662 q_[0][3] = atan2(-fMe[0][2], fMe[1][2]);
664 q_[1][3] = q_[0][3] - M_PI;
666 q_[1][3] = q_[0][3] + M_PI;
668 q_[0][4] = asin(fMe[2][2]);
670 q_[1][4] = M_PI - q_[0][4];
672 q_[1][4] = -M_PI - q_[0][4];
674 q_[0][5] = atan2(-fMe[2][1], fMe[2][0]);
676 q_[1][5] = q_[0][5] - M_PI;
678 q_[1][5] = q_[0][5] + M_PI;
680 q_[0][0] = fMe[0][3] - this->
_long_56 * cos(q_[0][3]);
681 q_[1][0] = fMe[0][3] - this->
_long_56 * cos(q_[1][3]);
682 q_[0][1] = fMe[1][3] - this->
_long_56 * sin(q_[0][3]);
683 q_[1][1] = fMe[1][3] - this->
_long_56 * sin(q_[1][3]);
684 q_[0][2] = q_[1][2] = fMe[2][3];
690 for (
int j = 0; j < 2; j++) {
693 for (
unsigned int i = 0; i < 6; i++) {
697 std::cout <<
"Joint " << i <<
" not in limits: " << this->
_joint_min[i] <<
" < " << q_[j][i] <<
" < " 709 std::cout <<
"No solution..." << std::endl;
712 }
else if (ok[1] == 1) {
713 for (
unsigned int i = 0; i < 6; i++)
719 for (
unsigned int i = 0; i < 6; i++)
725 for (
int j = 0; j < 2; j++) {
727 for (
unsigned int i = 3; i < 6; i++)
728 d[j] += (q_[j][i] - q[i]) * (q_[j][i] - q[i]);
730 if (nearest ==
true) {
732 for (
unsigned int i = 0; i < 6; i++)
735 for (
unsigned int i = 0; i < 6; i++)
739 for (
unsigned int i = 0; i < 6; i++)
742 for (
unsigned int i = 0; i < 6; i++)
747 for (
unsigned int i = 0; i < 6; i++)
811 fMc = fMe * this->
_eMc;
842 double q5 = q[5] - this->
_coupl_56 * q[4];
844 double c1 = cos(q[3]);
845 double s1 = sin(q[3]);
846 double c2 = cos(q[4]);
847 double s2 = sin(q[4]);
853 fMe[0][0] = s1 * s2 * c3 + c1 * s3;
854 fMe[0][1] = -s1 * s2 * s3 + c1 * c3;
855 fMe[0][2] = -s1 * c2;
856 fMe[0][3] = q0 + this->
_long_56 * c1;
858 fMe[1][0] = -c1 * s2 * c3 + s1 * s3;
859 fMe[1][1] = c1 * s2 * s3 + s1 * c3;
861 fMe[1][3] = q1 + this->
_long_56 * s1;
864 fMe[2][1] = -c2 * s3;
937 double s4, c4, s5, c5, s6, c6;
947 eJe[0][0] = s4 * s5 * c6 + c4 * s6;
948 eJe[0][1] = -c4 * s5 * c6 + s4 * s6;
950 eJe[0][3] = -this->
_long_56 * s5 * c6;
952 eJe[1][0] = -s4 * s5 * s6 + c4 * c6;
953 eJe[1][1] = c4 * s5 * s6 + s4 * c6;
954 eJe[1][2] = -c5 * s6;
955 eJe[1][3] = this->
_long_56 * s5 * s6;
957 eJe[2][0] = -s4 * c5;
965 eJe[4][3] = -c5 * s6;
1008 fJe[0][0] = fJe[1][1] = fJe[2][2] = 1;
1010 double s4 = sin(q[3]);
1011 double c4 = cos(q[3]);
1017 double s5 = sin(q[4]);
1018 double c5 = cos(q[4]);
1021 fJe[3][5] = -s4 * c5;
1023 fJe[4][5] = c4 * c5;
1029 fJe[4][4] += -this->
_coupl_56 * c4 * c5;
1046 for (
unsigned int i = 0; i < 6; i++)
1062 for (
unsigned int i = 0; i < 6; i++)
1098 std::ifstream fdconfig(filename.c_str(), std::ios::in);
1100 if (!fdconfig.is_open()) {
1107 bool get_erc =
false;
1108 bool get_etc =
false;
1111 while (std::getline(fdconfig, line)) {
1113 if ((line.compare(0, 1,
"#") == 0) || line.empty()) {
1116 std::istringstream ss(line);
1120 for (code = 0; NULL != opt_Afma6[code]; ++code) {
1121 if (key.compare(opt_Afma6[code]) == 0) {
1149 ss >> erc[0] >> erc[1] >> erc[2];
1152 erc = erc * M_PI / 180.0;
1157 ss >> etc[0] >> etc[1] >> etc[2];
1163 filename.c_str(), lineNum));
1170 if (get_etc && get_erc) {
1257 const unsigned int &image_height)
const 1259 #if defined(VISP_HAVE_AFMA6_DATA) 1325 if (image_width == 640 && image_height == 480) {
1340 vpTRACE(
"Cannot get default intrinsic camera parameters for this image " 1348 if (image_width == 640 && image_height == 480) {
1363 vpTRACE(
"Cannot get default intrinsic camera parameters for this image " 1371 if (image_width == 640 && image_height == 480) {
1386 vpTRACE(
"Cannot get default intrinsic camera parameters for this image " 1394 if (image_width == 640 && image_height == 480) {
1409 vpTRACE(
"Cannot get default intrinsic camera parameters for this image " 1417 if (image_width == 640 && image_height == 480) {
1432 vpTRACE(
"Cannot get default intrinsic camera parameters for this image " 1555 os <<
"Joint Max:" << std::endl
1559 <<
"Joint Min: " << std::endl
1563 <<
"Long 5-6: " << std::endl
1564 <<
"\t" << afma6.
_long_56 <<
"\t" << std::endl
1566 <<
"Coupling 5-6:" << std::endl
1567 <<
"\t" << afma6.
_coupl_56 <<
"\t" << std::endl
1569 <<
"eMc: " << std::endl
1570 <<
"\tTranslation (m): " << afma6.
_eMc[0][3] <<
" " << afma6.
_eMc[1][3] <<
" " << afma6.
_eMc[2][3] <<
"\t" 1572 <<
"\tRotation Rxyz (rad) : " << rxyz[0] <<
" " << rxyz[1] <<
" " << rxyz[2] <<
"\t" << std::endl
1574 <<
"\t" << std::endl;
static const std::string CONST_EMC_GENERIC_WITHOUT_DISTORTION_FILENAME
Modelisation of Irisa's gantry robot named Afma6.
Implementation of a matrix and operations on matrices.
vpRxyzVector buildFrom(const vpRotationMatrix &R)
void getCameraParameters(vpCameraParameters &cam, const unsigned int &image_width, const unsigned int &image_height) const
static const unsigned int njoint
Number of joint.
static const std::string CONST_AFMA6_FILENAME
void resize(unsigned int nrows, unsigned int ncols, bool flagNullify=true, bool recopy_=true)
Error that can be emited by the vpRobot class and its derivates.
static const std::string CONST_EMC_INTEL_D435_WITHOUT_DISTORTION_FILENAME
static const std::string CONST_EMC_GRIPPER_WITHOUT_DISTORTION_FILENAME
Implementation of an homogeneous matrix and operations on such kind of matrices.
vpColVector getJointMax() const
void parseConfigFile(const std::string &filename)
static const std::string CONST_EMC_CCMOP_WITH_DISTORTION_FILENAME
int getInverseKinematics(const vpHomogeneousMatrix &fMc, vpColVector &q, const bool &nearest=true, const bool &verbose=false) const
static const std::string CONST_CAMERA_AFMA6_FILENAME
error that can be emited by ViSP classes.
void get_cVe(vpVelocityTwistMatrix &cVe) const
vpAfma6ToolType
List of possible tools that can be attached to the robot end-effector.
unsigned int getRows() const
vpHomogeneousMatrix inverse() const
vpCameraParameters::vpCameraParametersProjType projModel
vpAfma6ToolType getToolType() const
Get the current tool type.
void extract(vpRotationMatrix &R) const
XML parser to load and save intrinsic camera parameters.
void initPersProjWithDistortion(double px, double py, double u0, double v0, double kud, double kdu)
vpHomogeneousMatrix get_fMc(const vpColVector &q) const
friend VISP_EXPORT std::ostream & operator<<(std::ostream &os, const vpAfma6 &afma6)
static const std::string CONST_EMC_INTEL_D435_WITH_DISTORTION_FILENAME
void setToolType(vpAfma6::vpAfma6ToolType tool)
Set the current tool type.
static const std::string CONST_EMC_GENERIC_WITH_DISTORTION_FILENAME
static const char *const CONST_GRIPPER_CAMERA_NAME
Implementation of a rotation matrix and operations on such kind of matrices.
static const vpAfma6ToolType defaultTool
Default tool attached to the robot end effector.
vpHomogeneousMatrix get_eMc() const
vpVelocityTwistMatrix buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)
static const std::string CONST_EMC_VACUUM_WITHOUT_DISTORTION_FILENAME
static const std::string CONST_EMC_VACUUM_WITH_DISTORTION_FILENAME
vpCameraParametersProjType
void get_eJe(const vpColVector &q, vpMatrix &eJe) const
Generic class defining intrinsic camera parameters.
vpColVector getJointMin() const
vpHomogeneousMatrix getForwardKinematics(const vpColVector &q) const
void buildFrom(const vpTranslationVector &t, const vpRotationMatrix &R)
void get_fJe(const vpColVector &q, vpMatrix &fJe) const
static double rad(double deg)
static const std::string CONST_EMC_CCMOP_WITHOUT_DISTORTION_FILENAME
int parse(vpCameraParameters &cam, const std::string &filename, const std::string &camera_name, const vpCameraParameters::vpCameraParametersProjType &projModel, unsigned int image_width=0, unsigned int image_height=0)
void initPersProjWithoutDistortion(double px, double py, double u0, double v0)
void get_fMe(const vpColVector &q, vpHomogeneousMatrix &fMe) const
virtual void set_eMc(const vpHomogeneousMatrix &eMc)
void resize(unsigned int i, bool flagNullify=true)
vpTranslationVector getTranslationVector() const
static double deg(double rad)
unsigned int getHeight() const
Implementation of column vector and the associated operations.
void get_cMe(vpHomogeneousMatrix &cMe) const
static const char *const CONST_INTEL_D435_CAMERA_NAME
Implementation of a rotation vector as Euler angle minimal representation.
static const char *const CONST_CCMOP_CAMERA_NAME
unsigned int getWidth() const
static const std::string CONST_EMC_GRIPPER_WITH_DISTORTION_FILENAME
static const char *const CONST_VACUUM_CAMERA_NAME
Class that consider the case of a translation vector.
double getCoupl56() const
static const char *const CONST_GENERIC_CAMERA_NAME