Skip to content

Commit 7f3aedc

Browse files
author
Dwatkins
committed
updated pid for clamped output
1 parent 3eabafd commit 7f3aedc

4 files changed

Lines changed: 161 additions & 75 deletions

File tree

src/pid/CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ find_package(catkin REQUIRED COMPONENTS)
55

66
catkin_package(
77
INCLUDE_DIRS include
8+
LIBRARIES pid
89
)
910

1011
## Check C++11 / C++0x
@@ -17,4 +18,9 @@ elseif(COMPILER_SUPPORTS_CXX0X)
1718
set(CMAKE_CXX_FLAGS "-std=c++0x")
1819
else()
1920
message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
20-
endif()
21+
endif()
22+
23+
24+
include_directories(include)
25+
add_library(pid
26+
src/pid.h)

src/pid/include/pid/pid.h

Lines changed: 106 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,119 @@
1-
class libpid
1+
#ifndef PID_H
2+
#define PID_H
3+
4+
class PID
25
{
36
public:
4-
libpid()
7+
PID();
8+
~PID() {}
9+
PID(double p,
10+
double i,
11+
double d,
12+
double derivator,
13+
double integrator,
14+
double integrator_max,
15+
double integrator_min);
16+
17+
PID& operator=(const PID& rhs);
18+
19+
double update(double current_value)
520
{
6-
kp_ = ki_ = kd_ = derivator_ = integrator_ = integrator_max_ = integrator_min_ = set_point_ = 0;
7-
}
8-
9-
libpid(double p,
10-
double i,
11-
double d,
12-
double derivator,
13-
double integrator,
14-
double integrator_max,
15-
double integrator_min)
16-
{
17-
kp_ = p;
18-
ki_ = i;
19-
kd_ = d;
20-
derivator_ = derivator;
21-
integrator_ = integrator;
22-
integrator_max_ = integrator_max;
23-
integrator_min_ = integrator_min;
24-
}
25-
26-
double update(double current_value){
2721
double error = set_point_ - current_value;
28-
double p_value = kp_ * error;
29-
double d_value = kd_ * (error - derivator_);
22+
integrator_ += error;
23+
//clamp integrator_ value between integrator_max_ and integrator_min_
24+
double i_value = ki_ * (integrator_ > integrator_max_ ? integrator_max_ : (integrator_ < integrator_min_ ? integrator_min_ : integrator_));
25+
double pid = kp_*error + kd_*(error-derivator_) + i_value;
26+
if(isLimited_)
27+
{
28+
//clamp pid value between output_max_ and output_min_
29+
pid = pid > output_max_ ? output_max_ : (pid < output_min_ ? output_min_ : pid);
30+
}
3031
derivator_ = error;
31-
integrator_ = integrator_ + error;
32-
if (integrator_ > integrator_max_)
33-
integrator_ = integrator_max_;
34-
else if (integrator_ < integrator_min_)
35-
integrator_ = integrator_min_;
36-
double i_value = integrator_ * ki_;
37-
double pid = p_value + i_value + d_value;
38-
return pid;
39-
}
40-
41-
void setPoint(double set_point){
32+
return pid;
33+
};
34+
35+
void setPoint(double set_point)
36+
{
4237
set_point_ = set_point;
43-
}
44-
45-
void setIntegrator(double integrator){
38+
};
39+
40+
void setIntegrator(double integrator)
41+
{
4642
integrator_ = integrator;
47-
}
48-
49-
void setIntegratorMax(double max){
43+
};
44+
45+
void setIntegratorMax(double max)
46+
{
5047
integrator_max_ = max;
51-
}
48+
};
5249

