From c08e5a617dba280e701149809631af8598ba6c84 Mon Sep 17 00:00:00 2001
From: mnaveau <maximilien.naveau@laas.fr>
Date: Thu, 18 Aug 2016 18:22:53 +0200
Subject: [PATCH] enable to put different weight on velocity tracking for X Y
 and Yaw

---
 .../nmpc_generator.cpp                        | 73 +++++++++++--------
 .../nmpc_generator.hh                         |  5 +-
 2 files changed, 46 insertions(+), 32 deletions(-)

diff --git a/src/ZMPRefTrajectoryGeneration/nmpc_generator.cpp b/src/ZMPRefTrajectoryGeneration/nmpc_generator.cpp
index fa5af714..8677b79a 100644
--- a/src/ZMPRefTrajectoryGeneration/nmpc_generator.cpp
+++ b/src/ZMPRefTrajectoryGeneration/nmpc_generator.cpp
@@ -115,7 +115,9 @@ NMPCgenerator::NMPCgenerator(SimplePluginManager * aSPM, PinocchioRobot *aPR)
   nc_obs_  = 0 ;
   nc_stan_ = 0 ;
 
-  alpha_=0.0;
+  alpha_x_     = 0.0 ;
+  alpha_y_     = 0.0 ;
+  alpha_theta_ = 0.0 ;
   beta_ =0.0;
   gamma_=0.0;
 
@@ -230,9 +232,11 @@ void NMPCgenerator::initNMPCgenerator(
   T_ = T ;
   Tfirst_ = T ;
   T_step_ = T_step ;
-  alpha_ = 1 ;// 1     ; // weight for CoM velocity tracking  : 0.5 * a ; 2.5
-  beta_  = 1e+3 ;// 1     ; // weight for ZMP reference tracking : 0.5 * b ; 1e+03
-  gamma_ = 1e-05 ;// 1e-05 ; // weight for jerk minimization      : 0.5 * c ; 1e-04
+  alpha_x_     = 1.0 ; // 1.0   ; // weight for CoM velocity X tracking  : 0.5 * a ; 2.5
+  alpha_y_     = 5.0 ; // 1.0   ; // weight for CoM velocity Y tracking  : 0.5 * a ; 2.5
+  alpha_theta_ = 1e+7 ;// 1.0  ; // weight for CoM velocity Yaw tracking  : 0.5 * a ; 2.5
+  beta_  = 1e+3 ;      // 1.0   ; // weight for ZMP reference tracking : 0.5 * b ; 1e+03
+  gamma_ = 1e-5 ;      // 1e-05 ; // weight for jerk minimization      : 0.5 * c ; 1e-04
   SecurityMarginX_ = 0.09 ;
   SecurityMarginY_ = 0.05 ;
 
@@ -1321,22 +1325,22 @@ void NMPCgenerator::updateFootPoseConstraint()
       }
     }
 
-//    if(n!=0)
-//    {
-//      deltaF_[n](0)=F_kp1_x_[n]-F_kp1_x_[n-1];
-//      deltaF_[n](1)=F_kp1_y_[n]-F_kp1_y_[n-1];
-//      AdRdF_[n] = MAL_RET_A_by_B(A0f_theta_[n],deltaF_[n]);
-//      double sum = 0.0 ;
-//      for (unsigned j=0 ; j<n_vertices_ ; ++j)
-//      {
-//        sum += AdRdF_[n](j);
-//      }
-//      for (unsigned j=0 ; j<n_vertices_ ; ++j)
-//      {
-//        //Afoot_theta_[n](j,n-1) = sum;
-//        Afoot_theta_[n](j,n-1) = AdRdF_[n](j);
-//      }
-//    }
+    if(n!=0)
+    {
+      deltaF_[n](0)=F_kp1_x_[n]-F_kp1_x_[n-1];
+      deltaF_[n](1)=F_kp1_y_[n]-F_kp1_y_[n-1];
+      AdRdF_[n] = MAL_RET_A_by_B(A0f_theta_[n],deltaF_[n]);
+      double sum = 0.0 ;
+      for (unsigned j=0 ; j<n_vertices_ ; ++j)
+      {
+        sum += AdRdF_[n](j);
+      }
+      for (unsigned j=0 ; j<n_vertices_ ; ++j)
+      {
+        //Afoot_theta_[n](j,n-1) = sum;
+        Afoot_theta_[n](j,n-1) = AdRdF_[n](j);
+      }
+    }
 #ifdef DEBUG
   ostringstream os ("") ;
   os << "Afoot_xy_" << n << "_" ;
