src/pid.cpp
Go to the documentation of this file.
1 
2 #include <diffbot_base/pid.h>
3 
4 namespace diffbot_base
5 {
6  PID::PID(double p, double i, double d, double i_max, double i_min, bool antiwindup, double out_max, double out_min)
7  : control_toolbox::Pid()
8  , dynamic_reconfig_initialized_(false)
9  {
10  f_ = 0.0;
11  initPid(p, i, d, i_max, i_min, antiwindup);
12  error_ = 0.0;
13 
14  out_min_ = out_min;
15  out_max_ = out_max;
16  }
17 
18  void PID::init(ros::NodeHandle& nh, double f, double p, double i, double d, double i_max, double i_min, bool antiwindup, double out_max, double out_min)
19  {
20  ROS_INFO("Initialize PID");
21  f_ = f;
22  initPid(p, i, d, i_max, i_min, antiwindup);
23  error_ = 0.0;
24 
25  out_min_ = out_min;
26  out_max_ = out_max;
27 
29 
30  Gains gains = getGains();
31  ROS_INFO_STREAM("Initialized PID: F=" << f << ", P=" << gains.p_gain_ << ", I=" << gains.i_gain_ << ", D=" << gains.d_gain_ << ", out_min=" << out_min_ << ", out_max=" << out_max_);
32 
33  }
34 
35  double PID::operator()(const double &measured_value, const double &setpoint, const ros::Duration &dt)
36  {
37  // Compute error terms
38  error_ = setpoint - measured_value;
39  ROS_DEBUG_STREAM_THROTTLE(1, "Error: " << error_);
40 
41  // Reset the i_error in case the p_error and the setpoint is zero
42  // Otherwise there will always be a constant i_error_ that won't vanish
43  if (0.0 == setpoint && 0.0 == error_)
44  {
45  // reset() will reset
46  // p_error_last_ = 0.0;
47  // p_error_ = 0.0;
48  // i_error_ = 0.0;
49  // d_error_ = 0.0;
50  // cmd_ = 0.0;
51  reset();
52  }
53 
54  // Use control_toolbox::Pid::computeCommand()
55  double output = computeCommand(error_, dt);
56  ROS_DEBUG_STREAM_THROTTLE(1, "PID computed command: " << output);
57 
58  // Compute final output including feed forward term
59  output = f_ * setpoint + output;
60  //output = clamp(output, out_min_, out_max_);
61 
62  return output;
63  }
64 
65  void PID::getParameters(double &f, double &p, double &i, double &d, double &i_max, double &i_min)
66  {
67  bool antiwindup;
68  getParameters(f, p, i, d, i_max, i_min, antiwindup);
69  }
70 
71  void PID::getParameters(double &f, double &p, double &i, double &d, double &i_max, double &i_min, bool &antiwindup)
72  {
73  f = f_;
74  // Call getGains from control_toolbox
75  getGains(p, i, d, i_max, i_min, antiwindup);
76  }
77 
78  void PID::setParameters(double f, double p, double i, double d, double i_max, double i_min, bool antiwindup)
79  {
80  f_ = f;
81  setGains(p, i, d, i_max, i_min, antiwindup);
82 
83  Gains gains = getGains();
84  ROS_INFO_STREAM("Update PID Gains: F=" << f << ", P=" << gains.p_gain_ << ", I=" << gains.i_gain_ << ", D=" << gains.d_gain_ << ", out_min=" << out_min_ << ", out_max=" << out_max_);
85  }
86 
87  void PID::setOutputLimits(double output_max, double output_min)
88  {
89  out_max_ = output_max;
90  out_min_ = output_min;
91  ROS_INFO_STREAM("Update PID output limits: lower=" << out_min_ << ", upper=" << out_max_);
92  }
93 
94 
95  double PID::clamp(const double& value, const double& lower_limit, const double& upper_limit)
96  {
97  if (value > upper_limit)
98  {
99  ROS_DEBUG_STREAM_THROTTLE(1, "Clamp " << value << " to upper limit " << upper_limit);
100  return upper_limit;
101  }
102  else if (value < lower_limit)
103  {
104  ROS_DEBUG_STREAM_THROTTLE(1, "Clamp " << value << " to lower limit " << upper_limit);
105  return lower_limit;
106  }
107 
108  return value;
109  }
110 
112  {
113  ROS_INFO_STREAM_NAMED("pid","Initializing dynamic reconfigure in namespace "
114  << node.getNamespace());
115 
116  // Start dynamic reconfigure server
119 
120  // Set Dynamic Reconfigure's gains to Pid's values
122 
123  // Set callback
124  param_reconfig_callback_ = boost::bind(&PID::dynamicReconfigCallback, this, _1, _2);
126  ROS_INFO_NAMED("pid", "Initialized dynamic reconfigure");
127  }
128 
130  {
131  // Make sure dynamic reconfigure is initialized
133  return;
134 
135  // Get starting values
136  diffbot_base::ParametersConfig config;
137  config.f = f_;
138 
139  // Get starting values
140  getGains(config.p, config.i, config.d, config.i_clamp_max, config.i_clamp_min, config.antiwindup);
141 
142  updateDynamicReconfig(config);
143  }
144 
145  void PID::updateDynamicReconfig(diffbot_base::ParametersConfig config)
146  {
147  // Make sure dynamic reconfigure is initialized
149  return;
150 
151  // Set starting values, using a shared mutex with dynamic reconfig
152  param_reconfig_mutex_.lock();
153  param_reconfig_server_->updateConfig(config);
154  param_reconfig_mutex_.unlock();
155  }
156 
157  void PID::dynamicReconfigCallback(diffbot_base::ParametersConfig &config, uint32_t /*level*/)
158  {
159  ROS_DEBUG_STREAM_NAMED("pid","Dynamics reconfigure callback recieved.");
160 
161  // Set the gains
162  setParameters(config.f, config.p, config.i, config.d, config.i_clamp_max, config.i_clamp_min, config.antiwindup);
163  }
164 
165 }
diffbot_base::PID::dynamic_reconfig_initialized_
bool dynamic_reconfig_initialized_
Definition: include/diffbot_base/pid.h:141
control_toolbox::Pid::setGains
void setGains(const Gains &gains)
diffbot_base::PID::updateDynamicReconfig
void updateDynamicReconfig()
Set Dynamic Reconfigure's gains to PID's values.
Definition: src/pid.cpp:129
diffbot_base::PID::param_reconfig_server_
boost::shared_ptr< DynamicReconfigServer > param_reconfig_server_
Definition: include/diffbot_base/pid.h:143
ROS_DEBUG_STREAM_NAMED
#define ROS_DEBUG_STREAM_NAMED(name, args)
diffbot_base::PID::getParameters
void getParameters(double &f, double &p, double &i, double &d, double &i_max, double &i_min)
Get the FPID parameters.
Definition: src/pid.cpp:65
diffbot_base::PID::init
void init(ros::NodeHandle &nh, double f, double p, double i, double d, double i_max, double i_min, bool antiwindup, double out_max, double out_min)
Initialize the.
Definition: src/pid.cpp:18
diffbot_base::PID::setOutputLimits
void setOutputLimits(double out_min, double out_max)
Set the Output Limits of the PID controller.
Definition: src/pid.cpp:87
diffbot_base::PID::error_
double error_
Definition: include/diffbot_base/pid.h:136
diffbot_base::PID::param_reconfig_callback_
DynamicReconfigServer::CallbackType param_reconfig_callback_
Definition: include/diffbot_base/pid.h:144
f
f
diffbot_base::PID::DynamicReconfigServer
dynamic_reconfigure::Server< diffbot_base::ParametersConfig > DynamicReconfigServer
Definition: include/diffbot_base/pid.h:142
ROS_INFO_NAMED
#define ROS_INFO_NAMED(name,...)
pid.h
diffbot_base::PID::clamp
double clamp(const double &value, const double &lower_limit, const double &upper_limit)
Clam given value to upper and lower limits.
Definition: src/pid.cpp:95
diffbot_base::PID::setParameters
void setParameters(double f, double p, double i, double d, double i_max, double i_min, bool antiwindup=false)
Set the Parameters using the Gains object of control_toolbox::Pid.
Definition: src/pid.cpp:78
diffbot_base::PID::operator()
double operator()(const double &measured_value, const double &setpoint, const ros::Duration &dt)
Compute PID output value from error using process value, set point and time period.
Definition: src/pid.cpp:35
d
d
ROS_DEBUG_STREAM_THROTTLE
#define ROS_DEBUG_STREAM_THROTTLE(period, args)
nh
ros::NodeHandle nh
Definition: main.cpp:8
ROS_INFO_STREAM
#define ROS_INFO_STREAM(args)
diffbot_base::PID::initDynamicReconfig
void initDynamicReconfig(ros::NodeHandle &node)
Start the dynamic reconfigure node and load the default values.
Definition: src/pid.cpp:111
diffbot_base
Definition: diffbot_hw_interface.h:21
diffbot_base::PID::dynamicReconfigCallback
void dynamicReconfigCallback(diffbot_base::ParametersConfig &config, uint32_t)
Update the PID parameters from dynamics reconfigure.
Definition: src/pid.cpp:157
ROS_INFO_STREAM_NAMED
#define ROS_INFO_STREAM_NAMED(name, args)
control_toolbox::Pid::initPid
void initPid(double p, double i, double d, double i_max, double i_min, bool antiwindup, const ros::NodeHandle &)
diffbot_base::PID::f_
double f_
Definition: include/diffbot_base/pid.h:135
diffbot_base::PID::out_min_
double out_min_
Definition: include/diffbot_base/pid.h:137
diffbot_base::PID::PID
PID(double p=0.0, double i=0.0, double d=0.0, double i_max=0.0, double i_min=0.0, bool antiwindup=false, double out_max=0.0, double out_min=0.0)
Construct a new PID object.
Definition: src/pid.cpp:6
control_toolbox::Pid::getGains
Gains getGains()
diffbot_base::PID::param_reconfig_mutex_
boost::recursive_mutex param_reconfig_mutex_
Definition: include/diffbot_base/pid.h:146
ros::NodeHandle::getNamespace
const std::string & getNamespace() const
diffbot_base::PID::out_max_
double out_max_
Definition: include/diffbot_base/pid.h:138
control_toolbox
ROS_INFO
#define ROS_INFO(...)
control_toolbox::Pid::computeCommand
double computeCommand(double error, double error_dot, ros::Duration dt)
control_toolbox::Pid::reset
void reset()
ros::Duration
ros::NodeHandle


diffbot_base
Author(s):
autogenerated on Thu Sep 7 2023 02:35:23