pfh.glidersim.paraglider_wing#

Models of paraglider wings.

FIXME: explain “wing = canopy + suspension lines”

Classes

LineGeometry(*args, **kwargs)

Interface for classes that define a LineGeometry model.

ParagliderWing(lines, canopy[, rho_upper, ...])

FIXME: add class docstring.

SimpleLineGeometry(kappa_x, kappa_z, ...)

FIXME: add docstring.

class pfh.glidersim.paraglider_wing.LineGeometry(*args, **kwargs)#

Bases: Protocol

Interface for classes that define a LineGeometry model.

Methods

aerodynamics(v_W2b, rho_air)

Calculate the aerodynamic forces and moments at each control point.

delta_d(s, delta_bl, delta_br)

Compute the trailing edge deflection distance due to brake inputs.

r_CP2LE()

Compute the control points for the line geometry dynamics.

r_RM2LE([delta_a])

Compute the position of the riser midpoint RM in body frd.

abstract r_RM2LE(delta_a=0)#

Compute the position of the riser midpoint RM in body frd.

Parameters
delta_aarray_like of float, shape (N,) [percentage] (optional)

Fraction of maximum accelerator application. Default: 0

Returns
r_RM2LEarray of float, shape (N,3) [unitless]

The riser midpoint RM with respect to the canopy origin.

abstract r_CP2LE()#

Compute the control points for the line geometry dynamics.

Returns
ndarray of float, shape (K,3) [m]

Control points relative to the central leading edge LE. Coordinates are in canopy frd, and K is the number of points being used to distribute the surface area of the lines.

abstract delta_d(s, delta_bl, delta_br)#

Compute the trailing edge deflection distance due to brake inputs.

Parameters
sarray_like of float

Section index, where -1 <= s <= 1

delta_blarray_like of float [percentage]

Left brake application as a fraction of maximum braking

delta_brarray_like of float [percentage]

Right brake application as a fraction of maximum braking

Returns
delta_dfloat [m]

The deflection distance of the trailing edge.

abstract aerodynamics(v_W2b, rho_air: float)#

Calculate the aerodynamic forces and moments at each control point.

Parameters
v_W2barray of float, shape (K,3) [m/s]

The wind velocity at each of the K control points.

rho_airfloat [kg/m^3]

Air density

Returns
dF, dMarray of float, shape (K,3) [N, N m]

Aerodynamic forces and moments for each control point.

__init__(*args, **kwargs)#
class pfh.glidersim.paraglider_wing.SimpleLineGeometry(kappa_x: float, kappa_z: float, kappa_A: float, kappa_C: float, kappa_a: float, kappa_b: float, total_line_length: float, average_line_diameter: float, r_L2LE, Cd_lines: float, s_delta_start0: float, s_delta_start1: float, s_delta_stop0: float, s_delta_stop1: float)#

Bases: pfh.glidersim.paraglider_wing.LineGeometry

FIXME: add docstring.

Parameters
kappa_xfloat [m]

x-coordinate distance from RM to the canopy origin.

kappa_zfloat [m]

z-coordinate distance from RM to the canopy origin.

kappa_A, kappa_Cfloat [m]

Distance of the A and C canopy connection points along the central chord. The accelerator adjusts the length of the A lines, while the C lines remain fixed length, effectively causing a rotation of the canopy about the point kappa_C.

kappa_afloat [m]

Accelerator line length. This is the maximum change in the length of the A lines.

kappa_bfloat [m]

Brake line length. Equal to the maximum vertical deflection of the trailing edge, which occurs at (s_delta_start + s_delta_stop) / 2. This is the deflection distance supported by the model, not the true physical length of the line. The aerodynamics model can only support a limited range of edge deflection, and this value is the deflection associated with “100% brake input”.

s_delta_start0, s_delta_start1float

Section indices where brake deflections begin, transitioning from start0 when delta_b = 0 to start1 when delta_b = 1. FIXME: needs a proper docstring. For example, these are for the right brake, but the left is symmetric.

