Skip to main content

Module fins

Module fins 

Source
Expand description

Fin sets and tube fins: planforms, cross-sections, tabs, and mass properties from geometry.

Fin frame. A fin set’s frame has its origin on the body axis at the station of the root chord’s leading edge. Fin k of N lies in the plane through the axis at roll angle φ_k = φ_0 + 2πk/N from x_B toward y_B. In a fin’s own coordinates, x runs aft from the root leading edge, the span h runs outward from the body surface (radius R_b + h), and the thickness coordinate τ is normal to the fin plane. Planform definitions follow S. Niskanen, OpenRocket technical documentation v13.05, §3.2.2, pp. 25–29: a trapezoidal fin has root chord c_r, tip chord c_t parallel to the body, span s, and sweep x_t, the axial distance from the root leading edge to the tip leading edge; an elliptical fin has chord c(h) = c_r √(1 − (h/s)²) centered on the root chord; a freeform fin is a polygon.

Mass. Each fin is a plate whose local thickness varies along each chord with the cross-section. At span h, a chord from a to b (length c) contributes the moments M_k = ∫ x^k t(x) dx and T = ∫ t(x)³/12 dx:

square:   t(x) = t
rounded:  semicircular leading and trailing edges of radius a_r = min(t, c)/2
airfoil:  t(x) = 10 t P(ξ),  P = 0.2969√ξ − 0.1260ξ − 0.3516ξ² + 0.2843ξ³ − 0.1015ξ⁴

The airfoil is the NACA four-digit symmetric thickness distribution (I. H. Abbott and A. E. von Doenhoff, Theory of Wing Sections, Dover, 1959, eq. 6.2) with its maximum thickness, 1.0003 t at ξ = 0.2998, scaled to the fin thickness. OpenRocket’s documentation uses the cross-section only for drag (§3.4.4, pp. 49–50); hpr-design also counts the volume it removes. The fin’s moments about the fin-set frame are then

m = ρ ∫ M_0 dh,  ∫ r dm = ρ ∫ (R_b + h) M_0 dh,  ∫ r² dm = ρ ∫ (R_b + h)² M_0 dh,
∫ x dm = ρ ∫ M_1 dh,  ∫ x² dm = ρ ∫ M_2 dh,  ∫ r x dm = ρ ∫ (R_b + h) M_1 dh,  ∫ τ² dm = ρ ∫ T dh

and with the fin at φ = 0 (points at (r, τ, −x) in body axes)

I_xx = ∫(τ² + x²) dm,  I_yy = ∫(r² + x²) dm,  I_zz = ∫(r² + τ²) dm,  I_xz = ∫ r x dm,  I_xy = I_yz = 0

about the origin. A tab is a square-section slab below the root (−h_tab ≤ h ≤ 0). The flat root is taken to sit on the body at radius R_b; the sliver between a flat root and the curved tube, t²/8R_b deep, is ignored. On a nose cone or a transition the surface is not level along the root: R_b is the body’s radius at the root leading edge, h is measured from it, and a freeform fin’s root runs through its root points on the surface (OpenRocket’s reading of a fin on a nose cone, ADR-166). Cant δ turns each fin (with its tab) by δ about its own outward span axis through the root mid-chord, right-handed, so a positive cant turns fin 0’s leading edge toward −y_B. See docs/physics/mass.md.

Fillets. A fillet of radius r runs the root chord c_r on each face of each fin. Its section is the region between the fin’s mid-plane, the body’s circle of radius R_b, and a circle of radius r tangent to both: OpenRocket 24.12’s reading, which leaves the fin’s thickness out. Its mass and center of mass match OpenRocket’s to 1e-15 on nine probe designs (ADR-096, the decision on fillets). With the fillet circle’s center at (c, r), c = √(R_b² + 2 R_b r) and θ = atan(r / c), the section is the triangle (0, 0), (c, 0), (c, r) less the body’s sector of angle θ and the fillet’s of π/2 − θ:

A = c r / 2 − R_b² θ / 2 − r² (π/2 − θ) / 2

which tends to r² (1 − π/4) on a flat body. Its moments come the same way, and the fillets are a prism of that section along the root, in the fillet’s own material.

Structs§

FinFillet
Fillets along each fin’s root: a concave joint on both faces, running the root chord.
FinSet
A set of identical fins spaced evenly around the body.
FinTab
A rectangular tab below a fin’s root, reaching into the body.
PlanformGeometry
Area and centroid of a planform.
TubeFinSet
Tube fins: open tubes parallel to the body, touching it, spaced evenly around it.

Enums§

FinCrossSection
The shape of a fin’s section along its chord.
FinPlanform
The outline of one fin.

Constants§

FILLET_RATIO_MAX
The widest fin fillet weighed, as a multiple of the body radius (FinSet::single_fin).