roket的Python3 PID模拟

问题描述 投票:0回答:1

我正在建造一个模型火箭,但我无法让离线模拟正常工作。

当我在“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()

谢谢,抱歉我的英语不好,我来自西班牙。

python-3.x simulation pid
1个回答
0
投票

您在 PID 控制器中使用 1 秒 (dt=1) 的时间步长。当您切换到 1 毫秒的时间步长时,您需要相应地调整您的积分项累积。

希望这有帮助(顺便说一句,你的英语听起来很棒)

© www.soinside.com 2019 - 2024. All rights reserved.