diff --git a/src/common_fc.cpp b/src/common_fc.cpp index b478e78d85b39d109aaa0c71167e94880cbc4e0b..4f8fb48365ac80238c0580ca9854601785062676 100644 --- a/src/common_fc.cpp +++ b/src/common_fc.cpp @@ -1,5 +1,7 @@ #include "common_fc.h" +namespace UAM { + CCommon_Fc::CCommon_Fc() {} @@ -187,3 +189,5 @@ void CCommon_Fc::write_to_file(const std::string& folder_name, const std::string File << "\n"; File.close(); } + +} // End of UAM namespace diff --git a/src/common_fc.h b/src/common_fc.h index d956315dfcdde2856a1c1e111ddf4d494e6cde63..9ba9eab0a4691832ecc09c8f93f4f099d5606eed 100644 --- a/src/common_fc.h +++ b/src/common_fc.h @@ -19,10 +19,7 @@ #include <kdl/frames.hpp> #include <kdl/frames_io.hpp> -typedef struct{ - double invjac_alpha_min; // Alpha value for gain matrix pseudo inverse. - Eigen::MatrixXd invjac_delta_gain; // Delta values (min and max) for gain matrix pseudo inverse W. -}misc_fc_params; +namespace UAM{ class CCommon_Fc { @@ -85,4 +82,6 @@ class CCommon_Fc }; +} // End of UAM namespace + #endif diff --git a/src/common_obj.h b/src/common_obj.h index 6a7de72e00bdf4e3c7059f89c2d2dced661a0645..b0223adf5b4ccaf17d61b2995798465ba3e3e852 100644 --- a/src/common_obj.h +++ b/src/common_obj.h @@ -22,72 +22,97 @@ #include <boost/scoped_ptr.hpp> #include <boost/shared_ptr.hpp> +namespace UAM { + +// Arm CoG data +typedef struct{ + std::vector<Eigen::MatrixXd> link_cog; // Vector of link CoG relative to base + Eigen::MatrixXd arm_cog; // Arm CoG coordinates w.r.t. arm base link; +}ArmCogData; + // Arm joint typedef struct{ - std::string link_parent; // Link parent name. - std::string link_child; // Link child name. - double joint_min; // Joint lower limit values. - double joint_max; // Joint upper limit values. - double mass; // Joint mass. + std::string link_parent; // Link parent name. + std::string link_child; // Link child name. + double joint_min; // Joint lower limit values. + double joint_max; // Joint upper limit values. + double mass; // Joint mass. }CArmJoint; // Arm typedef struct{ - KDL::Chain chain; // KDL chain. - double mass; // mass. - unsigned int nj; // number of joints. - std::vector<CArmJoint> joint_info; // joints info. - Eigen::MatrixXd jnt_pos; // Joint value. - boost::shared_ptr<KDL::ChainFkSolverPos_recursive> jnt_to_pose_solver; // chain solver. - boost::scoped_ptr<KDL::ChainJntToJacSolver> jnt_to_jac_solver; // chain solver. - KDL::JntArray jnt_pos_kdl; // Array of arm positions. - KDL::Jacobian jacobian; // Jacobian. - std::vector<Eigen::MatrixXd> T_base_to_joint; // Homogenous Transforms from arm base to each link. + KDL::Chain chain; // KDL chain. + double mass; // mass. + unsigned int nj; // number of joints. + std::vector<CArmJoint> joint_info; // joints info. + Eigen::MatrixXd jnt_pos; // Joint value. + boost::shared_ptr<KDL::ChainFkSolverPos_recursive> jnt_to_pose_solver; // chain solver. + boost::scoped_ptr<KDL::ChainJntToJacSolver> jnt_to_jac_solver; // chain solver. + KDL::JntArray jnt_pos_kdl; // Array of arm positions. + KDL::Jacobian jacobian; // Jacobian. + std::vector<Eigen::MatrixXd> T_base_to_joint; // Homogenous Transforms from arm base to each link. }CArm; // Quadrotor typedef struct{ - Eigen::MatrixXd pos; // position values (joints). + Eigen::MatrixXd pos; // position values (joints). }CQuad; // UAM (Unmanned Aerial Manipulator) typedef struct{ - Eigen::MatrixXd vel; // Velocities (joints). - Eigen::MatrixXd jacob; // Jacobian. + Eigen::MatrixXd vel; // Velocities (joints). + Eigen::MatrixXd jacob; // Jacobian. }CUAM; // Homogenous Transforms typedef struct{ - Eigen::Matrix4d tag_in_cam; // Tag in camera frames. - Eigen::Matrix4d tag_in_baselink; // Tag in base_link frames. - Eigen::Matrix4d cam_in_tip; // Camera in arm tip frames. - Eigen::Matrix4d tip_in_baselink; // Arm forward kinematics (from base_link to arm link frame). - Eigen::Matrix4d cam_in_baselink; // Camera in base_link frames. - Eigen::Matrix4d armbase_in_baselink; // Camera in base_link frames. + Eigen::Matrix4d tag_in_cam; // Tag in camera frames. + Eigen::Matrix4d tag_in_baselink; // Tag in base_link frames. + Eigen::Matrix4d cam_in_tip; // Camera in arm tip frames. + Eigen::Matrix4d tip_in_baselink; // Arm forward kinematics (from base_link to arm link frame). + Eigen::Matrix4d cam_in_baselink; // Camera in base_link frames. + Eigen::Matrix4d armbase_in_baselink; // Camera in base_link frames. }CHT; // Control Law parameters typedef struct{ - bool enable_sec_task; // Enable secondary task. - double dt; // time interval. - double stabil_gain; // Gain of kinematics stabilization secondary task. - Eigen::MatrixXd lambda_robot; // Robot proportional gains. - Eigen::MatrixXd ir_vel; // Inflation radius velocity. - Eigen::MatrixXd vs_vel; // Primary task velocity. - double vs_alpha_min; // Alpha value for gain matrix pseudo inverse. - Eigen::MatrixXd vs_delta_gain; // Delta values (min and max) for gain matrix pseudo inverse W. - double ir_gain; // Gain of Inflation radius task. - double inf_radius; // Security distance to an obstacle (Inflation radius) to prevent Collisions. - double cog_gain; // Gain of CoG alignment secondary task. - Eigen::MatrixXd cog_vel; // Secondary task velocity. - Eigen::MatrixXd cog_PGxy; // X and Y of the CoG r.t. Quadrotor body inertial frame. - Eigen::MatrixXd cog_arm; // Arm Center of Gravity r.t. quadrotor body frame. - double jntlim_gain; // Gain of joint limits secondary task. - Eigen::MatrixXd jntlim_vel; // Joint limit task velocity. - Eigen::MatrixXd jntlim_pos_des; // Desired arm position for secondary task (avoiding joint limits). - Eigen::MatrixXd jntlim_pos_error; // Arm joint errors between current and secondary task desired joint positions - Eigen::MatrixXd q_rollpitch; // Quadrotor roll and pitch angles. - Eigen::MatrixXd v_rollpitch; // Quadrotor roll and pitch angular velocities. + bool enable_sec_task; // Enable secondary task. + double dt; // time interval. + double stabil_gain; // Gain of kinematics stabilization secondary task. + Eigen::MatrixXd lambda_robot; // Robot proportional gains. + Eigen::MatrixXd ir_vel; // Inflation radius velocity. + Eigen::MatrixXd vs_vel; // Primary task velocity. + double vs_alpha_min; // Alpha value for gain matrix pseudo inverse. + Eigen::MatrixXd vs_delta_gain; // Delta values (min and max) for gain matrix pseudo inverse W. + double ir_gain; // Gain of Inflation radius task. + double inf_radius; // Security distance to an obstacle (Inflation radius) to prevent Collisions. + double cog_gain; // Gain of CoG alignment secondary task. + Eigen::MatrixXd cog_vel; // Secondary task velocity. + Eigen::MatrixXd cog_PGxy; // X and Y of the CoG r.t. Quadrotor body inertial frame. + Eigen::MatrixXd cog_arm; // Arm Center of Gravity r.t. quadrotor body frame. + double jntlim_gain; // Gain of joint limits secondary task. + Eigen::MatrixXd jntlim_vel; // Joint limit task velocity. + Eigen::MatrixXd jntlim_pos_des; // Desired arm position for secondary task (avoiding joint limits). + Eigen::MatrixXd jntlim_pos_error; // Arm joint errors between current and secondary task desired joint positions + Eigen::MatrixXd q_rollpitch; // Quadrotor roll and pitch angles. + Eigen::MatrixXd v_rollpitch; // Quadrotor roll and pitch angular velocities. }CCtrlParams; +// Task Eigen Values +typedef struct{ + Eigen::VectorXd vs; // Visual Servo Task Eigen Values + Eigen::VectorXd cog; // CoG Task Eigen Values + Eigen::VectorXd jl; // Joint Limits Task Eigen Values +}TaskEigVal; + +// Task Jacobians +typedef struct{ + Eigen::MatrixXd ir; // Inflation Radius Task Jac + Eigen::MatrixXd vs; // Visual Servo Task Jac + Eigen::MatrixXd cog; // CoG Task Jac + Eigen::MatrixXd jl; // Joint Limits Task Jac +}TaskJac; + +} // End of UAM namespace + #endif \ No newline at end of file diff --git a/src/kinematics.cpp b/src/kinematics.cpp index 4f9641a71bec98179d145682ce4a15f93c8cb490..673408400811ce25ffa3e7c136b722621ed25015 100644 --- a/src/kinematics.cpp +++ b/src/kinematics.cpp @@ -1,7 +1,8 @@ #include "kinematics.h" +namespace UAM { -void CKinematics::UAMKine(const CQuad& quad, CArm& arm, CHT& HT, CUAM& uam) +void CKinematics::UAMKine(const UAM::CQuad& quad, UAM::CArm& arm, UAM::CHT& HT, UAM::CUAM& uam) { // Get arm Homogenous transform, arm tip in base_link HT.tip_in_baselink = ArmFKine(arm); @@ -48,7 +49,7 @@ void CKinematics::UAMKine(const CQuad& quad, CArm& arm, CHT& HT, CUAM& uam) uam.jacob.block(0,6,6,arm.nj)=Rot*Ja; } -Eigen::Matrix4d CKinematics::ArmFKine(CArm& arm) +Eigen::Matrix4d CKinematics::ArmFKine(UAM::CArm& arm) { // constructs the kdl solver in non-realtime arm.jnt_to_pose_solver.reset(new KDL::ChainFkSolverPos_recursive(arm.chain)); @@ -85,7 +86,7 @@ Eigen::Matrix4d CKinematics::ArmFKine(CArm& arm) return Tarm; } -Eigen::MatrixXd CKinematics::ArmJac(CArm& arm) +Eigen::MatrixXd CKinematics::ArmJac(UAM::CArm& arm) { // constructs the kdl solver in non-realtime arm.jnt_to_jac_solver.reset(new KDL::ChainJntToJacSolver(arm.chain)); @@ -139,4 +140,6 @@ Eigen::MatrixXd CKinematics::QuadJac(const Eigen::MatrixXd& pos) Jq(5,5) = cos(phi)*cos(theta); return Jq; -} \ No newline at end of file +} + +} // End of UAM namespace \ No newline at end of file diff --git a/src/kinematics.h b/src/kinematics.h index 14d905c3dc572927a7bfadb3fab8ac1e6c91133b..514fe3a73479e61d1c922a6bc7a2db73f6f40eb8 100644 --- a/src/kinematics.h +++ b/src/kinematics.h @@ -21,6 +21,8 @@ #include <common_obj.h> #include <common_fc.h> +namespace UAM { + class CKinematics { private: @@ -49,7 +51,7 @@ class CKinematics * Compute the arm Forward Kinematics * */ - static Eigen::Matrix4d ArmFKine(CArm& arm); + static Eigen::Matrix4d ArmFKine(UAM::CArm& arm); /** * \brief Compute Arm Jacobian @@ -57,7 +59,7 @@ class CKinematics * Compute the arm Jacobian * */ - static Eigen::MatrixXd ArmJac(CArm& arm); + static Eigen::MatrixXd ArmJac(UAM::CArm& arm); /** * \brief Compute Quadrotor Jacobian @@ -73,7 +75,9 @@ class CKinematics * Compute the UAM Jacobian and the position of the quadrotor * */ - static void UAMKine(const CQuad& quad, CArm& arm, CHT& HT, CUAM& uam); + static void UAMKine(const UAM::CQuad& quad, UAM::CArm& arm, UAM::CHT& HT, UAM::CUAM& uam); }; +} // End of UAM namespace + #endif diff --git a/src/uam_task_ctrl.cpp b/src/uam_task_ctrl.cpp index c69296524933104394747efff3598ad76aac9f98..4e971e58dc5e42244f5e8281ed93d7f308c26a38 100644 --- a/src/uam_task_ctrl.cpp +++ b/src/uam_task_ctrl.cpp @@ -8,7 +8,7 @@ using namespace std; CQuadarm_Task_Priority_Ctrl::CQuadarm_Task_Priority_Ctrl() { - // this->datetime_ = CCommon_Fc::get_datetime(); + // this->datetime_ = UAM::CCommon_Fc::get_datetime(); } CQuadarm_Task_Priority_Ctrl::~CQuadarm_Task_Priority_Ctrl() @@ -18,10 +18,10 @@ CQuadarm_Task_Priority_Ctrl::~CQuadarm_Task_Priority_Ctrl() // Main public function void CQuadarm_Task_Priority_Ctrl::quadarm_task_priority_ctrl(const MatrixXd& quad_dist_obs, const goal_obj& goal, - CHT& HT, - CArm& arm, - const CQuad& quad, - CCtrlParams& ctrl_params, + UAM::CHT& HT, + UAM::CArm& arm, + const UAM::CQuad& quad, + UAM::CCtrlParams& ctrl_params, MatrixXd& robot_pos, MatrixXd& robot_vel) { @@ -44,7 +44,7 @@ void CQuadarm_Task_Priority_Ctrl::quadarm_task_priority_ctrl(const MatrixXd& qua // Quad data this->quad_.pos = quad.pos; - CKinematics::UAMKine(this->quad_,this->arm_,this->T_,this->uam_); + UAM::CKinematics::UAMKine(this->quad_,this->arm_,this->T_,this->uam_); uam_hierarchical_ctrl(); // Arm positions increment @@ -97,7 +97,7 @@ void CQuadarm_Task_Priority_Ctrl::uam_hierarchical_ctrl() JIR_VS.block(0,0,JIR.rows(),JIR.cols()) = JIR; JIR_VS.block(JIR.rows()-1,0,JVS.rows(),JVS.cols())=JVS; MatrixXd NIR_VS = MatrixXd::Zero(4+this->arm_.nj,4+this->arm_.nj); - MatrixXd JIR_VS_pseudo = CCommon_Fc::CalcPinv(JIR_VS); + MatrixXd JIR_VS_pseudo = UAM::CCommon_Fc::CalcPinv(JIR_VS); NIR_VS = (eye-(JIR_VS_pseudo*JIR_VS)); // task Jacobian and sigma @@ -117,7 +117,7 @@ void CQuadarm_Task_Priority_Ctrl::uam_hierarchical_ctrl() JIR_VS_G.block(0,0,JIR_VS.rows(),JIR_VS.cols()) = JIR_VS; JIR_VS_G.block(JIR_VS.rows()-1,0,JG.rows(),JG.cols())=JG; MatrixXd NIR_VS_G = MatrixXd::Zero(4+this->arm_.nj,4+this->arm_.nj); - MatrixXd JIR_VS_G_pseudo = CCommon_Fc::CalcPinv(JIR_VS_G); + MatrixXd JIR_VS_G_pseudo = UAM::CCommon_Fc::CalcPinv(JIR_VS_G); // Third task after secondary aligning CoG NIR_VS_G = (eye-(JIR_VS_G_pseudo*JIR_VS_G)); @@ -230,11 +230,11 @@ void CQuadarm_Task_Priority_Ctrl::task_infrad(MatrixXd& JIR,MatrixXd& JIR_pseudo } // } - MatrixXd Hinv = CCommon_Fc::CalcPinv(H); + MatrixXd Hinv = UAM::CCommon_Fc::CalcPinv(H); // weighting matrix MatrixXd temp = JIR*Hinv*JIR.transpose(); - JIR_pseudo = Hinv*JIR.transpose()*CCommon_Fc::CalcPinv(temp); + JIR_pseudo = Hinv*JIR.transpose()*UAM::CCommon_Fc::CalcPinv(temp); // cout << "xxxxxx Task velocities xxxxxx" << endl; // cout << JIR_pseudo*sigmaIR << endl; @@ -258,9 +258,9 @@ void CQuadarm_Task_Priority_Ctrl::task_vs(MatrixXd& JVS,MatrixXd& JVS_pseudo,Mat JVS = Jqa1; // task jacobian pseudo inverse - //JVS_pseudo = CCommon_Fc::CalcPinv(Jqa1); - // JVS_pseudo = CCommon_Fc::WeightInvJac(Jqa1); - JVS_pseudo = CCommon_Fc::WeightInvJac(Jqa1,this->ctrl_params_.vs_delta_gain,this->ctrl_params_.vs_alpha_min,this->target_dist_); + //JVS_pseudo = UAM::CCommon_Fc::CalcPinv(Jqa1); + // JVS_pseudo = UAM::CCommon_Fc::WeightInvJac(Jqa1); + JVS_pseudo = UAM::CCommon_Fc::WeightInvJac(Jqa1,this->ctrl_params_.vs_delta_gain,this->ctrl_params_.vs_alpha_min,this->target_dist_); // task velocity vector sigmaVS = this->cam_vel_-Jqa2*this->ctrl_params_.v_rollpitch; @@ -322,7 +322,7 @@ void CQuadarm_Task_Priority_Ctrl::task_cog(MatrixXd& JG,MatrixXd& JG_pseudo,Matr // Joint frames joint_pose.at(jj) = arm_segment.at(jj+1).pose(this->arm_.jnt_pos(jj,0)); // relative Homogeneous transforms (HT) - Transf.at(jj) = CCommon_Fc::GetTransform(joint_pose.at(jj)); + Transf.at(jj) = UAM::CCommon_Fc::GetTransform(joint_pose.at(jj)); // HT r.t. base link T_base_to_joint.at(jj+1) = T_base_to_joint.at(jj) * Transf.at(jj); // 3rd column of rotation matrix @@ -423,7 +423,7 @@ void CQuadarm_Task_Priority_Ctrl::task_cog(MatrixXd& JG,MatrixXd& JG_pseudo,Matr JG.block(0,4,1,this->arm_.nj)=2*this->ctrl_params_.cog_PGxy.transpose()*Jacob_temp.block(0,0,2,this->arm_.nj); - JG_pseudo = CCommon_Fc::CalcPinv(JG); + JG_pseudo = UAM::CCommon_Fc::CalcPinv(JG); sigmaG = -(this->ctrl_params_.cog_PGxy.transpose()*this->ctrl_params_.cog_PGxy); } @@ -453,6 +453,6 @@ void CQuadarm_Task_Priority_Ctrl::task_jl(MatrixXd& JL,MatrixXd& JL_pseudo,Matri MatrixXd Jtemp = AAL*this->ctrl_params_.jntlim_pos_error; JL.block(0,4,1,this->arm_.nj) = -2*Jtemp.transpose(); - JL_pseudo = CCommon_Fc::CalcPinv(JL); + JL_pseudo = UAM::CCommon_Fc::CalcPinv(JL); } diff --git a/src/uam_task_ctrl.h b/src/uam_task_ctrl.h index e9aedd8c79a96cf543042accde5bf8e6c0e76f1f..91efd72a31de5ce4f696da54c04dbfa595f519ce 100644 --- a/src/uam_task_ctrl.h +++ b/src/uam_task_ctrl.h @@ -43,35 +43,17 @@ typedef struct{ double target_dist; // Target distance }goal_obj; -typedef struct{ - vector<MatrixXd> link_cog; // Vector of link CoG relative to base - MatrixXd arm_cog; // Arm CoG coordinates w.r.t. arm base link; -}cog_data; - -typedef struct{ - VectorXd vs; - VectorXd cog; - VectorXd jl; -}eig_values; - -typedef struct{ - MatrixXd ir; - MatrixXd vs; - MatrixXd cog; - MatrixXd jl; -}jacobians; - class CQuadarm_Task_Priority_Ctrl { private: - CUAM uam_; // Unmanned Aerial Manipulator. - CArm arm_; // Arm. - CQuad quad_; // Quadrotor. + UAM::CUAM uam_; // Unmanned Aerial Manipulator. + UAM::CArm arm_; // Arm. + UAM::CQuad quad_; // Quadrotor. - CCtrlParams ctrl_params_; // Control Law parameters. + UAM::CCtrlParams ctrl_params_; // Control Law parameters. - CHT T_; // Homogeneous Transforms. + UAM::CHT T_; // Homogeneous Transforms. MatrixXd cam_vel_; // Camera velocities. @@ -130,11 +112,11 @@ class CQuadarm_Task_Priority_Ctrl //TODO: these variables are public for debugging purposes // they must be private and set get functions created. - cog_data arm_cog_data_; // Arm CoG data to debug in higher levels. + UAM::ArmCogData arm_cog_data_; // Arm CoG data to debug in higher levels. - eig_values eig_values_; // Task jacobian eigenvalues. + UAM::TaskEigVal eig_values_; // Task jacobian eigenvalues. - jacobians jacobians_; // Task Jacobians. + UAM::TaskJac jacobians_; // Task Jacobians. /** * \brief Constructor @@ -160,10 +142,10 @@ class CQuadarm_Task_Priority_Ctrl */ void quadarm_task_priority_ctrl(const MatrixXd& quad_dist_obs, const goal_obj& goal, - CHT& HT, - CArm& arm, - const CQuad& quad, - CCtrlParams& CtrlParams, + UAM::CHT& HT, + UAM::CArm& arm, + const UAM::CQuad& quad, + UAM::CCtrlParams& CtrlParams, MatrixXd& robot_pos, MatrixXd& robot_vel); };