Skip to content

Commit 1d17751

Browse files
committed
Add trajectories tests
1 parent fd0071f commit 1d17751

File tree

3 files changed

+122
-5
lines changed

3 files changed

+122
-5
lines changed

src/trajectories.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ function Base.copy(Z::Traj) where {T,N,M}
5858
Traj([KnotPoint(copy(z.z), copy(z._x), copy(z._u), z.dt, z.t) for z in Z])
5959
end
6060

61-
function Traj(n::Int, m::Int, dt::AbstractFloat, N::Int, equal=false)
61+
function Traj(n::Int, m::Int, dt::AbstractFloat, N::Int; equal=false)
6262
x = NaN*@SVector ones(n)
6363
u = @SVector zeros(m)
6464
Traj(x,u,dt,N,equal)
6565
end
6666

67-
function Traj(x::SVector, u::SVector, dt::AbstractFloat, N::Int, equal=false)
67+
function Traj(x::SVector, u::SVector, dt::AbstractFloat, N::Int; equal=false)
6868
equal ? uN = N : uN = N-1
6969
Z = [KnotPoint(x,u,dt,(k-1)*dt) for k = 1:uN]
7070
if !equal
@@ -132,7 +132,7 @@ function Base.copyto!(Z::Traj, Z0::Traj)
132132
end
133133
end
134134

135-
function Base.copyto!(Z::Vector{<:KnotPoint}, Z0::Traj)
135+
function Base.copyto!(Z::Union{Vector{<:KnotPoint},Traj{<:Any,<:Any,<:Any,<:KnotPoint}}, Z0::Traj)
136136
@assert length(Z) == length(Z0)
137137
for k in eachindex(Z)
138138
Z[k].z = Z0[k].z
@@ -142,9 +142,9 @@ end
142142
#~~~~~~~~~~~~~~~~~~~~~~~~~~ FUNCTIONS ON TRAJECTORIES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
143143

144144
"Evaluate the discrete dynamics for all knot points"
145-
function discrete_dynamics!(f, model, Z::Traj)
145+
function discrete_dynamics!(::Type{Q}, f, model, Z::Traj) where Q
146146
for k in eachindex(Z)
147-
f[k] = discrete_dynamics(model, Z[k])
147+
f[k] = RobotDynamics.discrete_dynamics(Q, model, Z[k])
148148
end
149149
end
150150

test/runtests.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ end
2121
include("constraint_list.jl")
2222
include("constraint_sets.jl")
2323
end
24+
25+
@testset "Utils" begin
26+
include("trajectories.jl")
27+
end

