You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
178 lines
5.0 KiB
178 lines
5.0 KiB
#!/usr/bin/env python3
|
|
|
|
import json
|
|
import sys
|
|
import os
|
|
import xml.etree.ElementTree as ET
|
|
import xml.dom.minidom as minidom
|
|
import shutil
|
|
|
|
import subprocess
|
|
|
|
exparameters = [
|
|
"--enable-terrasync",
|
|
"--timeofday=noon",
|
|
"--disable-sound",
|
|
"--disable-random-objects",
|
|
"--prop:/sim/rendering/texture-compression=off",
|
|
"--prop:/sim/rendering/quality-level=0",
|
|
"--prop:/sim/rendering/shaders/quality-level=0",
|
|
"--disable-ai-traffic",
|
|
"--prop:/sim/ai/enabled=0",
|
|
"--prop:/sim/rendering/random-vegetation=0",
|
|
"--prop:/sim/rendering/random-buildings=0",
|
|
"--disable-specular-highlight",
|
|
"--disable-ai-models",
|
|
"--disable-clouds",
|
|
"--disable-clouds3d",
|
|
"--fog-fastest",
|
|
"--visibility=2000",
|
|
"--disable-distance-attenuation",
|
|
"--disable-real-weather-fetch",
|
|
"--prop:/sim/rendering/particles=0",
|
|
"--prop:/sim/rendering/multi-sample-buffers=1",
|
|
"--prop:/sim/rendering/multi-samples=2",
|
|
"--prop:/sim/rendering/draw-mask/clouds=false",
|
|
"--prop:/sim/rendering/draw-mask/aircraft=true",
|
|
"--prop:/sim/rendering/draw-mask/models=true",
|
|
"--prop:/sim/rendering/draw-mask/terrain=true",
|
|
"--disable-random-vegetation",
|
|
"--disable-random-buildings",
|
|
"--disable-rembrandt",
|
|
"--disable-horizon-effect"
|
|
]
|
|
|
|
|
|
if len(sys.argv)!=3:
|
|
print('FG_run.py -- bad argument count')
|
|
exit(-1)
|
|
|
|
filename=sys.argv[1]
|
|
px4id=int(sys.argv[2])
|
|
|
|
if not os.path.exists('./'+filename):
|
|
print('FG_run.py -- file not found: '+filename)
|
|
exit(-1)
|
|
|
|
#get FG binary to run
|
|
fgbin=os.getenv("FG_BINARY")
|
|
if fgbin is None:
|
|
fgbin='fgfs'
|
|
|
|
#pick fgroot (fgdata) from flightgear
|
|
fgroot=""
|
|
fghelp=subprocess.check_output([fgbin, '--version']).decode("utf-8").split('\n');
|
|
for s in fghelp:
|
|
if s.find("FG_ROOT")>=0:
|
|
fgroot=s.split('=')[1]
|
|
|
|
if not fgroot:
|
|
print('fgroot not found.. abort')
|
|
exit(-1)
|
|
|
|
#get FGFS MODEL dir
|
|
fgmodelsdir=os.getenv("FG_MODELS_DIR")
|
|
if fgmodelsdir is None:
|
|
fgmodelsdir='./models'
|
|
|
|
#get FGFS EXTRA PARAMS
|
|
fgargsex=os.getenv("FG_ARGS_EX")
|
|
print(fgargsex)
|
|
if fgargsex is None:
|
|
fgargsex=" ".join(exparameters);
|
|
|
|
#get FGFS ADD PARAMS
|
|
fgargsadd=os.getenv("FG_ARGS_ADD")
|
|
print(fgargsadd)
|
|
if fgargsadd is None:
|
|
fgargsadd="";
|
|
|
|
protocols=fgroot+'/Protocol'
|
|
if not os.access(protocols, os.W_OK):
|
|
print('Cannot Write into direcotry: '+ protocols)
|
|
exit(-1)
|
|
|
|
############################ Parse Config ######################################
|
|
|
|
with open(filename) as json_file:
|
|
data = json.load(json_file)
|
|
model=data['FgModel']
|
|
url=data['Url']
|
|
controls=data['Controls']
|
|
|
|
print(model)
|
|
print(url)
|
|
for c in controls:
|
|
print(c[0]+' '+c[1]+' '+c[2])
|
|
|
|
############################ Create FG Input Protocol ###########################
|
|
propertyList=ET.Element('PropertyList')
|
|
generic= ET.SubElement(propertyList, 'generic')
|
|
input=ET.SubElement(generic,'input')
|
|
|
|
binary_mode=ET.SubElement(input,'binary_mode')
|
|
binary_mode.text='true'
|
|
|
|
for c in controls:
|
|
chunk=ET.SubElement(input,'chunk')
|
|
name=ET.SubElement(chunk,'name')
|
|
name.text=c[0]
|
|
type=ET.SubElement(chunk,'type')
|
|
type.text='double'
|
|
node=ET.SubElement(chunk,'node')
|
|
node.text=c[1]
|
|
|
|
rough_string = ET.tostring(propertyList, 'utf-8')
|
|
reparsed = minidom.parseString(rough_string)
|
|
xmlstring=reparsed.toprettyxml(indent=" ")
|
|
|
|
with open(protocols+'/PX4toFG.xml','w') as xml_file:
|
|
xml_file.write(xmlstring)
|
|
|
|
############################ Copy FG Output Protocol ############################
|
|
shutil.copy('px4bridge.xml',protocols+'/FGtoPX4.xml' )
|
|
|
|
############################ Run FG #############################################
|
|
|
|
baseparameters = [
|
|
"--aircraft=" + model,
|
|
"--fg-aircraft=" + fgmodelsdir,
|
|
"--telnet="+str(15400+px4id),
|
|
"--timeofday=noon",
|
|
"--generic=socket,out,100,127.0.0.1,"+str(15200+px4id)+",udp,FGtoPX4",
|
|
"--generic=socket,in,100,,"+str(15300+px4id)+",udp,PX4toFG",
|
|
"--model-hz=120",
|
|
"--disable-random-objects",
|
|
"--prop:/sim/rendering/texture-compression=off",
|
|
"--prop:/sim/rendering/quality-level=0",
|
|
"--prop:/sim/rendering/shaders/quality-level=0",
|
|
"--disable-ai-traffic",
|
|
"--prop:/sim/ai/enabled=0",
|
|
"--prop:/sim/rendering/random-vegetation=0",
|
|
"--prop:/sim/rendering/random-buildings=0",
|
|
"--disable-specular-highlight",
|
|
"--disable-ai-models",
|
|
"--disable-clouds",
|
|
"--disable-clouds3d",
|
|
"--fog-fastest",
|
|
"--visibility=2000",
|
|
"--model-hz=500",
|
|
"--disable-distance-attenuation",
|
|
"--disable-real-weather-fetch",
|
|
"--prop:/sim/rendering/particles=0",
|
|
"--prop:/sim/rendering/multi-sample-buffers=1",
|
|
"--prop:/sim/rendering/multi-samples=2",
|
|
"--prop:/sim/rendering/draw-mask/clouds=false",
|
|
"--prop:/sim/rendering/draw-mask/aircraft=true",
|
|
"--prop:/sim/rendering/draw-mask/models=true",
|
|
"--prop:/sim/rendering/draw-mask/terrain=true",
|
|
"--disable-random-vegetation",
|
|
"--disable-random-buildings",
|
|
"--disable-horizon-effect"
|
|
]
|
|
|
|
#with FG output
|
|
commnad=fgbin+" "+" ".join(baseparameters)+" "+fgargsex+" "+fgargsadd+" & echo $! > /tmp/px4fgfspid_"+str(px4id)
|
|
|
|
print(commnad)
|
|
os.system(commnad)
|
|
|