欢迎光临
我们一直在努力

RocketPy 处理流程全解析:从初始化到仿真分析的完整文字流程图

RocketPy 作为一个专业的开源火箭轨迹仿真工具,其处理流程遵循严格的工程逻辑和物理建模顺序。根据官方文档,整个仿真过程围绕四个核心类展开:Environment(环境)、Motor(发动机)、Rocket(火箭)和 Flight(飞行仿真)。以下是完整的处理流程文字流程图,涵盖了从初始化到结果分析的所有关键步骤。

一、总体仿真流程架构

开始仿真

初始化阶段
├── 创建环境对象 (Environment)
├── 创建发动机对象 (Motor)
└── 创建火箭对象 (Rocket)

配置阶段
├── 配置火箭气动特性
├── 配置降落伞系统
├── 配置传感器(可选)
└── 配置其他子系统

仿真执行阶段
├── 创建飞行对象 (Flight)
├── 自动运行仿真
└── 处理飞行事件

后处理阶段
├── 数据提取与分析
├── 可视化绘图
└── 结果导出

仿真结束

二、详细处理流程分解

阶段1:环境初始化与配置

1.1 导入必要模块
from rocketpy import Environment, SolidMotor, Rocket, Flight

1.2 创建环境对象
Env = Environment(
railLength=5.2, # 导轨长度 [m]
latitude=32.990254, # 发射场纬度 [°]
longitude=-106.974998, # 发射场经度 [°]
elevation=1400 # 发射场海拔 [m]
)

1.3 设置仿真日期和时间
import datetime
tomorrow = datetime.date.today() + datetime.timedelta(days=1)
Env.setDate((tomorrow.year, tomorrow.month, tomorrow.day, 12))

1.4 选择大气模型
┌─ 选项1:标准大气模型
│ Env.setAtmosphericModel(type="StandardAtmosphere")

├─ 选项2:天气预报数据(GFS)
│ Env.setAtmosphericModel(type="Forecast", file="GFS")

└─ 选项3:自定义气象文件
Env.setAtmosphericModel(type="CustomAtmosphere", file="custom_data.csv")

1.5 配置风场模型(可选)
Env.setWindModel(
type="WindGradient", # 风梯度模型
windSpeed=10, # 风速 [m/s]
windDirection=270, # 风向 [°]
windGradient=0.1 # 风梯度 [1/s]
)

阶段2:发动机配置

2.1 选择发动机类型
┌─ 固体发动机 (SolidMotor)
│ Pro75M1670 = SolidMotor(
│ thrustSource="data/motors/Cesaroni_M1670.eng",
│ burnOut=3.9,
│ grainNumber=5,
│ grainDensity=1815,
│ grainOuterRadius=33/1000,
│ grainInitialInnerRadius=15/1000,
│ grainInitialHeight=120/1000,
│ nozzleRadius=33/1000
│ )

├─ 混合动力发动机 (HybridMotor)
│ Hybrid = HybridMotor(…)

└─ 液体发动机 (LiquidMotor)
Liquid = LiquidMotor(…)

2.2 配置发动机参数
├── 推力曲线处理
│ ├── 从.eng文件读取
│ ├── 从.csv文件读取
│ └── 自定义推力函数

├── 推进剂特性
│ ├── 药柱几何参数
│ ├── 推进剂密度
│ └── 燃速特性

└── 喷管参数
├── 喷管半径
├── 喉部半径
└── 膨胀比

阶段3:火箭配置

3.1 创建火箭基础对象
Calisto = Rocket(
motor=Pro75M1670, # 发动机对象
radius=127/2000, # 火箭半径 [m]
mass=19.197-2.956, # 干质量 [kg]
inertiaI=6.60, # 横向惯性矩 [kg·m²]
inertiaZ=0.0351, # 轴向惯性矩 [kg·m²]
distanceRocketNozzle=-1.255, # 喷管到参考点距离 [m]
distanceRocketPropellant=-0.85704, # 推进剂质心到参考点距离 [m]
powerOffDrag="data/calisto/powerOffDragCurve.csv",
powerOnDrag="data/calisto/powerOnDragCurve.csv"
)

3.2 配置导轨约束
Calisto.setRailButtons([0.2, -0.5]) # 导轨按钮位置 [m]

