Skip to content

Commit 49ac0ca

Browse files
committed
added Uop vector for EMPC
1 parent 35d90aa commit 49ac0ca

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

src/controller/linmpc.jl

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,14 @@ struct LinMPC{S<:StateEstimator} <: PredictiveController
2626
::Vector{Float64}
2727
Ks::Matrix{Float64}
2828
Ps::Matrix{Float64}
29+
d0::Vector{Float64}
30+
D̂0::Vector{Float64}
31+
Uop::Vector{Float64}
2932
Yop::Vector{Float64}
3033
Dop::Vector{Float64}
3134
function LinMPC{S}(estim::S, Hp, Hc, Mwt, Nwt, Lwt, Cwt, ru, optim) where {S<:StateEstimator}
3235
model = estim.model
33-
nu, nxd, nxs, ny = model.nu, model.nx, estim.nxs, model.ny
36+
nu, nxd, nxs, ny, nd = model.nu, model.nx, estim.nxs, model.ny, model.nd
3437
x̂d, x̂s, ŷ = zeros(nxd), zeros(nxs), zeros(ny)
3538
validate_weights(model, Hp, Hc, Mwt, Nwt, Lwt, Cwt, ru)
3639
M_Hp = Diagonal{Float64}(repeat(Mwt, Hp))
@@ -69,8 +72,8 @@ struct LinMPC{S<:StateEstimator} <: PredictiveController
6972
nvar = size(Ẽ, 2)
7073
P̃, q̃ = init_quadprog(model, Ẽ, S̃_Hp, M_Hp, Ñ_Hc, L_Hp)
7174
Ks, Ps = init_stochpred(estim, Hp)
72-
Yop, Dop = repeat(model.yop, Hp), repeat(model.dop, Hp)
73-
set_silent(optim)
75+
d0, D̂0 = zeros(nd), zeros(nd*Hp)
76+
Uop, Yop, Dop = repeat(model.uop, Hp), repeat(model.yop, Hp), repeat(model.dop, Hp)
7477
@variable(optim, ΔŨ[1:nvar])
7578
A = con.A[con.i_b, :]
7679
b = con.b[con.i_b]
@@ -89,9 +92,11 @@ struct LinMPC{S<:StateEstimator} <: PredictiveController
8992
S̃_Hp, T_Hp, T_Hc,
9093
Ẽ, F, G, J, Kd, Q, P̃, q̃,
9194
Ks, Ps,
92-
Yop, Dop,
95+
d0, D̂0,
96+
Uop, Yop, Dop,
9397
)
9498
@objective(optim, Min, obj_quadprog(ΔŨ, mpc.P̃, mpc.q̃))
99+
set_silent(optim)
95100
return mpc
96101
end
97102
end

