|
@@ -0,0 +1,53 @@
|
|
|
+package contorllogic;
|
|
|
+
|
|
|
+import lombok.Data;
|
|
|
+
|
|
|
+/**
|
|
|
+ * PID控制器
|
|
|
+ * 在这个代码中,我们定义了一个PIDController类,
|
|
|
+ * 它包含了比例系数kp、积分系数ki、微分系数kd、目标值setpoint、积分项integral和上一次误差lastError。
|
|
|
+ * 我们还定义了一个calculate方法,它接受一个输入值input,并返回PID控制器的输出值。
|
|
|
+ * 在calculate方法中,我们首先算当前误差error,然后将其加入分项integral中。
|
|
|
+ * 接下来,我们计算误差的微分项derivative,并将当前误差保存为上一次误差lastError。
|
|
|
+ * 最后,我们将比例项、积分项和微分项相加,得到PID控制器的输出值。
|
|
|
+ * 使用这个PIDController类,我们可以轻松地实现PID控制。
|
|
|
+ * 例如,我们可以创建一个PID控制器对象,设置比例系数、积分系数、微分系数和目标值,
|
|
|
+ * 然后在每个时间步骤中调用calculate方法,将当前输入值传递给它,以获得PID控制器的输出值。
|
|
|
+ * PID控制器是一种常见的反馈控制器,用于控制系统的输出。它通过比较实际输出和期望输出之间的差异来计算控制信号,以使输出尽可能接近期望值。
|
|
|
+ * PID控制器的名称来自其三个控制参数:比例系数(P)、积分系数(I)和微分系数(D)。这些参数控制着控制器的响应速度、稳定性和抗干扰能力。
|
|
|
+ * PID控制器的逻辑如下:
|
|
|
+ * 比例控制:比例控制是根据误差的大小来计算控制信号的一种方法。比例系数(P)控制着控制器对误差的响应速度。当误差较大时,控制器会输出更大的控制信号,以加快系统的响应速度。
|
|
|
+ * 积分控制:积分控制是根据误差的积分来计算控制信号的一种方法。积分系数(I)控制着控制器对误差的持续时间的响应。当误差持续一段时间时,控制器会输出更大的控制信号,以减小误差。
|
|
|
+ * 微分控制:微分控制是根据误差的变化率来计算控制信号的一种方法。微分系数(D)控制着控制器对误差变化率的响应。当误差变化率较大时,控制器会输出更大的控制信号,以减小误差的变化率。
|
|
|
+ * PID控制器的输出信号是由比例控制、积分控制和微分控制三个部分组成的。PID控制器的输出信号可以表示为:
|
|
|
+ * Output = Kp * Error + Ki * Integral + Kd * Derivative
|
|
|
+ * 其中,Kp、Ki和Kd分别是比例系数、积分系数和微分系数,Error是期望值与实际值之间的误差,Integral是误差的积分,Derivative是误差的变化率。
|
|
|
+ */
|
|
|
+
|
|
|
+@Data
|
|
|
+public class PidController {
|
|
|
+ private double kp; // 比例系数 控制着控制器对误差的响应速度
|
|
|
+ private double ki; // 积分系数 控制着控制器对误差的持续时间的响应
|
|
|
+ private double kd; // 微分系数 控制着控制器对误差变化率的响应
|
|
|
+ private double setpoint; // 目标值
|
|
|
+ private double integral; // 积分项
|
|
|
+ private double lastError; // 上一次误差
|
|
|
+
|
|
|
+ public PidController(double kp, double ki, double kd, double setpoint) {
|
|
|
+ this.kp = kp;
|
|
|
+ this.ki = ki;
|
|
|
+ this.kd = kd;
|
|
|
+ this.setpoint = setpoint;
|
|
|
+ this.integral = 0;
|
|
|
+ this.lastError = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ public double calculate(double input) {
|
|
|
+ //目标值减当前值 求出差距值
|
|
|
+ double error = setpoint - input;
|
|
|
+ integral += error;
|
|
|
+ double derivative = error - lastError;
|
|
|
+ lastError = error;
|
|
|
+ return kp * error + ki * integral + kd * derivative;
|
|
|
+ }
|
|
|
+}
|