|
|
|
@ -32,14 +32,12 @@ |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include "src/core/lib/transport/pid_controller.h" |
|
|
|
|
#include <grpc/support/useful.h> |
|
|
|
|
|
|
|
|
|
void grpc_pid_controller_init(grpc_pid_controller *pid_controller, |
|
|
|
|
double initial_control_value, double gain_p, |
|
|
|
|
double gain_i, double gain_d) { |
|
|
|
|
pid_controller->last_control_value = initial_control_value; |
|
|
|
|
pid_controller->gain_p = gain_p; |
|
|
|
|
pid_controller->gain_i = gain_i; |
|
|
|
|
pid_controller->gain_d = gain_d; |
|
|
|
|
grpc_pid_controller_args args) { |
|
|
|
|
pid_controller->args = args; |
|
|
|
|
pid_controller->last_control_value = args.initial_control_value; |
|
|
|
|
grpc_pid_controller_reset(pid_controller); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -53,13 +51,20 @@ double grpc_pid_controller_update(grpc_pid_controller *pid_controller, |
|
|
|
|
/* integrate error using the trapezoid rule */ |
|
|
|
|
pid_controller->error_integral += |
|
|
|
|
dt * (pid_controller->last_error + error) * 0.5; |
|
|
|
|
pid_controller->error_integral = GPR_CLAMP( |
|
|
|
|
pid_controller->error_integral, -pid_controller->args.integral_range, |
|
|
|
|
pid_controller->args.integral_range); |
|
|
|
|
double diff_error = (error - pid_controller->last_error) / dt; |
|
|
|
|
/* calculate derivative of control value vs time */ |
|
|
|
|
double dc_dt = pid_controller->gain_p * error + |
|
|
|
|
pid_controller->gain_i * pid_controller->error_integral + |
|
|
|
|
pid_controller->gain_d * diff_error; |
|
|
|
|
double dc_dt = pid_controller->args.gain_p * error + |
|
|
|
|
pid_controller->args.gain_i * pid_controller->error_integral + |
|
|
|
|
pid_controller->args.gain_d * diff_error; |
|
|
|
|
/* and perform trapezoidal integration */ |
|
|
|
|
double new_control_value = pid_controller->last_control_value + |
|
|
|
|
dt * (pid_controller->last_dc_dt + dc_dt) * 0.5; |
|
|
|
|
new_control_value = |
|
|
|
|
GPR_CLAMP(new_control_value, pid_controller->args.min_control_value, |
|
|
|
|
pid_controller->args.max_control_value); |
|
|
|
|
pid_controller->last_error = error; |
|
|
|
|
pid_controller->last_dc_dt = dc_dt; |
|
|
|
|
pid_controller->last_control_value = new_control_value; |
|
|
|
|