Skip to content
Snippets Groups Projects
Commit 0164598a authored by Angel Santamaria-Navarro's avatar Angel Santamaria-Navarro
Browse files

Added options to the launch file (jacvs weighted pseudo inverse and task priority)

parent b61ef4c7
No related branches found
No related tags found
No related merge requests found
......@@ -22,6 +22,7 @@ void CQuadarm_Task_Priority_Ctrl::quadarm_task_priority_ctrl(const goal_obj& goa
arm& arm,
const quadrotor& quad,
ctrl_params& ctrl_params,
const options& options,
cog_data& arm_cog_data,
MatrixXd& robot_pos,
MatrixXd& robot_vel)
......@@ -29,14 +30,14 @@ void CQuadarm_Task_Priority_Ctrl::quadarm_task_priority_ctrl(const goal_obj& goa
// Goal related objects
this->cam_vel_ = goal.cam_vel;
this->target_dist_ = goal.target_dist;
// Distance to a detected obstacle (0 = no obstacle)
this->obstacle_dist_ = obstacle_dist;
// Homogeneous transformations
this->T_ = HT;
// Control parameters
this->ctrl_params_ = ctrl_params;
// Algorithmic options
this->options_ = options;
// Arm data
this->arm_.chain = arm.chain;
this->arm_.joint_info= arm.joint_info;
......@@ -207,31 +208,28 @@ MatrixXd CQuadarm_Task_Priority_Ctrl::quadrotor_jacobian()
// Control
void CQuadarm_Task_Priority_Ctrl::uam_control(){
// TASK 0: Security task (Inflation radius) _____________________
// Task Jacobians and sigmas ____________________________________
// task Jacobian and sigma
// Security task (Inflation radius: IR)
MatrixXd JIR,JIR_pseudo,sigmaIR;
task_infrad(JIR,JIR_pseudo,sigmaIR);
// task velocity
this->ctrl_params_.ir_vel = JIR_pseudo * sigmaIR;
// TASK 1: Visual Servo _________________________________________
// Null space projector
MatrixXd eye = MatrixXd::Identity(4+this->arm_.nj,4+this->arm_.nj);
MatrixXd NIR = (eye-(JIR_pseudo*JIR));
// task Jacobian and sigma
// Visual Servo (VS)
MatrixXd JVS,JVS_wpseudo,sigmaVS;
task_vs(JVS,JVS_wpseudo,sigmaVS);
// CoG alignement (G)
MatrixXd JG,JG_pseudo,sigmaG;
task_cog(JG,JG_pseudo,sigmaG);
// Joint limits avoidance (L)
MatrixXd JL,JL_pseudo,sigmaL;
task_jl(JL,JL_pseudo,sigmaL);
// task velocity
this->ctrl_params_.vs_vel = NIR * JVS_wpseudo * sigmaVS;
// NULL space projectors ________________________________________
// TASK 2: CoG alignement ______________________________________
// IR
MatrixXd eye = MatrixXd::Identity(4+this->arm_.nj,4+this->arm_.nj);
MatrixXd NIR = (eye-(JIR_pseudo*JIR));
// Null space projector
// IR + VS
MatrixXd JIR_VS = MatrixXd::Zero(JIR.rows()+JVS.rows(),JVS.cols());
JIR_VS.block(0,0,JIR.rows(),JIR.cols()) = JIR;
JIR_VS.block(JIR.rows()-1,0,JVS.rows(),JVS.cols())=JVS;
......@@ -239,65 +237,96 @@ void CQuadarm_Task_Priority_Ctrl::uam_control(){
MatrixXd JIR_VS_pseudo = calcPinv(JIR_VS);
NIR_VS = (eye-(JIR_VS_pseudo*JIR_VS));
// task Jacobian and sigma
MatrixXd JG,JG_pseudo,sigmaG;
task_cog(JG,JG_pseudo,sigmaG);
// Gain
double lambdaG = this->ctrl_params_.cog_gain;
MatrixXd NIR_VS_G = MatrixXd::Zero(4+this->arm_.nj,4+this->arm_.nj);
MatrixXd NIR_VS_L = MatrixXd::Zero(4+this->arm_.nj,4+this->arm_.nj);
// task velocity
this->ctrl_params_.cog_vel = NIR_VS * JG_pseudo * lambdaG * sigmaG;
if (this->options_.task_prio == IRVSGL)
{
// IR + VS + G
MatrixXd JIR_VS_G = MatrixXd::Zero(JIR_VS.rows()+JG.rows(),JIR_VS.cols());
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 JIR_VS_G_pseudo = calcPinv(JIR_VS_G);
NIR_VS_G = (eye-(JIR_VS_G_pseudo*JIR_VS_G));
}
else if (this->options_.task_prio == IRVSLG)
{
// IR + VS + L
MatrixXd JIR_VS_L = MatrixXd::Zero(JIR_VS.rows()+JL.rows(),JIR_VS.cols());
JIR_VS_L.block(0,0,JIR_VS.rows(),JIR_VS.cols()) = JIR_VS;
JIR_VS_L.block(JIR_VS.rows()-1,0,JL.rows(),JL.cols())=JL;
MatrixXd JIR_VS_L_pseudo = calcPinv(JIR_VS_L);
NIR_VS_L = (eye-(JIR_VS_L_pseudo*JIR_VS_L));
}
// TASK 3: Joint limits ________________________
// Augmented null space projector from Augmented Jacobian
MatrixXd JIR_VS_G = MatrixXd::Zero(JIR_VS.rows()+JG.rows(),JIR_VS.cols());
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 = calcPinv(JIR_VS_G);
// Total velocities __________________________________________________________
// Third task after secondary aligning CoG
NIR_VS_G = (eye-(JIR_VS_G_pseudo*JIR_VS_G));
// IR
this->ctrl_params_.ir_vel = JIR_pseudo * sigmaIR;
// task Jacobian and sigma
MatrixXd JL,JL_pseudo,sigmaL;
task_jl(JL,JL_pseudo,sigmaL);
// Gain
double lambdaL = this->ctrl_params_.jntlim_gain;
// VS
this->ctrl_params_.vs_vel = NIR * JVS_wpseudo * sigmaVS;
MatrixXd Vtotal(4+this->arm_.nj,1);
// task velocity
//this->ctrl_params_.jntlim_vel = NIR_VS * JL_pseudo * lambdaL * sigmaL; // As secondary
this->ctrl_params_.jntlim_vel = NIR_VS_G * JL_pseudo * lambdaL * sigmaL;
switch (this->options_.task_prio){
case IRVS:
{
Vtotal = this->ctrl_params_.ir_vel + this->ctrl_params_.vs_vel;
break;
}
case IRVSG:
{
// G
double lambdaG = this->ctrl_params_.cog_gain;
this->ctrl_params_.cog_vel = NIR_VS * JG_pseudo * lambdaG * sigmaG;
// Vtotal = IR + VS + G
Vtotal = this->ctrl_params_.ir_vel + this->ctrl_params_.vs_vel + this->ctrl_params_.cog_vel;
break;
}
case IRVSGL:
{
// G
double lambdaG = this->ctrl_params_.cog_gain;
this->ctrl_params_.cog_vel = NIR_VS * JG_pseudo * lambdaG * sigmaG;
// L
double lambdaL = this->ctrl_params_.jntlim_gain;
this->ctrl_params_.jntlim_vel = NIR_VS_G * JL_pseudo * lambdaL * sigmaL;
// Vtotal = IR + VS + G + L
Vtotal = this->ctrl_params_.ir_vel + this->ctrl_params_.vs_vel + this->ctrl_params_.cog_vel + this->ctrl_params_.jntlim_vel;
break;
}
case IRVSL:
{
// L
double lambdaL = this->ctrl_params_.jntlim_gain;
this->ctrl_params_.jntlim_vel = NIR_VS * JL_pseudo * lambdaL * sigmaL;
// Vtotal = IR + VS + L
Vtotal = this->ctrl_params_.ir_vel + this->ctrl_params_.vs_vel + this->ctrl_params_.jntlim_vel;
break;
}
case IRVSLG:
{
// L
double lambdaL = this->ctrl_params_.jntlim_gain;
this->ctrl_params_.jntlim_vel = NIR_VS * JL_pseudo * lambdaL * sigmaL;
// G
double lambdaG = this->ctrl_params_.cog_gain;
this->ctrl_params_.cog_vel = NIR_VS_L * JG_pseudo * lambdaG * sigmaG;
// Vtotal = IR + VS + L + G
Vtotal = this->ctrl_params_.ir_vel + this->ctrl_params_.vs_vel + this->ctrl_params_.jntlim_vel + this->ctrl_params_.cog_vel;
break;
}
}
// Total velocities _______________________________
Vtotal = this->ctrl_params_.lambda_robot.array()*Vtotal.array();
//******************************************************************
// Weighted sum of subtasks
// Weighted sum of subtasks (OLD: comparison purposes)
// this->ctrl_params_.cog_vel = NIR * (JG_pseudo * lambdaG * sigmaG + JL_pseudo * lambdaL * sigmaL);
// this->ctrl_params_.jntlim_vel = MatrixXd::Zero(9,1);
//******************************************************************
//Total velocity __________________________________________
if (!this->ctrl_params_.enable_sec_task)
{
this->ctrl_params_.cog_vel = MatrixXd::Zero(4+this->arm_.nj,1);
this->ctrl_params_.jntlim_vel = MatrixXd::Zero(4+this->arm_.nj,1);
cout << "[Task Priority Control]: Secondary tasks not enabled" << endl;
}
MatrixXd Vtotal(4+this->arm_.nj,1);
// Task 0 + 1 + 2
//Vtotal = this->ctrl_params_.ir_vel + this->ctrl_params_.vs_vel + this->ctrl_params_.cog_vel;
// Task 0 + 1 + 3
//Vtotal = this->ctrl_params_.ir_vel + this->ctrl_params_.vs_vel + this->ctrl_params_.jntlim_vel;
// All tasks
Vtotal = this->ctrl_params_.ir_vel + this->ctrl_params_.vs_vel + this->ctrl_params_.cog_vel + this->ctrl_params_.jntlim_vel;
Vtotal = this->ctrl_params_.lambda_robot.array()*Vtotal.array();
// // Debug
// std::cout << "Task velocities" << std::endl;
......@@ -373,8 +402,10 @@ void CQuadarm_Task_Priority_Ctrl::task_vs(MatrixXd& JVS,MatrixXd& JVS_pseudo,Mat
JVS = Jqa1;
// task jacobian pseudo inverse
//JVS_pseudo = calcPinv(Jqa1);
JVS_pseudo = weight_jacvs_inverse(Jqa1);
if (this->options_.jacvs_weight_pinv)
JVS_pseudo = jacvs_weight_pinv(Jqa1);
else
JVS_pseudo = calcPinv(Jqa1);
// task velocity vector
sigmaVS = this->cam_vel_-Jqa2*this->ctrl_params_.v_rollpitch;
......@@ -571,7 +602,7 @@ void CQuadarm_Task_Priority_Ctrl::task_jl(MatrixXd& JL,MatrixXd& JL_pseudo,Matri
}
// MISC functions
MatrixXd CQuadarm_Task_Priority_Ctrl::weight_jacvs_inverse(const MatrixXd& J)
MatrixXd CQuadarm_Task_Priority_Ctrl::jacvs_weight_pinv(const MatrixXd& J)
{
// W: Weighting matrix (motion distribution) ______________________
double w_min = this->ctrl_params_.vs_delta_gain(0,0);
......
......@@ -57,10 +57,6 @@ typedef struct{
MatrixXd arm_cog; // Arm CoG coordinates w.r.t. arm base link;
}cog_data;
typedef struct{
bool vs_weight_psinv; // If using weighted pseudo inverse of the visual servo Jacobian
}config;
// Arm joint definition
typedef struct{
string link_parent; // Link parent name.
......@@ -97,7 +93,6 @@ typedef struct{
// 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.
MatrixXd lambda_robot; // Robot proportional gains.
......@@ -118,6 +113,19 @@ typedef struct{
MatrixXd v_rollpitch; // Quadrotor roll and pitch angular velocities.
}ctrl_params;
enum task_seq {
IRVS, // 1: Inflation Radius, 2: Visual Servo
IRVSG, // 1: Inflation Radius, 2: Visual Servo, 3: CoG alignement
IRVSGL, // 1: Inflation Radius, 2: Visual Servo, 3: CoG alignement, 4: Joint limits avoidance
IRVSL, // 1: Inflation Radius, 2: Visual Servo, 3: Joint limits avoidance
IRVSLG, // 1: Inflation Radius, 2: Visual Servo, 3: Joint limits avoidance, 4: CoG alignement
};
typedef struct{
bool jacvs_weight_pinv; // If using weighted pseudo inverse of the visual servo Jacobian
task_seq task_prio; // Task priorization
}options;
class CQuadarm_Task_Priority_Ctrl
{
......@@ -132,6 +140,8 @@ class CQuadarm_Task_Priority_Ctrl
ctrl_params ctrl_params_; // Control Law parameters.
options options_; // Possible algorithmic options.
ht T_; // Homogeneous Transforms
cog_data arm_cog_data_; // Arm CoG data to debug in higher levels.
......@@ -231,7 +241,7 @@ class CQuadarm_Task_Priority_Ctrl
* Compute the Jacobian inverse weighted depending on target distance
*
*/
MatrixXd weight_jacvs_inverse(const MatrixXd& J);
MatrixXd jacvs_weight_pinv(const MatrixXd& J);
/**
* \brief KDL Frame to Homogeneous transform
......@@ -270,6 +280,7 @@ class CQuadarm_Task_Priority_Ctrl
arm& arm,
const quadrotor& quad,
ctrl_params& ctrl_params,
const options& options,
cog_data& arm_cog_data,
MatrixXd& robot_pos,
MatrixXd& robot_vel);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment