本文整理汇总了Python中JSBSim_utils.SandBox.elude方法的典型用法代码示例。如果您正苦于以下问题:Python SandBox.elude方法的具体用法?Python SandBox.elude怎么用?Python SandBox.elude使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类JSBSim_utils.SandBox
的用法示例。
在下文中一共展示了SandBox.elude方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: CheckScripts
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class CheckScripts(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
self.scripts = 0
def tearDown(self):
print "Tested %g scripts" % (self.scripts,)
self.sandbox.erase()
def testScripts(self):
script_path = self.sandbox.path_to_jsbsim_file('scripts')
for f in os.listdir(self.sandbox.elude(script_path)):
fullpath = os.path.join(self.sandbox.elude(script_path), f)
# Does f contains a JSBSim script ?
if not CheckXMLFile(fullpath, 'runscript'):
continue
fdm = CreateFDM(self.sandbox)
self.assertTrue(fdm.load_script(os.path.join(script_path, f)),
msg="Failed to load script %s" % (fullpath,))
fdm.run_ic()
self.scripts += 1
del fdm
示例2: TestScriptOutput
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestScriptOutput(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
self.script_path = self.sandbox.path_to_jsbsim_file('scripts',
'c1722.xml')
def tearDown(self):
self.sandbox.erase()
def test_no_output(self):
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.script_path)
fdm.run_ic()
ExecuteUntil(fdm, 10.)
self.assertFalse(self.sandbox.exists('output.csv'),
msg="Results have unexpectedly been written to 'output.csv'")
def test_output_from_file(self):
tree = et.parse(self.sandbox.elude(self.script_path))
output_tag = et.SubElement(tree.getroot(), 'output')
output_tag.attrib['file'] = self.sandbox.elude(self.sandbox.path_to_jsbsim_file('tests', 'output.xml'))
tree.write(self.sandbox('c1722_0.xml'))
fdm = CreateFDM(self.sandbox)
fdm.load_script('c1722_0.xml')
fdm.run_ic()
ExecuteUntil(fdm, 10.)
self.assertTrue(self.sandbox.exists('output.csv'),
msg="The file 'output.csv' has not been created")
def test_output(self):
tree = et.parse(self.sandbox.elude(self.script_path))
output_tag = et.SubElement(tree.getroot(), 'output')
output_tag.attrib['name'] = 'test.csv'
output_tag.attrib['type'] = 'CSV'
output_tag.attrib['rate'] = '10'
property_tag = et.SubElement(output_tag, 'property')
property_tag.text = 'position/vrp-radius-ft'
tree.write(self.sandbox('c1722_0.xml'))
fdm = CreateFDM(self.sandbox)
fdm.load_script('c1722_0.xml')
fdm.run_ic()
ExecuteUntil(fdm, 10.)
self.assertTrue(self.sandbox.exists(output_tag.attrib['name']),
msg="The file 'output.csv' has not been created")
orig = pd.read_csv(self.sandbox('JSBout172B.csv'))
test = pd.read_csv(self.sandbox('test.csv'))
self.assertEqual(np.max(orig['Time']-test['Time']), 0.0)
pname = '/fdm/jsbsim/' + property_tag.text
self.assertEqual(np.max(orig[pname]-test[pname]), 0.0)
示例3: CheckTrim
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class CheckTrim(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def test_trim_doesnt_ignite_rockets(self):
# Run a longitudinal trim with a rocket equipped with solid propellant
# boosters (aka SRBs). The trim algorithm will try to reach a vertical
# equilibrium by tweaking the throttle but since the rocket is nose up,
# the trim cannot converge. As a result the algorithm will set full
# throttle which will result in the SRBs ignition if the integration is
# not suspended. This bug has been reported in FlightGear and this test
# is checking that there is no regression.
fdm = CreateFDM(self.sandbox)
fdm.load_model('J246')
aircraft_path = self.sandbox.elude(self.sandbox.path_to_jsbsim_file('aircraft'))
fdm.load_ic(os.path.join(aircraft_path, 'J246', 'LC39'), False)
fdm.run_ic()
# Check that the SRBs are not ignited
self.assertEqual(fdm['propulsion/engine[0]/thrust-lbs'], 0.0)
self.assertEqual(fdm['propulsion/engine[1]/thrust-lbs'], 0.0)
try:
fdm['simulation/do_simple_trim'] = 1
except RuntimeError as e:
# The trim cannot succeed. Just make sure that the raised exception
# is due to the trim failure otherwise rethrow.
if e.args[0] != 'Trim Failed':
raise
# Check that the trim did not ignite the SRBs
self.assertEqual(fdm['propulsion/engine[0]/thrust-lbs'], 0.0)
self.assertEqual(fdm['propulsion/engine[1]/thrust-lbs'], 0.0)
def test_trim_on_ground(self):
fdm = CreateFDM(self.sandbox)
fdm.load_model('c172x')
fdm['ic/theta-deg'] = 10.0
fdm.run_ic()
fdm['ic/theta-deg'] = 0.0
fdm['simulation/do_simple_trim'] = 2
示例4: CheckAircrafts
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class CheckAircrafts(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def testAircrafts(self):
aircraft_path = self.sandbox.elude(self.sandbox.path_to_jsbsim_file('aircraft'))
for d in os.listdir(aircraft_path):
fullpath = os.path.join(aircraft_path, d)
# Is d a directory ?
if not os.path.isdir(fullpath):
continue
f = os.path.join(aircraft_path, d, append_xml(d))
# Is f an aircraft definition file ?
if not CheckXMLFile(f, 'fdm_config'):
continue
if d in ('blank'):
continue
fdm = CreateFDM(self.sandbox)
self.assertTrue(fdm.load_model(d),
msg='Failed to load aircraft %s' % (d,))
for f in os.listdir(fullpath):
f = os.path.join(aircraft_path, d, f)
if CheckXMLFile(f, 'initialize'):
self.assertTrue(fdm.load_ic(f, False),
msg='Failed to load IC %s for aircraft %s' %(f,d))
try:
fdm.run_ic()
except RuntimeError:
self.fail('Failed to run IC %s for aircraft %s' %(f,d))
break
del fdm
示例5: TestHoldDown
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestHoldDown(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def test_static_hold_down(self):
fdm = CreateFDM(self.sandbox)
fdm.load_model('J246')
aircraft_path = self.sandbox.elude(self.sandbox.path_to_jsbsim_file('aircraft'))
fdm.load_ic(os.path.join(aircraft_path, 'J246', 'LC39'), False)
fdm.set_property_value('forces/hold-down', 1.0)
fdm.run_ic()
h0 = fdm.get_property_value('position/h-sl-ft')
t = 0.0
while t < 420.0:
fdm.run()
t = fdm.get_property_value('simulation/sim-time-sec')
self.assertAlmostEqual(fdm.get_property_value('position/h-sl-ft'),
h0, delta=1E-5)
示例6: TestOrbitCheckCase
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestOrbitCheckCase(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox('check_cases', 'orbit')
def tearDown(self):
self.sandbox.erase()
def testOrbitCheckCase(self):
os.environ['JSBSIM_DEBUG'] = str(0)
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.sandbox.path_to_jsbsim_file('scripts', 'ball_orbit.xml'))
fdm.run_ic()
while fdm.run():
pass
ref, current = Table(), Table()
ref.ReadCSV(self.sandbox.elude(self.sandbox.path_to_jsbsim_file('logged_data', 'BallOut.csv')))
current.ReadCSV(self.sandbox('BallOut.csv'))
diff = ref.compare(current)
self.longMessage = True
self.assertTrue(diff.empty(), msg='\n'+repr(diff))
示例7: TestICOverride
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestICOverride(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def test_IC_override(self):
# Run the script c1724.xml
script_path = self.sandbox.path_to_jsbsim_file('scripts', 'c1724.xml')
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_path)
vt0 = fdm.get_property_value('ic/vt-kts')
fdm.run_ic()
ExecuteUntil(fdm, 1.0)
# Check that the total velocity exported in the output file matches the IC
# defined in the initialization file
ref = Table()
ref.ReadCSV(self.sandbox('JSBout172B.csv'))
for col, title in enumerate(ref._lines[0]):
if title == 'V_{Total} (ft/s)':
self.assertTrue(abs(ref._lines[1][col] - (vt0 / fpstokts)) < 1E-5,
msg="Original script %s\nThe total velocity is %f. The value %f was expected" % (script_path, ref._lines[1][col], vt0 / fpstokts))
break
else:
self.fail("The total velocity is not exported in %s" % (script_path,))
# Now, we will re-run the same test but the IC will be overridden in the scripts
# The initial total velocity is increased by 1 ft/s
vt0 += 1.0
# The script c1724.xml is loaded and the following line is added in it:
# <property value="..."> ic/vt-kts </property>
# The modified script is then saved with the named 'c1724_0.xml'
tree = et.parse(self.sandbox.elude(script_path))
run_tag = tree.getroot().find("./run")
property = et.SubElement(run_tag, 'property')
property.text = 'ic/vt-kts'
property.attrib['value'] = str(vt0)
tree.write(self.sandbox('c1724_0.xml'))
# Re-run the same check than above. This time we are making sure than the total
# initial velocity is increased by 1 ft/s
self.sandbox.delete_csv_files()
# Because JSBSim internals use static pointers, we cannot rely on Python
# garbage collector to decide when the FDM is destroyed otherwise we can
# get dangling pointers.
del fdm
fdm = CreateFDM(self.sandbox)
fdm.load_script('c1724_0.xml')
self.assertTrue(abs(fdm.get_property_value('ic/vt-kts') - vt0) < 1E-5,
msg="Modified script %s\nThe total velocity in the IC (%f) is different from %f" % (self.sandbox('JSBout172B.csv'), fdm.get_property_value('ic/vt-kts'), vt0))
fdm.run_ic()
ExecuteUntil(fdm, 1.0)
mod = Table()
mod.ReadCSV(self.sandbox('JSBout172B.csv'))
for col, title in enumerate(mod._lines[0]):
if title == 'V_{Total} (ft/s)':
self.assertTrue(abs(mod._lines[1][col] - (vt0 / fpstokts)) < 1E-5,
msg="Modified script %s\nThe total velocity is %f. The value %f was expected" % (self.sandbox('JSBout172B.csv'), mod._lines[1][col], vt0 / fpstokts))
break
else:
self.fail("The total velocity is not exported in %s" % (sandbox('JSBout172B.csv'),))
示例8: TestInitialConditions
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestInitialConditions(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def test_initial_conditions(self):
# A dictionary that contains the XML tags to extract from the IC file
# along with the name of the properties that contain the values
# extracted from the IC file.
vars = [{'tag': 'vt', 'unit': convtofps, 'default_unit': 'FT/SEC',
'ic_prop': 'ic/vt-fps', 'prop': 'velocities/vt-fps',
'CSV_header': 'V_{Total} (ft/s)'},
{'tag': 'ubody', 'unit': convtofps, 'default_unit': 'FT/SEC',
'ic_prop': 'ic/u-fps', 'prop': 'velocities/u-fps',
'CSV_header': 'UBody'},
{'tag': 'vbody', 'unit': convtofps, 'default_unit': 'FT/SEC',
'ic_prop': 'ic/v-fps', 'prop': 'velocities/v-fps',
'CSV_header': 'VBody'},
{'tag': 'wbody', 'unit': convtofps, 'default_unit': 'FT/SEC',
'ic_prop': 'ic/w-fps', 'prop': 'velocities/w-fps',
'CSV_header': 'WBody'},
{'tag': 'vnorth', 'unit': convtofps, 'default_unit': 'FT/SEC',
'ic_prop': 'ic/vn-fps', 'prop': 'velocities/v-north-fps',
'CSV_header': 'V_{North} (ft/s)'},
{'tag': 'veast', 'unit': convtofps, 'default_unit': 'FT/SEC',
'ic_prop': 'ic/ve-fps', 'prop': 'velocities/v-east-fps',
'CSV_header': 'V_{East} (ft/s)'},
{'tag': 'vdown', 'unit': convtofps, 'default_unit': 'FT/SEC',
'ic_prop': 'ic/vd-fps', 'prop': 'velocities/v-down-fps',
'CSV_header': 'V_{Down} (ft/s)'},
{'tag': 'latitude', 'unit': convtodeg, 'default_unit': 'RAD',
'ic_prop': 'ic/lat-gc-deg', 'prop': 'position/lat-gc-deg',
'CSV_header': 'Latitude (deg)'},
{'tag': 'longitude', 'unit': convtodeg, 'default_unit': 'RAD',
'ic_prop': 'ic/long-gc-deg', 'prop': 'position/long-gc-deg',
'CSV_header': 'Longitude (deg)'},
{'tag': 'altitude', 'unit': convtoft, 'default_unit': 'FT',
'ic_prop': 'ic/h-agl-ft', 'prop': 'position/h-agl-ft',
'CSV_header': 'Altitude AGL (ft)'},
{'tag': 'altitudeAGL', 'unit': convtoft, 'default_unit': 'FT',
'ic_prop': 'ic/h-agl-ft', 'prop': 'position/h-agl-ft',
'CSV_header': 'Altitude AGL (ft)'},
{'tag': 'altitudeMSL', 'unit': convtoft, 'default_unit': 'FT',
'ic_prop': 'ic/h-sl-ft', 'prop': 'position/h-sl-ft',
'CSV_header': 'Altitude ASL (ft)'},
{'tag': 'phi', 'unit': convtodeg, 'default_unit': 'RAD',
'ic_prop': 'ic/phi-deg', 'prop': 'attitude/phi-deg',
'CSV_header': 'Phi (deg)'},
{'tag': 'theta', 'unit': convtodeg, 'default_unit': 'RAD',
'ic_prop': 'ic/theta-deg', 'prop': 'attitude/theta-deg',
'CSV_header': 'Theta (deg)'},
{'tag': 'psi', 'unit': convtodeg, 'default_unit': 'RAD',
'ic_prop': 'ic/psi-true-deg', 'prop': 'attitude/psi-deg',
'CSV_header': 'Psi (deg)'},
{'tag': 'elevation', 'unit': convtoft, 'default_unit': 'FT',
'ic_prop': 'ic/terrain-elevation-ft', 'prop': 'position/terrain-elevation-asl-ft',
'CSV_header': 'Terrain Elevation (ft)'}]
script_path = self.sandbox.path_to_jsbsim_file('scripts')
for f in os.listdir(self.sandbox.elude(script_path)):
# TODO These scripts need some further investigation
if f in ('ZLT-NT-moored-1.xml',):
continue
fullpath = os.path.join(self.sandbox.elude(script_path), f)
# Does f contains a JSBSim script ?
if not CheckXMLFile(fullpath, 'runscript'):
continue
# Read the IC file name from the script
tree = et.parse(fullpath)
root = tree.getroot()
use_tag = root.find('use')
aircraft_name = use_tag.attrib['aircraft']
aircraft_path = os.path.join('aircraft', aircraft_name)
path_to_jsbsim_aircrafts = self.sandbox.elude(self.sandbox.path_to_jsbsim_file(aircraft_path))
IC_file = append_xml(use_tag.attrib['initialize'])
IC_tree = et.parse(os.path.join(path_to_jsbsim_aircrafts, IC_file))
IC_root = IC_tree.getroot()
# Only testing version 1.0 of init files
if 'version' in IC_root.attrib:
if float(IC_root.attrib['version']) == 2.0:
continue
# Extract the IC values from XML
for var in vars:
var_tag = IC_root.find('./'+var['tag'])
var['specified'] = var_tag is not None
if not var['specified']:
var['value'] = 0.0
continue
var['value'] = float(var_tag.text)
if 'unit' in var_tag.attrib:
conv = var['unit'][var_tag.attrib['unit']]
#.........这里部分代码省略.........
示例9: TestSimTimeReset
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestSimTimeReset(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def test_no_script(self):
fdm = CreateFDM(self.sandbox)
aircraft_path = self.sandbox.path_to_jsbsim_file('aircraft')
fdm.set_aircraft_path(aircraft_path)
fdm.load_model('c172x')
aircraft_path = os.path.join(self.sandbox.elude(aircraft_path), 'c172x')
fdm.load_ic(os.path.join(aircraft_path, 'reset01.xml'), False)
fdm.run_ic()
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 0.0)
ExecuteUntil(fdm, 5.0)
t = fdm.get_property_value('simulation/sim-time-sec')
fdm.set_property_value('simulation/do_simple_trim', 1)
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), t)
fdm.reset_to_initial_conditions(1)
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 0.0)
del fdm
def test_script_start_time_0(self):
script_name = 'ball_orbit.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_path)
fdm.run_ic()
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 0.0)
ExecuteUntil(fdm, 5.0)
fdm.reset_to_initial_conditions(1)
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 0.0)
del fdm
def test_script_start_time(self):
script_name = 'ball_orbit.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
tree = et.parse(self.sandbox.elude(script_path))
run_tag = tree.getroot().find('./run')
run_tag.attrib['start'] = '1.2'
tree.write(self.sandbox(script_name))
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_name)
fdm.run_ic()
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 1.2)
ExecuteUntil(fdm, 5.0)
fdm.reset_to_initial_conditions(1)
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 1.2)
del fdm
def test_script_no_start_time(self):
script_name = 'ball_orbit.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts', script_name)
tree = et.parse(self.sandbox.elude(script_path))
run_tag = tree.getroot().find('./run')
# Remove the parameter 'start' from the tag <run>
del run_tag.attrib['start']
tree.write(self.sandbox(script_name))
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_name)
fdm.run_ic()
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 0.0)
ExecuteUntil(fdm, 5.0)
fdm.reset_to_initial_conditions(1)
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 0.0)
del fdm
示例10: SandBox
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses/>
#
import sys
from JSBSim_utils import CreateFDM, Table, SandBox
sandbox = SandBox("check_cases", "orbit")
fdm = CreateFDM(sandbox)
fdm.load_script(sandbox.path_to_jsbsim_file("scripts", "ball_orbit.xml"))
fdm.run_ic()
while fdm.run():
pass
ref, current = Table(), Table()
ref.ReadCSV(sandbox.elude(sandbox.path_to_jsbsim_file("logged_data", "BallOut.csv")))
current.ReadCSV(sandbox("BallOut.csv"))
diff = ref.compare(current)
if not diff.empty():
print diff
sys.exit(-1) # Needed for 'make test' to report the test passed.
sandbox.erase()
示例11: TestInputSocket
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
#.........这里部分代码省略.........
msg="Not connected to the JSBSim server.\nGot message '%s' instead" % (out,))
# Check that "help" returns the minimum set of commands that will be
# tested
self.assertEqual(sorted(map(lambda x: string.strip(string.split(x, '{')[0]),
string.split(_tn.sendCommand("help"), '\n')[2:-2])),
['get', 'help', 'hold', 'info', 'iterate', 'quit', 'resume', 'set'])
def test_no_input(self):
fdm = CreateFDM(self.sandbox)
fdm.load_script(self.script_path)
fdm.run_ic()
fdm.hold()
with self.assertRaises(socket.error):
TelnetInterface(fdm, 5., 1137)
def test_input_socket(self):
# The aircraft c172x does not contain an <input> tag so we need
# to add one.
tree, aircraft_name, b = CopyAircraftDef(self.script_path, self.sandbox)
self.root = tree.getroot()
input_tag = et.SubElement(self.root, 'input')
input_tag.attrib['port'] = '1137'
tree.write(self.sandbox('aircraft', aircraft_name,
aircraft_name+'.xml'))
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(self.script_path)
fdm.run_ic()
fdm.hold()
tn = TelnetInterface(fdm, 5., 1137)
self.sanityCheck(tn)
# Check the aircraft name and its version
msg = string.split(tn.sendCommand("info"), '\n')
self.assertEqual(string.strip(string.split(msg[2], ':')[1]),
string.strip(self.root.attrib['name']))
self.assertEqual(string.strip(string.split(msg[1], ':')[1]),
string.strip(self.root.attrib['version']))
# Check that the simulation time is 0.0
self.assertEqual(float(string.strip(string.split(msg[3], ':')[1])), 0.0)
self.assertEqual(tn.getSimTime(), 0.0)
self.assertEqual(tn.getPropertyValue("simulation/sim-time-sec"), 0.0)
# Check that 'iterate' iterates the correct number of times
tn.sendCommand("iterate 19")
self.assertEqual(tn.getSimTime(), 19. * tn.getDeltaT())
self.assertAlmostEqual(tn.getPropertyValue("simulation/sim-time-sec"),
tn.getSimTime(), delta=1E-5)
# Wait a little bit and make sure that the simulation time has not
# changed meanwhile thus confirming that the simulation is on hold.
tn.wait(0.1)
self.assertEqual(tn.getSimTime(), 19. * tn.getDeltaT())
self.assertAlmostEqual(tn.getPropertyValue("simulation/sim-time-sec"),
tn.getSimTime(), delta=1E-5)
# Modify the tank[0] contents via the "send" command
half_contents = 0.5 * tn.getPropertyValue("propulsion/tank/contents-lbs")
tn.sendCommand("set propulsion/tank/contents-lbs " + str(half_contents))
self.assertEqual(tn.getPropertyValue("propulsion/tank/contents-lbs"),
half_contents)
# Check the resume/hold commands
tn.setRealTime(True)
t = tn.getSimTime()
tn.sendCommand("resume")
tn.wait(0.5)
self.assertNotEqual(tn.getSimTime(), t)
tn.wait(0.5)
tn.sendCommand("hold")
tn.setRealTime(False)
t = tn.getSimTime()
self.assertAlmostEqual(tn.getPropertyValue("simulation/sim-time-sec"),
t, delta=1E-5)
# Wait a little bit and make sure that the simulation time has not
# changed meanwhile thus confirming that the simulation is on hold.
tn.wait(0.1)
self.assertEqual(tn.getSimTime(), t)
self.assertAlmostEqual(tn.getPropertyValue("simulation/sim-time-sec"),
t, delta=1E-5)
def test_script_input(self):
tree = et.parse(self.sandbox.elude(self.script_path))
input_tag = et.SubElement(tree.getroot(), 'input')
input_tag.attrib['port'] = '1138'
tree.write(self.sandbox('c1722_1.xml'))
fdm = CreateFDM(self.sandbox)
fdm.load_script('c1722_1.xml')
fdm.run_ic()
fdm.hold()
tn = TelnetInterface(fdm, 5., 1138)
self.sanityCheck(tn)
示例12: TestModelLoading
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestModelLoading(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def BuildReference(self, script_name):
# Run the script
self.script = self.sandbox.path_to_jsbsim_file(os.path.join('scripts',
script_name))
self.sandbox.delete_csv_files()
fdm = CreateFDM(self.sandbox)
fdm.set_output_directive(self.sandbox.path_to_jsbsim_file('tests',
'output.xml'))
fdm.load_script(self.script)
fdm.set_property_value('simulation/randomseed', 0.0)
fdm.run_ic()
ExecuteUntil(fdm, 50.0)
self.ref = Table()
self.ref.ReadCSV(self.sandbox("output.csv"))
# Since the script will work with modified versions of the aircraft XML
# definition file, we need to make a copy of the directory that contains
# all the input data of that aircraft
tree, self.aircraft_name, self.path_to_jsbsim_aircrafts = CopyAircraftDef(self.script, self.sandbox)
self.aircraft_path = self.sandbox('aircraft', self.aircraft_name)
def ProcessAndCompare(self, section):
# Here we determine if the original aircraft definition <section> is
# inline or read from an external file.
tree = et.parse(os.path.join(self.path_to_jsbsim_aircrafts,
self.aircraft_name + '.xml'))
root = tree.getroot()
# Iterate over all the tags named <section>
for section_element in root.findall(section):
if 'file' in section_element.keys():
self.InsertAndCompare(section_element, tree)
else:
self.DetachAndCompare(section_element, tree)
def DetachAndCompare(self, section_element, tree):
# Extract <section> from the original aircraft definition file and copy
# it in a separate XML file 'section.xml'
section_tree = et.ElementTree(element=section_element)
if 'name' in section_element.keys():
section = section_element.attrib['name']
else:
section = section_element.tag
section_tree.write(os.path.join(self.aircraft_path, section+'.xml'),
xml_declaration=True)
# Now, we need to clean up the aircraft definition file from all
# references to <section>. We just need a single <section> tag that
# points to the file 'section.xml'
for element in list(section_element):
section_element.remove(element)
section_element.attrib = {'file': section+'.xml'}
tree.write(os.path.join(self.aircraft_path, self.aircraft_name+'.xml'),
xml_declaration=True)
self.Compare(section)
def InsertAndCompare(self, section_element, tree):
file_name = append_xml(section_element.attrib['file'])
section_file = os.path.join(self.path_to_jsbsim_aircrafts, file_name)
# If <section> is actually <system>, we need to iterate over all the
# directories in which the file is allowed to be stored until the file
# is located.
if not os.path.exists(section_file) and section_element.tag == 'system':
section_file = os.path.join(self.path_to_jsbsim_aircrafts, "systems", file_name)
if not os.path.exists(section_file):
section_file = self.sandbox.elude(self.sandbox.path_to_jsbsim_file("systems", file_name))
# The original <section> tag is dropped and replaced by the content of
# the file.
section_root = et.parse(section_file).getroot()
del section_element.attrib['file']
section_element.attrib.update(section_root.attrib)
section_element.extend(section_root)
tree.write(os.path.join(self.aircraft_path, self.aircraft_name+'.xml'))
self.Compare(section_element.tag+" file:"+section_file)
def Compare(self, section):
# Rerun the script with the modified aircraft definition
self.sandbox.delete_csv_files()
fdm = CreateFDM(self.sandbox)
# We need to tell JSBSim that the aircraft definition is located in the
# directory build/.../aircraft
fdm.set_aircraft_path('aircraft')
#.........这里部分代码省略.........
示例13: TestPitotAngle
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestPitotAngle(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def test_CAS_ic(self):
script_name = 'Short_S23_3.xml'
script_path = self.sandbox.path_to_jsbsim_file('scripts',
script_name)
# Add a Pitot angle to the Short S23
tree, aircraft_name, path_to_jsbsim_aircrafts = CopyAircraftDef(script_path, self.sandbox)
metrics_tag = tree.getroot().find('./metrics')
pitot_tag = et.SubElement(metrics_tag, 'pitot_angle')
pitot_tag.attrib['unit'] = 'DEG'
pitot_tag.text = '5.0'
tree.write(self.sandbox('aircraft', aircraft_name,
aircraft_name+'.xml'))
# Read the CAS specified in the IC file
tree = et.parse(self.sandbox.elude(script_path))
use_element = tree.getroot().find('use')
IC_file = use_element.attrib['initialize']
tree = et.parse(os.path.join(path_to_jsbsim_aircrafts,
append_xml(IC_file)))
vc_tag = tree.getroot().find('./vc')
VCAS = float(vc_tag.text)
if 'unit' in vc_tag.attrib and vc_tag.attrib['unit'] == 'FT/SEC':
VCAS /= 1.68781
# Run the IC and check that the model is initialized correctly
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_path)
fdm.run_ic()
self.assertAlmostEqual(fdm.get_property_value('ic/vc-kts'),
VCAS, delta=1E-7)
self.assertAlmostEqual(fdm.get_property_value('velocities/vc-kts'),
VCAS, delta=1E-7)
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()
metrics_tag = root.find('./metrics')
pitot_tag = et.SubElement(metrics_tag, 'pitot_angle')
pitot_tag.attrib['unit'] = 'DEG'
pitot_tag.text = '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 = float(pitot_tag.text) * math.pi / 180.
weight = fdm.get_property_value('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.set_property_value('ic/h-sl-ft', weight / spring_coeff)
fdm.set_property_value('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.set_property_value('atmosphere/wind-north-fps',
10. * math.cos(angle) * ca2)
fdm.set_property_value('atmosphere/wind-east-fps',
10. * math.sin(angle) * ca2)
fdm.set_property_value('atmosphere/wind-down-fps',
10. * math.sin(angle2))
fdm.run()
vg = fdm.get_property_value('velocities/vg-fps')
self.assertAlmostEqual(vg, 0.0, delta=1E-7)
vt = fdm.get_property_value('velocities/vt-fps')
self.assertAlmostEqual(vt, 10., delta=1E-7)
mach = vt / fdm.get_property_value('atmosphere/a-fps')
P = fdm.get_property_value('atmosphere/P-psf')
pt = P * math.pow(1+0.2*mach*mach, 3.5)
psl = fdm.get_property_value('atmosphere/P-sl-psf')
rhosl = fdm.get_property_value('atmosphere/rho-sl-slugs_ft3')
A = math.pow((pt-P)/psl+1.0, 1.0/3.5)
alpha = fdm.get_property_value('aero/alpha-rad')
beta = fdm.get_property_value('aero/beta-rad')
#.........这里部分代码省略.........
示例14: TestICOverride
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestICOverride(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def test_IC_override(self):
# Run the script c1724.xml
script_path = self.sandbox.path_to_jsbsim_file('scripts', 'c1724.xml')
fdm = CreateFDM(self.sandbox)
fdm.load_script(script_path)
vt0 = fdm.get_property_value('ic/vt-kts')
fdm.run_ic()
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 0.0)
self.assertAlmostEqual(fdm.get_property_value('velocities/vt-fps'),
vt0 / fpstokts, delta=1E-7)
ExecuteUntil(fdm, 1.0)
# Check that the total velocity exported in the output file matches the
# IC defined in the initialization file
ref = Table()
ref.ReadCSV(self.sandbox('JSBout172B.csv'))
self.assertEqual(ref.get_column('Time')[1], 0.0)
self.assertAlmostEqual(ref.get_column('V_{Total} (ft/s)')[1],
vt0 / fpstokts, delta=1E-7)
# Now, we will re-run the same test but the IC will be overridden in the
# script. The initial total velocity is increased by 1 ft/s
vt0 += 1.0
# The script c1724.xml is loaded and the following line is added in it:
# <property value="..."> ic/vt-kts </property>
# The modified script is then saved with the named 'c1724_0.xml'
tree = et.parse(self.sandbox.elude(script_path))
run_tag = tree.getroot().find("./run")
property = et.SubElement(run_tag, 'property')
property.text = 'ic/vt-kts'
property.attrib['value'] = str(vt0)
tree.write(self.sandbox('c1724_0.xml'))
# Re-run the same check than above. This time we are making sure than
# the total initial velocity is increased by 1 ft/s
self.sandbox.delete_csv_files()
# Because JSBSim internals use static pointers, we cannot rely on Python
# garbage collector to decide when the FDM is destroyed otherwise we can
# get dangling pointers.
del fdm
fdm = CreateFDM(self.sandbox)
fdm.load_script('c1724_0.xml')
self.assertAlmostEqual(fdm.get_property_value('ic/vt-kts'), vt0,
delta=1E-6)
fdm.run_ic()
self.assertEqual(fdm.get_property_value('simulation/sim-time-sec'), 0.0)
self.assertAlmostEqual(fdm.get_property_value('velocities/vt-fps'),
vt0 / fpstokts, delta=1E-6)
ExecuteUntil(fdm, 1.0)
mod = Table()
mod.ReadCSV(self.sandbox('JSBout172B.csv'))
self.assertAlmostEqual(mod.get_column('V_{Total} (ft/s)')[1],
vt0 / fpstokts, delta=1E-6)
示例15: TestAccelerometer
# 需要导入模块: from JSBSim_utils import SandBox [as 别名]
# 或者: from JSBSim_utils.SandBox import elude [as 别名]
class TestAccelerometer(unittest.TestCase):
def setUp(self):
self.sandbox = SandBox()
def tearDown(self):
self.sandbox.erase()
def AddAccelerometersToAircraft(self, script_path):
tree, aircraft_name, b = CopyAircraftDef(script_path, self.sandbox)
system_tag = et.SubElement(tree.getroot(), 'system')
system_tag.attrib['file'] = 'accelerometers'
tree.write(self.sandbox('aircraft', aircraft_name, aircraft_name+'.xml'))
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(self.sandbox.elude(script_path))
run_tag = tree.getroot().find('./run')
run_tag.attrib['dt'] = '0.1'
tree.write(self.sandbox(script_name))
fdm = CreateFDM(self.sandbox)
fdm.set_aircraft_path('aircraft')
fdm.load_script(script_name)
# Switch the accel on
fdm.set_property_value('fcs/accelerometer/on', 1.0)
fdm.run_ic()
while fdm.run():
self.assertAlmostEqual(fdm.get_property_value('fcs/accelerometer/X'),
0.0, delta=1E-8)
self.assertAlmostEqual(fdm.get_property_value('fcs/accelerometer/Y'),
0.0, delta=1E-8)
self.assertAlmostEqual(fdm.get_property_value('fcs/accelerometer/Z'),
0.0, delta=1E-8)
self.assertAlmostEqual(fdm.get_property_value('accelerations/a-pilot-x-ft_sec2'),
0.0, delta=1E-8)
self.assertAlmostEqual(fdm.get_property_value('accelerations/a-pilot-y-ft_sec2'),
0.0, delta=1E-8)
self.assertAlmostEqual(fdm.get_property_value('accelerations/a-pilot-z-ft_sec2'),
0.0, delta=1E-8)
del fdm
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
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
#.........这里部分代码省略.........