/* * perturb_esc_nd.cpp * * Created on: Aug 1, 2012 * Author: Berk Calli * Organization: Delft Biorobotics Lab., Delft University of Technology * Contact info: b.calli@tudelft.nl, web: www.dbl.tudelft.nl * * Class for perturbation based extremum seeking control * * * References: * - K. B. Ariyur and M. Krstic, "Real-Time Optimization by Extremum-Seeking Control", Wiley, 2003. * - B. Calli, W. Caarls, P. Jonker, M. Wisse, "Comparison of Extremum Seeking Control Algorithms for Robotic Applications", IROS 2012. * */ #include "esc_perturb/perturb_esc_nd.h" PerturbESCND::PerturbESCND(){ sin_amp_ = 0; sin_freq_ = 0; corr_gain_ = 0; high_pass_pole_ = 0; low_pass_pole_ = 0; comp_pole_ = 0; comp_zero_ = 0; period_ = 0; state_initialized_ = false; initialized_ = false; old_vals_initialized_ = false; } PerturbESCND::PerturbESCND(double sin_amp, double sin_freq, double corr_gain, double high_pass_pole, double low_pass_pole, double comp_zero, double comp_pole, double period){ init(sin_amp, sin_freq, corr_gain, high_pass_pole, low_pass_pole, comp_zero, comp_pole, period); } void PerturbESCND::init(double sin_amp, double sin_freq, double corr_gain, double high_pass_pole, double low_pass_pole, double comp_zero, double comp_pole, double period){ sin_amp_ = sin_amp; sin_freq_ = sin_freq; corr_gain_ = corr_gain; high_pass_pole_ = high_pass_pole; low_pass_pole_ = low_pass_pole; comp_pole_ = comp_pole; comp_zero_ = comp_zero; period_ = period; obj_val_old_ = 0; cycle_count_ = 0; hpf_out_old_ = 0; opt_dim_ = 0; state_initialized_ = false; initialized_ = true; old_vals_initialized_ = false; } std::vector PerturbESCND::step(std::vector state, double obj_val){ if(!initialized_){ fprintf(stderr,"The perturbation based ESC (1D) is not initialized... It will not be executed. \n"); return std::vector(); } if(!state_initialized_ && state.empty()){ fprintf(stderr,"The state value of the perturbation based ESC (1D) cannot be initialized: State vector is empty. The algorithm will not be executed. \n"); return std::vector(); } else if(!state_initialized_){ opt_dim_ = (unsigned int)state.size(); lpf_out_old_.resize(opt_dim_); signal_demodulated_old_.resize(opt_dim_); comp_old_.resize(opt_dim_); corr_signal_.resize(opt_dim_); pos_ref_.resize(opt_dim_); for (size_t i = 0; i signal_demodulated(opt_dim_); std::vector lpf_out(opt_dim_); std::vector comp_out(opt_dim_); std::vector output; for (size_t i = 0; i PerturbESCND::monitor(){ std::vector monitor_values; for(size_t i = 0; i PerturbESCND::monitorNames(){ std::vector monitor_names; std::string base = "correction signal "; char numstr[21]; for(size_t i = 0; i