Skip to content

Commit 23e7a58

Browse files
committed
add plot_pitch_stability.jl
1 parent e8df06e commit 23e7a58

File tree

1 file changed

+172
-0
lines changed

1 file changed

+172
-0
lines changed

examples/plot_pitch_stability.jl

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
V_WIND_200 = [ 10.0 ]
2+
DEPOWER = [0.38 ]
3+
4+
using Printf
5+
using KiteModels, KitePodModels, KiteUtils, LinearAlgebra
6+
7+
if haskey(ENV, "USE_V9")
8+
set = deepcopy(load_settings("system_v9.yaml"))
9+
else
10+
set = deepcopy(load_settings("system.yaml"))
11+
end
12+
13+
using Pkg
14+
if ! ("ControlPlots" keys(Pkg.project().dependencies))
15+
using TestEnv; TestEnv.activate()
16+
end
17+
using ControlPlots
18+
plt.close("all")
19+
20+
set.abs_tol=0.0006
21+
set.rel_tol=0.00001
22+
23+
# the following values can be changed to match your interest
24+
dt = 0.05
25+
set.solver="DFBDF" # IDA or DFBDF
26+
STEPS = 550# 740
27+
PLOT = true
28+
PRINT = true
29+
STATISTIC = false
30+
# end of user parameter section #
31+
32+
bridle_length = KiteModels.bridle_length(set)
33+
println("bridle_length: $bridle_length")
34+
bridle_area = (set.d_line/2000) * bridle_length
35+
println("bridle_area: $bridle_area")
36+
37+
function set_tether_diameter!(se, d; c_spring_4mm = 614600, damping_4mm = 473)
38+
set.d_tether = d
39+
set.c_spring = c_spring_4mm * (d/4.0)^2
40+
set.damping = damping_4mm * (d/4.0)^2
41+
end
42+
43+
set_tether_diameter!(set, set.d_tether)
44+
45+
if PLOT
46+
using Pkg
47+
if ! ("ControlPlots" keys(Pkg.project().dependencies))
48+
using TestEnv; TestEnv.activate()
49+
end
50+
using ControlPlots
51+
end
52+
53+
function simulate(kps4, integrator, logger, steps)
54+
iter = 0
55+
cl = 0.0
56+
cd = 0.0
57+
for i in 1:steps
58+
force = norm(kps4.forces[1])
59+
r = set.drum_radius
60+
n = set.gear_ratio
61+
set_torque = -r/n * force
62+
KiteModels.next_step!(kps4, integrator; set_torque, dt)
63+
sys_state = KiteModels.SysState(kps4)
64+
aoa = kps4.alpha_2
65+
sys_state.var_01 = aoa
66+
log!(logger, sys_state)
67+
iter += kps4.iter
68+
if i > steps - 50 # last 2.5s
69+
cl_, cd_ = KiteModels.cl_cd(kps4)
70+
cl += cl_
71+
cd += cd_
72+
end
73+
end
74+
return cl/50, cd/50
75+
end
76+
77+
78+
CL = zeros(length(DEPOWER))
79+
CD = zeros(length(DEPOWER))
80+
AOA = zeros(length(DEPOWER))
81+
DEP = zeros(length(DEPOWER))
82+
ELEV = zeros(length(DEPOWER))
83+
V_WIND_KITE = zeros(length(DEPOWER))
84+
85+
elev = set.elevation
86+
i = 1
87+
for depower in DEPOWER
88+
global elev, i, kps4
89+
local cl, cd, aoa, kcu, integrator, logger, v_app
90+
91+
logger = Logger(set.segments + 5, STEPS)
92+
DEP[i] = depower
93+
set.depower = 100*depower
94+
95+
# set.depower_gain = 5
96+
97+
kcu::KCU = KCU(set)
98+
kps4::KPS4 = KPS4(kcu)
99+
set.elevation += 5
100+
set.v_wind = V_WIND_200[i]
101+
integrator = KiteModels.init_sim!(kps4; delta=0.001*0, stiffness_factor=1, prn=STATISTIC)
102+
if ! isnothing(integrator)
103+
try
104+
cl, cd = simulate(kps4, integrator, logger, STEPS)
105+
catch e
106+
println("Error: $e")
107+
if PLOT
108+
p = plot(logger.time_vec, rad2deg.(logger.elevation_vec), logger.var_01_vec, xlabel="time [s]", ylabels=["elevation [°]", "aoa"],
109+
fig="depower: $depower")
110+
display(p)
111+
sleep(0.2)
112+
end
113+
break
114+
end
115+
set_depower_steering(kps4.kcu, depower, 0.0)
116+
cl, cd = simulate(kps4, integrator, logger, STEPS)
117+
else
118+
break
119+
end
120+
elev = rad2deg(logger.elevation_vec[end])
121+
ELEV[i] = elev
122+
V_WIND_KITE[i] = norm(kps4.v_wind)
123+
set.elevation -= 5
124+
if elev > 70
125+
set.elevation = elev - 4
126+
else
127+
set.elevation = elev - 4
128+
end
129+
j=i
130+
if j ==2
131+
set.elevation -= 4
132+
elseif j == 3
133+
set.elevation -= 4
134+
elseif j == 4
135+
set.elevation += 4
136+
end
137+
138+
aoa = kps4.alpha_2
139+
orient_vec = orient_euler(kps4)
140+
alpha_depower = rad2deg(kps4.alpha_depower)
141+
pitch = rad2deg(orient_vec[2]) + alpha_depower
142+
v_app = norm(kps4.v_apparent)
143+
# v_200 = calc_wind_factor(kps4.am, 200) * V_WIND
144+
height = logger.Z_vec[end][end-2]
145+
CL[i] = cl
146+
CD[i] = cd
147+
AOA[i] = aoa
148+
if PRINT
149+
print("Depower: $depower, alpha_dp: $(round(alpha_depower, digits=2)), CL $(round(cl, digits=3)), CD: $(round(cd, digits=3)), aoa: $(round(aoa, digits=2)), pitch: $(round(pitch, digits=2)), CL/CD: $(round(cl/cd, digits=2))")
150+
println(", elevation: $(round((elev), digits=2)), height:$(round(height, digits=2))")
151+
end
152+
# if depower in [DEPOWER[begin+1], DEPOWER[end]] && PLOT
153+
if PLOT
154+
p = plot(logger.time_vec, rad2deg.(logger.elevation_vec), logger.var_01_vec, xlabel="time [s]", ylabels=["elevation [°]", "aoa [°]"],
155+
fig="depower: $depower")
156+
display(p)
157+
sleep(0.2)
158+
end
159+
i+=1
160+
end
161+
162+
cl = zeros(length(AOA))
163+
cd = zeros(length(AOA))
164+
for (i, alpha) in pairs(AOA)
165+
global cl, cd
166+
cl[i] = kps4.calc_cl(alpha)
167+
cd[i] = kps4.calc_cd(alpha)
168+
end
169+
170+
# display(plot(AOA, [CL, cl], xlabel="AOA [deg]", ylabel="CL", labels=["CL","cl"], fig="CL vs AOA"))
171+
# display(plot(AOA, [CD, cd], xlabel="AOA [deg]", ylabel="CD", labels=["CD","cd"], fig="CD vs AOA"))
172+
# display(plot(DEP,[AOA, 1.5*25.5 .- 2PITCH]; xlabel="depower", ylabel="aoa/pitch [°]", scatter=true, labels=["aoa", "38.25°-2pitch"], fig="pitch and aoa vs depower"))

0 commit comments

Comments
 (0)