我正在建造一个模型火箭,但我无法让离线模拟正常工作。
当我在“1 秒模式”下运行模拟时,它工作得很好,但是当我尝试每毫秒计算一次新位置时,它就不行了。代码是用python3编写的。
我以“1毫秒模式”发送代码希望你能帮忙。
import math
import matplotlib.pyplot as plt
import random
time=10*1000
potencia=2.73 #powerof engine
Pcont=5
Icont=0
Dcont=0
Brazo_fuerza=0.21 #moment arm
Inetia=0.083407294
Setpoint=0
dt=1
TVC=0
Angulo_veiculo=-20 #angel of rocket
Angulo_veiculo_ant=0 #angel of rocket vefore
Fuerza_ariba=0
Fuerza_lado=0
torque=0 #tor
Accel_rotacion=0 #rotational acceleration
Sum=0
pos=0
acc=5
X1=[]
X2=[]
def PIDcal(Sum):
e = Angulo_veiculo-Setpoint
P=e*Pcont
Sum+=e*dt
I=Sum*Icont
D=((Angulo_veiculo-Angulo_veiculo_ant)/dt)*Dcont
PID=P+I+D
PID=PID/3
if PID > 5:
PID=5
elif PID < -5:
PID=-5
return PID, Sum
for t in range(time):
Fuerza_lado=round(potencia*math.sin(math.radians(TVC)),acc) #calcuate lateral force
torque=round(Brazo_fuerza*Fuerza_lado,acc) #calculate torque
Accel_rotacion=round((torque/Inetia),acc) #calculate rotational acceleration
Angulo_veiculo+=round(math.degrees(Accel_rotacion)/1000,acc) #calculate actual rotation of rocket
if Angulo_veiculo > 181:
Angulo_veiculo=-180
elif Angulo_veiculo <-181:
Angulo_veiculo=-180
TVC, Sum=PIDcal(Sum)
TVC=round(TVC*-1,acc)
X1.append(TVC)
X2.append(Angulo_veiculo)
plt.plot(range(time),X1,label = 'TVC') #plot
plt.plot(range(time),X2,label = 'Angulo_veiculo')
plt.legend()
plt.show()
谢谢,抱歉我的英语不好,我来自西班牙。
您在 PID 控制器中使用 1 秒 (dt=1) 的时间步长。当您切换到 1 毫秒的时间步长时,您需要相应地调整您的积分项累积。
希望这有帮助(顺便说一句,你的英语听起来很棒)