记录一下jsbsim + python + tacview 仿真&可视化:F16起飞任务
import jsbsim
import matplotlib.pyplot as plt
sim = jsbsim.FGFDMExec(None)
sim.set_debug_level(0)
sim.load_model('f16')
sim['ic/h-sl-ft'] = 35000
sim['ic/vt-fps'] = 2500
sim['ic/psi-true-deg'] = 0
sim['ic/theta-deg'] = 95
sim['ic/lat-gc-deg'] = 41.62513
sim['ic/long-gc-deg'] = 41.59104
sim['ic/roc-fpm'] = 0
sim.run_ic()
sim['fcs/throttle-cmd-norm'] = 1.0
dt = sim.get_delta_t()
total_sim_time = 90
steps = int(total_sim_time / dt)
reference_time = "2011-06-02T05:00:00Z"
acmi_lines = ["FileType=text/acmi/tacview\n","FileVersion=2.2\n",f"0,ReferenceTime={reference_time}\n","0,Author=JSBSim2Tacview\n","0,Title=F16 Takeoff\n","0,RecordingTime=60\n","0,Comments=Generated from JSBSim\n","0,DataSource=JSBSim\n","0,DataRecorder=PythonScript\n","0,3000102,Type=Aircraft,Name=F16\n"
]
altitudes_m = []
time_sec = []
for step in range(steps):sim['fcs/elevator-cmd-norm'] = 0.2 sim.run()t = step * dtlat = sim["position/lat-gc-deg"]lon = sim["position/long-gc-deg"]alt_ft = sim["position/h-sl-ft"]alt_m = alt_ft * 0.3048heading = sim["attitude/psi-deg"]pitch = sim["attitude/theta-deg"]roll = sim["attitude/phi-deg"]acmi_lines.append(f"#{t:.2f}\n")acmi_lines.append(f"3000102,T={lat}|{lon}|{alt_m:.2f},Heading={heading:.2f},Pitch={pitch:.2f},Roll={roll:.2f},Name=F16\n")altitudes_m.append(alt_m)time_sec.append(t)
with open("F16_takeoff.acmi", "w") as f:f.writelines(acmi_lines)
plt.figure(figsize=(10, 6))
plt.plot(time_sec, altitudes_m, label="Altitude (m)", color="green")
plt.title("F16 Takeoff Altitude Curve")
plt.xlabel("Time (s)")
plt.ylabel("Altitude (m)")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()

导出用于 TacView 可视化的 “F16_takeoff.acmi” 文件,并在 TacView 中打开。
