con arm control a libreria

FollowFilter.cpp

Committer:
marcodesilva
Date:
2021-10-04
Revision:
0:843c9f29adde

File content as of revision 0:843c9f29adde:

#include "FollowFilter.h"

FollowFilter::FollowFilter(VectorXf _omega, VectorXf _zita, VectorXf _maxJerk, VectorXf _maxAcc, VectorXf _maxVel, VectorXf _maxPos, VectorXf _minPos){
    omega = _omega;
    zita = _zita;
    maxJerk = _maxJerk;
    maxAcc = _maxAcc;
    maxVel = _maxVel;
    maxPos = _maxPos;
    minPos = _minPos;    
    dq_filtered = VectorXf::Zero( _omega.size(),1);
    ddq_filtered = VectorXf::Zero( _omega.size(),1);
    q_filtered = VectorXf::Zero( _omega.size(),1);
}

void FollowFilter::setFollowFilterParameters(VectorXf _omega, VectorXf _zita, VectorXf _maxJerk, VectorXf _maxAcc, VectorXf _maxVel, VectorXf _maxPos, VectorXf _minPos){
    
    omega = _omega;
    zita = _zita;
    maxJerk = _maxJerk;
    maxAcc = _maxAcc;
    maxVel = _maxVel;
    maxPos = _maxPos;
    minPos = _minPos;    
   
    
}

void FollowFilter::initFollowFilter(VectorXf _first_q){
    
    first_q = _first_q;
    dq_filtered = VectorXf::Zero( _first_q.size(),1);
    ddq_filtered = VectorXf::Zero( _first_q.size(),1);
    q_filtered = VectorXf::Zero( _first_q.size(),1);
    q_filtered = first_q;
    
    
}

void FollowFilter::getJointCmd(VectorXf &q_cmd, VectorXf &dq_cmd,VectorXf &ddq_cmd){
    q_cmd.resize(q_filtered.size(),1);
    dq_cmd.resize(q_filtered.size(),1);
    ddq_cmd.resize(q_filtered.size(),1);
    q_cmd = q_filtered;
    dq_cmd = dq_filtered;
    ddq_cmd = ddq_filtered;    

}


void FollowFilter::updateFollowFilter(VectorXf q_in, float dT ) {

    float ddq = 0.0;
    float dq  = 0.0;
    float posError = 0.0;
    float jerk = 0.0;

    for(int j = 0; j<q_in.size(); j++){
        posError = q_in(j) - q_filtered(j);
        
        ddq = omega(j) * omega(j) * posError - 2.0 * zita(j) * omega(j) * dq_filtered(j);
        
        //Jerk
        /*jerk = (ddq - ddq_filtered(j))/dT;
        
        //---jerk saturation
        if( fabs( jerk )  > maxJerk(j) ) {
            if( jerk > 0.0 )
                jerk = (maxJerk(j) ); // / jerk[j_id] );
            else
                jerk = -(maxJerk(j) ); // / jerk[j_id] );
        }  
        //---
        
        //acceleration
        ddq = ddq_filtered(j) + jerk*dT;*/
           
          //---acc saturation    
        if( fabs( ddq )  > maxAcc(j) ) {
            if( ddq > 0.0 )
                ddq_filtered(j) = maxAcc(j); // / ddq[j_id];
            else
                ddq_filtered(j) = -maxAcc(j); // / ddq[j_id];
        }else {
                ddq_filtered(j) = ddq;
        }      
          //---
        
        //velocity
        dq = dq_filtered(j) + ddq_filtered(j) * dT;
           
        //---veloticyt saturation    
        if( fabs( dq ) > maxVel(j) ) {    
            if( dq > 0.0 )
                dq_filtered(j) = maxVel(j);
            else  
                dq_filtered(j) =  -maxVel(j);
        }else {
                dq_filtered(j) = dq;
        }        
          //---
        
          //Aggiornamento posizione
        q_filtered(j)  += dq_filtered(j) * dT;
        
        if(q_filtered(j) > maxPos(j)){ q_filtered(j) = maxPos(j);}
        if(q_filtered(j) < minPos(j)){ q_filtered(j) = minPos(j);}
        

        
    }  
    
}