3.3 添加气动表面
├── 头锥 (Nose Cone)
│ NoseCone = Calisto.addNose(
│ length=0.55829,
│ kind="vonKarman",
│ distanceToCM=0.71971
│ )

├── 翼面 (Fin Set)
│ FinSet = Calisto.addFins(
│ n=4, # 翼片数量
│ span=0.100, # 翼展 [m]
│ rootChord=0.120, # 根弦长 [m]
│ tipChord=0.040, # 尖弦长 [m]
│ distanceToCM=-1.04956 # 到质心距离 [m]
│ )

└── 尾段 (Tail)
Tail = Calisto.addTail(
topRadius=0.0635,
bottomRadius=0.0435,
length=0.060,
distanceToCM=-1.194656
)

3.4 配置降落伞系统
├── 定义触发函数
│ def drogueTrigger(p, y):
│ # p = 压力, y = 状态向量
│ return True if y[5] < 0 else False # 当垂直速度<0时触发

│ def mainTrigger(p, y):
│ return True if y[5] < 0 and y[2] < 800+1400 else False

├── 添加减速伞
│ Drogue = Calisto.addParachute(
│ "Drogue",
│ CdS=1.0, # 阻力面积系数
│ trigger=drogueTrigger,
│ samplingRate=105, # 采样率 [Hz]
│ lag=1.5, # 开伞延迟 [s]
│ noise=(0, 8.3, 0.5) # 噪声参数
│ )

└── 添加主伞
Main = Calisto.addParachute(
"Main",
CdS=10.0,
trigger=mainTrigger,
samplingRate=105,
lag=1.5,
noise=(0, 8.3, 0.5)
)

3.5 添加传感器(可选)
Calisto.addSensor(
name="Accelerometer",
sensor_type="accelerometer",
position=[0, 0, 0], # 安装位置 [m]
sampling_rate=1000 # 采样率 [Hz]
)

阶段4:飞行仿真执行

4.1 创建飞行对象(自动触发仿真)
TestFlight = Flight(
rocket=Calisto, # 火箭对象
environment=Env, # 环境对象
railLength=5.2, # 导轨长度 [m]
inclination=85, # 发射仰角 [°]
heading=0, # 发射方位角 [°]
max_time=600, # 最大仿真时间 [s]
rtol=1e-3, # 相对误差容限
atol=[1e-3]*6 + [1e-6]*4 + [1e-3]*3, # 绝对误差容限
verbose=True # 详细输出模式
)

4.2 内部仿真流程(Flight.__simulate()方法)
┌─ 4.2.1 初始化阶段
│ ├── 验证输入参数
│ ├── 设置初始条件
│ │ ├── 位置: [0, 0, 0]
│ │ ├── 速度: [0, 0, 0]
│ │ ├── 姿态四元数: 根据inclination和heading计算
│ │ └── 角速度: [0, 0, 0]
│ │
│ └── 配置数值积分器
│ ├── 选择ODE求解器 (LSODA/RK45/DOP853等)
│ ├── 设置误差容限
│ └── 配置最大/最小时间步长

├─ 4.2.2 导轨约束阶段处理
│ ├── 使用1自由度运动方程
│ ├── 约束火箭沿导轨方向运动
│ ├── 固定火箭姿态
│ └── 计算导轨反作用力

├─ 4.2.3 自由飞行阶段处理
│ ├── 切换为6自由度运动方程
│ ├── 计算时变质量特性
│ │ ├── 推进剂质量消耗
│ │ ├── 质心位置变化
│ │ └── 惯性张量变化
│ │
│ ├── 计算作用力和力矩
│ │ ├── 推力计算
│ │ ├── 气动力计算
│ │ │ ├── 轴向力(阻力)
│ │ │ ├── 法向力(升力)
│ │ │ └── 气动力矩
│ │ ├── 重力计算
│ │ └── 科里奥利力(考虑地球自转)
│ │
│ ├── 求解运动方程
│ │ ├── 平移运动: m·a = ΣF
│ │ ├── 旋转运动: I·α + ω×(I·ω) = ΣM
│ │ └── 姿态运动: 四元数微分方程
│ │
│ └── 数值积分推进
│ ├── 自适应步长控制
│ ├── 误差估计与调整
│ └── 状态变量更新