s_delta_stop0, s_delta_stop1float

Section indices where brake deflections end, transitioning from stop0 when delta_b = 0 to stop1 when delta_b = 1. FIXME: needs a proper docstring. For example, these are for the right brake, but the left is symmetric.

total_line_lengthfloat [m]

Total length of the lines from the risers to the canopy.

average_line_diameterfloat [m]

Average diameter of the connecting lines.

r_L2LEarray of float, shape (K,3) [m]

Averaged location(s) of the connecting line surface area(s). If multiple positions are given, the total line length will be divided between them evenly.

Cd_linesfloat

Drag coefficient of the lines.

Notes

FIXME: describe the design, and reference the sections in my thesis.

Accelerator

FIXME: describe

Brakes

The wing root typically experiences very little (if any) brake deflection, so this model allows for zero deflection until some section s_delta_start from the wing root. Similarly, brake deflections typically stop a little before reaching the wing tip.

This models the deflection distribution with a quartic function. It assumes the deflection distance is symmetric about some peak at the middle of s_delta_start and s_delta_stop.

Regarding the the derivation: a normal quartic goes like \(Ap^4 + Bp^3 + Cp^2 + Dp + E = 0\). Assuming symmetry about p = 0.5, the six terms can be solved using:

delta_d(0) = 0 d(delta_d)/dp | s_0 = 0 delta_d(1) = 0 d(delta_d)/dp | s_1 = 0 delta_d(0.5) = delta_d_peak

I don’t love this design, but I was hoping to find time to prototype a proper line geometry that computes the true angles throughout the bridle, and having the LineGeometry compute distances instead of angles would make that easier.

Methods

aerodynamics(v_W2b, rho_air)

Calculate the aerodynamic forces and moments at each control point.

delta_d(s, delta_bl, delta_br)

Compute the trailing edge deflection distance due to brake inputs.

maximize_kappa_b(delta_d_max, chord_length)

Maximze kappa_b such that delta_d never exceeds delta_d_max.

r_CP2LE()

Compute the control points for the line geometry dynamics.

r_RM2LE([delta_a])

Compute the position of the riser midpoint RM in body frd.

__init__(kappa_x: float, kappa_z: float, kappa_A: float, kappa_C: float, kappa_a: float, kappa_b: float, total_line_length: float, average_line_diameter: float, r_L2LE, Cd_lines: float, s_delta_start0: float, s_delta_start1: float, s_delta_stop0: float, s_delta_stop1: float)#
r_RM2LE(delta_a=0)#

Compute the position of the riser midpoint RM in body frd.

Parameters
delta_aarray_like of float, shape (N,) [percentage] (optional)

Fraction of maximum accelerator application. Default: 0

Returns
r_RM2LEarray of float, shape (N,3) [unitless]

The riser midpoint RM with respect to the canopy origin.

r_CP2LE()#

Compute the control points for the line geometry dynamics.

Returns
ndarray of float, shape (K,3) [m]

Control points relative to the central leading edge LE. Coordinates are in canopy frd, and K is the number of points being used to distribute the surface area of the lines.

delta_d(s, delta_bl, delta_br)#

Compute the trailing edge deflection distance due to brake inputs.

Parameters
sarray_like of float

Section index, where -1 <= s <= 1

delta_blarray_like of float [percentage]

Left brake application as a fraction of maximum braking

delta_brarray_like of float [percentage]

Right brake application as a fraction of maximum braking

Returns
delta_dfloat [m]

The deflection distance of the trailing edge.

aerodynamics(v_W2b, rho_air: float)#

Calculate the aerodynamic forces and moments at each control point.

Parameters
v_W2barray of float, shape (K,3) [m/s]

The wind velocity at each of the K control points.

rho_airfloat [kg/m^3]

Air density

Returns
dF, dMarray of float, shape (K,3) [N, N m]

Aerodynamic forces and moments for each control point.

maximize_kappa_b(delta_d_max: float, chord_length: Callable, margin: float = 1e-06) None#

