Skip to content

Commit f38fbdb

Browse files
committed
Add mwe_03.jl
1 parent d3ce43d commit f38fbdb

File tree

3 files changed

+73
-1
lines changed

3 files changed

+73
-1
lines changed

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ version = "0.5.3"
66
[deps]
77
ControlSystemsBase = "aaaaaaaa-a6ca-5380-bf3e-84a91bcd477e"
88
DocStringExtensions = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae"
9+
FiniteDiff = "6a86dc24-6348-571c-b903-95158fe2bd41"
910
KiteUtils = "90980105-b163-44e5-ba9f-8b1c83bb0533"
1011
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1112
NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56"
@@ -24,6 +25,7 @@ ControlPlots = "0.2.7"
2425
ControlSystemsBase = "1.15.1"
2526
DocStringExtensions = "0.9.4"
2627
Documenter = "1.11.4"
28+
FiniteDiff = "2.27.0"
2729
KiteUtils = "0.10.7"
2830
LinearAlgebra = "1.10, 1.11"
2931
NLsolve = "4.5.1"

mwes/mwe_02.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ function finite_jacobian(f, x; ϵ=sqrt(eps(eltype(x))))
6666
J
6767
end
6868

69-
A = finite_jacobian(x -> motor_dynamics(x, u0), x0)
69+
@time A = finite_jacobian(x -> motor_dynamics(x, u0), x0)
7070
B = finite_jacobian(u -> motor_dynamics(x0, u), u0)
7171
C = [1.0]
7272
D = [0.0 0.0]

mwes/mwe_03.jl

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Linearize the winch
2+
# input: set_speed
3+
# output: speed
4+
5+
using Pkg
6+
if ! ("ControlPlots" keys(Pkg.project().dependencies))
7+
using TestEnv; TestEnv.activate()
8+
using Test
9+
end
10+
using WinchControllers, WinchModels, KiteUtils, ControlPlots, ControlSystemsBase, FiniteDiff
11+
import FiniteDiff: finite_difference_jacobian
12+
13+
if isfile("data/system_tuned.yaml")
14+
set = load_settings("system_tuned.yaml")
15+
else
16+
set = load_settings("system.yaml")
17+
end
18+
wcs = WCSettings(dt=0.02)
19+
update(wcs)
20+
wcs.test = true
21+
22+
winch = Winch(wcs, set)
23+
24+
# find equilibrium speed
25+
function find_equilibrium_speed(winch, set_speed, force, n=2000)
26+
last_v_act = 0.0
27+
for v_set in range(0.0, 2*set_speed, n)
28+
lim_speed = minimum([v_set, set_speed])
29+
set_force(winch, force)
30+
set_v_set(winch, lim_speed)
31+
v_act = get_speed(winch)
32+
on_timer(winch)
33+
if v_set > 0 && abs(v_act - last_v_act) < 1e-6
34+
return v_act
35+
end
36+
last_v_act = v_act
37+
end
38+
set_v_set(winch, set_speed)
39+
on_timer(winch)
40+
end
41+
42+
function motor_dynamics(x, u)
43+
# x: state vector, e.g., [v_act]
44+
# u: input vector, e.g., [v_set, force]
45+
v_act = x[1]
46+
v_set, force = u[1], u[2]
47+
acc = calc_acceleration(winch.wm, v_act, force; set_speed = v_set)
48+
return [acc]
49+
end
50+
51+
v_set = 8.0
52+
force = 4000.0
53+
v_act = find_equilibrium_speed(winch, v_set, force)
54+
55+
x0 = [v_act] # State at operating point
56+
u0 = [v_set, force] # Input at operating point
57+
58+
# System matrix A = ∂f/∂x at operating point
59+
@time A = finite_difference_jacobian(x -> motor_dynamics(x, u0), x0)
60+
61+
# Input matrix B = ∂f/∂u at operating point
62+
B = finite_difference_jacobian(u -> motor_dynamics(x0, u), u0)
63+
64+
C = [1.0]
65+
D = [0.0 0.0]
66+
67+
sys = ss(A, B, C, D)
68+
sys_new = ss(A, B[:, 1], C, D[:, 1])
69+
70+
bode_plot(sys_new; to=2, title="Linearized Winch, F=$force N")

0 commit comments

Comments
 (0)