diff --git a/src/ZMPRefTrajectoryGeneration/nmpc_generator.cpp b/src/ZMPRefTrajectoryGeneration/nmpc_generator.cpp index b7d54c5bffa14c70657e55e63db4eb0df15c97a3..54552f9259c93483ac84f7d449795333452248d9 100644 --- a/src/ZMPRefTrajectoryGeneration/nmpc_generator.cpp +++ b/src/ZMPRefTrajectoryGeneration/nmpc_generator.cpp @@ -400,8 +400,10 @@ void NMPCgenerator::solve_qp(){ else { // force the solver to use the maximum time for computing the solution +// cput_[0] = 0.0015; +// nwsr_ = 20 ; cput_[0] = 0.0015; - nwsr_ = 20 ; + nwsr_ = 100 ; /*ret = */QP_->hotstart( qpOases_H_, qpOases_g_, qpOases_J_, qpOases_lb_, qpOases_ub_, @@ -1028,7 +1030,7 @@ void NMPCgenerator::updateCoPConstraint() rotMat_(1,0)=-sin(angle) ; rotMat_(1,1)= cos(angle) ; double l = 0.04; - double L = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) + 0.04 ; + double L = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) ; hull4_.X_vec[0] = - L*0.5 ; hull4_.Y_vec[0] = - l*0.5 ; hull4_.X_vec[1] = - L*0.5 ; hull4_.Y_vec[1] = + l*0.5 ; @@ -1418,46 +1420,13 @@ void NMPCgenerator::updateFootVelIneqConstraint() break; --itBeforeLanding; -// double dt = (double)itBeforeLanding * T_ - 2*T_;// (t_touchdown - t) -// if(dt<=0.0) -// { -// dt=0.0; -// } -// //dt=0.0; - -// double vref_x = vel_ref_.Global.X ; -// double vref_y = vel_ref_.Global.Y ; -// double norm_vref = sqrt(vref_x*vref_x + vref_y*vref_y ) ; -// if (norm_vref<=1e-5) -// { -// // in that case we use arbitrary velocity reference -// // to not get division by zero -// vref_x = 1.0 ; -// vref_y = 0.0 ; -// norm_vref = 1.0; -// } -// double dyaw = vel_ref_.Global.Yaw ; -// double signq = dyaw>=0.0?1:-1; - -// double xvmax(0.4), yvmax(0.4), yawvmax(0.3) ;// [m/s,m/s,rad/s] - -// UBvel_(0) = (dt) * xvmax + vref_x * F_kp1_x_(0) / norm_vref ; -// UBvel_(1) = (dt) * yvmax + vref_y * F_kp1_y_(0) / norm_vref ; - -// Avel_(0, N_ ) = vref_x / norm_vref ; -// Avel_(1, 2*N_+nf_) = vref_y / norm_vref ; - -// Avel_ (2,2*N_+2*nf_) = signq ; -// UBvel_(2) = (dt) * yawvmax + signq * F_kp1_theta_(0) ; - - - double thresh_time_pos = 0.0 ; double thresh_time_rot = 0.0 ; if(itBeforeLanding < 2) + { thresh_time_pos=1.0; - if(itBeforeLanding < 2) thresh_time_rot=1.0; + } Avel_(0, N_ ) = thresh_time_pos ; Avel_(1, 2*N_+nf_) = thresh_time_pos ; Avel_ (2,2*N_+2*nf_) = thresh_time_rot ; @@ -1702,6 +1671,13 @@ void NMPCgenerator::initializeCostFunction() MAL_VECTOR_RESIZE(Pvsc_y_ ,N_); MAL_VECTOR_FILL(Pvsc_y_ , 0.0); +// MAL_MATRIX_RESIZE(qp_J_ ,nc_,nv_); +// MAL_VECTOR_RESIZE(qp_lbJ_,nc_); +// MAL_VECTOR_RESIZE(qp_ubJ_,nc_); +// MAL_MATRIX_FILL(qp_J_ ,0.0); +// MAL_VECTOR_FILL(qp_lbJ_,0.0); +// MAL_VECTOR_FILL(qp_ubJ_,0.0); + // Q_q = 0.5 * a * ( 1 0 ) // ( 0 1 ) Q_theta_ *= alpha_ ; @@ -1725,10 +1701,17 @@ void NMPCgenerator::updateCostFunction() + gamma_ * I_NN_ ; // number of constraint - nc_ = nc_cop_+nc_foot_+nc_vel_+nc_rot_+nc_obs_+nc_stan_ ; - MAL_MATRIX_RESIZE(qp_J_, nc_,nv_); MAL_MATRIX_FILL(qp_J_, 0.0); - MAL_VECTOR_RESIZE(qp_lbJ_, nc_); MAL_VECTOR_FILL(qp_lbJ_, 0.0); - MAL_VECTOR_RESIZE(qp_ubJ_, nc_); MAL_VECTOR_FILL(qp_ubJ_, 0.0); + unsigned nc = nc_cop_+nc_foot_+nc_vel_+nc_rot_+nc_obs_+nc_stan_ ; + if(nc_!=nc) + { + MAL_MATRIX_RESIZE(qp_J_, nc_,nv_); + MAL_VECTOR_RESIZE(qp_lbJ_, nc_); + MAL_VECTOR_RESIZE(qp_ubJ_, nc_); + } + nc_=nc; + MAL_MATRIX_FILL(qp_J_, 0.0); + MAL_VECTOR_FILL(qp_lbJ_, 0.0); + MAL_VECTOR_FILL(qp_ubJ_, 0.0); // Q_xXX = ( 0.5 * a * Pvu^T * Pvu + b * Pzu^T * Pzu + c * I ) // Q_xXF = ( -0.5 * b * Pzu^T * V_kp1 ) @@ -1939,12 +1922,12 @@ void NMPCgenerator::updateCostFunction() // Fill up qp_lbJ_, qp_ubJ_ and qp_J_ - MAL_MATRIX_RESIZE(qp_J_ ,nc_,nv_); - MAL_VECTOR_RESIZE(qp_lbJ_,nc_); - MAL_VECTOR_RESIZE(qp_ubJ_,nc_); - MAL_MATRIX_FILL(qp_J_ ,0.0); - MAL_VECTOR_FILL(qp_lbJ_,0.0); - MAL_VECTOR_FILL(qp_ubJ_,0.0); +// MAL_MATRIX_RESIZE(qp_J_ ,nc_,nv_); +// MAL_VECTOR_RESIZE(qp_lbJ_,nc_); +// MAL_VECTOR_RESIZE(qp_ubJ_,nc_); +// MAL_MATRIX_FILL(qp_J_ ,0.0); +// MAL_VECTOR_FILL(qp_lbJ_,0.0); +// MAL_VECTOR_FILL(qp_ubJ_,0.0); unsigned index = 0 ; for(unsigned i=0 ; i<nc_cop_ ; ++i) {