src/controller/nonlinmpc.jl

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@ struct NonLinMPC{S<:StateEstimator, JEFunc<:Function} <: PredictiveController
2828
::Vector{Float64}
2929
Ks::Matrix{Float64}
3030
Ps::Matrix{Float64}
31+
d0::Vector{Float64}
32+
D̂0::Vector{Float64}
33+
Uop::Vector{Float64}
3134
Yop::Vector{Float64}
3235
Dop::Vector{Float64}
3336
function NonLinMPC{S, JEFunc}(
3437
estim::S, Hp, Hc, Mwt, Nwt, Lwt, Cwt, Ewt, JE::JEFunc, ru, optim
3538
) where {S<:StateEstimator, JEFunc<:Function}
3639
model = estim.model
37-
nu, nxd, nxs, ny = model.nu, model.nx, estim.nxs, model.ny
40+
nu, nxd, nxs, ny, nd = model.nu, model.nx, estim.nxs, model.ny, model.nd
3841
x̂d, x̂s, ŷ = zeros(nxd), zeros(nxs), zeros(ny)
3942
validate_weights(model, Hp, Hc, Mwt, Nwt, Lwt, Cwt, ru, Ewt)
4043
M_Hp = Diagonal(convert(Vector{Float64}, repeat(Mwt, Hp)))
@@ -73,8 +76,8 @@ struct NonLinMPC{S<:StateEstimator, JEFunc<:Function} <: PredictiveController
7376
nvar = size(Ẽ, 2)
7477
P̃, q̃ = init_quadprog(model, Ẽ, S̃_Hp, M_Hp, Ñ_Hc, L_Hp)
7578
Ks, Ps = init_stochpred(estim, Hp)
76-
Yop, Dop = repeat(model.yop, Hp), repeat(model.dop, Hp)
77-
set_silent(optim)
79+
d0, D̂0 = zeros(nd), zeros(nd*Hp)
80+
Uop, Yop, Dop = repeat(model.uop, Hp), repeat(model.yop, Hp), repeat(model.dop, Hp)
7881
@variable(optim, ΔŨ[1:nvar])
7982
A = [A_Umin; A_Umax; A_ΔŨmin; A_ΔŨmax; A_Ŷmin; A_Ŷmax]
8083
A = con.A[con.i_b, :]
@@ -95,11 +98,13 @@ struct NonLinMPC{S<:StateEstimator, JEFunc<:Function} <: PredictiveController
9598
S̃_Hp, T_Hp, T_Hc,
9699
Ẽ, F, G, J, Kd, Q, P̃, q̃,
97100
Ks, Ps,
98-
Yop, Dop,
101+
d0, D̂0,
102+
Uop, Yop, Dop,
99103
)
100104
J = (ΔŨ...) -> obj_nonlinprog(mpc, model, ΔŨ)
101105
register(mpc.optim, :J, nvar, J, autodiff=true)
102106
@NLobjective(mpc.optim, Min, J(ΔŨ...))
107+
set_silent(optim)
103108
return mpc
104109
end
105110
end

src/predictive_control.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -353,18 +353,18 @@ See [`init_deterpred`](@ref) and [`init_quadprog`](@ref) for the definition of t
353353
function initpred!(mpc::PredictiveController, model::LinModel, d, D̂, Ŷs, R̂y)
354354
mpc.F[:] = mpc.Kd*mpc.x̂d + mpc.Q*mpc.estim.lastu0 + Ŷs + mpc.Yop
355355
if model.nd 0
356-
mpc.F .+= mpc.G*(d - model.dop) + mpc.J*(D̂ - mpc.Dop)
356+
mpc.d0[:], mpc.D̂0[:] = d - model.dop, D̂ - mpc.Dop
357+
mpc.F[:] = mpc.F + mpc.G*mpc.d0 + mpc.J*mpc.D̂0
357358
end
358359
= mpc.F - R̂y
359360
mpc.q̃[:] = 2(mpc.M_Hp*mpc.Ẽ)'*
360361
p ='*mpc.M_Hp*
361362
if ~isempty(mpc.R̂u)
362-
= mpc.T_Hp*(mpc.estim.lastu0 + model.uop) - mpc.R̂u
363+
lastu = mpc.estim.lastu0 + model.uop
364+
= mpc.T_Hp*lastu - mpc.R̂u
363365
mpc.q̃[:] = mpc.+ 2(mpc.L_Hp*mpc.T_Hp)'*
364366
p +='*mpc.L_Hp*
365367
end
366-
#d0 = zeros(model.nd, 0) # only used for NonLinModel objects
367-
#D̂0 = zeros(model.nd*mpc.Hp, 0) # only used for NonLinModel objects
368368
return p
369369
end
370370

@@ -380,9 +380,10 @@ without the operating points ``\mathbf{d_{op}}``.
380380
"""
381381
function initpred!(mpc::PredictiveController, model::NonLinModel, d, D̂, Ŷs , _ )
382382
mpc.F[:] = Ŷs + mpc.Yop
383+
if model.nd 0
384+
mpc.d0[:], mpc.D̂0[:] = d - model.dop, D̂ - mpc.Dop
385+
end
383386
p = 0.0 # only used for LinModel objects
384-
#d0 = d - model.dop
385-
#D̂0 = D̂ - mpc.Dop
386387
return p
387388
end
388389

0 commit comments

Comments
 (0)