本文整理汇总了Python中JSBSim_utils.CreateFDM.run方法的典型用法代码示例。如果您正苦于以下问题:Python CreateFDM.run方法的具体用法?Python CreateFDM.run怎么用?Python CreateFDM.run使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类JSBSim_utils.CreateFDM
的用法示例。
在下文中一共展示了CreateFDM.run方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: test_hold_down_with_gnd_reactions
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_hold_down_with_gnd_reactions(self):
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'c1721.xml'))
fdm.run_ic()
ExecuteUntil(fdm, 0.25)
fdm['forces/hold-down'] = 1.0
h0 = fdm['position/h-sl-ft']
pitch = fdm['attitude/pitch-rad']
roll = fdm['attitude/roll-rad']
heading = fdm['attitude/heading-true-rad']
while fdm['simulation/sim-time-sec'] < 2.0:
fdm.run()
self.assertAlmostEqual(fdm['accelerations/pdot-rad_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/qdot-rad_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/rdot-rad_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/udot-ft_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/vdot-ft_sec2'], 0.0)
self.assertAlmostEqual(fdm['accelerations/wdot-ft_sec2'], 0.0)
self.assertAlmostEqual(fdm['position/h-sl-ft'], h0, delta=1E-6)
self.assertAlmostEqual(fdm['attitude/pitch-rad'], pitch)
self.assertAlmostEqual(fdm['attitude/roll-rad'], roll)
self.assertAlmostEqual(fdm['attitude/heading-true-rad'], heading)
示例2: test_direct_steer
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_direct_steer(self):
fdm = CreateFDM(self.sandbox)
fdm.load_model('c172r')
aircraft_path = self.sandbox.path_to_jsbsim_file('aircraft')
fdm.load_ic(os.path.join(aircraft_path, 'c172r', 'reset00'), False)
fdm.run_ic()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 0.0)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 0.0)
# Should be part of a unit test in C++ ?
fpectl.turnon_sigfpe()
grndreact = fdm.get_ground_reactions()
for i in xrange(grndreact.get_num_gear_units()):
gear = grndreact.get_gear_unit(i)
self.assertEqual(gear.get_steer_norm(), 0.0)
fpectl.turnoff_sigfpe()
fdm['fcs/steer-pos-deg'] = 5.0
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 5.0)
fdm.run()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 0.0)
fdm['fcs/steer-cmd-norm'] = 1.0
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 1.0)
fdm.run()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 1.0)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 10.0)
示例3: test_pitot_angle
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_pitot_angle(self):
script_name = 'ball_chute.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
# Add a Pitot angle to the Cessna 172
tree, aircraft_name, path_to_jsbsim_aircrafts = CopyAircraftDef(script_path, self.sandbox)
root = tree.getroot()
pitot_angle_deg = 5.0
self.addPitotTube(root, 5.0)
contact_tag = root.find('./ground_reactions/contact')
contact_tag.attrib['type'] = 'STRUCTURE'
tree.write(self.sandbox('aircraft', aircraft_name,
aircraft_name+'.xml'))
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_model('ball')
pitot_angle = pitot_angle_deg * math.pi / 180.
weight = fdm['inertia/weight-lbs']
spring_tag = contact_tag.find('./spring_coeff')
spring_coeff = float(spring_tag.text)
print "Weight=%d Spring=%d" % (weight, spring_coeff)
fdm['ic/h-sl-ft'] = weight / spring_coeff
fdm['forces/hold-down'] = 1.0
fdm.run_ic()
ExecuteUntil(fdm, 10.)
for i in xrange(36):
for j in xrange(-9, 10):
angle = math.pi * i / 18.0
angle2 = math.pi * j / 18.0
ca2 = math.cos(angle2)
fdm['atmosphere/wind-north-fps'] = 10. * math.cos(angle) * ca2
fdm['atmosphere/wind-east-fps'] = 10. * math.sin(angle) * ca2
fdm['atmosphere/wind-down-fps'] = 10. * math.sin(angle2)
fdm.run()
vg = fdm['velocities/vg-fps']
self.assertAlmostEqual(vg, 0.0, delta=1E-7)
vt = fdm['velocities/vt-fps']
self.assertAlmostEqual(vt, 10., delta=1E-7)
mach = vt / fdm['atmosphere/a-fps']
P = fdm['atmosphere/P-psf']
pt = P * math.pow(1+0.2*mach*mach, 3.5)
psl = fdm['atmosphere/P-sl-psf']
rhosl = fdm['atmosphere/rho-sl-slugs_ft3']
A = math.pow((pt-P)/psl+1.0, 1.0/3.5)
alpha = fdm['aero/alpha-rad']
beta = fdm['aero/beta-rad']
vc = math.sqrt(7.0*psl/rhosl*(A-1.0))*math.cos(alpha+pitot_angle)*math.cos(beta)
self.assertAlmostEqual(fdm['velocities/vc-kts'],
max(0.0, vc) / 1.68781, delta=1E-7)
示例4: testEnginePowerVC
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def testEnginePowerVC(self):
# Check that the same results are obtained whether the engine power
# velocity correction is given in a <table> or <function>
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'L4102.xml'))
fdm.run_ic()
while fdm.run():
pass
del fdm
ref = pd.read_csv('L410.csv', index_col=0)
tree = et.parse(self.sandbox.path_to_jsbsim_file('engine',
'engtm601.xml'))
# Modify the engine definition to use a <function> rather than a
# <table> component.
root = tree.getroot()
engPowVC_tag = root.find("table/[@name='EnginePowerVC']")
root.remove(engPowVC_tag)
del engPowVC_tag.attrib['name']
func_engPowVC = et.SubElement(root, 'function')
func_engPowVC.attrib['name'] = 'EnginePowerVC'
func_engPowVC.append(engPowVC_tag)
tree.write('engtm601.xml')
# Copy the propeller file.
shutil.copy(self.sandbox.path_to_jsbsim_file('engine', 'vrtule2.xml'),
'.')
self.sandbox.delete_csv_files()
fdm = CreateFDM(self.sandbox)
fdm.set_engine_path('.')
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'L4102.xml'))
fdm.run_ic()
while fdm.run():
pass
current = pd.read_csv('L410.csv', index_col=0)
# Check the data are matching i.e. the time steps are the same between
# the two data sets and that the output data are also the same.
self.assertTrue(isDataMatching(ref, current))
# Find all the data that are differing by more than 1E-5 between the
# two data sets.
diff = FindDifferences(ref, current, 0.0)
self.longMessage = True
self.assertEqual(len(diff), 0, msg='\n'+diff.to_string())
示例5: testKinematicSetInitialValue
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def testKinematicSetInitialValue(self):
fdm = CreateFDM(self.sandbox)
fdm.load_model('p51d')
fdm.load_ic(self.sandbox.path_to_jsbsim_file('aircraft', 'p51d',
'reset01'), False)
fdm.run_ic()
fdm['gear/gear-cmd-norm'] = 0.5
fdm['gear/gear-pos-norm'] = 0.5
while fdm['simulation/sim-time-sec'] < 1.0:
fdm.run()
self.assertAlmostEqual(fdm['gear/gear-cmd-norm'], 0.5)
self.assertAlmostEqual(fdm['gear/gear-pos-norm'], 0.5)
示例6: test_steer_with_fcs
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_steer_with_fcs(self):
fdm = CreateFDM(self.sandbox)
fdm.load_model('L410')
aircraft_path = self.sandbox.path_to_jsbsim_file('aircraft')
fdm.load_ic(os.path.join(aircraft_path, 'L410', 'reset00'), False)
fdm.run_ic()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 0.0)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 0.0)
fdm['fcs/steer-cmd-norm'] = 1.0
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 1.0)
fdm.run()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 1.0)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 5.0)
fdm['/controls/switches/full-steering-sw'] = 1.0
fdm.run()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 1.0)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 0.0)
fdm['/controls/switches/full-steering-sw'] = 2.0
fdm.run()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 1.0)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 45.0)
fdm['fcs/steer-cmd-norm'] = -0.5
fdm.run()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], -0.5)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], -22.5)
示例7: test_static_hold_down
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_static_hold_down(self):
fdm = CreateFDM(self.sandbox)
fdm.load_model('J246')
aircraft_path = self.sandbox.path_to_jsbsim_file('aircraft')
fdm.load_ic(os.path.join(aircraft_path, 'J246', 'LC39'), False)
fdm['forces/hold-down'] = 1.0
fdm.run_ic()
h0 = fdm['position/h-sl-ft']
t = 0.0
while t < 420.0:
fdm.run()
t = fdm['simulation/sim-time-sec']
self.assertAlmostEqual(fdm['position/h-sl-ft'], h0, delta=1E-5)
示例8: testFunctionWithIndexedProps
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def testFunctionWithIndexedProps(self):
tree = et.parse(self.sandbox.path_to_jsbsim_file('engine',
'eng_PegasusXc.xml'))
# Define the function starter-max-power-W as a 'post' function
root = tree.getroot()
startPowFunc_tag = root.find("function/[@name='propulsion/engine[#]/starter-max-power-W']")
startPowFunc_tag.attrib['type']='post'
tree.write('eng_PegasusXc.xml')
# Copy the propeller file.
shutil.copy(self.sandbox.path_to_jsbsim_file('engine', 'prop_deHavilland5000.xml'),
'.')
fdm = CreateFDM(self.sandbox)
fdm.set_engine_path('.')
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts',
'Short_S23_1.xml'))
fdm.run_ic()
pm = fdm.get_property_manager()
self.assertTrue(pm.hasNode('propulsion/engine[0]/starter-max-power-W'))
self.assertTrue(pm.hasNode('propulsion/engine[1]/starter-max-power-W'))
self.assertTrue(pm.hasNode('propulsion/engine[2]/starter-max-power-W'))
self.assertTrue(pm.hasNode('propulsion/engine[3]/starter-max-power-W'))
while fdm.run():
rpm = [fdm['propulsion/engine[0]/engine-rpm'],
fdm['propulsion/engine[1]/engine-rpm'],
fdm['propulsion/engine[2]/engine-rpm'],
fdm['propulsion/engine[3]/engine-rpm']]
for i in range(4):
maxPower = max(0.0, 1.0-rpm[i]/400)*498.941*0.10471976*rpm[i]
self.assertAlmostEqual(fdm['propulsion/engine[%d]/starter-max-power-W' % (i,)],
maxPower)
示例9: testOrbit
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def testOrbit(self):
script_name = 'ball_orbit.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
self.AddAccelerometersToAircraft(script_path)
# The time step is too small in ball_orbit so let's increase it to 0.1s
# for a quicker run
tree = et.parse(script_path)
run_tag = tree.getroot().find('./run')
run_tag.attrib['dt'] = '0.1'
tree.write(script_name)
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_name)
# Switch the accel on
fdm['fcs/accelerometer/on'] = 1.0
fdm.run_ic()
while fdm.run():
self.assertAlmostEqual(fdm['fcs/accelerometer/X'], 0.0, delta=1E-8)
self.assertAlmostEqual(fdm['fcs/accelerometer/Y'], 0.0, delta=1E-8)
self.assertAlmostEqual(fdm['fcs/accelerometer/Z'], 0.0, delta=1E-8)
self.assertAlmostEqual(fdm['accelerations/a-pilot-x-ft_sec2'], 0.0,
delta=1E-8)
self.assertAlmostEqual(fdm['accelerations/a-pilot-y-ft_sec2'], 0.0,
delta=1E-8)
self.assertAlmostEqual(fdm['accelerations/a-pilot-z-ft_sec2'], 0.0,
delta=1E-8)
del fdm
示例10: test_wind_frame
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_wind_frame(self):
script_path = self.sandbox.path_to_jsbsim_file('scripts',
'ball_chute.xml')
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_path)
fdm.run_ic()
self.assertAlmostEqual(fdm['external_reactions/parachute/location-x-in'],
12.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/location-y-in'],
0.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/location-z-in'],
0.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/x'], -1.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/y'], 0.0)
self.assertAlmostEqual(fdm['external_reactions/parachute/z'], 0.0)
while fdm.run():
Tw2b = fdm.get_auxiliary().get_Tw2b()
mag = fdm['aero/qbar-psf'] * fdm['fcs/parachute_reef_pos_norm']*20.0
f = Tw2b * np.mat([-1.0, 0.0, 0.0]).T * mag
self.assertAlmostEqual(fdm['forces/fbx-external-lbs'], f[0, 0])
self.assertAlmostEqual(fdm['forces/fby-external-lbs'], f[1, 0])
self.assertAlmostEqual(fdm['forces/fbz-external-lbs'], f[2, 0])
m = np.cross(self.getLeverArm(fdm,'parachute'),
np.array([f[0,0], f[1,0], f[2, 0]]))
self.assertAlmostEqual(fdm['moments/l-external-lbsft'], m[0])
self.assertAlmostEqual(fdm['moments/m-external-lbsft'], m[1])
self.assertAlmostEqual(fdm['moments/n-external-lbsft'], m[2])
示例11: test_moments_update
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_moments_update(self):
script_path = self.sandbox.path_to_jsbsim_file('scripts', 'weather-balloon.xml')
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_path)
fdm.run_ic()
# Moves the radio sonde to modify the CG location
fdm.set_property_value('inertia/pointmass-location-X-inches', 5.0)
# Check that the moment is immediately updated accordingly
fdm.run()
Fbz = fdm.get_property_value('forces/fbz-buoyancy-lbs')
CGx = fdm.get_property_value('inertia/cg-x-in') / 12.0 # Converts from in to ft
Mby = fdm.get_property_value('moments/m-buoyancy-lbsft')
self.assertTrue(abs(Fbz * CGx + Mby) < 1E-7,
msg="Fbz*CGx = %f and Mby = %f do not match" % (-Fbz*CGx, Mby))
示例12: test_direct_steer
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_direct_steer(self):
fdm = CreateFDM(self.sandbox)
fdm.load_model('c172r')
aircraft_path = self.sandbox.path_to_jsbsim_file('aircraft')
fdm.load_ic(os.path.join(aircraft_path, 'c172r', 'reset00'), False)
fdm.run_ic()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 0.0)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 0.0)
fdm['fcs/steer-pos-deg'] = 5.0
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 5.0)
fdm.run()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 0.0)
fdm['fcs/steer-cmd-norm'] = 1.0
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 1.0)
fdm.run()
self.assertAlmostEqual(fdm['fcs/steer-cmd-norm'], 1.0)
self.assertAlmostEqual(fdm['fcs/steer-pos-deg'], 10.0)
示例13: testSteadyFlight
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def testSteadyFlight(self):
script_name = 'c1722.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
self.AddAccelerometersToAircraft(script_path)
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_path)
# Switch the accel on
fdm.set_property_value('fcs/accelerometer/on', 1.0)
# Use the standard gravity (i.e. GM/r^2)
fdm.set_property_value('simulation/gravity-model', 0)
# Simplifies the transformation to compare the accelerometer with the
# gravity
fdm.set_property_value('ic/psi-true-rad', 0.0)
fdm.run_ic()
while fdm.get_property_value('simulation/sim-time-sec') <= 0.5:
fdm.run()
fdm.set_property_value('simulation/do_simple_trim', 1)
ax = fdm.get_property_value('accelerations/udot-ft_sec2')
ay = fdm.get_property_value('accelerations/vdot-ft_sec2')
az = fdm.get_property_value('accelerations/wdot-ft_sec2')
g = fdm.get_property_value('accelerations/gravity-ft_sec2')
theta = fdm.get_property_value('attitude/theta-rad')
# There is a lag of one time step between the computations of the
# accelerations and the update of the accelerometer
fdm.run()
fax = fdm.get_property_value('fcs/accelerometer/X')
fay = fdm.get_property_value('fcs/accelerometer/Y')
faz = fdm.get_property_value('fcs/accelerometer/Z')
fax -= ax
fay -= ay
faz -= az
# Deltas are relaxed because the tolerances of the trimming algorithm
# are quite relaxed themselves.
self.assertAlmostEqual(faz / (g * math.cos(theta)), -1.0, delta=1E-5)
self.assertAlmostEqual(fax / (g * math.sin(theta)), 1.0, delta=1E-5)
self.assertAlmostEqual(math.sqrt(fax*fax+fay*fay+faz*faz)/g, 1.0, delta=1E-6)
del fdm
示例14: testOnGround
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def testOnGround(self):
script_name = 'c1721.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
self.AddAccelerometersToAircraft(script_path)
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_path)
# Switch the accel on
fdm.set_property_value('fcs/accelerometer/on', 1.0)
# Use the standard gravity (i.e. GM/r^2)
fdm.set_property_value('simulation/gravity-model', 0)
# Simplifies the transformation to compare the accelerometer with the
# gravity
fdm.set_property_value('ic/psi-true-rad', 0.0)
fdm.run_ic()
for i in xrange(500):
fdm.run()
ax = fdm.get_property_value('accelerations/udot-ft_sec2')
ay = fdm.get_property_value('accelerations/vdot-ft_sec2')
az = fdm.get_property_value('accelerations/wdot-ft_sec2')
g = fdm.get_property_value('accelerations/gravity-ft_sec2')
theta = fdm.get_property_value('attitude/theta-rad')
# There is a lag of one time step between the computations of the
# accelerations and the update of the accelerometer
fdm.run()
fax = fdm.get_property_value('fcs/accelerometer/X')
fay = fdm.get_property_value('fcs/accelerometer/Y')
faz = fdm.get_property_value('fcs/accelerometer/Z')
fax -= ax
faz -= az
self.assertAlmostEqual(fay, 0.0, delta=1E-6)
self.assertAlmostEqual(fax / (g * math.sin(theta)), 1.0, delta=1E-5)
self.assertAlmostEqual(faz / (g * math.cos(theta)), -1.0, delta=1E-7)
del fdm
示例15: test_trim_on_ground
# 需要导入模块: from JSBSim_utils import CreateFDM [as 别名]
# 或者: from JSBSim_utils.CreateFDM import run [as 别名]
def test_trim_on_ground(self):
# Check that the trim is made with up to date initial conditions
fdm = CreateFDM(self.sandbox)
fdm.load_model('c172x')
fdm['ic/theta-deg'] = 90.0
fdm.run_ic()
fdm['ic/theta-deg'] = 0.0
# If the trim fails, it will raise an exception
fdm['simulation/do_simple_trim'] = 2 # Ground trim
# Check that the aircraft has been trimmed successfully (velocities
# should be zero i.e. the aircraft must be motionless once trimmed).
while fdm['simulation/sim-time-sec'] <= 1.0:
fdm.run()
self.assertAlmostEqual(fdm['velocities/p-rad_sec'], 0., delta=1E-4)
self.assertAlmostEqual(fdm['velocities/q-rad_sec'], 0., delta=1E-4)
self.assertAlmostEqual(fdm['velocities/r-rad_sec'], 0., delta=1E-4)
self.assertAlmostEqual(fdm['velocities/u-fps'], 0.0, delta=1E-4)
self.assertAlmostEqual(fdm['velocities/v-fps'], 0.0, delta=1E-4)
self.assertAlmostEqual(fdm['velocities/w-fps'], 0.0, delta=1E-4)