From 0241b30e58f2dc7a893047f5be8acf521ac34e1e Mon Sep 17 00:00:00 2001 From: Sergi Hernandez Juan <shernand@iri.upc.edu> Date: Tue, 25 Oct 2022 16:56:51 +0200 Subject: [PATCH] Updated the trapezoid velocity profile generation. --- src/vel_trapezoid.cpp | 48 +++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/vel_trapezoid.cpp b/src/vel_trapezoid.cpp index 03bed13..ebb3d76 100644 --- a/src/vel_trapezoid.cpp +++ b/src/vel_trapezoid.cpp @@ -20,54 +20,62 @@ void CVelTrapezoid::generate(double start_vel,double end_vel,double max_vel, dou this->set_end_vel(end_vel); this->set_max_vel(max_vel); this->set_max_acc(max_acc); - this->acc_time=(max_vel-start_vel)/max_acc; - this->dec_time=-(end_vel-max_vel)/max_acc; - this->acc_length=start_vel*this->acc_time+(max_vel-start_vel)*this->acc_time/2.0; - this->dec_length=end_vel*this->dec_time-(end_vel-max_vel)*this->dec_time/2.0; + if(start_vel==max_vel) + this->acc_time=0.0; + else + this->acc_time=fabs(max_vel-start_vel)/max_acc; + if(end_vel==max_vel) + this->dec_time=0.0; + else + this->dec_time=fabs(end_vel-max_vel)/max_acc; + this->acc_length=std::min(start_vel,max_vel)*this->acc_time+fabs(max_vel-start_vel)*this->acc_time/2.0; + this->dec_length=std::min(end_vel,max_vel)*this->dec_time+fabs(end_vel-max_vel)*this->dec_time/2.0; this->length=length; this->generated=true; } bool CVelTrapezoid::generate(double start_vel,double end_vel,double max_vel, double max_acc,double length,double &new_start_vel,double &new_max_vel) { + /* if(start_vel>max_vel) throw CException(_HERE_,"Start velocity must be smaller than the maximum velocity"); if(end_vel>max_vel) throw CException(_HERE_,"End velocity must be smaller than the maximum velocity"); if(max_acc<=0.0) throw CException(_HERE_,"Acceleration must be positive"); + */ + if(start_vel>max_vel) + start_vel=max_vel; + if(end_vel>max_vel) + end_vel=max_vel; + if(max_acc<=0.0) + max_acc=0.0; this->generate(start_vel,end_vel,max_vel,max_acc,length); - if(length-this->acc_length-this->dec_length>0.0) + if((length-this->acc_length-this->dec_length)>0.0) { this->time=(length-this->acc_length-this->dec_length)/this->max_vel+this->acc_time+this->dec_time; new_start_vel=this->start_vel; new_max_vel=this->max_vel; return true; } - else + else { - double value=-pow(this->start_vel-this->end_vel,2.0)*pow(this->max_acc-1.0,2.0)-2.0*this->length*pow(this->max_acc,2.0)*(this->max_acc-1.0); - if(value>=0.0) + new_max_vel=sqrt(length*this->max_acc+(pow(start_vel,2.0)+pow(end_vel,2.0))/2.0); + if(new_max_vel>=start_vel) { - new_max_vel=((this->max_acc-1.0)*(this->start_vel+this->end_vel)-sqrt(value))/(2.0*(this->max_acc-1.0)); this->generate(this->start_vel,this->end_vel,new_max_vel,this->max_acc,this->length); this->time=(length-this->acc_length-this->dec_length)/new_max_vel+this->acc_time+this->dec_time; new_start_vel=this->start_vel; + return true; } else { - value=-this->length*(this->max_acc-1.0); - if(value>0.0) - { - new_max_vel=((this->max_acc-1.0)*this->end_vel-this->max_acc*sqrt(value))/(this->max_acc-1.0); - new_start_vel=new_max_vel; - this->generate(new_start_vel,this->end_vel,new_max_vel,this->max_acc,length); - this->time=(this->length-this->dec_length)/new_max_vel+this->dec_time; - } - else - throw CException(_HERE_,"Impossible to create trapezoid"); + new_max_vel=sqrt(pow(end_vel,2.0)+2*length*this->max_acc); + this->generate(this->start_vel,this->end_vel,new_max_vel,this->max_acc,this->length); + this->time=(length-this->acc_length-this->dec_length)/new_max_vel+this->acc_time+this->dec_time; + new_start_vel=this->start_vel; + return true; } - return false; } } -- GitLab