试着做一个家庭作业问题,可能需要一些帮助。我试图用Scipy的integrate.solve_ivp()
函数在Python中模拟PID控制。你知道吗
我的方法是在函数的右侧运行PID代码,使用全局变量并在每个时间步结束时将它们附加到全局矩阵,如下所示:
solution = integrate.solve_ivp(rhs, tspan, init, t_eval=teval)
def rhs(dt, init):
global old_time, omega0dot, rhs_t, omega0dotmat
timestep = dt - old_time
old_time = dt
# UNPACK INITIAL
x = init[0]
y = init[1]
z = init[2]
xdot = init[3]
ydot = init[4]
zdot = init[5]
alpha = init[6]
beta = init[7]
gamma = init[8]
alphadot = init[9]
betadot = init[10]
gammadot = init[11]
# SOLVE EQUATIONS
(xddot, yddot, zddot, alphaddot, betaddot, gammaddot) = dynamics(k_d, k_m, x, y, z, xdot, ydot, zdot, alpha, beta, gamma, alphadot, betadot, gammadot, omega0dot)
# CONTROL SYSTEMS
z_des = 10
err_z = z_des - z
zPID = (1*err_z) + hover
omega0dot = zPID
rhs_t.append(dt)
omega0dotmat.append(omega0dot)
return [xdot, ydot, zdot, xddot, yddot, zddot, alphadot, betadot, gammadot, alphaddot, betaddot, gammaddot]
全局变量在此函数外部初始化。你可能注意到,我特别尝试模拟一个四旋翼直升机,其中四旋翼的线性和角运动依赖于omega0dot
,它代表旋翼速度,我尝试用PID控制。你知道吗
我的困难在于integrate.solve_ivp()
的时间步。PID控制的积分和微分部分都依赖于时间步长,但是solve_ivp()
函数有一个可变的时间步长,有时甚至在时间上向后,有时没有时间步长(即dt<;=0)。你知道吗
我想知道是否有更好的方法来实现这个PID控制,或者我是否把dt
这个术语解释错了。感谢您的帮助!你知道吗
谢谢你
目前没有回答
相关问题 更多 >
编程相关推荐