Skip to content

Commit 597bc8c

Browse files
author
Adolfo Rodriguez Tsouroukdissian
committed
Merge pull request #46 from clearpathrobotics/further-reuse
Remove code repetition
2 parents 06ccaed + eea374f commit 597bc8c

File tree

2 files changed

+22
-63
lines changed

2 files changed

+22
-63
lines changed

include/control_toolbox/pid.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,10 @@ class Pid
117117
/*!
118118
* \brief Store gains in a struct to allow easier realtime buffer usage
119119
*/
120-
struct Gains
120+
struct Gains
121121
{
122122
// Optional constructor for passing in values
123-
Gains(double p, double i, double d, double i_max, double i_min)
123+
Gains(double p, double i, double d, double i_max, double i_min)
124124
: p_gain_(p),
125125
i_gain_(i),
126126
d_gain_(d),
@@ -338,7 +338,7 @@ class Pid
338338
*/
339339
void getCurrentPIDErrors(double *pe, double *ie, double *de);
340340

341-
341+
342342
/*!
343343
* \brief Print to console the current parameters
344344
*/
@@ -355,7 +355,7 @@ class Pid
355355

356356
// Copy the realtime buffer to then new PID class
357357
gains_buffer_ = source.gains_buffer_;
358-
358+
359359
// Reset the state of this PID controller
360360
reset();
361361

@@ -366,7 +366,7 @@ class Pid
366366

367367
// Store the PID gains in a realtime buffer to allow dynamic reconfigure to update it without
368368
// blocking the realtime update loop
369-
realtime_tools::RealtimeBuffer<Gains> gains_buffer_;
369+
realtime_tools::RealtimeBuffer<Gains> gains_buffer_;
370370

371371
double p_error_last_; /**< _Save position state for derivative state calculation. */
372372
double p_error_; /**< Position error. */
@@ -376,7 +376,7 @@ class Pid
376376

377377
// Dynamics reconfigure
378378
bool dynamic_reconfig_initialized_;
379-
typedef dynamic_reconfigure::Server<control_toolbox::ParametersConfig> DynamicReconfigServer;
379+
typedef dynamic_reconfigure::Server<control_toolbox::ParametersConfig> DynamicReconfigServer;
380380
boost::shared_ptr<DynamicReconfigServer> param_reconfig_server_;
381381
DynamicReconfigServer::CallbackType param_reconfig_callback_;
382382

src/pid.cpp

Lines changed: 16 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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

157157
void 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

174174
void 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

199199
void 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

259259
void Pid::dynamicReconfigCallback(control_toolbox::ParametersConfig &config, uint32_t level)
@@ -284,19 +284,7 @@ double Pid::computeCommand(double error, ros::Duration dt)
284284

285285
double 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

302290
double 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

336324
double 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

370329
void Pid::setCurrentCmd(double cmd)

0 commit comments

Comments
 (0)