Skip to content

Commit 43d324b

Browse files
committed
added: first order hold for TrapezoidalCollocation
1 parent 00ac589 commit 43d324b

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

src/controller/transcription.jl

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,6 +1405,14 @@ function con_nonlinprogeq!(
14051405
X̂0_Z̃ = @views Z̃[(nΔU+1):(nΔU+nX̂)]
14061406
x̂0 = @views mpc.estim.x̂0[1:nx̂]
14071407
d0 = @views mpc.d0[1:nd]
1408+
if !iszero(transcription.nh)
1409+
k1, u0, û0 = @views K0[1:nx], U0[1:nu], Û0[1:nu]
1410+
xd, xs = @views x̂0[1:nx], x̂0[nx+1:end]
1411+
mul!(û0, Cs_u, xs)
1412+
û0 .+= u0
1413+
model.f!(k1, xd, û0, d0, p)
1414+
lastk2 = k1
1415+
end
14081416
#TODO: allow parallel for loop or threads?
14091417
for j=1:Hp
14101418
k0 = @views K0[(1 + nk*(j-1)):(nk*j)]
@@ -1424,12 +1432,17 @@ function con_nonlinprogeq!(
14241432
model.f!(k1, xd, û0, d0, p)
14251433
model.f!(k2, xdnext_Z̃, û0, d0next, p)
14261434
else # piecewise linear manipulated inputs u:
1427-
u0next = @views U0[(1 + nu*j):(nu*(j+1))]
1428-
û0next = @views U0[(1 + nu*j):(nu*(j+1))]
1435+
if j < Hp
1436+
u0next = @views U0[(1 + nu*j):(nu*(j+1))]
1437+
û0next = @views Û0[(1 + nu*j):(nu*(j+1))]
1438+
else # u(k+Hp) = u(k+Hp-1) since Hc ≤ Hp implies that Δu(k+Hp)=0
1439+
u0next = @views U0[(1 + nu*(j-1)):(nu*j)]
1440+
û0next = @views Û0[(1 + nu*(j-1)):(nu*j)]
1441+
end
14291442
mul!(û0next, Cs_u, xsnext_Z̃) # ys_u(k+1) = Cs_u*xs(k+1)
14301443
û0next .+= u0next # û0(k+1) = u0(k+1) + ys_u(k+1)
1431-
model.f!(k2, xdnext_Z̃, û0next, d0next, p)
14321444
k1 .= lastk2
1445+
model.f!(k2, xdnext_Z̃, û0next, d0next, p)
14331446
lastk2 = k2
14341447
end
14351448
xsnext = @views x̂0next[nx+1:end]

0 commit comments

Comments
 (0)