Skip to content

Commit 8b87700

Browse files
committed
New example, unit tests
1 parent f45a122 commit 8b87700

File tree

6 files changed

+115
-84
lines changed

6 files changed

+115
-84
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ you should see a kite on a tether.
3434
The same example, but using the 4 point kite model:
3535

3636
```julia
37+
using KiteViewers
3738
using KiteUtils#main
39+
viewer=Viewer3D(false);
3840
segments=6
3941
state=demo_state_4p(segments+1)
4042
update_points(state.pos, segments, orient=state.orient)

examples/plot.jl

Lines changed: 0 additions & 64 deletions
This file was deleted.

examples/steering_4p.jl

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
using Pkg
2+
if ! ("KiteModels" keys(Pkg.project().dependencies))
3+
using TestEnv; TestEnv.activate()
4+
end
5+
6+
using KiteViewers, KiteModels, KitePodModels, Rotations
7+
8+
# change this to KPS3 or KPS4
9+
const Model = KPS4
10+
11+
if ! @isdefined kcu; const kcu = KCU(se()); end
12+
if ! @isdefined kps4; const kps4 = Model(kcu); end
13+
14+
# the following values can be changed to match your interest
15+
dt = 0.05
16+
TIME = 45
17+
TIME_LAPSE_RATIO = 5
18+
STEPS = Int64(round(TIME/dt))
19+
STATISTIC = false
20+
SHOW_KITE = false
21+
# end of user parameter section #
22+
23+
if ! @isdefined viewer; const viewer = Viewer3D(SHOW_KITE); end
24+
25+
include("timers.jl")
26+
27+
function update_system(kps::KPS3, reltime; segments=se().segments)
28+
scale = 0.08
29+
pos_kite = kps.pos[end]
30+
pos_before = kps.pos[end-1]
31+
elevation = calc_elevation(pos_kite)
32+
azimuth = azimuth_east(pos_kite)
33+
force = winch_force(kps)
34+
if SHOW_KITE
35+
v_app = kps.v_apparent
36+
rotation = rot(pos_kite, pos_before, v_app)
37+
q = QuatRotation(rotation)
38+
orient = MVector{4, Float32}(Rotations.params(q))
39+
update_points(kps.pos, segments, scale, reltime, elevation, azimuth, force, orient=orient)
40+
else
41+
update_points(kps.pos, segments, scale, reltime, elevation, azimuth, force)
42+
end
43+
end
44+
45+
function update_system(kps::KPS4, reltime; segments=se().segments)
46+
scale = 0.08
47+
pos_kite = kps.pos[segments+1] # well, this is the position of the pod...
48+
elevation = calc_elevation(pos_kite)
49+
azimuth = azimuth_east(pos_kite)
50+
force = winch_force(kps)
51+
update_points(kps.pos, segments, scale, reltime, elevation, azimuth, force, scale_kite=3.5)
52+
end
53+
54+
function simulate(integrator, steps)
55+
start = integrator.p.iter
56+
start_time = time()
57+
for i in 1:steps
58+
if i == 300
59+
set_depower_steering(kps4.kcu, 0.25, 0.1)
60+
elseif i == 302
61+
set_depower_steering(kps4.kcu, 0.25, -0.1)
62+
elseif i == 304
63+
set_depower_steering(kps4.kcu, 0.25, 0.0)
64+
elseif i == 350
65+
set_depower_steering(kps4.kcu, 0.25, -0.04)
66+
elseif i == 352
67+
set_depower_steering(kps4.kcu, 0.25, 0.0)
68+
end
69+
# KitePodModels.on_timer(kcu, dt)
70+
KiteModels.next_step!(kps4, integrator, dt=dt)
71+
reltime = i*dt
72+
if mod(i, TIME_LAPSE_RATIO) == 0 || i == steps
73+
update_system(kps4, reltime; segments=se().segments)
74+
if start_time+dt > time() + 0.002
75+
wait_until(start_time+dt)
76+
else
77+
sleep(0.001)
78+
end
79+
start_time = time()
80+
end
81+
end
82+
(integrator.p.iter - start) / steps
83+
end
84+
85+
integrator = KiteModels.init_sim!(kps4, stiffness_factor=0.04, prn=STATISTIC)
86+
87+
av_steps = simulate(integrator, STEPS)
88+
nothing

src/viewer3D.jl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,17 @@ SOFTWARE. =#
3838
textsize = Node(TEXT_SIZE)
3939
textsize2 = Node(AXIS_LABEL_SIZE)
4040
status = Node("")
41-
p1 = Node(Vector{Point2f0}(undef, 6000)) # 5 min
42-
p2 = Node(Vector{Point2f0}(undef, 6000)) # 5 min
41+
p1 = Node(Vector{Point2f}(undef, 6000)) # 5 min
42+
p2 = Node(Vector{Point2f}(undef, 6000)) # 5 min
4343
pos_x = Node(0.0f0)
4444

45-
points = Vector{Point3f0}(undef, se().segments+1+4)
45+
points = Vector{Point3f}(undef, se().segments+1+4)
4646
quat = Node(Quaternionf0(0,0,0,1)) # orientation of the kite
47-
kite_pos = Node(Point3f0(1,0,0)) # position of the kite
48-
positions = Node([Point3f0(x,0,0) for x in 1:se().segments+KITE_SPRINGS]) # positions of the tether segments
49-
part_positions = Node([Point3f0(x,0,0) for x in 1:se().segments+1+4]) # positions of the tether particles
50-
markersizes = Node([Point3f0(1,1,1) for x in 1:se().segments+KITE_SPRINGS]) # includes the segment length
51-
rotations = Node([Point3f0(1,0,0) for x in 1:se().segments+KITE_SPRINGS]) # unit vectors corresponding with
47+
kite_pos = Node(Point3f(1,0,0)) # position of the kite
48+
positions = Node([Point3f(x,0,0) for x in 1:se().segments+KITE_SPRINGS]) # positions of the tether segments
49+
part_positions = Node([Point3f(x,0,0) for x in 1:se().segments+1+4]) # positions of the tether particles
50+
markersizes = Node([Point3f(1,1,1) for x in 1:se().segments+KITE_SPRINGS]) # includes the segment length
51+
rotations = Node([Point3f(1,0,0) for x in 1:se().segments+KITE_SPRINGS]) # unit vectors corresponding with
5252
# the orientation of the segments
5353
energy = [0.0]
5454
end
@@ -67,7 +67,7 @@ end
6767

6868
function Viewer3D(show_kite=true)
6969
KiteUtils.set_data_path(datapath)
70-
scene, layout = layoutscene(resolution = (840, 900), backgroundcolor = RGBf0(0.7, 0.8, 1))
70+
scene, layout = layoutscene(resolution = (840, 900), backgroundcolor = RGBf(0.7, 0.8, 1))
7171
scene3D = LScene(scene, scenekw = (show_axis=false, limits = Rect(-7,-10.0,0, 11,10,11), resolution = (800, 800)), raw=false)
7272
create_coordinate_system(scene3D)
7373
cam = cameracontrols(scene3D.scene)
@@ -80,11 +80,11 @@ function Viewer3D(show_kite=true)
8080

8181
textsize[] = TEXT_SIZE
8282
textsize2[] = AXIS_LABEL_SIZE
83-
text!(scene3D, "z", position = Point3f0(0, 0, 14.6), textsize = textsize2, align = (:center, :center), show_axis = false)
84-
text!(scene3D, "x", position = Point3f0(17, 0,0), textsize = textsize2, align = (:center, :center), show_axis = false)
85-
text!(scene3D, "y", position = Point3f0( 0, 14.5, 0), textsize = textsize2, align = (:center, :center), show_axis = false)
83+
text!(scene3D, "z", position = Point3f(0, 0, 14.6), textsize = textsize2, align = (:center, :center), show_axis = false)
84+
text!(scene3D, "x", position = Point3f(17, 0,0), textsize = textsize2, align = (:center, :center), show_axis = false)
85+
text!(scene3D, "y", position = Point3f( 0, 14.5, 0), textsize = textsize2, align = (:center, :center), show_axis = false)
8686

87-
text!(scene, status, position = Point2f0( 20, 0), textsize = TEXT_SIZE, align = (:left, :bottom), show_axis = false)
87+
text!(scene, status, position = Point2f( 20, 0), textsize = TEXT_SIZE, align = (:left, :bottom), show_axis = false)
8888
status[]="Stopped"
8989

9090
layout[1, 1] = scene3D

test/runtests.jl

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
1-
using KiteViewers
1+
using KiteViewers, KiteUtils
22
using Test
33

4+
cd("..")
5+
include("test_steering.jl")
6+
47
@testset "KiteViewers.jl" begin
5-
# Write your tests here.
8+
segments=se().segments
9+
pos_kite = kps4.pos[segments+1] # well, this is the position of the pod...
10+
elevation = calc_elevation(pos_kite)
11+
@test rad2deg(elevation) 70.31815477683752
12+
azimuth = azimuth_east(pos_kite)
13+
@test rad2deg(azimuth) 9.217613192065718
14+
force = winch_force(kps4)
15+
@test force 495.7191503651492
616
end

test/test_steering.jl

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
using Pkg
2-
if ! ("KiteModels" keys(Pkg.project().dependencies))
3-
using TestEnv; TestEnv.activate()
4-
end
5-
61
using KiteViewers, KiteModels, KitePodModels, Rotations
72

83
# change this to KPS3 or KPS4

0 commit comments

Comments
 (0)