#ifndef KINEMATICS_ #define KINEMATICS_ #include #include #include #include #include "opencv2/opencv.hpp" #include "eigen3/Eigen/Dense" #include "TransformationMatrix.h" #define KINEMATICS_REVOLUTE_JOINT 1 #define KINEMATICS_PRISMATIC_JOINT 2 class Kinematics { public: // Constructors Kinematics(); Kinematics(std::vector& vDHTheta, std::vector& vDHD, std::vector& vDHA, std::vector& vDHAlpha, std::vector& vJointType, std::vector& vJointOffset, std::vector& vQiValues, int i32NbJoints, int i32MaxNbIterations, double f64PController, double f64RankThreshold, double f64DistanceThreshold); // Destructor ~Kinematics(); // DH Params void loadDHParameters(std::string sDHParametersFilename); void setDHParameters(std::vector& vDHTheta, std::vector& vDHD, std::vector& vDHA, std::vector& vDHAlpha, std::vector& vJointType, std::vector& vJointOffset, std::vector& vQiValues, int i32NbJoints); void updateDHParameters(std::vector vQiValues); void updateDHParameters(); std::vector getQiValues(); // FK cv::Mat dh2FK(int i32StartJointNumber); cv::Mat computeCurrentEndEffectorPosition(); // IK void loadIKParameters(std::string sIKParametersFilename); void inverseKinematics(cv::Mat oXTarget); // Database void createKinematicDatabase(int i32NbSamples, std::string sKinematicDatabaseFilename, int i32MinValueRevoluteJoint, int i32MaxValueRevoluteJoint, int i32MinValuePrismaticJoint, int i32MaxValuePrismaticJoint); void loadKinematicDatabase(std::string sKinematicDatabaseFilename); void findClosestCandidateInDatabase(cv::Mat& oXtarget); private: cv::Mat skewSymmetricMatrix(double fX, double fY, double fZ); cv::Mat computeVee(cv::Mat oXtarget); cv::Mat computeNumericalJacobian(); cv::Mat computePseudoInverseJacobian(cv::Mat oNumericalJacobian); double computeDistanceToTarget(cv::Mat& oXtarget); private: // DH Params bool m_bAreDHParametersSet; int m_i32NbJoints; std::vector m_vDHTheta; std::vector m_vDHD; std::vector m_vDHA; std::vector m_vDHAlpha; std::vector m_vJointOffset; std::vector m_vJointType; std::vector m_vQiValues; std::vector m_vQiOriginalValues; // Database bool m_bIsDatabaseLoaded; cv::Mat m_oRandomEndEffectorPositions; cv::Mat m_oRandomJointValues; // IK int m_i32MaxNbIterations; double m_f64PController; double m_f64RankThreshold; double m_f64DistanceThreshold; }; #endif