@@ -4,6 +4,7 @@ const DEFAULT_LINMPC_TRANSCRIPTION = SingleShooting()
4
4
struct LinMPC{
5
5
NT<: Real ,
6
6
SE<: StateEstimator ,
7
+ CW<: ControllerWeights ,
7
8
TM<: TranscriptionMethod ,
8
9
JM<: JuMP.GenericModel
9
10
} <: PredictiveController{NT}
@@ -18,7 +19,7 @@ struct LinMPC{
18
19
Hp:: Int
19
20
Hc:: Int
20
21
nϵ:: Int
21
- weights:: ControllerWeights{NT}
22
+ weights:: CW
22
23
R̂u:: Vector{NT}
23
24
R̂y:: Vector{NT}
24
25
P̃Δu:: Matrix{NT}
@@ -45,13 +46,18 @@ struct LinMPC{
45
46
Dop:: Vector{NT}
46
47
buffer:: PredictiveControllerBuffer{NT}
47
48
function LinMPC {NT} (
48
- estim:: SE , Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt ,
49
+ estim:: SE , Hp, Hc, weights :: CW ,
49
50
transcription:: TM , optim:: JM
50
- ) where {NT<: Real , SE<: StateEstimator , TM<: TranscriptionMethod , JM<: JuMP.GenericModel }
51
+ ) where {
52
+ NT<: Real ,
53
+ SE<: StateEstimator ,
54
+ CW<: ControllerWeights ,
55
+ TM<: TranscriptionMethod ,
56
+ JM<: JuMP.GenericModel
57
+ }
51
58
model = estim. model
52
59
nu, ny, nd, nx̂ = model. nu, model. ny, model. nd, estim. nx̂
53
60
ŷ = copy (model. yop) # dummy vals (updated just before optimization)
54
- weights = ControllerWeights {NT} (model, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt)
55
61
# dummy vals (updated just before optimization):
56
62
R̂y, R̂u, Tu_lastu0 = zeros (NT, ny* Hp), zeros (NT, nu* Hp), zeros (NT, nu* Hp)
57
63
PΔu = init_ZtoΔU (estim, transcription, Hp, Hc)
@@ -63,8 +69,9 @@ struct LinMPC{
63
69
# dummy vals (updated just before optimization):
64
70
F, fx̂, Fŝ = zeros (NT, ny* Hp), zeros (NT, nx̂), zeros (NT, nx̂* Hp)
65
71
con, nϵ, P̃Δu, P̃u, Ẽ, Ẽŝ = init_defaultcon_mpc (
66
- estim, transcription,
67
- Hp, Hc, Cwt, PΔu, Pu, E,
72
+ estim, weights, transcription,
73
+ Hp, Hc,
74
+ PΔu, Pu, E,
68
75
ex̂, fx̂, gx̂, jx̂, kx̂, vx̂, bx̂,
69
76
Eŝ, Fŝ, Gŝ, Jŝ, Kŝ, Vŝ, Bŝ
70
77
)
@@ -78,7 +85,7 @@ struct LinMPC{
78
85
nZ̃ = get_nZ (estim, transcription, Hp, Hc) + nϵ
79
86
Z̃ = zeros (NT, nZ̃)
80
87
buffer = PredictiveControllerBuffer (estim, transcription, Hp, Hc, nϵ)
81
- mpc = new {NT, SE, TM, JM} (
88
+ mpc = new {NT, SE, CW, TM, JM} (
82
89
estim, transcription, optim, con,
83
90
Z̃, ŷ,
84
91
Hp, Hc, nϵ,
@@ -140,9 +147,9 @@ arguments. This controller allocates memory at each time step for the optimizati
140
147
- `Mwt=fill(1.0,model.ny)` : main diagonal of ``\m athbf{M}`` weight matrix (vector).
141
148
- `Nwt=fill(0.1,model.nu)` : main diagonal of ``\m athbf{N}`` weight matrix (vector).
142
149
- `Lwt=fill(0.0,model.nu)` : main diagonal of ``\m athbf{L}`` weight matrix (vector).
143
- - `M_Hp=diagm (repeat(Mwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{M}_{H_p}``.
144
- - `N_Hc=diagm (repeat(Nwt,Hc))` : positive semidefinite symmetric matrix ``\m athbf{N}_{H_c}``.
145
- - `L_Hp=diagm (repeat(Lwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{L}_{H_p}``.
150
+ - `M_Hp=Diagonal (repeat(Mwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{M}_{H_p}``.
151
+ - `N_Hc=Diagonal (repeat(Nwt,Hc))` : positive semidefinite symmetric matrix ``\m athbf{N}_{H_c}``.
152
+ - `L_Hp=Diagonal (repeat(Lwt,Hp))` : positive semidefinite symmetric matrix ``\m athbf{L}_{H_p}``.
146
153
- `Cwt=1e5` : slack variable weight ``C`` (scalar), use `Cwt=Inf` for hard constraints only.
147
154
- `transcription=SingleShooting()` : a [`TranscriptionMethod`](@ref) for the optimization.
148
155
- `optim=JuMP.Model(OSQP.MathOptInterfaceOSQP.Optimizer)` : quadratic optimizer used in
@@ -199,9 +206,9 @@ function LinMPC(
199
206
Mwt = fill (DEFAULT_MWT, model. ny),
200
207
Nwt = fill (DEFAULT_NWT, model. nu),
201
208
Lwt = fill (DEFAULT_LWT, model. nu),
202
- M_Hp = diagm (repeat (Mwt, Hp)),
203
- N_Hc = diagm (repeat (Nwt, Hc)),
204
- L_Hp = diagm (repeat (Lwt, Hp)),
209
+ M_Hp = Diagonal (repeat (Mwt, Hp)),
210
+ N_Hc = Diagonal (repeat (Nwt, Hc)),
211
+ L_Hp = Diagonal (repeat (Lwt, Hp)),
205
212
Cwt = DEFAULT_CWT,
206
213
transcription:: TranscriptionMethod = DEFAULT_LINMPC_TRANSCRIPTION,
207
214
optim:: JuMP.GenericModel = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
@@ -242,9 +249,9 @@ function LinMPC(
242
249
Mwt = fill (DEFAULT_MWT, estim. model. ny),
243
250
Nwt = fill (DEFAULT_NWT, estim. model. nu),
244
251
Lwt = fill (DEFAULT_LWT, estim. model. nu),
245
- M_Hp = diagm (repeat (Mwt, Hp)),
246
- N_Hc = diagm (repeat (Nwt, Hc)),
247
- L_Hp = diagm (repeat (Lwt, Hp)),
252
+ M_Hp = Diagonal (repeat (Mwt, Hp)),
253
+ N_Hc = Diagonal (repeat (Nwt, Hc)),
254
+ L_Hp = Diagonal (repeat (Lwt, Hp)),
248
255
Cwt = DEFAULT_CWT,
249
256
transcription:: TranscriptionMethod = DEFAULT_LINMPC_TRANSCRIPTION,
250
257
optim:: JM = JuMP. Model (DEFAULT_LINMPC_OPTIMIZER, add_bridges= false ),
@@ -255,7 +262,8 @@ function LinMPC(
255
262
@warn (" prediction horizon Hp ($Hp ) ≤ estimated number of delays in model " *
256
263
" ($nk ), the closed-loop system may be unstable or zero-gain (unresponsive)" )
257
264
end
258
- return LinMPC {NT} (estim, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt, transcription, optim)
265
+ weights = ControllerWeights {NT} (estim. model, Hp, Hc, M_Hp, N_Hc, L_Hp, Cwt)
266
+ return LinMPC {NT} (estim, Hp, Hc, weights, transcription, optim)
259
267
end
260
268
261
269
"""
0 commit comments