Balloon filling for smore-002

Published

November 6, 2025

Filling Calculations

Define basic balloon parameters

free_lift = 5.0u"g" # grams
balloon_weight = 38.0u"g" # gram
balloon_volume = 0.15u"m^3" # m^3
payload_weight = 16.7u"g" # gram
gas = "helium 97%"

# compare 1 and 2 balloons
balloon_1 = Balloon(balloon_weight, balloon_volume)
balloon_2 = balloon_1 * 2
Balloon(0.076 kg, 0.3 m³)

Look at options as a function of free lift

free_lifts = collect(0.0:1.0:10.0)u"g"
bss1 = BalloonSystem(balloon_1, payload_weight, free_lifts, gas)
bss2 = BalloonSystem(balloon_2, payload_weight, free_lifts, gas)
BalloonSystem(Balloon(0.076 kg, 0.3 m³), 0.0167 kg, Quantity{Float64, Dimensions{FRInt32}}[0.0 kg, 0.001 kg, 0.002 kg, 0.003 kg, 0.004 kg, 0.005 kg, 0.006 kg, 0.007 kg, 0.008 kg, 0.009000000000000001 kg, 0.01 kg], "helium 97%", 0.201 m⁻³ kg, 1.2247 m⁻³ kg, Quantity{Float64, Dimensions{FRInt32}}[0.0167 kg, 0.0177 kg, 0.0187 kg, 0.0197 kg, 0.0207 kg, 0.0217 kg, 0.022699999999999998 kg, 0.0237 kg, 0.0247 kg, 0.0257 kg, 0.0267 kg], Quantity{Float64, Dimensions{FRInt32}}[0.09055387320504056 m³, 0.09153072189117907 m³, 0.0925075705773176 m³, 0.0934844192634561 m³, 0.09446126794959461 m³, 0.09543811663573314 m³, 0.09641496532187166 m³, 0.09739181400801017 m³, 0.09836866269414869 m³, 0.0993455113802872 m³, 0.10032236006642573 m³], Quantity{Float64, Dimensions{FRInt32}}[0.018201328514213154 kg, 0.018397675100126996 kg, 0.018594021686040837 kg, 0.01879036827195468 kg, 0.018986714857868518 kg, 0.019183061443782363 kg, 0.019379408029696205 kg, 0.019575754615610046 kg, 0.019772101201523888 kg, 0.01996844778743773 kg, 0.02016479437335157 kg], Quantity{Float64, Dimensions{FRInt32}}[0.11090132851421315 kg, 0.111097675100127 kg, 0.11129402168604083 kg, 0.11149036827195467 kg, 0.11168671485786852 kg, 0.11188306144378236 kg, 0.11207940802969621 kg, 0.11227575461561004 kg, 0.11247210120152389 kg, 0.11266844778743773 kg, 0.11286479437335156 kg], Quantity{Float64, Dimensions{FRInt32}}[0.36967109504737716 m⁻³ kg, 0.37032558366709 m⁻³ kg, 0.3709800722868028 m⁻³ kg, 0.3716345609065156 m⁻³ kg, 0.37228904952622843 m⁻³ kg, 0.3729435381459412 m⁻³ kg, 0.37359802676565407 m⁻³ kg, 0.3742525153853668 m⁻³ kg, 0.37490700400507965 m⁻³ kg, 0.37556149262479244 m⁻³ kg, 0.3762159812445052 m⁻³ kg], Quantity{Float64, Dimensions{FRInt32}}[0.0 , 0.00900108844850937 , 0.01797041718594712 , 0.02690815400916249 , 0.0358144655350492 , 0.04468951721089916 , 0.05353347332464728 , 0.06234649701500886 , 0.07112875028151076 , 0.07988039399441767 , 0.0886015879045547 ], Quantity{Float64, Dimensions{FRInt32}}[217.4270575927123 K, 217.51743272339178 K, 217.60780785407127 K, 217.69818298475076 K, 217.78717726436642 K, 217.8775523950459 K, 217.9679275257254 K, 218.05692180534106 K, 218.1462699165201 K, 218.23611431531046 K, 218.32528549525188 K], Quantity{Float64, Dimensions{FRInt32}}[10903.380956438785 m, 10889.45566665766 m, 10875.530376876537 m, 10861.605087095413 m, 10847.892563271736 m, 10833.967273490613 m, 10820.041983709487 m, 10806.329459885812 m, 10792.56241656084 m, 10778.718903650157 m, 10764.979122457335 m], Quantity{Float64, Dimensions{FRInt32}}[23054.82855682038 m⁻¹ kg s⁻², 23104.959600032427 m⁻¹ kg s⁻², 23155.537605556816 m⁻¹ kg s⁻², 23206.221686456513 m⁻¹ kg s⁻², 23256.586772221748 m⁻¹ kg s⁻², 23306.717815433796 m⁻¹ kg s⁻², 23357.844660274895 m⁻¹ kg s⁻², 23408.213944411073 m⁻¹ kg s⁻², 23458.519058724887 m⁻¹ kg s⁻², 23509.611946859433 m⁻¹ kg s⁻², 23559.57724690786 m⁻¹ kg s⁻²], Quantity{Float64, Dimensions{FRInt32}}[23077.95665313947 m⁻¹ kg s⁻², 23336.60579829076 m⁻¹ kg s⁻², 23595.46190179738 m⁻¹ kg s⁻², 23854.524963659314 m⁻¹ kg s⁻², 24113.642094488157 m⁻¹ kg s⁻², 24373.117491991583 m⁻¹ kg s⁻², 24632.79984785033 m⁻¹ kg s⁻², 24892.53152946848 m⁻¹ kg s⁻², 25152.507804476834 m⁻¹ kg s⁻², 25412.7464767353 m⁻¹ kg s⁻², 25673.111727428302 m⁻¹ kg s⁻²], Quantity{Float64, Dimensions{FRInt32}}[23.128096319091128 m⁻¹ kg s⁻², 231.64619825833142 m⁻¹ kg s⁻², 439.9242962405624 m⁻¹ kg s⁻², 648.3032772028018 m⁻¹ kg s⁻², 857.0553222664093 m⁻¹ kg s⁻², 1066.3996765577867 m⁻¹ kg s⁻², 1274.9551875754332 m⁻¹ kg s⁻², 1484.317585057408 m⁻¹ kg s⁻², 1693.9887457519471 m⁻¹ kg s⁻², 1903.1345298758679 m⁻¹ kg s⁻², 2113.534480520444 m⁻¹ kg s⁻²], Quantity{Float64, Dimensions{FRInt32}}[0.0 m⁻¹ kg s⁻², 207.96978495912754 m⁻¹ kg s⁻², 416.11467093674304 m⁻¹ kg s⁻², 624.4365871099384 m⁻¹ kg s⁻², 832.922225416617 m⁻¹ kg s⁻², 1041.5659669423987 m⁻¹ kg s⁻², 1250.426554042081 m⁻¹ kg s⁻², 1459.4201408119138 m⁻¹ kg s⁻², 1668.5751441021034 m⁻¹ kg s⁻², 1877.9570649710001 m⁻¹ kg s⁻², 2087.4159544360537 m⁻¹ kg s⁻²], Quantity{Float64, Dimensions{FRInt32}}[10891.11196102824 m, 10806.533633395324 m, 10722.642303118218 m, 10639.425457411626 m, 10556.872668108195 m, 10474.969829524922 m, 10393.705592654165 m, 10313.06880790737 m, 10233.048521328114 m, 10153.63397088381 m, 10074.814582834082 m])

