Skip to content

Commit 4bf0b18

Browse files
committed
fix(pid_longitudinal_controller): change pid structure with respect to design
Signed-off-by: Berkay Karaman <brkay54@gmail.com>
1 parent 99e3e09 commit 4bf0b18

File tree

4 files changed

+13
-12
lines changed

4 files changed

+13
-12
lines changed

control/pid_longitudinal_controller/include/pid_longitudinal_controller/pid.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,15 @@ class PIDController
2929
/**
3030
* @brief calculate the output of this PID
3131
* @param [in] error previous error
32+
* @param [in] error_filtered filtered error
3233
* @param [in] dt time step [s]
3334
* @param [in] is_integrated if true, will use the integral component for calculation
3435
* @param [out] pid_contributions values of the proportional, integral, and derivative components
3536
* @return PID output
3637
* @throw std::runtime_error if gains or limits have not been set
3738
*/
3839
double calculate(
39-
const double error, const double dt, const bool is_integrated,
40+
const double error, const double error_filtered, const double dt, const bool is_integrated,
4041
std::vector<double> & pid_contributions);
4142
/**
4243
* @brief set the coefficients for the P (proportional) I (integral) D (derivative) terms

control/pid_longitudinal_controller/src/pid.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ PIDController::PIDController()
3232
}
3333

3434
double PIDController::calculate(
35-
const double error, const double dt, const bool enable_integration,
35+
const double error, const double filtered_error, const double dt, const bool enable_integration,
3636
std::vector<double> & pid_contributions)
3737
{
3838
if (!m_is_gains_set || !m_is_limits_set) {
@@ -55,12 +55,12 @@ double PIDController::calculate(
5555
error_differential = 0;
5656
m_is_first_time = false;
5757
} else {
58-
error_differential = (error - m_prev_error) / dt;
58+
error_differential = (filtered_error - m_prev_error) / dt;
5959
}
6060
double ret_d = p.kd * error_differential;
6161
ret_d = std::min(std::max(ret_d, p.min_ret_d), p.max_ret_d);
6262

63-
m_prev_error = error;
63+
m_prev_error = filtered_error;
6464

6565
pid_contributions.resize(3);
6666
pid_contributions.at(0) = ret_p;

control/pid_longitudinal_controller/src/pid_longitudinal_controller.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1078,8 +1078,8 @@ double PidLongitudinalController::applyVelocityFeedback(const ControlData & cont
10781078
const double error_vel_filtered = m_lpf_vel_error->filter(diff_vel);
10791079

10801080
std::vector<double> pid_contributions(3);
1081-
const double pid_acc =
1082-
m_pid_vel.calculate(error_vel_filtered, control_data.dt, enable_integration, pid_contributions);
1081+
const double pid_acc = m_pid_vel.calculate(
1082+
diff_vel, error_vel_filtered, control_data.dt, enable_integration, pid_contributions);
10831083

10841084
// Feedforward scaling:
10851085
// This is for the coordinate conversion where feedforward is applied, from Time to Arclength.

control/pid_longitudinal_controller/test/test_pid.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ TEST(TestPID, calculate_pid_output)
2929
PIDController pid;
3030

3131
// Cannot calculate before initializing gains and limits
32-
EXPECT_THROW(pid.calculate(0.0, dt, enable_integration, contributions), std::runtime_error);
32+
EXPECT_THROW(pid.calculate(0.0, 0.0, dt, enable_integration, contributions), std::runtime_error);
3333

3434
pid.setGains(1.0, 1.0, 1.0);
3535
pid.setLimits(10.0, 0.0, 10.0, 0.0, 10.0, 0.0, 10.0, 0.0);
3636
double error = target - current;
3737
double prev_error = error;
3838
while (current != target) {
39-
current = pid.calculate(error, dt, enable_integration, contributions);
39+
current = pid.calculate(error, error, dt, enable_integration, contributions);
4040
EXPECT_EQ(contributions[0], error);
4141
EXPECT_EQ(contributions[1], 0.0); // integration is deactivated
4242
EXPECT_EQ(contributions[2], error - prev_error);
@@ -50,18 +50,18 @@ TEST(TestPID, calculate_pid_output)
5050
enable_integration = true;
5151

5252
// High errors to force each component to its upper limit
53-
EXPECT_EQ(pid.calculate(0.0, dt, enable_integration, contributions), 0.0);
53+
EXPECT_EQ(pid.calculate(0.0, 0.0, dt, enable_integration, contributions), 0.0);
5454
for (double error = 100.0; error < 1000.0; error += 100.0) {
55-
EXPECT_EQ(pid.calculate(error, dt, enable_integration, contributions), 10.0);
55+
EXPECT_EQ(pid.calculate(error, error, dt, enable_integration, contributions), 10.0);
5656
EXPECT_EQ(contributions[0], 10.0);
5757
EXPECT_EQ(contributions[1], 10.0); // integration is activated
5858
EXPECT_EQ(contributions[2], 10.0);
5959
}
6060

6161
// Low errors to force each component to its lower limit
62-
EXPECT_EQ(pid.calculate(0.0, dt, enable_integration, contributions), 0.0);
62+
EXPECT_EQ(pid.calculate(0.0, 0.0, dt, enable_integration, contributions), 0.0);
6363
for (double error = -100.0; error > -1000.0; error -= 100.0) {
64-
EXPECT_EQ(pid.calculate(error, dt, enable_integration, contributions), -10.0);
64+
EXPECT_EQ(pid.calculate(error, error, dt, enable_integration, contributions), -10.0);
6565
EXPECT_EQ(contributions[0], -10.0);
6666
EXPECT_EQ(contributions[1], -10.0); // integration is activated
6767
EXPECT_EQ(contributions[2], -10.0);

0 commit comments

Comments
 (0)