mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-09 22:49:53 +08:00
41451d5422
- the exact same basic model is now a NPS FDM - sim target still woks, it is just an alias to NPS with the proper FDM - the old ocaml files are removed - AHRS and INS are bypassed, since the accelerations are not well calculated by the model
157 lines
6.9 KiB
Python
Executable File
157 lines
6.9 KiB
Python
Executable File
#! /usr/bin/env python
|
|
|
|
# Copyright (C) 2013 Felix Ruess <felix.ruess@gmail.com>
|
|
#
|
|
# This file is part of Paparazzi.
|
|
#
|
|
# Paparazzi is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2, or (at your option)
|
|
# any later version.
|
|
#
|
|
# Paparazzi is distributed in the hope that it will be useful,
|
|
# but WITHOUT 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 Paparazzi; see the file COPYING. If not, write to
|
|
# the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
# Boston, MA 02111-1307, USA.
|
|
#
|
|
|
|
from __future__ import print_function
|
|
import sys
|
|
import os
|
|
import subprocess
|
|
from optparse import OptionParser, OptionGroup, OptionValueError
|
|
|
|
def spektrum_callback(option, opt_str, value, parser):
|
|
if not os.path.exists(value):
|
|
raise OptionValueError("Spektrum device %s not found" % value)
|
|
else:
|
|
parser.values.spektrum_dev = value
|
|
|
|
def main():
|
|
usage = "usage: %prog -a <ac_name> -t <sim_type> [sim arguments]\nRun %prog --help to list the options."
|
|
parser = OptionParser(usage)
|
|
parser.add_option("-a", "--aircraft", dest="ac_name",
|
|
action="store", metavar="NAME",
|
|
help="Aircraft name to use")
|
|
parser.add_option("-t", "--type", dest="simtype",
|
|
type='choice', choices=['sim', 'nps','hitl'],
|
|
action="store", default=None,
|
|
help="Simulator type to start: sim or nps")
|
|
parser.add_option("-b", "--ivy_bus", dest="ivy_bus", action="store",
|
|
metavar="BUS", help="Ivy Bus broadcast address (127.255.255.255)")
|
|
parser.add_option("-f", "--fg_host", dest="fg_host", action="store", metavar="HOST",
|
|
help="Host for FlightGear visualization (e.g. 127.0.0.1)")
|
|
parser.add_option("-v", "--verbose",
|
|
action="store_true", dest="verbose")
|
|
parser.add_option("--norc", dest="norc", action="store_true",
|
|
help="Hide the simulated RC")
|
|
parser.add_option("-p", "--fg_port", dest="fg_port", metavar="PORT",
|
|
type="int", default=5501, action="store",
|
|
help="Port on FlightGear host to connect to (Default: %default)")
|
|
parser.add_option("-P", "--fg_port_in", dest="fg_port_in", metavar="PORT_IN",
|
|
type="int", default=5502, action="store",
|
|
help="Port to receive from FlightGear host (Default: %default)")
|
|
parser.add_option("--fg_time_offset", type="int", action="store", metavar="SEC",
|
|
help="FlightGear time offset in seconds (e.g. 21600 for 6h)")
|
|
parser.add_option("-j", "--js_dev", dest="js_dev", metavar="IDX",
|
|
type="int", default=-1, action="store",
|
|
help="Use joystick with specified index (e.g. 0)")
|
|
parser.add_option("--spektrum_dev", type="string", action="callback",
|
|
callback=spektrum_callback, metavar="DEV",
|
|
help="Spektrum device to use (e.g. /dev/ttyUSB0)")
|
|
parser.add_option("--rc_script", type="int", action="store", metavar="NO",
|
|
help="Number of RC script to use")
|
|
parser.add_option("--time_factor", type="float", action="store", metavar="factor",
|
|
help="Time factor (default 1.0)")
|
|
parser.add_option("--fg_fdm", action="store_true",
|
|
help="Use FlightGear native-fdm protocol instead of native-gui")
|
|
parser.add_option("--nodisplay", dest="nodisplay", action="store_true",
|
|
help="Don't send NPS Ivy messages")
|
|
|
|
(options, args) = parser.parse_args()
|
|
|
|
if not options.ac_name:
|
|
parser.error("Please specify the aircraft name.")
|
|
|
|
# get environment
|
|
paparazzi_home = os.environ['PAPARAZZI_HOME']
|
|
if not paparazzi_home:
|
|
paparazzi_home = os.getcwd()
|
|
if options.verbose:
|
|
print("Using "+paparazzi_home+" as Paparazzi home dir.")
|
|
ac_dir = os.path.join(paparazzi_home, "var", "aircrafts", options.ac_name)
|
|
|
|
# if sim type not explicitly specified: check which one is built
|
|
if options.simtype is None:
|
|
nps_sitl = os.path.join(ac_dir, "nps", "simsitl")
|
|
nps_sitl = nps_sitl if os.path.isfile(nps_sitl) else None
|
|
sim_sitl = os.path.join(ac_dir, "sim", "simsitl")
|
|
sim_sitl = sim_sitl if os.path.isfile(sim_sitl) else None
|
|
if nps_sitl and sim_sitl:
|
|
print("Error: Both sim and nps targets built for aircraft " + options.ac_name + ". Please specify sim type to use...")
|
|
sys.exit(1)
|
|
elif nps_sitl is None and sim_sitl is None:
|
|
print("Error: No simulator target (sim or nps) built for aircraft " + options.ac_name)
|
|
sys.exit(1)
|
|
else:
|
|
options.simtype = "nps" if nps_sitl is not None else "sim"
|
|
|
|
simargs = []
|
|
|
|
if options.simtype in ["sim", "nps", "hitl"]:
|
|
if options.fg_host:
|
|
simargs.append("--fg_host")
|
|
simargs.append(options.fg_host)
|
|
simargs.append("--fg_port")
|
|
simargs.append(str(options.fg_port))
|
|
simargs.append("--fg_port_in")
|
|
simargs.append(str(options.fg_port_in))
|
|
if options.fg_time_offset:
|
|
simargs.append("--fg_time_offset")
|
|
simargs.append(str(options.fg_time_offset))
|
|
if options.js_dev != -1:
|
|
simargs.append("--js_dev")
|
|
simargs.append(str(options.js_dev))
|
|
if options.spektrum_dev:
|
|
simargs.append("--spektrum_dev")
|
|
simargs.append(options.spektrum_dev)
|
|
if options.rc_script:
|
|
simargs.append("--rc_script")
|
|
simargs.append(options.rc_script)
|
|
if options.norc:
|
|
simargs.append("--norc")
|
|
if options.ivy_bus:
|
|
simargs.append("--ivy_bus")
|
|
simargs.append(options.ivy_bus)
|
|
if options.time_factor:
|
|
simargs.append("--time_factor")
|
|
simargs.append(str(options.time_factor))
|
|
if options.fg_fdm:
|
|
simargs.append("--fg_fdm")
|
|
if options.nodisplay:
|
|
simargs.append("--nodisplay")
|
|
else:
|
|
parser.error("Please specify a valid sim type.")
|
|
|
|
# pass additional args through to the sim
|
|
simargs += args
|
|
|
|
simsitl = os.path.join(ac_dir, options.simtype, "simsitl")
|
|
if not os.path.isfile(simsitl):
|
|
print("Error: " + simsitl + " is missing. Is target " + options.simtype + " built for aircraft " + options.ac_name + "?")
|
|
sys.exit(1)
|
|
|
|
if options.verbose:
|
|
print("Launching "+options.simtype+" simulator with arguments: "+' '.join(simargs))
|
|
|
|
# start the simulator, replacing this process
|
|
os.execv(simsitl, [simsitl] + simargs)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|