diff --git a/src/quadarm_task_priority_ctrl.cpp b/src/quadarm_task_priority_ctrl.cpp index 909108102b582b57b74bd165a740eb96584b704d..b913d1bf78543d61c6e12993c9d643d49c62b510 100644 --- a/src/quadarm_task_priority_ctrl.cpp +++ b/src/quadarm_task_priority_ctrl.cpp @@ -33,7 +33,6 @@ void CQuadarm_Task_Priority_Ctrl::quadarm_task_priority_ctrl(const goal_obj& goa this->arm_.joint_info= arm.joint_info; this->arm_.jnt_pos = arm.jnt_pos; - // Arm DOFs this->arm_.nj = this->arm_.chain.getNrOfJoints(); @@ -155,6 +154,7 @@ MatrixXd CQuadarm_Task_Priority_Ctrl::arm_jacobian() Ja(ii,jj) = this->arm_.jacobian.data(ii,jj); } } + return Ja; } MatrixXd CQuadarm_Task_Priority_Ctrl::quadrotor_jacobian() @@ -221,8 +221,8 @@ void CQuadarm_Task_Priority_Ctrl::qa_control(){ // Secondary control task (CoG alignement) ____________________ // Null space projector - MatrixXd Nqa1 = (eye-(Jqa1_pseudo*Jqa1)); - //MatrixXd Nqa1 = (eye-(Jqa1_geninverse*Jqa1)); + //MatrixXd Nqa1 = (eye-(Jqa1_pseudo*Jqa1)); + MatrixXd Nqa1 = (eye-(Jqa1_geninverse*Jqa1)); // Secondary task Jacobian and sigma MatrixXd JG,JG_pseudo,sigmaG; @@ -243,7 +243,11 @@ void CQuadarm_Task_Priority_Ctrl::qa_control(){ Jqa1_G.block(Jqa1.rows()-1,0,JG.rows(),JG.cols())=JG; MatrixXd Nqa1_G = MatrixXd::Zero(4+this->arm_.nj,4+this->arm_.nj); MatrixXd Jqa1_G_pseudo = calcPinv(Jqa1_G); - Nqa1_G = (eye-(Jqa1_G_pseudo*Jqa1_G)); + // Third task after secondary aligning CoG + //Nqa1_G = (eye-(Jqa1_G_pseudo*Jqa1_G)); + + // Third task as secondary + Nqa1_G = Nqa1; // Sec task Jacobian and sigma MatrixXd JL,JL_pseudo,sigmaL; @@ -268,7 +272,8 @@ void CQuadarm_Task_Priority_Ctrl::qa_control(){ this->ctrl_params_.jntlim_vel = MatrixXd::Zero(4+this->arm_.nj,1); cout << "[Task Priority Control]: Secondary tasks not enabled" << endl; } - Vtotal = this->ctrl_params_.vs_vel + this->ctrl_params_.cog_vel + this->ctrl_params_.jntlim_vel; + //Vtotal = this->ctrl_params_.vs_vel + this->ctrl_params_.cog_vel + this->ctrl_params_.jntlim_vel; + Vtotal = this->ctrl_params_.vs_vel + this->ctrl_params_.jntlim_vel; Vtotal = this->ctrl_params_.lambda_robot.array()*Vtotal.array(); // Check a singular configuration ///// @@ -317,17 +322,12 @@ void CQuadarm_Task_Priority_Ctrl::sec_task_cog(MatrixXd& JG,MatrixXd& sigmaG) qa = this->arm_.jnt_pos.block(6,0,this->arm_.nj,1); //Fixed transform from arm_base to base_link - Matrix4d Tbase = Matrix4d::Zero(); - //Tbase(3,3) = 1; - //Tbase(0,2) = -1; - //Tbase(1,1) = 1; - //Tbase(2,0) = 1; - - Tbase(0,0) = 1; - Tbase(1,1) = 1; - Tbase(2,2) = 1; - Tbase(3,3) = 1; - + // Matrix4d Tbase = Matrix4d::Zero(); + // Tbase(0,0) = -1; + // Tbase(1,1) = 1; + // Tbase(2,2) = -1; + // Tbase(3,3) = 1; + Matrix4d Tbase = Matrix4d::Identity(); // Origin of the base frame MatrixXd pini(4,1); @@ -342,6 +342,7 @@ void CQuadarm_Task_Priority_Ctrl::sec_task_cog(MatrixXd& JG,MatrixXd& sigmaG) // Debug //std::cout << "**************" << std::endl; + this->arm_cog_data_.link.resize(this->arm_.nj); for (unsigned int jj = 0; jj < this->arm_.nj; ++jj) { @@ -367,20 +368,34 @@ void CQuadarm_Task_Priority_Ctrl::sec_task_cog(MatrixXd& JG,MatrixXd& sigmaG) this->arm_.mass = this->arm_.mass + mass(jj,0); //Debug - //std::cout << "num segments: " << arm_segment.size() << std::endl; - //std::cout << "Link: " << jj << " name:" << arm_segment.at(jj+1).getName() << std::endl; - //std::cout << "Transform: " << std::endl; - //std::cout << T_base_to_joint.at(jj+1) <<std::endl; + // std::cout << "num segments: " << arm_segment.size() << std::endl; + // std::cout << "Link: " << jj << " name:"; + // std::cout << arm_segment.at(jj+1).getName(); + // std::cout << " mass: " << mass(jj,0); + // std::cout << " link_cog:" << std::endl; + // std::cout << frame_link.at(jj)+dist.at(jj) << std::endl; + // std::cout << "Transform: " << std::endl; + // std::cout << T_base_to_joint.at(jj+1) <<std::endl; + + // Fill link information + this->arm_cog_data_.link.at(jj).origin = T_base_to_joint.at(jj+1); + this->arm_cog_data_.link.at(jj).cog = (frame_link.at(jj+1)-frame_link.at(jj))/2; + this->arm_cog_data_.link.at(jj).mass = mass(jj,0); } // Debug - //std::cout << "mass: " << this->arm_.mass << std::endl; - //std::cout << "arm_cg: " << arm_cg << std::endl; + // std::cout << "mass: " << this->arm_.mass << std::endl; + // std::cout << "arm_cg: " << arm_cg << std::endl; // vector from arm base to CoG this->ctrl_params_.cog_arm = arm_cg/this->arm_.mass; // Debug - //std::cout << "cog: " << this->ctrl_params_.cog_arm << std::endl; + // std::cout << "cog: " << this->ctrl_params_.cog_arm << std::endl; + + // Fill arm CoG information + this->arm_cog_data_.arm_mass = this->arm_.mass; + this->arm_cog_data_.arm_cog = this->ctrl_params_.cog_arm; + // Rotation between quadrotor body and inertial frames Matrix3d Rib; diff --git a/src/quadarm_task_priority_ctrl.h b/src/quadarm_task_priority_ctrl.h index a9d04217ec93817aca7579d5574e8d7a7dc178d8..124809e6b96e465d85bc916bdc69b60752654d2f 100644 --- a/src/quadarm_task_priority_ctrl.h +++ b/src/quadarm_task_priority_ctrl.h @@ -99,6 +99,17 @@ typedef struct{ MatrixXd v_rollpitch; // Quadrotor roll and pitch angular velocities. }ctrl_params; +typedef struct{ + MatrixXd origin; // Origin coordinates + MatrixXd cog; // CoG coordinates (3D vector) w.r.t. link origin + double mass; // Mass +}link_obj; + +typedef struct{ + vector<link_obj> link; // Vector of link CoG relative to base + double arm_mass; // Arm Mass; + MatrixXd arm_cog; // Arm CoG coordinates w.r.t. arm base link; +}cog_data; class CQuadarm_Task_Priority_Ctrl { @@ -199,6 +210,8 @@ class CQuadarm_Task_Priority_Ctrl public: + cog_data arm_cog_data_; // Arm CoG data to debug in higher levels. + /** * \brief Constructor *