在本文中,将详细介绍如何使用RocketPy这个创新的Python库来模拟火箭飞行。RocketPy是一个为模拟和分析高功率火箭飞行而设计的Python库。它提供了一个全面的套件,用于建模火箭组件,如固体火箭发动机、翼和降落伞,并模拟它们在发射和飞行期间的行为。RocketPy允许用户定义火箭参数,执行详细的模拟,并通过图表和数据导出可视化结果。对于想要以精确和便捷的方式理解和预测火箭性能的学生、工程师和爱好者来说,这是一个宝贵的资源。
通过本文的学习,将获得以下知识:
- 全面了解RocketPy库及其模拟火箭发射的能力。
- 学习如何定义和配置各种火箭组件,如固体火箭发动机、火箭主体、翼和降落伞。
- 执行火箭飞行模拟并理解如何解释结果。
- 使用绘图库如Matplotlib可视化模拟数据并执行傅里叶分析。
- 识别和解决模拟过程中可能出现的常见问题。
RocketPy是一个Python库,用于模拟和分析高功率火箭飞行。它提供了一个全面的套件,用于建模火箭组件,如固体火箭发动机、翼和降落伞,并模拟它们在发射和飞行期间的行为。使用RocketPy,用户可以定义火箭参数,执行详细的模拟,并通过图表和数据导出可视化结果。它是学生、工程师和爱好者理解和预测火箭性能的宝贵资源。
要开始模拟,需要下载必要的数据文件。执行以下命令以获取这些文件:
!pip install rocketpy
!curl -o NACA0012-radians.csv https://raw.githubusercontent.com/RocketPy-Team/RocketPy/master/data/calisto/NACA0012-radians.csv
!curl -o Cesaroni_M1670.eng https://raw.githubusercontent.com/RocketPy-Team/RocketPy/master/data/motors/Cesaroni_M1670.eng
!curl -o powerOffDragCurve.csv https://raw.githubusercontent.com/RocketPy-Team/RocketPy/master/data/calisto/powerOffDragCurve.csv
!curl -o powerOnDragCurve.csv https://raw.githubusercontent.com/RocketPy-Team/RocketPy/master/data/calisto/powerOnDragCurve.csv
首先,导入所需的库并设置环境。这涉及到定义位置和大气条件:
from rocketpy import Environment, SolidMotor, Rocket, Flight
import datetime
# 初始化环境
env = Environment(latitude=32.990254, longitude=-106.974998, elevation=1400)
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
env.set_date((tomorrow.year, tomorrow.month, tomorrow.day, 12))
env.set_atmospheric_model(type="Forecast", file="GFS")
env.info()
Environment类用于设置地理位置和大气条件。这些信息对于获得准确的模拟结果至关重要。
定义发动机参数,包括推力曲线、尺寸和物理属性:
Pro75M1670 = SolidMotor(
thrust_source="Cesaroni_M1670.eng",
dry_mass=1.815,
dry_inertia=(0.125, 0.125, 0.002),
nozzle_radius=33 / 1000,
grain_number=5,
grain_density=1815,
grain_outer_radius=33 / 1000,
grain_initial_inner_radius=15 / 1000,
grain_initial_height=120 / 1000,
grain_separation=5 / 1000,
grains_center_of_mass_position=0.397,
center_of_dry_mass_position=0.317,
nozzle_position=0,
burn_time=3.9,
throat_radius=11 / 1000,
coordinate_system_orientation="nozzle_to_combustion_chamber",
)
Pro75M1670.info()
SolidMotor类定义了发动机的物理属性和性能特征,这对于理解其对火箭飞行的贡献至关重要。
定义火箭的参数,包括其尺寸、组件和发动机集成:
calisto = Rocket(
radius=127 / 2000,
mass=14.426,
inertia=(6.321, 6.321, 0.034),
power_off_drag="powerOffDragCurve.csv",
power_on_drag="powerOnDragCurve.csv",
center_of_mass_without_motor=0,
coordinate_system_orientation="tail_to_nose",
)
calisto.set_rail_buttons(upper_button_position=0.0818, lower_button_position=-0.618, angular_position=45)
calisto.add_motor(Pro75M1670, position=-1.255)
calisto.add_nose(length=0.55829, kind="vonKarman", position=1.278)
calisto.add_trapezoidal_fins(n=4, root_chord=0.120, tip_chord=0.060, span=0.110, position=-1.04956, cant_angle=0.5, airfoil=("NACA0012-radians.csv", "radians"))
calisto.add_tail(top_radius=0.0635, bottom_radius=0.0435, length=0.060, position=-1.194656)
calisto.all_info()
Rocket类用于定义火箭的结构组件,如翼和鼻锥。这些组件的正确定义影响火箭的稳定性和空气动力学。
添加降落伞以确保火箭安全回收:
Main = calisto.add_parachute(
"Main",
cd_s=10.0,
trigger=800,
sampling_rate=105,
lag=1.5,
noise=(0, 8.3, 0.5),
)
Drogue = calisto.add_parachute(
"Drogue",
cd_s=1.0,
trigger="apogee",
sampling_rate=105,
lag=1.5,
noise=(0, 8.3, 0.5),
)
侧面降落伞在下降过程中减慢火箭速度至关重要。像阻力系数和部署条件这样的参数确保了安全着陆。
使用定义的火箭和环境运行飞行模拟:
test_flight = Flight(
rocket=calisto, environment=env, rail_length=5.2, inclination=85, heading=0
)
test_flight.all_info()
Flight类根据定义的参数模拟火箭的轨迹。它提供了关于飞行的详细信息。
将飞行轨迹导出为KML,以便在Google Earth等工具中可视化:
test_flight.export_kml(file_name="trajectory.kml", extrude=True, altitude_mode="relative_to_ground")
导出为KML允许可视化火箭的路径并分析其飞行特性。
进行进一步的分析并可视化结果:
from rocketpy.utilities import apogee_by_mass, liftoff_speed_by_mass
import numpy as np
import matplotlib.pyplot as plt
# 按质量绘制Apogee和Liftoff Speed
apogee_by_mass(flight=test_flight, min_mass=5, max_mass=20, points=10, plot=True)
liftoff_speed_by_mass(flight=test_flight, min_mass=5, max_mass=20, points=10, plot=True)
# 模拟并分析飞行的前5秒
flight = Flight(
rocket=calisto,
environment=env,
rail_length=5.2,
inclination=90,
heading=0,
max_time_step=0.01,
max_time=5,
)
# 执行傅里叶分析
Fs = 100.0
Ts = 1.0 / Fs
t = np.arange(1, 400, Ts) # 时间向量
y = flight.attitude_angle(t) - np.mean(flight.attitude_angle(t))
n = len(y) # 信号长度
k = np.arange(n)
T = n / Fs
frq = k / T # 两侧频率范围
frq = frq[range(n // 2)] # 单侧频率范围
Y = np.fft.fft(y) / n # fft计算和归一化
Y = Y[range(n // 2)]
# 创建图表
fig, ax = plt.subplots(2, 1)
ax[0].plot(t, y)
ax[0].set_xlabel("Time")
ax[0].set_ylabel("Signal")
ax[0].set_xlim((0, 5))
ax[0].grid()
ax[1].plot(frq, abs(Y), "r") # 绘制频谱
ax[1].set_xlabel("Freq (Hz)")
ax[1].set_ylabel("|Y(freq)|")
ax[1].set_xlim((0, 5))
ax[1].grid()
plt.subplots_adjust(hspace=0.5)
plt.show()
分析和绘图部分有助于通过可视化如按质量的Apogee、Liftoff Speed以及姿态角的傅里叶分析来理解火箭的性能和动态。
RocketPy提供了一个全面的系统,用于模拟和分析火箭飞行。通过遵循本文的指导,将能够设置模拟,分析结果,并成功地可视化数据。无论是专家还是新手,RocketPy都能帮助实现火箭技术目标。
本文提供了使用RocketPy进行火箭模拟的完整指南,从初始设置到结果分析。
- 读者将获得与Python代码片段的实践经验,使他们能够将理论知识应用于实际的火箭模拟中。
- 理解不同火箭组件的部件及其设置对于精确模拟和成功的火箭发射至关重要。
- 可视化模拟数据有助于更好地理解火箭的性能和轨迹,使复杂信息更易于获取。
- 本文解决了常见问题及其解决方案,并提供了高级学习和社区支持的额外资源。