昨日、ここに質問を投稿しました。しかし、その後、いくつかのことに気付きました。
- このプログラムを実行すると、目的の速度 vr に向かう傾向がありません
- プログラムを実行し、角度 (道路のピッチを表す) を時間の変化に応じて変化させると、常に目的の速度 vr に戻るとは限らず、以前の安定した状態にさえ戻るとは限りません。
このプログラムは、統合制御システム (特にクルーズ コントロール) をモデル化することを目的としています。現在、速度 v0 から開始し、しばらくの間その速度で実行し、その後クルーズ コントロールをオンにします。この時点で、最終的に目的の速度 vr で安定する速度の変化が見られるはずです (そうです)。そうではありません。理由は不明ですが、他の値に達し、この値はライドの勾配によって異なります。初期速度に関係なく、それでも目的の速度に到達できません
さまざまなパラメーターと変数をいじってみましたが、役に立ちませんでした。問題は、コントローラーに正しい現在の速度が渡されていないことだと思いますが、その問題に対処する方法がわかりません。
追加情報が必要な場合はお知らせください。前の質問を編集する必要があった場合はお知らせください。代わりに編集します。申し訳ありません。
これが私のコードです:
import matplotlib.pylab as plt
import numpy as np
import scipy.integrate as integrate
##Parameters
kp = .5 #proportional gain
ki = .1 #integral gain
vr = 25 #desired velocity in m/s
Tm = 190 #Max Torque in Nm
wm = 420 #engine speed
B = 0.4 #Beta
an = 12 #at gear 4
p = 1.3 #air density
Cd = 0.32 #Drag coefficient
Cr = .01 #Coefficient of rolling friction
A = 2.4 #frontal area
##Variables
m = 18000.0 #weight
v0 = 20. #starting velocity
t = np.linspace(61, 500, 5000) #time
theta = np.radians(4) #Theta
def torque(v):
return Tm * (1 - B*(an*v/wm - 1)**2)
def vderivs(v, t):
v1 = an * controller(v, t) * torque(v)
v2 = m*Cr*np.sign(v)
v3 = 0.5*p*Cd*A*v**2
v4 = m*np.sin(theta)
vtot = v1-v2-v3-v4*(t>=200)
return vtot/m
def uderivs(v, t):
return vr - v
def controller(currentV, time):
z = integrate.odeint(uderivs, currentV, time)
return kp*(vr-currentV) + ki*z.squeeze()
def velocity(desired, theta, time):
return integrate.odeint(vderivs, desired, time)
t0l = [i for i in range(61)]
vf=[v0 for i in range(61)]+[v for v in velocity(v0,theta,t)]
tf=t0l+[time for time in t]
plt.plot(tf, vf, 'k-', label=('V(0) = '+str(v0)))
v0=35.
vf=[v0 for i in range(61)]+[v for v in velocity(v0,theta,t)]
plt.plot(tf, vf, 'b-', label=('V(0) = '+str(v0)))
v0=vr
vf=[v0 for i in range(61)]+[v for v in velocity(v0,theta,t)]
plt.plot(tf, vf, 'g-', label=('V(0) = Vr'))
plt.axhline(y=vr, xmin=0, xmax=1000, color='r', label='Desired Velocity')
plt.legend(loc = "upper right")
plt.axis([0,500,18,36])
plt.show()
これは、初期速度の範囲を使用して、プログラムをそのまま実行してプロットされたものです
速度の最初の急激な変化は、クルーズ コントロールが開始されたときであり、2 つ目は、乗車の勾配が変化したときです。