Free lift is the excess lift due to the super-pressure of the balloon.

Code
plot(
    ustrip(u"g",free_lifts),
    ustrip(us"ft",bss1.float_altitude)/1000.,
    label="One Balloon",
    title="Altitude vs. free lift",
    xlabel="Free lift [grams]",
    ylabel="Float altitude [kft]",
)
plot!(ustrip(u"g",free_lifts),
      ustrip(us"ft",bss2.float_altitude)/1000.,
      label="Two balloons",
)
Figure 1: Float altitude vs. free lift

Neck lift if the amount of lift that’s used to fill a balloon. For a two balloon system, this is the total, so divide by two to get the amount for each balloon.

Code
plot(
    ustrip(u"g",bss1.neck_lift),
    ustrip(us"ft",bss1.float_altitude)/1000.,
    label="One Balloon",
    title="Altitude vs. neck lift",
    xlabel="Neck lift [grams]",
    ylabel="Float altitude [kft]",
)
plot!(ustrip(u"g",bss2.neck_lift),
      ustrip(us"ft",bss2.float_altitude)/1000.,
      label="Two balloons",
)
Figure 2: Float altitude vs. neck lift

Generally, more free lift means that there is extra gas and the balloon will stay aloft longer as the gas slowly leaks or diffuses out.

