Skip to content

Commit 65e2b69

Browse files
ufechner7Copilot
andcommitted
Now working with 7% wind turbulence
Co-authored-by: Copilot <copilot@github.com>
1 parent 0296c83 commit 65e2b69

3 files changed

Lines changed: 56 additions & 25 deletions

File tree

‎examples/parking_4p.jl‎

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,30 @@ dt::Float64 = 1/set.sample_freq
3939

4040
MIN_DEPOWER, DISTURBANCE = if KiteUtils.PROJECT == "system.yaml"
4141
# result of tuning
42-
pcs.kp_tr=0.07
43-
pcs.ki_tr=0.0012
44-
pcs.kp = 15
45-
pcs.ki = 0
46-
pcs.c1 = 0.149
47-
pcs.c2 = 0 # has no big effect, can also be set to zero c1 = 0.149 c2 = 5.428
42+
pcs.kp_tr=0.04
43+
pcs.ki_tr=0.0008
44+
pcs.kp = 8.0
45+
pcs.ki = 0.2
46+
pcs.c1 = 0.048
47+
pcs.c2 = 0 # has no big effect, can also be set to zero
48+
pcs.max_turn_rate_set = 0.45
49+
pcs.max_turn_rate_cmd = 0.75
50+
pcs.max_steering = 0.45
51+
pcs.max_steering_rate = 1.0
4852
0.22, 0.1
49-
else
53+
else
5054
# result of tuning
5155
println("not system.yaml")
52-
pcs.kp_tr=0.05
53-
pcs.ki_tr=0.0024
54-
pcs.kp = 30
55-
pcs.ki = 1.0
56+
pcs.kp_tr=0.035
57+
pcs.ki_tr=0.0015
58+
pcs.kp = 10.0
59+
pcs.ki = 0.3
5660
pcs.c1 = 0.048
5761
pcs.c2 = 0 # has no big effect, can also be set to zero
62+
pcs.max_turn_rate_set = 0.45
63+
pcs.max_turn_rate_cmd = 0.75
64+
pcs.max_steering = 0.45
65+
pcs.max_steering_rate = 1.0
5866
0.4, 0.4
5967
end
6068
@info "pcs.kp_tr=$(pcs.kp_tr), pcs.ki_tr=$(pcs.ki_tr), pcs.kp=$(pcs.kp), pcs.ki=$(pcs.ki), MIN_DEPOWER=$(MIN_DEPOWER)"

‎examples/parking_controller.jl‎

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,18 @@ import KiteUtils: wrap2pi
1919
k_ds = 2.0 # influence of the depower settings on the steering sensitivity
2020
c1 = 0.048 # v9 kite model
2121
c2 = 0 # a value other than zero creates more problems than it solves
22+
max_turn_rate_set::Float64 = 100.0 # clamp outer-loop desired turn-rate [rad/s]
23+
max_turn_rate_cmd::Float64 = 100.0 # clamp inner-loop commanded turn-rate [rad/s]
24+
max_steering::Float64 = 100.0 # clamp final steering command to physical range
25+
max_steering_rate::Float64 = 0.0 # optional rate limit [1/s], 0 disables limiting
2226
end
2327

2428
mutable struct ParkingController
2529
pcs::ParkingControllerSettings
2630
pid_tr::DiscretePID
2731
pid_outer::DiscretePID
2832
last_heading::Float64
33+
last_steering::Float64
2934
chi_set::Float64
3035
last_ndi_gain::Float64
3136
end
@@ -34,7 +39,7 @@ function ParkingController(pcs::ParkingControllerSettings; last_heading = 0.0)
3439
Ts = pcs.dt
3540
pid_tr = DiscretePID(;K=pcs.kp_tr, Ti=pcs.kp_tr/ pcs.ki_tr, Ts)
3641
pid_outer = DiscretePID(;K=pcs.kp, Ti=pcs.kp/ pcs.ki, Ts)
37-
return ParkingController(pcs, pid_tr, pid_outer, last_heading, 0, 0)
42+
return ParkingController(pcs, pid_tr, pid_outer, last_heading, 0.0, 0.0, 0.0)
3843
end
3944

