From 8b87700fbee2e4a2ef3ef6c56e8eb3155f20effb Mon Sep 17 00:00:00 2001 From: Uwe Fechner Date: Wed, 27 Apr 2022 12:00:17 +0200 Subject: [PATCH] New example, unit tests --- README.md | 2 + examples/plot.jl | 64 ------------------------------ examples/steering_4p.jl | 88 +++++++++++++++++++++++++++++++++++++++++ src/viewer3D.jl | 26 ++++++------ test/runtests.jl | 14 ++++++- test/test_steering.jl | 5 --- 6 files changed, 115 insertions(+), 84 deletions(-) delete mode 100644 examples/plot.jl create mode 100644 examples/steering_4p.jl diff --git a/README.md b/README.md index 9114ad7..2ce4b7f 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,9 @@ you should see a kite on a tether. The same example, but using the 4 point kite model: ```julia +using KiteViewers using KiteUtils#main +viewer=Viewer3D(false); segments=6 state=demo_state_4p(segments+1) update_points(state.pos, segments, orient=state.orient) diff --git a/examples/plot.jl b/examples/plot.jl deleted file mode 100644 index 97e3e4d..0000000 --- a/examples/plot.jl +++ /dev/null @@ -1,64 +0,0 @@ -using KiteViewers, KiteModels, KitePodModels, Rotations, StaticArrays - -# change this to KPS3 or KPS4 -const Model = KPS3 - -if ! @isdefined kcu; const kcu = KCU(se()); end -if ! @isdefined kps4; const kps4 = Model(kcu); end - -# the following values can be changed to match your interest -dt = 0.05 -TIME = 30 -TIME_LAPSE_RATIO = 5 -STEPS = Int64(round(TIME/dt)) -FRONT_VIEW = false -ZOOM = true -STATISTIC = false -SHOW_KITE = true -# end of user parameter section # - -viewer = Viewer3D() -init_system(viewer.scene3D; show_kite=SHOW_KITE) - -include("timers.jl") - -function plot2d(pos, reltime; zoom=ZOOM, front=FRONT_VIEW, segments=se().segments) - scale = 0.1 - pos_kite = pos[end] - pos_before = pos[end-1] - if SHOW_KITE - v_app = kps4.v_apparent - rotation = rot(pos_kite, pos_before, v_app) - q = QuatRotation(rotation) - orient = MVector{4, Float32}(Rotations.params(q)) - update_points(viewer.scene3D, pos, segments, scale, reltime, orient) - else - update_points(viewer.scene3D, pos, segments, scale, reltime) - end -end - -function simulate(integrator, steps) - start = integrator.p.iter - start_time = time() - for i in 1:steps - if i == 300 - set_depower_steering(kps4.kcu, 0.25, 0.1) - elseif i == 302 - set_depower_steering(kps4.kcu, 0.25, -0.1) - elseif i == 304 - set_depower_steering(kps4.kcu, 0.25, 0.0) - end - # KitePodModels.on_timer(kcu, dt) - KiteModels.next_step!(kps4, integrator, dt=dt) - reltime = i*dt - plot2d(kps4.pos, reltime; zoom=ZOOM, front=FRONT_VIEW, segments=se().segments) - # sleep(dt/5) - wait_until(start_time+i*dt/TIME_LAPSE_RATIO) - end - (integrator.p.iter - start) / steps -end - -integrator = KiteModels.init_sim!(kps4, stiffness_factor=0.04, prn=STATISTIC) - -av_steps = simulate(integrator, STEPS) -nothing diff --git a/examples/steering_4p.jl b/examples/steering_4p.jl new file mode 100644 index 0000000..1a9ea28 --- /dev/null +++ b/examples/steering_4p.jl @@ -0,0 +1,88 @@ +using Pkg +if ! ("KiteModels" ∈ keys(Pkg.project().dependencies)) + using TestEnv; TestEnv.activate() +end + +using KiteViewers, KiteModels, KitePodModels, Rotations + +# change this to KPS3 or KPS4 +const Model = KPS4 + +if ! @isdefined kcu; const kcu = KCU(se()); end +if ! @isdefined kps4; const kps4 = Model(kcu); end + +# the following values can be changed to match your interest +dt = 0.05 +TIME = 45 +TIME_LAPSE_RATIO = 5 +STEPS = Int64(round(TIME/dt)) +STATISTIC = false +SHOW_KITE = false +# end of user parameter section # + +if ! @isdefined viewer; const viewer = Viewer3D(SHOW_KITE); end + +include("timers.jl") + +function update_system(kps::KPS3, reltime; segments=se().segments) + scale = 0.08 + pos_kite = kps.pos[end] + pos_before = kps.pos[end-1] + elevation = calc_elevation(pos_kite) + azimuth = azimuth_east(pos_kite) + force = winch_force(kps) + if SHOW_KITE + v_app = kps.v_apparent + rotation = rot(pos_kite, pos_before, v_app) + q = QuatRotation(rotation) + orient = MVector{4, Float32}(Rotations.params(q)) + update_points(kps.pos, segments, scale, reltime, elevation, azimuth, force, orient=orient) + else + update_points(kps.pos, segments, scale, reltime, elevation, azimuth, force) + end +end + +function update_system(kps::KPS4, reltime; segments=se().segments) + scale = 0.08 + pos_kite = kps.pos[segments+1] # well, this is the position of the pod... + elevation = calc_elevation(pos_kite) + azimuth = azimuth_east(pos_kite) + force = winch_force(kps) + update_points(kps.pos, segments, scale, reltime, elevation, azimuth, force, scale_kite=3.5) +end + +function simulate(integrator, steps) + start = integrator.p.iter + start_time = time() + for i in 1:steps + if i == 300 + set_depower_steering(kps4.kcu, 0.25, 0.1) + elseif i == 302 + set_depower_steering(kps4.kcu, 0.25, -0.1) + elseif i == 304 + set_depower_steering(kps4.kcu, 0.25, 0.0) + elseif i == 350 + set_depower_steering(kps4.kcu, 0.25, -0.04) + elseif i == 352 + set_depower_steering(kps4.kcu, 0.25, 0.0) + end + # KitePodModels.on_timer(kcu, dt) + KiteModels.next_step!(kps4, integrator, dt=dt) + reltime = i*dt + if mod(i, TIME_LAPSE_RATIO) == 0 || i == steps + update_system(kps4, reltime; segments=se().segments) + if start_time+dt > time() + 0.002 + wait_until(start_time+dt) + else + sleep(0.001) + end + start_time = time() + end + end + (integrator.p.iter - start) / steps +end + +integrator = KiteModels.init_sim!(kps4, stiffness_factor=0.04, prn=STATISTIC) + +av_steps = simulate(integrator, STEPS) +nothing diff --git a/src/viewer3D.jl b/src/viewer3D.jl index 759c684..2c3d4ff 100644 --- a/src/viewer3D.jl +++ b/src/viewer3D.jl @@ -38,17 +38,17 @@ SOFTWARE. =# textsize = Node(TEXT_SIZE) textsize2 = Node(AXIS_LABEL_SIZE) status = Node("") - p1 = Node(Vector{Point2f0}(undef, 6000)) # 5 min - p2 = Node(Vector{Point2f0}(undef, 6000)) # 5 min + p1 = Node(Vector{Point2f}(undef, 6000)) # 5 min + p2 = Node(Vector{Point2f}(undef, 6000)) # 5 min pos_x = Node(0.0f0) - points = Vector{Point3f0}(undef, se().segments+1+4) + points = Vector{Point3f}(undef, se().segments+1+4) quat = Node(Quaternionf0(0,0,0,1)) # orientation of the kite - kite_pos = Node(Point3f0(1,0,0)) # position of the kite - positions = Node([Point3f0(x,0,0) for x in 1:se().segments+KITE_SPRINGS]) # positions of the tether segments - part_positions = Node([Point3f0(x,0,0) for x in 1:se().segments+1+4]) # positions of the tether particles - markersizes = Node([Point3f0(1,1,1) for x in 1:se().segments+KITE_SPRINGS]) # includes the segment length - rotations = Node([Point3f0(1,0,0) for x in 1:se().segments+KITE_SPRINGS]) # unit vectors corresponding with + kite_pos = Node(Point3f(1,0,0)) # position of the kite + positions = Node([Point3f(x,0,0) for x in 1:se().segments+KITE_SPRINGS]) # positions of the tether segments + part_positions = Node([Point3f(x,0,0) for x in 1:se().segments+1+4]) # positions of the tether particles + markersizes = Node([Point3f(1,1,1) for x in 1:se().segments+KITE_SPRINGS]) # includes the segment length + rotations = Node([Point3f(1,0,0) for x in 1:se().segments+KITE_SPRINGS]) # unit vectors corresponding with # the orientation of the segments energy = [0.0] end @@ -67,7 +67,7 @@ end function Viewer3D(show_kite=true) KiteUtils.set_data_path(datapath) - scene, layout = layoutscene(resolution = (840, 900), backgroundcolor = RGBf0(0.7, 0.8, 1)) + scene, layout = layoutscene(resolution = (840, 900), backgroundcolor = RGBf(0.7, 0.8, 1)) scene3D = LScene(scene, scenekw = (show_axis=false, limits = Rect(-7,-10.0,0, 11,10,11), resolution = (800, 800)), raw=false) create_coordinate_system(scene3D) cam = cameracontrols(scene3D.scene) @@ -80,11 +80,11 @@ function Viewer3D(show_kite=true) textsize[] = TEXT_SIZE textsize2[] = AXIS_LABEL_SIZE - text!(scene3D, "z", position = Point3f0(0, 0, 14.6), textsize = textsize2, align = (:center, :center), show_axis = false) - text!(scene3D, "x", position = Point3f0(17, 0,0), textsize = textsize2, align = (:center, :center), show_axis = false) - text!(scene3D, "y", position = Point3f0( 0, 14.5, 0), textsize = textsize2, align = (:center, :center), show_axis = false) + text!(scene3D, "z", position = Point3f(0, 0, 14.6), textsize = textsize2, align = (:center, :center), show_axis = false) + text!(scene3D, "x", position = Point3f(17, 0,0), textsize = textsize2, align = (:center, :center), show_axis = false) + text!(scene3D, "y", position = Point3f( 0, 14.5, 0), textsize = textsize2, align = (:center, :center), show_axis = false) - text!(scene, status, position = Point2f0( 20, 0), textsize = TEXT_SIZE, align = (:left, :bottom), show_axis = false) + text!(scene, status, position = Point2f( 20, 0), textsize = TEXT_SIZE, align = (:left, :bottom), show_axis = false) status[]="Stopped" layout[1, 1] = scene3D diff --git a/test/runtests.jl b/test/runtests.jl index 74f3fe5..510347e 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,6 +1,16 @@ -using KiteViewers +using KiteViewers, KiteUtils using Test +cd("..") +include("test_steering.jl") + @testset "KiteViewers.jl" begin - # Write your tests here. + segments=se().segments + pos_kite = kps4.pos[segments+1] # well, this is the position of the pod... + elevation = calc_elevation(pos_kite) + @test rad2deg(elevation) ≈ 70.31815477683752 + azimuth = azimuth_east(pos_kite) + @test rad2deg(azimuth) ≈ 9.217613192065718 + force = winch_force(kps4) + @test force ≈ 495.7191503651492 end diff --git a/test/test_steering.jl b/test/test_steering.jl index b5a456a..33455cf 100644 --- a/test/test_steering.jl +++ b/test/test_steering.jl @@ -1,8 +1,3 @@ -using Pkg -if ! ("KiteModels" ∈ keys(Pkg.project().dependencies)) - using TestEnv; TestEnv.activate() -end - using KiteViewers, KiteModels, KitePodModels, Rotations # change this to KPS3 or KPS4