For this launch, there will be two balloons carrying the payload. A free lift of 5 grams means a neck lift of 22 grams total or 11 grams per balloon.

This should provide a float altitude of about 35kft.

Float reality

In reality the ballon as settled on a float of about 6500 meters or about 20kft. The balloon has held float for 5 days (so far so good, fingers crossed) so there’s likely not a leak causing an issue.

The gas I used was Target party gas or unknown quality. The question is, can I back out the effetive density of the Target party gas?

The following Julia code inerts the float calculations using a known altitude to find the gas density

gas = "helium 97%"

bs1 = BalloonSystem(balloon_1, payload_weight, free_lift, gas)
bs2 = BalloonSystem(balloon_2, payload_weight, free_lift, gas)

float_altitude = 6400.0u"m"
system_density = PicoBalloons.atmos_density(6400u"m")
total_mass = system_density * balloon_2.volume
lift_gas_mass = total_mass - payload_weight - balloon_2.weight
lift_gas_density = lift_gas_mass * PicoBalloons.gas_density("air")/(bs2.neck_lift + balloon_2.weight + lift_gas_mass)
println(lift_gas_density)
# = 0.6102020876451465 m⁻³ kg
0.6102020876451465 m⁻³ kg

And then as a cross check, use this density and work the calculations forward again.

## work this answer forward again to verify the float altitude
gas = "helium party"

bs1 = BalloonSystem(balloon_1, payload_weight, free_lift, gas)
bs2 = BalloonSystem(balloon_2, payload_weight, free_lift, gas)
println(bs2)
# Weight: 0.076 kg
# Volume: 0.3 m³
# Neck lift                         21.7 g
# Gas fill at launch                0.15899158977708827 m³
# Gas mass                          97.017 g
# Total mass                        189.71699999999996 g
# System density                    0.6323899999999999 m⁻³ kg
# Temperature at float              246.65399999999997 K
# Pressure at float                 44.74199999999999 kPa
# Float altitude                    6400.000000000002 m
# Internal pressure                 45.9662472246834 kPa
# Differential pressure             1.2242472246834077 kPa
# Super pressure                    1.1791774063473488 kPa
# Super pressure onset altitude     6153.065084031026 m
Weight: 0.076 kg
Volume: 0.3 m³
Neck lift                         21.7 g
Gas fill at launch                0.15899158977708827 m³
Gas mass                          97.017 g
Total mass                        189.71699999999996 g
System density                    0.6323899999999999 m⁻³ kg
Temperature at float              246.65399999999997 K
Pressure at float                 44.74199999999999 kPa
Float altitude                    6400.000000000002 m
Internal pressure                 45.9662472246834 kPa
Differential pressure             1.2242472246834077 kPa
Super pressure                    1.1791774063473488 kPa
Super pressure onset altitude     6153.065084031026 m

Which is consistent. Also note that my balloon volumes are derived by measuring an inflated balloon with a tape measure adding a potential source of uncertainty.

Now we can calculate the percentage of helium in the party gas based on the density.

For two ideal gasses the mixed density is \[\begin{equation} \rho_{mix} = \frac{\rho_1 v_1 + \rho_2 v_2}{v_1 + v_2} \end{equation}\] where \(\rho_i\) is the density of each gas and \(v_i\) is the volume occupied by each gas. This can be manipulated to get a volume fraction for one of the gasses \[\begin{equation} \frac{v_1}{v_{mix}} = \frac{\rho_{mix} - \rho_2}{\rho_1 - \rho_2} \end{equation}\] and we can put in some numbers for the density we have found as well as air and pure helium

rho_he = 0.1693u"kg/m^3"
rho_air = 1.2247u"kg/m^3"
rho_mix = lift_gas_density

helium_volume_fraction = (rho_mix - rho_air)/(rho_he - rho_air)

print(helium_volume_fraction)
0.5822417210108523