├─ 4.2.4 事件检测与处理
│ ├── 发动机关机检测
│ │ └── 当推进剂耗尽或达到burnOut时间时
│ │
│ ├── 开伞事件检测
│ │ ├── 定期检查触发条件
│ │ ├── 执行开伞动力学
│ │ └── 更新气动特性
│ │
│ ├── 多级分离检测(如适用)
│ │ ├── 分离条件判断
│ │ ├── 质量特性更新
│ │ └── 运动状态初始化
│ │
│ └── 终止条件检查
│ ├── 达到最大仿真时间
│ ├── 火箭落地(高度≤0)
│ └── 用户定义终止条件

└─ 4.2.5 数据记录与存储
├── 状态变量记录
│ ├── 时间序列
│ ├── 位置/速度/加速度
│ ├── 姿态四元数/角速度
│ └── 质量特性

├── 气动参数记录
│ ├── 攻角/侧滑角
│ ├── 马赫数/雷诺数
│ ├── 气动系数
│ └── 动压

├── 性能参数记录
│ ├── 过载系数
│ ├── 动压
│ ├── 热流密度
│ └── 稳定性余量

└── 事件时间记录
├── 离轨时间
├── 最大动压时间
├── 发动机关机时间
├── 开伞时间
└── 落地时间

阶段5:后处理与结果分析

5.1 基本信息查看
TestFlight.info() # 显示飞行摘要信息
TestFlight.allInfo() # 显示完整飞行信息

5.2 数据访问与提取
├── 直接属性访问
│ ├── TestFlight.x # X位置随时间变化
│ ├── TestFlight.y # Y位置随时间变化
│ ├── TestFlight.z # Z位置(高度)随时间变化
│ ├── TestFlight.vx # X方向速度
│ ├── TestFlight.vy # Y方向速度
│ ├── TestFlight.vz # Z方向速度
│ ├── TestFlight.ax # X方向加速度
│ ├── TestFlight.ay # Y方向加速度
│ └── TestFlight.az # Z方向加速度

├── 气动参数访问
│ ├── TestFlight.alpha # 攻角
│ ├── TestFlight.beta # 侧滑角
│ ├── TestFlight.Mach # 马赫数
│ └── TestFlight.dynamicPressure # 动压

└── 性能参数访问
├── TestFlight.apogee # 最大高度
├── TestFlight.maxVelocity # 最大速度
├── TestFlight.maxAcceleration # 最大加速度
└── TestFlight.stabilityMargin # 稳定性余量

5.3 可视化分析
├── 轨迹可视化
│ ├── TestFlight.plotTrajectory3D() # 3D轨迹图
│ ├── TestFlight.plot2DTrajectory() # 2D轨迹投影
│ └── TestFlight.earthPlot() # 地球投影轨迹

├── 运动参数图
│ ├── TestFlight.plotLinearKinematics() # 线运动参数
│ ├── TestFlight.plotAngularKinematics() # 角运动参数
│ └── TestFlight.plotAttitude() # 姿态变化

├── 气动参数图
│ ├── TestFlight.plotAerodynamicCoefficients() # 气动系数
│ ├── TestFlight.plotAngleOfAttack() # 攻角变化
│ └── TestFlight.plotDragForce() # 阻力变化

├── 质量特性图
│ ├── TestFlight.plotMass() # 质量变化
│ └── TestFlight.plotCenterOfMass() # 质心位置变化

└── 能量分析图
├── TestFlight.plotEnergy() # 能量变化
└── TestFlight.plotThrustCurve() # 推力曲线

5.4 数据导出
├── 导出为CSV文件
│ TestFlight.exportData("flight_data.csv")

├── 导出为KML文件(Google Earth)
│ TestFlight.exportKML("trajectory.kml")

└── 导出为JSON文件
TestFlight.exportJSON("flight_data.json")

5.5 高级分析功能
├── 蒙特卡洛分析
│ ├── 定义参数分布
│ ├── 运行多次仿真
│ ├── 统计结果分布
│ └── 生成散布图

├── 灵敏度分析
│ ├── 参数扰动分析
│ ├── 输出响应面
│ └── 识别关键参数

└── 优化分析
├── 定义目标函数
├── 设置约束条件
├── 运行优化算法
└── 获取最优设计

阶段6:特殊仿真模式

6.1 3自由度简化仿真
Flight3DOF = Flight(
rocket=Calisto,
environment=Env,
railLength=5.2,
inclination=85,
heading=0,
equations_of_motion="3DOF" # 使用3自由度模型
)

