Skip to content

Commit 0d8c17e

Browse files
committed
Issue #21 (pid): Change PID value from additional to absolute
1 parent 6731f25 commit 0d8c17e

File tree

4 files changed

+39
-33
lines changed

4 files changed

+39
-33
lines changed

src/kpi_rover_ecu/include/PIDRegulator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
class PIDRegulator {
99
public:
1010
void Init(std::array<float, 3> _coeficients);
11-
int Run(float kError, float kTimeDt);
11+
int Run(float actual, float setpoint, float dt);
1212

1313
private:
1414
float kp_ = 0;

src/kpi_rover_ecu/src/PIDRegulator.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,24 @@ void PIDRegulator::Init(std::array<float, 3> _coeficients) {
99
kd_ = _coeficients[2];
1010
}
1111

12-
int PIDRegulator::Run(float kError, float kTimeDt) {
13-
const float kPTerm = kp_ * kError;
12+
int PIDRegulator::Run(float actual, float setpoint, float dt) {
13+
float error = setpoint - actual;
14+
float pTerm = kp_ * error;
1415

15-
integral_ += kError * kTimeDt;
16-
if (integral_ > integralLimit_) {
17-
integral_ = integralLimit_;
18-
}
19-
if (integral_ < -integralLimit_) {
20-
integral_ = -integralLimit_;
21-
}
16+
integral_ += error * dt;
17+
if (integral_ > integralLimit_) integral_ = integralLimit_;
18+
if (integral_ < -integralLimit_) integral_ = -integralLimit_;
2219

23-
const float kITerm = ki_ * integral_;
20+
float iTerm = ki_ * integral_;
21+
float dTerm = kd_ * ((dt > 0.0F) ? (error - previousError_) / dt : 0.0F);
2422

25-
const float kDerivativePart = (kTimeDt > 0.0F) ? (kError - previousError_) / kTimeDt : 0.0F;
26-
const float kDTerm = kd_ * kDerivativePart;
23+
previousError_ = error;
2724

28-
previousError_ = kError;
25+
float output = pTerm + iTerm + dTerm;
2926

30-
return static_cast<int>(kPTerm + kITerm + kDTerm);
27+
// Optionally clamp output to max/min here if needed
28+
// if (output > maxOutput_) output = maxOutput_;
29+
// if (output < minOutput_) output = minOutput_;
30+
31+
return static_cast<int>(output);
3132
}

src/kpi_rover_ecu/src/main.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,17 @@ int main(int argc, char* argv[]) {
9393

9494
MotorController motors_processor;
9595
const uint8_t kMotorNumber = 4;
96+
// const std::vector<MotorConfig> kShassisVector = {
97+
// MotorConfig(3, false, {1.5, 0.056, 1.5}),
98+
// MotorConfig(4, false, {1.5, 0.056, 1.5}),
99+
// MotorConfig(1, true, {1.5, 0.056, 1.5}),
100+
// MotorConfig(2, true, {1.5, 0.056, 1.5}),
101+
// };
96102
const std::vector<MotorConfig> kShassisVector = {
97-
MotorConfig(3, false, {1.5, 0.056, 1.5}),
98-
MotorConfig(4, false, {1.5, 0.056, 1.5}),
99-
MotorConfig(1, true, {1.5, 0.056, 1.5}),
100-
MotorConfig(2, true, {1.5, 0.056, 1.5}),
103+
MotorConfig(3, false, {0, 0, 0}),
104+
MotorConfig(4, false, {0, 0, 0}),
105+
MotorConfig(1, true, {0, 0, 0}),
106+
MotorConfig(2, true, {0, 0, 0}),
101107
};
102108

103109
motors_processor.Init(kShassisVector, kMotorNumber);

src/kpi_rover_ecu/src/motor.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ Motor::Motor(int assigned_number, bool is_inverted, std::array<float, 3> _coefic
1919
}
2020

2121
int Motor::MotorGo(int newRPM) {
22-
if (newRPM > kMaxRpm) {
23-
LOG_WARNING << " RPM out of range for motor" << motorNumber_;
24-
newRPM = kMaxRpm;
25-
}
26-
27-
if (newRPM < -kMaxRpm) {
28-
LOG_WARNING << "RPM out of range for motor" << motorNumber_;
29-
newRPM = -kMaxRpm;
30-
}
22+
// if (newRPM > kMaxRpm) {
23+
// LOG_WARNING << " RPM out of range for motor" << motorNumber_;
24+
// newRPM = kMaxRpm;
25+
// }
26+
27+
// if (newRPM < -kMaxRpm) {
28+
// LOG_WARNING << "RPM out of range for motor" << motorNumber_;
29+
// newRPM = -kMaxRpm;
30+
// }
3131
LOG_DEBUG << "Set new RPM for motor " << motorNumber_;
3232
if (MotorSet(newRPM) == -1) {
3333
LOG_ERROR << "MotorSet failed";
@@ -94,12 +94,11 @@ int Motor::GetEncoderCounter() {
9494
LOG_INFO << "set point " << setpointRpm_ << " current point " << actualRpm_ << " error " << kError << " for motor"
9595
<< motorNumber_;
9696

97-
LOG_DEBUG << "Run PID regulator";
98-
const int kPidOutput = pidRegulator_.Run(static_cast<float>(kError), kTimeDt);
97+
// LOG_DEBUG << "Run PID regulator";
98+
const int kPidOutput = pidRegulator_.Run(actualRpm_, setpointRpm_, kTimeDt);
9999
rc_encoder_write(motorNumber_, 0);
100-
LOG_DEBUG << "set encoder value to " << 0;
101-
LOG_DEBUG << "Set additional result PID value " << kPidOutput << " for motor " << motorNumber_;
102-
MotorSet(setpointRpm_ + kPidOutput);
100+
LOG_DEBUG << "Set absoulute PID value" << kPidOutput;
101+
MotorSet(kPidOutput);
103102
return pid_encoder_ticks;
104103
}
105104

0 commit comments

Comments
 (0)