diff --git a/src/quadarm_task_priority_ctrl.cpp b/src/quadarm_task_priority_ctrl.cpp index 6db4225092504bfc22da599634ddba1a2afcb9f1..052ab852651485ca189b0b4ff1d1a48f246ebb64 100644 --- a/src/quadarm_task_priority_ctrl.cpp +++ b/src/quadarm_task_priority_ctrl.cpp @@ -200,56 +200,50 @@ MatrixXd CQuadarm_Task_Priority_Ctrl::quadrotor_jacobian() // Control void CQuadarm_Task_Priority_Ctrl::qa_control(){ + // Control law ________________________________________________________________ + + // TASK: Security task (Inflation radius) _____________________ + + // task Jacobian and sigma + MatrixXd JIR,JIR_pseudo,sigmaIR; + task_infrad(JIR,JIR_pseudo,sigmaIR); + + + // TASK: Visual Servo _________________________________________ + // Underactuated Quadrotor MatrixXd J1(8,4),J2(8,2),Jqa1(6,4+this->arm_.nj),Jqa2(6,2); - // 9 DOF Extracting wx and wy from quadrotor ////////////////// + // 9 DOF Extracting wx and wy from quadrotor Jqa1.block(0,0,6,3) = this->Jqa_.block(0,0,6,3); Jqa1.block(0,3,6,1+this->arm_.nj) = this->Jqa_.block(0,5,6,1+this->arm_.nj); Jqa2 = this->Jqa_.block(0,3,6,2); MatrixXd eye(4+this->arm_.nj,4+this->arm_.nj); eye = MatrixXd::Identity(4+this->arm_.nj,4+this->arm_.nj); - // compute pseudo inverse ///////////// - MatrixXd Jqa1_pseudo(4+this->arm_.nj,6); - Jqa1_pseudo = calcPinv(Jqa1); - + // compute pseudo inverse + //MatrixXd Jqa1_pseudo(4+this->arm_.nj,6); + //Jqa1_pseudo = calcPinv(Jqa1); MatrixXd Jqa1_wpseudo(4+this->arm_.nj,6); Jqa1_wpseudo = weight_jacvs_inverse(Jqa1); MatrixXd sigmaVS = this->vel_.cam-Jqa2*this->ctrl_params_.v_rollpitch; - - // Control law ________________________________________________________________ - - // Secutiry task (Inflation radius) - MatrixXd JIR,JIR_pseudo,sigmaIR; - task_infrad(JIR,JIR_pseudo,sigmaIR); - - - // Primary control task (Visual Servo) ________________________ - this->ctrl_params_.vs_vel = Jqa1_wpseudo * sigmaVS; - - // Jqa1 - // Jqa1_wpseudo - // sigmaVS - - // Secondary control task (CoG alignement) ____________________ + // TASK: CoG alignement ______________________________________ // Null space projector - //MatrixXd Nqa1 = (eye-(Jqa1_pseudo*Jqa1)); MatrixXd Nqa1 = (eye-(Jqa1_wpseudo*Jqa1)); - // Secondary task Jacobian and sigma + // task Jacobian and sigma MatrixXd JG,JG_pseudo,sigmaG; task_cog(JG,JG_pseudo,sigmaG); // Gain double lambdaG = this->ctrl_params_.cog_gain; - // Secondary task velocity + // task velocity this->ctrl_params_.cog_vel = Nqa1 * JG_pseudo * lambdaG * sigmaG; // Third control task (Joint limits) ________________________ @@ -260,21 +254,19 @@ 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); + // Third task after secondary aligning CoG Nqa1_G = (eye-(Jqa1_G_pseudo*Jqa1_G)); + //Nqa1_G = Nqa1; // Third task as secondary - // Third task as secondary - //Nqa1_G = Nqa1; - - // Sec task Jacobian and sigma + // task Jacobian and sigma MatrixXd JL,JL_pseudo,sigmaL; task_jl(JL,JL_pseudo,sigmaL); - // Gain double lambdaL = this->ctrl_params_.jntlim_gain; - // Third task velocity + // task velocity this->ctrl_params_.jntlim_vel = Nqa1_G * JL_pseudo * lambdaL * sigmaL; //******************************************************************