6.2 多级火箭仿真
├── 定义各级火箭
│ Stage1 = Rocket(…)
│ Stage2 = Rocket(…)

├── 配置分离机制
│ separation_trigger = lambda t, y: t > 60 # 60秒后分离

└── 运行多级仿真
MultiStageFlight = Flight(
rocket=[Stage1, Stage2], # 火箭列表
environment=Env,
separation_triggers=[separation_trigger],

)

6.3 带控制系统的仿真
├── 定义控制律
│ def control_law(t, state):
│ # 基于状态反馈计算控制指令
│ return control_input

├── 添加执行器模型
│ Calisto.addActuator(
│ name="TVCFins",
│ actuator_type="fins",
│ position=[0, 0, -1.0],
│ max_deflection=15, # 最大偏转角 [°]
│ response_time=0.05 # 响应时间 [s]
│ )

└── 运行闭环仿真
ControlledFlight = Flight(
rocket=Calisto,
environment=Env,
controller=control_law,

)

三、核心算法流程细节

3.1 数值积分主循环(Flight.__simulate()内部)

初始化时间 t = 0
初始化状态向量 y = y0
设置积分器参数 (rtol, atol, max_step, min_step)

while t < t_max 且未达到终止条件:
# 1. 计算当前环境参数
密度 = atmosphere.density(高度)
压力 = atmosphere.pressure(高度)
温度 = atmosphere.temperature(高度)
风速 = wind_model.get_wind(位置)

# 2. 计算火箭当前状态
质量 = rocket.total_mass(t)
质心 = rocket.center_of_mass(t)
惯性张量 = rocket.inertia_tensor(t)

# 3. 计算作用力和力矩
# 3.1 推力
推力 = motor.thrust(t, 环境压力)
推力力矩 = cross(推力向量, 推力作用点到质心的向量)

# 3.2 气动力
相对风速 = 风速 – 火箭速度
攻角, 侧滑角 = calculate_aerodynamic_angles(相对风速, 火箭姿态)
气动力系数 = aero_surface.calculate_coefficients(攻角, 侧滑角, 马赫数)
气动力 = 0.5 * 密度 * 速度^2 * 参考面积 * 气动力系数
气动力矩 = 气动力 * 压力中心到质心的距离

# 3.3 重力
重力 = 质量 * gravity_model.g(高度)

# 3.4 科里奥利力(考虑地球自转)
科里奥利力 = -2 * 地球自转角速度 × 火箭速度

# 4. 计算状态导数 (dy/dt)
if 在导轨上:
dy/dt = u_dot_rail(t, y) # 1自由度运动
else:
dy/dt = u_dot_generalized(t, y) # 6自由度运动

# 5. 数值积分一步
y_new = integrator.step(t, y, dy/dt, dt)

# 6. 检查事件触发
for 事件 in 事件列表:
if 事件.触发条件(t, y_new):
事件.处理()
# 可能修改运动方程或火箭参数

# 7. 更新状态和时间
y = y_new
t = t + dt

# 8. 记录数据
记录状态(t, y)
记录气动参数(t, 攻角, 侧滑角, 马赫数, …)
记录性能参数(t, 过载, 动压, …)

# 9. 自适应步长调整
dt = integrator.estimate_next_step_size(误差估计)

结束循环

3.2 气动力计算流程

输入: 火箭状态 (位置, 速度, 姿态, 角速度), 环境参数

1. 计算相对风速
风速向量 = wind_model.get_wind(位置)
相对风速 = 风速向量 – 火箭速度向量

2. 计算气动角
攻角 = arctan2(相对风速垂直分量, 相对风速轴向分量)
侧滑角 = arcsin(相对风速侧向分量 / |相对风速|)

3. 计算无量纲参数
马赫数 = |相对风速| / 声速
雷诺数 = 密度 * |相对风速| * 特征长度 / 粘度

4. 对各气动表面循环:
for 表面 in 火箭.气动表面列表:
# 4.1 计算局部攻角(考虑下洗和干扰)
局部攻角 = 攻角 + 表面.诱导攻角修正