4045
"""
@@ -104,12 +109,22 @@ function calc_steering(pc::ParkingController, heading, chi_set; elevation=0.0, v
104109
# calculate the desired turn rate
105110
heading = wrap2pi(heading) # a different wrap2pi function is needed that avoids any jumps
106111
psi_dot_set = pc.pid_outer(wrap2pi(chi_set), heading)
107-
psi_dot = (wrap2pi(heading - pc.last_heading)) / pc.pcs.dt
112+
psi_dot_set = clamp(psi_dot_set, -pc.pcs.max_turn_rate_set, pc.pcs.max_turn_rate_set)
113+
# Use shortest-angle difference to avoid artificial spikes at wrap boundaries.
114+
dpsi = atan(sin(heading - pc.last_heading), cos(heading - pc.last_heading))
115+
psi_dot = dpsi / pc.pcs.dt
108116
pc.last_heading = heading
109117
psi_dot_in = pc.pid_tr(psi_dot_set, psi_dot)
118+
psi_dot_in = clamp(psi_dot_in, -pc.pcs.max_turn_rate_cmd, pc.pcs.max_turn_rate_cmd)
110119
# linearize the NDI block
111120
u_s, ndi_gain = linearize(pc, psi_dot_in, heading, elevation, v_app; ud_prime)
112-
u_s, ndi_gain, psi_dot, psi_dot_set
121+
u_cmd = clamp(u_s, -pc.pcs.max_steering, pc.pcs.max_steering)
122+
if pc.pcs.max_steering_rate > 0.0
123+
max_delta = pc.pcs.max_steering_rate * pc.pcs.dt
124+
u_cmd = clamp(u_cmd, pc.last_steering - max_delta, pc.last_steering + max_delta)
125+
end
126+
pc.last_steering = u_cmd
127+
u_cmd, ndi_gain, psi_dot, psi_dot_set
113128
end
114129

115130
function test_linearize()

‎examples/parking_wind_dir.jl‎

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,30 @@ dt::Float64 = wcs.dt
4747

4848
MIN_DEPOWER = if KiteUtils.PROJECT == "system.yaml"
4949
# result of tuning
50-
pcs.kp_tr=0.06
51-
pcs.ki_tr=0.0012
52-
pcs.kp = 15
53-
pcs.ki = 0.5
50+
pcs.kp_tr=0.04
51+
pcs.ki_tr=0.0008
52+
pcs.kp = 8.0
53+
pcs.ki = 0.2
5454
pcs.c1 = 0.048
5555
pcs.c2 = 0 # has no big effect, can also be set to zero
56+
pcs.max_turn_rate_set = 0.45
57+
pcs.max_turn_rate_cmd = 0.75
58+
pcs.max_steering = 0.45
59+
pcs.max_steering_rate = 1.0
5660
0.22
5761
else
5862
# result of tuning
5963
println("not system.yaml")
60-
pcs.kp_tr=0.05
61-
pcs.ki_tr=0.0024
62-
pcs.kp = 30
63-
pcs.ki = 1.0
64+
pcs.kp_tr=0.035
65+
pcs.ki_tr=0.0015
66+
pcs.kp = 10.0
67+
pcs.ki = 0.3
6468
pcs.c1 = 0.048
6569
pcs.c2 = 0 # has no big effect, can also be set to zero
70+
pcs.max_turn_rate_set = 0.45
71+
pcs.max_turn_rate_cmd = 0.75
72+
pcs.max_steering = 0.45
73+
pcs.max_steering_rate = 1.0
6674
0.4
6775
end
6876
pc = pcm.ParkingController(pcs)
@@ -201,10 +209,10 @@ end
201209
play_parking()
202210
stop(viewer)
203211
p=plotx(T, rad2deg.(AZIMUTH), rad2deg.(AZIMUTH_EAST),[rad2deg.(UPWIND_DIR_), rad2deg.(AV_UPWIND_DIR)],
204-
rad2deg.(HEADING), [100*(SET_STEERING), 100*(STEERING)];
212+
rad2deg.(HEADING), [100*(SET_STEERING), 100*(STEERING)], V_WIND_KITE;
205213
xlabel="Time [s]",
206-
ylabels=["Azimuth [°]", "azimuth_east [°]", "upwind_dir [°]", "Heading [°]", "Steering [%]"],
207-
labels=["azimuth", "azimuth_east", ["upwind_dir", "filtered_upwind_dir"], "heading", ["set_steering", "steering"]])
214+
ylabels=["Azimuth [°]", "azimuth_east [°]", "upwind_dir [°]", "Heading [°]", "Steering [%]", "v_wind_kite [m/s]"],
215+
labels=["azimuth", "azimuth_east", ["upwind_dir", "filtered_upwind_dir"], "heading", ["set_steering", "steering"], "v_wind_kite"])
208216
display(p)
209217
reactivate_host_app()
210218

0 commit comments

Comments
 (0)