@@ -67,7 +67,7 @@ Pid::~Pid()
6767{
6868}
6969
70- void Pid::initPid (double p, double i, double d, double i_max, double i_min,
70+ void Pid::initPid (double p, double i, double d, double i_max, double i_min,
7171 const ros::NodeHandle &node)
7272{
7373 initPid (p, i, d, i_max, i_min);
@@ -97,7 +97,7 @@ bool Pid::init(const ros::NodeHandle &node, const bool quiet)
9797 Gains gains;
9898
9999 // Load PID gains from parameter server
100- if (!nh.getParam (" p" , gains.p_gain_ ))
100+ if (!nh.getParam (" p" , gains.p_gain_ ))
101101 {
102102 if (!quiet) {
103103 ROS_ERROR (" No p gain specified for pid. Namespace: %s" , nh.getNamespace ().c_str ());
@@ -123,7 +123,7 @@ bool Pid::init(const ros::NodeHandle &node, const bool quiet)
123123 nh.param (" i_clamp_max" , gains.i_max_ , gains.i_max_ ); // use i_clamp_max parameter, otherwise keep i_clamp
124124 gains.i_max_ = std::abs (gains.i_max_ ); // make sure the value is >= 0
125125 }
126-
126+
127127 setGains (gains);
128128
129129 reset ();
@@ -140,7 +140,7 @@ bool Pid::initXml(TiXmlElement *config)
140140 double i_clamp;
141141 i_clamp = config->Attribute (" iClamp" ) ? atof (config->Attribute (" iClamp" )) : 0.0 ;
142142
143- setGains (
143+ setGains (
144144 config->Attribute (" p" ) ? atof (config->Attribute (" p" )) : 0.0 ,
145145 config->Attribute (" i" ) ? atof (config->Attribute (" i" )) : 0.0 ,
146146 config->Attribute (" d" ) ? atof (config->Attribute (" d" )) : 0.0 ,
@@ -156,19 +156,19 @@ bool Pid::initXml(TiXmlElement *config)
156156
157157void Pid::initDynamicReconfig (ros::NodeHandle &node)
158158{
159- ROS_DEBUG_STREAM_NAMED (" pid" ," Initializing dynamic reconfigure in namespace "
159+ ROS_DEBUG_STREAM_NAMED (" pid" ," Initializing dynamic reconfigure in namespace "
160160 << node.getNamespace ());
161161
162162 // Start dynamic reconfigure server
163163 param_reconfig_server_.reset (new DynamicReconfigServer (param_reconfig_mutex_, node));
164164 dynamic_reconfig_initialized_ = true ;
165-
165+
166166 // Set Dynamic Reconfigure's gains to Pid's values
167167 updateDynamicReconfig ();
168168
169169 // Set callback
170170 param_reconfig_callback_ = boost::bind (&Pid::dynamicReconfigCallback, this , _1, _2);
171- param_reconfig_server_->setCallback (param_reconfig_callback_);
171+ param_reconfig_server_->setCallback (param_reconfig_callback_);
172172}
173173
174174void Pid::reset ()
@@ -191,15 +191,15 @@ void Pid::getGains(double &p, double &i, double &d, double &i_max, double &i_min
191191 i_min = gains.i_min_ ;
192192}
193193
194- Pid::Gains Pid::getGains ()
194+ Pid::Gains Pid::getGains ()
195195{
196196 return *gains_buffer_.readFromRT ();
197197}
198198
199199void Pid::setGains (double p, double i, double d, double i_max, double i_min)
200200{
201201 Gains gains (p,i,d,i_max,i_min);
202-
202+
203203 setGains (gains);
204204}
205205
@@ -217,10 +217,10 @@ void Pid::updateDynamicReconfig()
217217 if (!dynamic_reconfig_initialized_)
218218 return ;
219219
220- // Get starting values
220+ // Get starting values
221221 control_toolbox::ParametersConfig config;
222222
223- // Get starting values
223+ // Get starting values
224224 getGains (config.p , config.i , config.d , config.i_clamp_max , config.i_clamp_min );
225225
226226 updateDynamicReconfig (config);
@@ -251,9 +251,9 @@ void Pid::updateDynamicReconfig(control_toolbox::ParametersConfig config)
251251 return ;
252252
253253 // Set starting values, using a shared mutex with dynamic reconfig
254- param_reconfig_mutex_.lock ();
254+ param_reconfig_mutex_.lock ();
255255 param_reconfig_server_->updateConfig (config);
256- param_reconfig_mutex_.unlock ();
256+ param_reconfig_mutex_.unlock ();
257257}
258258
259259void Pid::dynamicReconfigCallback (control_toolbox::ParametersConfig &config, uint32_t level)
@@ -284,19 +284,7 @@ double Pid::computeCommand(double error, ros::Duration dt)
284284
285285double Pid::updatePid (double error, ros::Duration dt)
286286{
287- if (dt == ros::Duration (0.0 ) || std::isnan (error) || std::isinf (error))
288- return 0.0 ;
289-
290- double error_dot = d_error_;
291-
292- // Calculate the derivative error
293- if (dt.toSec () > 0.0 )
294- {
295- error_dot = (error - p_error_last_) / dt.toSec ();
296- p_error_last_ = error;
297- }
298-
299- return updatePid (error, error_dot, dt);
287+ return -computeCommand (error, dt);
300288}
301289
302290double Pid::computeCommand (double error, double error_dot, ros::Duration dt)
@@ -317,7 +305,7 @@ double Pid::computeCommand(double error, double error_dot, ros::Duration dt)
317305
318306 // Calculate the integral of the position error
319307 i_error_ += dt.toSec () * p_error_;
320-
308+
321309 // Calculate integral contribution to command
322310 i_term = gains.i_gain_ * i_error_;
323311
@@ -335,36 +323,7 @@ double Pid::computeCommand(double error, double error_dot, ros::Duration dt)
335323
336324double Pid::updatePid (double error, double error_dot, ros::Duration dt)
337325{
338- // Get the gain parameters from the realtime buffer
339- Gains gains = *gains_buffer_.readFromRT ();
340-
341- double p_term, d_term, i_term;
342- p_error_ = error; // this is pError = pState-pTarget
343- d_error_ = error_dot;
344-
345- if (dt == ros::Duration (0.0 ) || std::isnan (error) || std::isinf (error) || std::isnan (error_dot) || std::isinf (error_dot))
346- return 0.0 ;
347-
348-
349- // Calculate proportional contribution to command
350- p_term = gains.p_gain_ * p_error_;
351-
352- // Calculate the integral of the position error
353- i_error_ += dt.toSec () * p_error_;
354-
355- // Calculate integral contribution to command
356- i_term = gains.i_gain_ * i_error_;
357-
358- // Limit i_term so that the limit is meaningful in the output
359- i_term = std::max ( gains.i_min_ , std::min ( i_term, gains.i_max_ ) );
360-
361- // Calculate derivative contribution to command
362- d_term = gains.d_gain_ * d_error_;
363-
364- // Compute the command
365- cmd_ = - p_term - i_term - d_term;
366-
367- return cmd_;
326+ return -computeCommand (error, error_dot, dt);
368327}
369328
370329void Pid::setCurrentCmd (double cmd)
0 commit comments