import time
class PIDController:
def __init__(self, Kp, Ki, Kd, setpoint):
self.Kp = Kp
self.Ki = Ki
self.Kd = Kd
self.setpoint = setpoint
self.integral = 0
self.previous_error = 0
self.previous_time = time.time()
def compute(self, current_value):
current_time = time.time()
dt = current_time - self.previous_time
if dt <= 0:
dt = 0.01
error = self.setpoint - current_value
self.integral += error * dt
derivative = (error - self.previous_error) / dt if dt > 0 else 0
u = self.Kp * error + self.Ki * self.integral + self.Kd * derivative
self.previous_error = error
self.previous_time = current_time
return u
setpoint = 30.0
current_angle = 0.0
current_velocity = 0.0
Kp = 1.2
Ki = 0.1
Kd = 0.5
pid = PIDController(Kp, Ki, Kd, setpoint)
dt = 0.1
max_time = 30.0
start_time = time.time()
while True:
u = pid.compute(current_angle)
a = 0.5 * u
current_velocity += a * dt
current_angle += current_velocity * dt
error = setpoint - current_angle
if abs(error) <= 2.0:
print("目标达到,当前偏航角: {:.2f}度,误差: {:.2f}度".format(current_angle, error))
break
if time.time() - start_time > max_time:
print("超时未收敛")
break
time.sleep(dt)
print("最终偏航角: {:.2f}度".format(current_angle))