@@ -1621,6 +1625,7 @@ void NMPCgenerator::initializeCostFunction()
   MAL_MATRIX_RESIZE(Q_x_XF_     ,N_,nf_);    MAL_MATRIX_FILL(Q_x_XF_     ,0.0);
   MAL_MATRIX_RESIZE(Q_x_FX_     ,nf_,N_);    MAL_MATRIX_FILL(Q_x_FX_     ,0.0);
   MAL_MATRIX_RESIZE(Q_x_FF_     ,nf_,nf_);   MAL_MATRIX_FILL(Q_x_FF_     ,0.0);
+  MAL_MATRIX_RESIZE(Q_y_XX_     ,N_,N_);     MAL_MATRIX_FILL(Q_y_XX_     ,0.0);
   MAL_MATRIX_RESIZE(Q_theta_    ,nf_,nf_);   MAL_MATRIX_SET_IDENTITY(Q_theta_);
   MAL_VECTOR_RESIZE(p_xy_X_     ,N_);        MAL_VECTOR_FILL(p_xy_X_ , 0.0);
   MAL_VECTOR_RESIZE(p_xy_Fx_    ,nf_);       MAL_VECTOR_FILL(p_xy_Fx_, 0.0);
@@ -1649,7 +1654,7 @@ void NMPCgenerator::initializeCostFunction()
 
   // Q_q = 0.5 * a * ( 1 0 )
   //                 ( 0 1 )
-  Q_theta_ *= alpha_ ;
+  Q_theta_ *= alpha_theta_ ;
 
   // Q_x_XF_, Q_x_FX_, Q_x_FF_ are time dependant matrices so they
   // are computed in the update function
@@ -1665,9 +1670,9 @@ void NMPCgenerator::updateCostFunction()
   // Q_xXF = ( -0.5 * b * Pzu^T   * V_kp1 )
   // Q_xFX = ( -0.5 * b * V_kp1^T * Pzu )^T
   // Q_xFF = (  0.5 * b * V_kp1^T * V_kp1 )
-  Q_x_XX_ = alpha_ * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pvu_),Pvu_)
-          + beta_  * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pzu_),Pzu_)
-          + gamma_ * I_NN_ ;
+  Q_x_XX_ = alpha_x_ * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pvu_),Pvu_)
+          + beta_    * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pzu_),Pzu_)
+          + gamma_   * I_NN_ ;
 
   // Q_xXX = (  0.5 * a * Pvu^T   * Pvu + b * Pzu^T * Pzu + c * I )
   // Q_xXF = ( -0.5 * b * Pzu^T   * V_kp1 )
@@ -1677,12 +1682,18 @@ void NMPCgenerator::updateCostFunction()
   Q_x_FX_ =   MAL_RET_TRANSPOSE(Q_x_XF_);
   Q_x_FF_ =   beta_ * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(V_kp1_),V_kp1_);
 
+  // Q_yXX = (  0.5 * a * Pvu^T   * Pvu + b * Pzu^T * Pzu + c * I )
+  Q_y_XX_ = alpha_y_ * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pvu_),Pvu_)
+          + beta_    * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pzu_),Pzu_)
+          + gamma_   * I_NN_ ;
+
+
   // define QP matrices
   // Gauss-Newton Hessian
   //                                     dim :
   // H = (( Q_xXX  Q_xXF   0      0       0     ) N_
   //      ( Q_xFX  Q_xFF   0      0       0     ) nf_
-  //      (   0      0   Q_xXX  Q_xXF     0     ) N_
+  //      (   0      0   Q_yXX  Q_xXF     0     ) N_
   //      (   0      0   Q_xFX  Q_xFF     0     ) nf_
   //      (   0      0     0      0    Q_theta_ ) nf_
   //dim :     N_     nf_   N_     nf_    nf_     = nv_