# 4.2 获取气动系数
if 表面.气动模型 == "线性":
Cl = Cl_alpha * 局部攻角
Cd = Cd0 + Cd_alpha * 局部攻角^2
elif 表面.气动模型 == "查表":
Cl = 插值(表面.升力系数表, 马赫数, 局部攻角)
Cd = 插值(表面.阻力系数表, 马赫数, 局部攻角)
elif 表面.气动模型 == "Barrowman":
Cl = barrowman_method(表面几何, 马赫数, 局部攻角)

# 4.3 计算力和力矩
动压 = 0.5 * 密度 * |相对风速|^2
法向力 = Cl * 动压 * 表面.参考面积
轴向力 = Cd * 动压 * 表面.参考面积

# 转换到体坐标系
表面力 = 转换矩阵 * [轴向力, 法向力, 0]
表面力矩 = cross(表面.压力中心位置, 表面力)

# 累加到总力和总力矩
总气动力 += 表面力
总气动力矩 += 表面力矩

5. 计算体轴阻力(非升力面部分)
体轴阻力系数 = rocket.get_body_drag_coefficient(马赫数)
体轴阻力 = 体轴阻力系数 * 动压 * rocket.参考横截面积
总气动力 += [0, 0, -体轴阻力] # 在体轴系中

返回: 总气动力, 总气动力矩

四、关键配置参数与默认值

4.1 数值积分器参数

积分器类型: 'LSODA' (自动在刚性/非刚性方法间切换)
相对容差 (rtol): 1e-3
绝对容差 (atol): [1e-3, 1e-3, 1e-3, 1e-3, 1e-3, 1e-3, # 位置/速度
1e-6, 1e-6, 1e-6, 1e-6, # 四元数
1e-3, 1e-3, 1e-3] # 角速度
最大时间步长: 0.01秒
最小时间步长: 1e-6秒
最大仿真时间: 600秒

4.2 物理模型选项

重力模型: WGS84椭球地球模型
大气模型: 国际标准大气(1976) 或 GFS天气预报
风场模型: 指数风剖面 或 实测风数据
气动模型: Barrowman理论(默认)或 自定义气动系数
发动机模型: 固体/混合/液体发动机
降落伞模型: 稳态阻力模型 或 动态充气模型

五、调试与验证流程

5.1 完整性检查

1. 单位一致性检查
├── 所有输入参数单位转换为SI制
├── 内部计算使用一致单位
└── 输出结果单位明确标注

2. 物理合理性检查
├── 质量守恒验证
├── 能量守恒验证
├── 动量守恒验证
└── 角动量守恒验证

3. 数值稳定性检查
├── 时间步长自适应检查
├── 误差增长监控
└── 奇异值检测

5.2 验证测试

1. 基准测试
├── 与已知解析解对比
├── 与商业软件(如STK)对比
└── 与实验数据对比

2. 敏感性分析
├── 参数扰动测试
├── 初始条件敏感性
└── 模型选择影响

3. 极限情况测试
├── 极端环境条件
├── 边界参数测试
└── 故障模式测试

六、扩展与自定义

6.1 自定义气动模型

class CustomAerodynamicModel(AeroSurface):
def __init__(self, custom_parameters):
super().__init__()
self.custom_params = custom_parameters

def calculate_force_and_moment(self, alpha, beta, mach, Re, angular_vel):
# 实现自定义气动力计算
# 可基于CFD数据、风洞数据或经验公式
pass

6.2 自定义控制律

def custom_control_law(t, state, rocket, environment):
"""自定义控制律函数"""
# state: [x, y, z, vx, vy, vz, e0, e1, e2, e3, omega1, omega2, omega3]
# 实现控制算法,返回控制指令
return control_input

6.3 自定义事件处理

class CustomEvent:
def __init__(self, trigger_condition, action):
self.trigger_condition = trigger_condition
self.action = action

def check(self, t, state):
return self.trigger_condition(t, state)

def execute(self, flight):
self.action(flight) # 修改飞行状态或参数

这个完整的处理流程展示了 RocketPy 从初始化到仿真分析的系统性工作方式。每个步骤都基于严格的物理模型和数值方法,确保了仿真结果的准确性和可靠性。用户可以根据具体需求调整配置参数、扩展物理模型或添加自定义功能,满足不同应用场景的需求。

 

赞(0)
未经允许不得转载:171主机测评 » RocketPy 处理流程全解析:从初始化到仿真分析的完整文字流程图
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址