Maximze kappa_b such that delta_d never exceeds delta_d_max.

Useful to ensure the deflections don’t exceed the maximum delta_d supported by the airfoil coefficients.

Parameters
delta_d_maxfloat

Maximum deflection distance the brakes should produce at any section, normalized to unit chord length.

chord_lengthfunction

Canopy chord length as a function of section index -1 <= s <= 1.

class pfh.glidersim.paraglider_wing.ParagliderWing(lines: LineGeometry, canopy: SimpleFoil, rho_upper: float = 0, rho_lower: float = 0, rho_ribs: float = 0, N_cells: int = 1)#

Bases: object

FIXME: add class docstring.

The system is referred to as the “body” since that is conventional in aeronautics literature. Vectors are in “body frd”, a coordinate system inherited from the canopy: the xyz axes are oriented front-right-down with the origin at the central leading edge LE.

Parameters
linesLineGeometry

Lines that position the riser and produce trailing edge deflections.

canopySimpleFoil

The geometric shape of the lifting surface.

rho_upper, rho_lowerfloat [kg/m^2]

Surface area densities of the upper and lower canopy surfaces.

rho_ribsfloat [kg/m^2]

Surface area density of the internal vertical ribs.

N_cellsinteger, optional

The number of canopy cells. This is only used for estimating the mass of the internal ribs. Proper support for ribs would require a new foil geometry with native support for cells, ribs, profile distortions, etc.

Methods

aerodynamics(delta_a, delta_bl, delta_br, ...)

FIXME: add docstring.

apparent_mass_properties(rho_air, r_R2LE, ...)

Compute the apparent mass matrix and momentum of the canopy.

equilibrium_alpha(delta_a, delta_b, v_mag[, ...])

Compute the angle of attack with zero aerodynamic pitching moment.

mass_properties(rho_air, r_R2LE)

Compute the mass properties of the materials and enclosed volume of air.

r_CP2LE([delta_a])

Compute the FoilGeometry control points in frd.

r_RM2LE([delta_a])

Compute the position of the riser midpoint RM in frd coordinates.

resultant_force(delta_a, delta_bl, delta_br, ...)

Calculate the net force and moment due to wind and gravity.

__init__(lines: LineGeometry, canopy: SimpleFoil, rho_upper: float = 0, rho_lower: float = 0, rho_ribs: float = 0, N_cells: int = 1)#
aerodynamics(delta_a: float, delta_bl: float, delta_br: float, v_W2b, rho_air: float, reference_solution: Optional[dict] = None)#

FIXME: add docstring.

Parameters
delta_afloat [percentage]

Fraction of accelerator, from 0 to 1

delta_blfloat [percentage]

Fraction of left brake, from 0 to 1

delta_brfloat [percentage]

Fraction of right brake, from 0 to 1

v_W2barray of float, shape (K,3) [m/s]

The wind vector at each control point in body frd

rho_airfloat [kg/m^3]

The ambient air density

reference_solutiondictionary, optional

FIXME: docstring. See Phillips.__call__

Returns
dF, dMarray of float, shape (K,3) [N, N m]

Aerodynamic forces and moments for each control point.

solutiondictionary, optional

FIXME: docstring. See Phillips.__call__

equilibrium_alpha(delta_a: float, delta_b: float, v_mag: float, rho_air: float = 1.225, alpha_0: float = 9, alpha_1: float = 6, reference_solution: Optional[dict] = None)#

Compute the angle of attack with zero aerodynamic pitching moment.

The final wing will have extra moments from the harness and weight of the wing, but this value is often a good estimate.

Parameters
delta_afloat [percentage], optional

Fraction of accelerator, from 0 to 1

delta_bfloat [percentage]

Fraction of symmetric brake, from 0 to 1

v_magfloat [m/s]

Airspeed

rho_airfloat [kg/m^3], optional

Air density

alpha_0float [deg], optional

First guess for the equilibrium alpha search.

alpha_1float [deg], optional

Second guess for the equilibrium alpha search.