@@ -1695,7 +1706,7 @@ void NMPCgenerator::updateCostFunction()
     for(unsigned j=0 ; j<N_ ; ++j)
     {
       qp_H_(i,j) = Q_x_XX_(i,j) ;
-      qp_H_(Nnf+i,Nnf+j) = Q_x_XX_(i,j) ;
+      qp_H_(Nnf+i,Nnf+j) = Q_y_XX_(i,j) ;
     }
   }
   for(unsigned i=0 ; i<N_ ; ++i)
@@ -1742,8 +1753,8 @@ void NMPCgenerator::updateCostFunction()
   // Pzsc_x_, Pzsc_y_ , v_kp1f_x_ and v_kp1f_y_ already up to date
   //from the CoP constraint building function
 
-  p_xy_X_ =    alpha_ * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pvu_  ), Pvsc_x_ - vel_ref_.Global.X_vec)
-             + beta_  * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pzu_  ), Pzsc_x_ - v_kp1f_x_            );
+  p_xy_X_ =    alpha_x_ * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pvu_  ), Pvsc_x_ - vel_ref_.Global.X_vec)
+             + beta_    * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pzu_  ), Pzsc_x_ - v_kp1f_x_            );
 #ifdef DEBUG
   DumpVector("Pvsc_x_"    , Pvsc_x_                    ) ;
   DumpVector("RefVectorX" , vel_ref_.Global.X_vec ) ;
@@ -1752,8 +1763,8 @@ void NMPCgenerator::updateCostFunction()
 #endif
   p_xy_Fx_ = - beta_  * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(V_kp1_), Pzsc_x_ - v_kp1f_x_                 );
 
-  p_xy_Y_  =   alpha_ * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pvu_  ), Pvsc_y_ - vel_ref_.Global.Y_vec)
-             + beta_  * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pzu_  ), Pzsc_y_ - v_kp1f_y_                 );
+  p_xy_Y_  =   alpha_y_ * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pvu_  ), Pvsc_y_ - vel_ref_.Global.Y_vec)
+             + beta_    * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(Pzu_  ), Pzsc_y_ - v_kp1f_y_                 );
 
   p_xy_Fy_ = - beta_  * MAL_RET_A_by_B(MAL_RET_TRANSPOSE(V_kp1_), Pzsc_y_ - v_kp1f_y_                 );
 #ifdef DEBUG
@@ -1783,7 +1794,7 @@ void NMPCgenerator::updateCostFunction()
   index+=nf_;
   // p_theta_ = ( 0.5 * a * [ f_k_theta+T_step*dTheta^ref  f_k_theta+2*T_step*dTheta^ref ] )
   for(unsigned i=0 ; i<nf_ ; ++i)
-    p_(index+i) = - alpha_ * ( currentSupport_.Yaw + (i+1) * T_step_* vel_ref_.Global.Yaw) ;
+    p_(index+i) = - alpha_theta_ * ( currentSupport_.Yaw + (i+1) * T_step_* vel_ref_.Global.Yaw) ;
 
   // Gradient of Objective
   // qp_g_ = (gx    )
diff --git a/src/ZMPRefTrajectoryGeneration/nmpc_generator.hh b/src/ZMPRefTrajectoryGeneration/nmpc_generator.hh
index 07d33bf2..ba47a3e3 100644
--- a/src/ZMPRefTrajectoryGeneration/nmpc_generator.hh
+++ b/src/ZMPRefTrajectoryGeneration/nmpc_generator.hh
@@ -314,6 +314,7 @@ namespace PatternGeneratorJRL
     // Q_x = ( Q_x_XX Q_x_XF ) = Q_y
     //       ( Q_x_FX Q_x_FF )
     MAL_MATRIX_TYPE(double) Q_x_XX_, Q_x_XF_, Q_x_FX_, Q_x_FF_ ;
+    MAL_MATRIX_TYPE(double) Q_y_XX_;// Q_x_XX_ != Q_y_XX_
 
     // Line Search
     bool useLineSearch_ ;
@@ -377,7 +378,9 @@ namespace PatternGeneratorJRL
     double SecurityMarginY_ ;
 
     // Gain of the cost function :
-    double alpha_ ;
+    double alpha_x_ ;
+    double alpha_y_ ;
+    double alpha_theta_ ;
     double beta_  ;
     double gamma_ ;
 
-- 
GitLab