Example EFH Jump Design¶
The following page describes how to construct a typical equivalent fall height
ski jump landing surface using the skijumpdesign
API. Make sure to install
the library first.
Approach¶
Start by creating a 20 meter length of an approach surface (also called the
in-run) which is flat and has a downward slope angle of 20 degrees. The
resulting surface can be visualized with the FlatSurface.plot()
method.
from skijumpdesign import FlatSurface
approach_ang = -np.deg2rad(20) # radians
approach_len = 20.0 # meters
approach = FlatSurface(approach_ang, approach_len)
approach.plot()
(Source code, png, hires.png, pdf)
Now that a surface has been created, a skier can be created. The skier can “ski”
along the approach surface using the slide_on()
method which generates a
skiing simulation trajectory.
from skijumpdesign import Skier
skier = Skier()
approach_traj = skier.slide_on(approach)
approach_traj.plot_time_series()
Takeoff¶
The takeoff ramp is constructed with a clothoid-circle-clothoid-flat surface to transition from the approach parent slope angle to the desired takeoff angle, in this case 15 degrees.
from skijumpdesign import TakeoffSurface
takeoff_entry_speed = skier.end_speed_on(approach)
takeoff_ang = np.deg2rad(15)
takeoff = TakeoffSurface(skier, approach_ang, takeoff_ang,
takeoff_entry_speed, init_pos=approach.end)
ax = approach.plot()
takeoff.plot(ax=ax)
(Source code, png, hires.png, pdf)
The trajectory of the skier on the takeoff can be examined also.
takeoff_traj = skier.slide_on(takeoff, takeoff_entry_speed)
takeoff_traj.plot_time_series()
Flight¶
Once the skier leaves the takeoff ramp at the maximum (design) speed they will be in flight. The
Skier.fly_to()
method can be used to simulate this longest flight trajectory.
takeoff_vel = skier.end_vel_on(takeoff, init_speed=takeoff_entry_speed)
flight = skier.fly_to(approach, init_pos=takeoff.end,
init_vel=takeoff_vel)
flight.plot_time_series()
The design speed flight trajectory can be plotted alongside the surfaces.
ax = approach.plot()
ax = takeoff.plot(ax=ax)
flight.plot(ax=ax, color='#9467bd')
(Source code, png, hires.png, pdf)
Landing Transition¶
There is a single infinity of landing surfaces that satisfy the efh differential equation and provide the desired equivalent fall height. The algorithm selects the one of these that is closest to the parent slope, and hence is least expensive to build, but which still is able to transition back to the parent slope with slope continuity and simultaneously is constrained to experience limited normal acceleration. The final part of this step is to determine the landing transition curve which connects the optimum (cheapest) constant efh landing surface to the parent slope.
from skijumpdesign import LandingTransitionSurface
fall_height = 0.5
landing_trans = LandingTransitionSurface(approach,
flight, fall_height, skier.tolerable_landing_acc)
ax = approach.plot()
ax = takeoff.plot(ax=ax)
ax = flight.plot(ax=ax, color='#9467bd')
landing_trans.plot(ax=ax, color='#d62728')
(Source code, png, hires.png, pdf)
Landing¶
Finally, the equivalent fall height landing surface can be generated which accommodates all takeoff speeds below the maximum takeoff (design) speed above.
from skijumpdesign import LandingSurface
slope = FlatSurface(approach_ang, np.sqrt(landing_trans.end[0]**2 +
landing_trans.end[1]**2) + 1.0)
landing = LandingSurface(skier, takeoff.end, takeoff_ang,
landing_trans.start, fall_height,
surf=slope)
ax = approach.plot()
ax = takeoff.plot(ax=ax)
ax = flight.plot(ax=ax, color='#9467bd')
ax = landing_trans.plot(ax=ax, color='#d62728')
landing.plot(ax=ax, color='#2ca02c')
(Source code, png, hires.png, pdf)
Entire Jump¶
There is a convenience function for plotting the jump:
from skijumpdesign import plot_jump
plot_jump(slope, approach, takeoff, landing, landing_trans, flight)
(Source code, png, hires.png, pdf)