solutiondictionary, optional

FIXME: docstring. See Phillips.__call__

Returns
float [rad]

The angle of attack where the section pitching moments sum to zero.

r_CP2LE(delta_a=0)#

Compute the FoilGeometry control points in frd.

FIXME: descibe/define “control points”

Parameters
delta_aarray_like of float, shape (K,) [percentage] (optional)

Fraction of maximum accelerator application

Returns
ndarray of floats, shape (K,3) [m]

The control points in frd coordinates

r_RM2LE(delta_a=0)#

Compute the position of the riser midpoint RM in frd coordinates.

Parameters
delta_aarray_like of float, shape (K,) [percentage] (optional)

Fraction of maximum accelerator application. Default: 0

Returns
r_RM2LEarray of float, shape (K,3) [m]

The riser midpoint RM with respect to the canopy origin.

mass_properties(rho_air: float, r_R2LE)#

Compute the mass properties of the materials and enclosed volume of air.

Parameters
rho_airfloat [kg/m^3]

Air density

r_R2LEarray of float, shape (3,) [m]

Reference point R with respect to the canopy origin in body frd.

Returns
dictionary
m_sfloat [kg]

The solid mass of the wing

r_S2LEarray of float, shape (3,) [m]

Vector from the canopy origin to the solid mass centroid

r_S2Rarray of float, shape (3,) [m]

Vector from the reference point to the solid mass centroid

J_s2Sarray of float, shape (3,3) [kg m^2]

The moment of inertia matrix of the solid mass about its cm

vfloat [m^3]

The enclosed volume

r_V2Rarray of float, shape (3,) [m]

Vector from the reference point to the volume centroid V

J_v2Varray of float, shape (3,3) [m^2]

The moment of inertia matrix of the volume about its centroid

m_airfloat [kg m^3]

The enclosed air mass.

apparent_mass_properties(rho_air: float, r_R2LE, v_R2e, omega_b2e)#

Compute the apparent mass matrix and momentum of the canopy.

Parameters
rho_airfloat [kg/m^3]

Air density

r_R2LEarray of float, shape (3,) [m]

Reference point R with respect to the canopy origin in body frd.

v_R2earray of float, shape (3,) [m/s]

The velocity of the R with respect to the inertial frame.

omega_b2earray of float, shape (3,) [rad/s]

Angular velocity of the body, in body frd coordinates.

Returns
dictionary
r_PC2RCarray of float, shape (3,) [m]

Vector to the pitch center from the roll center

r_RC2Rarray of float, shape (3,) [m]

Vector to the roll center from the riser connection point

M_aarray of float, shape (3,3)

The apparent mass matrix

A_a2Rarray of float, shape (6,6)

The apparent inertia matrix of the volume with respect to R

p_a2earray of float, shape (3,)

The apparent linear momentum with respect to the inertial frame

h_a2Rarray of float, shape (3,3)

The angular momentum of the apparent mass with respect to R

resultant_force(delta_a, delta_bl, delta_br, v_W2b, rho_air, g, r_R2LE, mp=None, reference_solution=None)#

Calculate the net force and moment due to wind and gravity.

Parameters
delta_afloat [percentage]

Fraction of accelerator, from 0 to 1

delta_blfloat [percentage]

Fraction of left brake, from 0 to 1

delta_brfloat [percentage]

Fraction of right brake, from 0 to 1

v_W2barray of float, shape (K,3) [m/s]

The wind vector at each control point in body frd

rho_airfloat [kg/m^3]

The ambient air density

garray of float, shape (3,) [m/s^s]

The gravity vector in body frd

r_R2LEarray of float, shape (3,) [m]

Reference point R with respect to the canopy origin in body frd.

mpdictionary, optional

The mass properties of the body associated with the given air density and reference point. Used to avoid recomputation.

reference_solutiondictionary, optional

FIXME: docstring. See Phillips.__call__

Returns
f_b, g_B2Rarray of float, shape (3,) [N, N m]

The net force and moment on the body with respect to R.