test/trajectories.jl

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
@testset "Trajectories" begin
2+
n,m,N = 5,3,11
3+
dt = 0.1
4+
x = @SVector rand(n)
5+
u = @SVector rand(m)
6+
z = KnotPoint(x,u,dt)
7+
8+
#--- Empty contructor
9+
Z = Traj(n,m,dt,N)
10+
@test all(isnan, state(Z[rand(1:N)]))
11+
@test control(Z[rand(1:N-1)]) == zeros(m)
12+
@test length(controls(Z)) == N-1
13+
@test length(states(Z)) == N
14+
@test eltype(states(Z)) <: SVector{n}
15+
@test eltype(controls(Z)) <: SVector{m}
16+
@test Z[1].dt dt
17+
@test Z[end].dt 0
18+
@test Z[1].t 0
19+
@test Z[N].t (N-1)*dt
20+
@test TO.is_terminal(Z[end]) == true
21+
22+
Z = Traj(n,m,dt,N, equal=true)
23+
@test all(isnan, state(Z[rand(1:N)]))
24+
@test control(Z[rand(1:N)]) == zeros(m)
25+
@test length(controls(Z)) == N
26+
@test length(states(Z)) == N
27+
@test eltype(states(Z)) <: SVector{n}
28+
@test eltype(controls(Z)) <: SVector{m}
29+
@test Z[1].dt dt
30+
@test Z[end].dt dt
31+
@test Z[1].t 0
32+
@test Z[N].t (N-1)*dt
33+
@test TO.is_terminal(Z[end]) == false
34+
35+
#--- Copy single constructor
36+
Z = Traj(x, u, dt, N)
37+
@test length(Z) == N
38+
@test eltype(Z) <: KnotPoint{Float64,n,m}
39+
@test state(Z[1]) == x
40+
Z[1].z = 2*Z[1].z
41+
@test state(Z[1]) 2x
42+
@test state(Z[2]) x
43+
@test control(Z[1]) 2u
44+
@test control(Z[2]) u
45+
@test Z[1].dt dt
46+
@test Z[end].dt 0
47+
@test Z[1].t 0
48+
@test Z[N].t (N-1)*dt
49+
50+
#--- Vector constructor
51+
X = [@SVector rand(n) for k = 1:N]
52+
U = [@SVector rand(m) for k = 1:N-1]
53+
Z = Traj(X,U,fill(dt,N))
54+
@test states(Z) X
55+
@test controls(Z) U
56+
@test TO.get_times(Z) range(0, length=N, step=dt)
57+
58+
Z2 = copy(Z)
59+
RobotDynamics.set_state!(Z[1], x)
60+
@test !(state(Z[1]) state(Z2[1]))
61+
@test state(Z[2]) state(Z2[2])
62+
X = 2 .* X
63+
U = 3 .* U
64+
X[1] = x
65+
TO.set_states!(Z2, X)
66+
@test state(Z[1]) state(Z2[1])
67+
@test !(control(Z2[2]) U[2])
68+
TO.set_controls!(Z2, U)
69+
@test control(Z2[2]) U[2]
70+
71+
@test TO.is_terminal(Z[end]) == true
72+
push!(U, 2*U[end])
73+
Z = Traj(X,U,fill(dt,N))
74+
@test length(controls(Z)) == N
75+
@test TO.is_terminal(Z[end]) == false
76+
77+
#--- Test copyto!
78+
Z0 = [KnotPoint(3*X[k], 2*U[k], dt, dt*(k-1)) for k = 1:N]
79+
@test state.(Z0) 3 .* states(Z)
80+
@test control.(Z0) 2 .* controls(Z)
81+
copyto!(Z0, Z)
82+
@test state.(Z0) states(Z)
83+
@test control.(Z0) controls(Z)
84+
85+
Z2 = Traj(rand() .* X, rand() .* U,fill(dt,N))
86+
@test !(states(Z) states(Z2))
87+
@test !(controls(Z) controls(Z2))
88+
copyto!(Z2, Z)
89+
@test states(Z) states(Z2)
90+
@test controls(Z) controls(Z2)
91+
92+
#--- Test functions on trajectories
93+
model = Cartpole()
94+
n,m = size(model)
95+
fVal = [@SVector zeros(n) for k = 1:N]
96+
X = [@SVector rand(n) for k = 1:N]
97+
U = [@SVector rand(m) for k = 1:N-1]
98+
Z = Traj(X,U,fill(dt,N))
99+
100+
# Test dynamics evaluation
101+
TO.discrete_dynamics!(RK3, fVal, model, Z)
102+
@test fVal[1] discrete_dynamics(RK3, model, X[1], U[1], 0.0, dt)
103+
dyn = TO.DynamicsConstraint{RK3}(model, N)
104+
conval = TO.ConVal(n,m, dyn, 1:N-1)
105+
TO.evaluate!(conval, Z)
106+
@test conval.vals fVal[1:N-1] .- X[2:N]
107+
@test !(conval.vals [zeros(n) for k = 1:N-1])
108+
109+
# Test rollout
110+
rollout!(model, Z, X[1])
111+
TO.evaluate!(conval, Z)
112+
@test conval.vals [zeros(n) for k = 1:N-1]
113+
end

0 commit comments

Comments
 (0)