53-
void setIntegratorMin(double min) {
50+
void setIntegratorMin(double min)
51+
{
5452
integrator_min_ = min;
55-
}
56-
57-
void setKp(double kp){
58-
kp_ = (kp >= 0) ? kp : 0;
59-
}
60-
61-
void setKi(double ki){
62-
ki_ = (ki >= 0) ? ki : 0;
63-
}
64-
65-
void setKd(double kd){
66-
kd_ = (kd >= 0) ? kd : 0;
67-
}
68-
double getKp(){
69-
return kp_;
70-
}
71-
double getKd(){
72-
return kd_;
73-
}
74-
double getKi(){
75-
return ki_;
76-
}
53+
};
54+
55+
void setDerivator(double derivator)
56+
{
57+
derivator_ = derivator;
58+
};
59+
60+
void setKp(double kp)
61+
{
62+
kp_ = kp;
63+
};
64+
65+
void setKi(double ki)
66+
{
67+
ki_ = ki;
68+
};
69+
70+
void setKd(double kd)
71+
{
72+
kd_ = kd;
73+
};
74+
75+
void limitOutput(double min, double max)
76+
{
77+
isLimited_ = true;
78+
output_min_ = min;
79+
output_max_ = max;
80+
};
7781

78-
double getPoint(){
82+
void delimitOutput()
83+
{
84+
isLimited_ = false;
85+
};
86+
87+
double getPoint()
88+
{
7989
return set_point_;
80-
}
81-
82-
double getIntegrator(){
90+
};
91+
92+
double getIntegrator()
93+
{
8394
return integrator_;
84-
}
85-
double getDerivator(){
95+
};
96+
97+
double getDerivator()
98+
{
8699
return derivator_;
87-
}
100+
};
101+
102+
double getOutputMin()
103+
{
104+
return output_min_;
105+
};
106+
107+
double getOutputMax()
108+
{
109+
return output_max_;
110+
};
88111

112+
bool outputIsLimited()
113+
{
114+
return isLimited_;
115+
};
116+
89117
private:
90118
double kp_;
91119
double ki_;
@@ -95,4 +123,9 @@ class libpid
95123
double integrator_min_;
96124
double integrator_max_;
97125
double set_point_;
126+
double output_max_;
127+
double output_min_;
128+
bool isLimited_;
98129
};
130+
131+
#endif

src/pid/package.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0"?>
22
<package>
33
<name>pid</name>
4-
<version>0.0.0</version>
4+
<version>1.0.0</version>
55
<description>The pid package</description>
66

77
<!-- One maintainer tag required, multiple allowed, one person per tag -->

src/pid/src/pid/pid.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include "pid.h"
2+
3+
PID::PID()
4+
{
5+
kp_ = ki_ = kd_ = derivator_ = integrator_ = integrator_max_ = integrator_min_ = set_point_ = output_max_ = output_min_ = 0;
6+
isLimited_ = false;
7+
}
8+
9+
PID::PID(double p,
10+
double i,
11+
double d,
12+
double derivator,
13+
double integrator,
14+
double integrator_max,
15+
double integrator_min) {
16+
kp_ = p;
17+
ki_ = i;
18+
kd_ = d;
19+
derivator_ = derivator;
20+
integrator_ = integrator;
21+
integrator_max_ = integrator_max;
22+
integrator_min_ = integrator_min;
23+
output_max_ = 0;
24+
output_min_ = 0;
25+
isLimited_ = false;
26+
}
27+
28+
PID&
29+
PID::operator=(const PID& rhs) {
30+
if (this == &rhs)
31+
return *this;
32+
kp_ = rhs.kp_;
33+
ki_ = rhs.ki_;
34+
kd_ = rhs.kd_;
35+
set_point_ = rhs.set_point_;
36+
derivator_ = rhs.derivator_;
37+
integrator_ = rhs.integrator_;
38+
integrator_max_ = rhs.integrator_max_;
39+
integrator_min_ = rhs.integrator_min_;
40+
output_min_ = rhs.output_min_;
41+
output_max_ = rhs.output_max_;
42+
isLimited_ = rhs.isLimited_;
43+
44+
return *this;
45+
}
46+
47+

0 commit comments

Comments
 (0)