G60 G60
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Determinar en que fase de Vuelo esta un Avion  (Leído 7417 veces)
0 Usuarios y 2 Visitantes están viendo este tema.
07 Junio, 2011, 15:52:41
CarlosGarcia
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 663



En línea
Determinar en que fase de Vuelo esta un Avion

Buenos dias.

No se si este es el foro indicado para esta pregunta pero no veo ningún foro de DESARROLLO o algo parecido.   Huh?

La idea es a través de un SCRIPT en GIZMO (la lógica debe ser muy parecida en otro lenguaje como PYTHON o C ) determinar en que fase del vuelo se encuentra un avion y realizar unas actividades de acuerdo a la fase en que se encuentre, Por ejemplo si esta en movimiento pero a baja velocidad y tocando el suelo, entonces esta en TAXI y que prenda las luces de Taxi y Apague las de Navegación y otras cosas (ver código de Función Taxi).

La idea es hacer una serie de Condicionales que tienen en cuenta la Velocidad, la Altura, La velocidad vertical y el peso sobre el tren de aterrizaje. Y en la aproximación tener en cuenta que el avion se encuentra en LOC y GS.

( Si hay alguna otra Variable por favor me Informan)

Este es el Script por si alguien me ayuda a Realizarlo.
Código:
-- 0 Park
-- 1 Take Off
-- 2 Fly
-- 3 landing
-- 4 Taxi

PhaseOfFlight = 0

function phases()

VSI = xp.getDataref("sim/cockpit2/gauges/indicators/vvi_fpm_pilot") -- velocidad vertical
get_VSI=xp.getFloat(VSI) -- velocidad vertical en ft/min

ALTG= xp.getDataref("sim/flightmodel/position/y_agl")
get_ALTG=xp.getFloat(ALTG) --Altura en metros AGL
get_ALTG_ft = get_ALTG*3.28  -- Altura en pies AGL Cambio de metros a pies

thro=xp.getDataref("sim/flightmodel/engine/ENGN_thro") -- Cantidad de Acelerador
get_thro=xp.getFloatV(thro,1,4)

contact_sol=xp.getDataref("sim/flightmodel/parts/tire_vrt_def_veh") -- Contacto de las ruedas sobre la pista > 0 En el piso < 0 Esta en el aire
get_contact_sol=xp.getFloatV(contact_sol,1,3) -- Por que tiene tres brazos el tren de aterrizaje

if (get_ALTG_ft < 5) and (acf.getKIAS() < 5 ) and (get_contact_sol > 0 ) then -- Condicional Park
PhaseOfFlight = 0
end

if (get_ALTG_ft < 5) and (acf.getKIAS() > 80)  and (get_contact_sol > 0 ) then -- Condicional Take Off
PhaseOfFlight = 1
end

if (get_ALTG_ft >10000 ) and (acf.getKIAS() > 100 ) then  -- Condicional Fly
PhaseOfFlight = 2
end

if (get_VSI < -1) and (get_ALTG_ft < 2200) and (acf.getKIAS() < 250 )  then -- Condicional landing
PhaseOfFlight = 3
end

if (get_ALTG_ft < 5) and (acf.getKIAS() < 50) and (acf.getKIAS() > 6 ) and (get_contact_sol > 0) then -- Condicional taxi
PhaseOfFlight = 4
end

if(PhaseOfFlight == 0) then -- park
park_stuff()
end

if(PhaseOfFlight == 3) then -- landing
landing_stuff()
gear_down()
flare()
braking()
end

if(PhaseOfFlight == 4) then -- Taxi
taxi_stuff()
end

end

Por ejemplo lo que haria el Script si el Avion esta en la fase de Taxi.

Código:
function taxi_stuff() --1 On, 0 Off
dref_nav_lights = xp.getDataref("sim/cockpit/electrical/nav_lights_on")
dref_land_lights  = xp.getDataref("sim/cockpit/electrical/landing_lights_on")
dref_taxi_lights  = xp.getDataref("sim/cockpit/electrical/taxi_light_on")
dref_strobe_lights  = xp.getDataref("sim/cockpit/electrical/strobe_lights_on")
dref_belts  = xp.getDataref("sim/cockpit/switches/fasten_seat_belts")
dref_smoking  = xp.getDataref("sim/cockpit/switches/no_smoking")
dref_TransP = xp.getDataref("sim/cockpit/radios/transponder_mode")
dref_beacon_lights  = xp.getDataref("sim/cockpit/electrical/beacon_lights_on")
xp.setInt(dref_nav_lights,0) --Luces de Navegacion Apagadas
xp.setInt(dref_land_lights,0) --Luces de  Aterrizaje Apagadas
xp.setInt(dref_taxi_lights,1) --Luces de  Taxi Encendidas
xp.setInt(dref_strobe_lights,0) --Luces de  Strobe Apagadas
xp.setInt(dref_smoking,1) --Luces de  No fumar Encendidas
xp.setInt(dref_TransP,2) --Luces de  Transponder Modo Stand By
xp.setInt(dref_belts,1) --Cinturon de seguridad  Encendidas
xp.setInt(dref_beacon_lights,1) --Luces de Faros Encendidas
end

Y este seria el código de Frenar después de Aterrizar

Código:
function braking()
ALTG= xp.getDataref("sim/flightmodel/position/y_agl")
get_ALTG=xp.getFloat(ALTG)
get_ALTG_ft = get_ALTG*3.28 -- Meters to Ft
IAS=xp.getDataref("sim/cockpit2/gauges/indicators/airspeed_kts_pilot")
get_IAS=xp.getFloat(IAS)

-- Logica : si el avion esta en el piso y la velocidad esta entre 30 y 80 aplicar los frenos al maximo
if(get_ALTG_ft < 3)  then
    xp.commandOnceByName("sim/flight_controls/speed_brakes_down_all")
if ( get_IAS < 80) and ( get_IAS > 30) then
xp.commandOnceByName("sim/flight_controls/brakes_max")
end
end

La función FLARE que es la que quiero en verdad Perfeccionar es la siguiente

Código:
function flare()
AUTOPILOT = xp.getDataref("sim/cockpit/autopilot/autopilot_mode")

ALTG= xp.getDataref("sim/flightmodel/position/y_agl")
get_ALTG=xp.getFloat(ALTG)
get_ALTG_ft = get_ALTG*3.28 -- Meters to Ft

VSI=xp.getDataref("sim/cockpit2/gauges/indicators/vvi_fpm_pilot")
get_VSI=xp.getFloat(VSI)

IAS=xp.getDataref("sim/cockpit2/gauges/indicators/airspeed_kts_pilot")
get_IAS=xp.getFloat(IAS)

thro=xp.getDataref("sim/flightmodel/engine/ENGN_thro")
get_thro=xp.getFloatV(thro,1,4) --caution here you need to give your engine count : 4 engines -> xp.getFloatV(thro,1,4)

appr=xp.getDataref("sim/cockpit2/autopilot/approach_status")
get_appr=xp.getInt(appr)

EFIS_map_range_selector=xp.getDataref("sim/cockpit/switches/EFIS_map_range_selector")
xp.setInt(EFIS_map_range_selector,0)

EFIS_shows_waypoints = xp.getDataref("sim/cockpit/switches/EFIS_shows_waypoints")
xp.setInt(EFIS_shows_waypoints,0)

EFIS_shows_VORs = xp.getDataref("sim/cockpit/switches/EFIS_shows_VORs")
xp.setInt(EFIS_shows_VORs,0)

EFIS_shows_NDBs = xp.getDataref("sim/cockpit/switches/EFIS_shows_NDBs")
xp.setInt(EFIS_shows_NDBs,0)

if ( get_ALTG_ft < 50 and get_ALTG_ft >10  ) then  -- en 10 sirve
     gain = 0.0001
target_vsi = -100 -- La velocidad Vertical que quiero lograr en este caso - 100 ft/min
delta_vsi = (get_VSI - target_vsi)
       thro1 = xp.getFloatV(thro,1,1) -- Motor 1
       thro2 = xp.getFloatV(thro,2,1) -- Motor 2
       thro3 = xp.getFloatV(thro,3,1) -- Motor 3
       thro4 = xp.getFloatV(thro,4,1) -- Motor 4
       custom_throttle1 = (thro1 - (delta_vsi * gain))
     if (custom_throttle1 > 1) then --- Protejo el Motor uno para que solo llegue hasta el 100 %
       custom_throttle1=1
       end
custom_throttle2 = (thro2 - (delta_vsi * gain))
      if (custom_throttle2 > 1) then --- Protejo el Motor dos para que solo llegue hasta el 100 %
custom_throttle2=1
end
custom_throttle3 = (thro3 - (delta_vsi * gain))
     if (custom_throttle3 > 1 )then --- Protejo el Motor tres para que solo llegue hasta el 100 %
custom_throttle3=1
     end
        custom_throttle4 = (thro4 - (delta_vsi * gain))
    if (custom_throttle4 > 1 )then --- Protejo el Motor cuatro para que solo llegue hasta el 100 %
       custom_throttle4=1
    end
    xp.setFloatV(thro, 1, custom_throttle1, custom_throttle2, custom_throttle3, custom_throttle4)
     elseif (get_ALTG_ft < 5 ) then --- Si ya esta casi en la pista
     xp.setFloatV(speedbreak,1) -- Pongo los Speed Brakes
     xp.commandOnceByName("sim/autopilot/nose_down_pitch_mode")
     custom_throttle1 = 0 -- Corto el Motor 1
     custom_throttle2 = 0  -- Corto el Motor 2
     custom_throttle3 = 0  -- Corto el Motor 3
     custom_throttle4 = 0 --- Corto el Motor 4
     xp.setFloatV(thro, 1, custom_throttle1, custom_throttle2, custom_throttle3, custom_throttle4)
     elseif ( get_ALTG_ft < 9 and get_ALTG_ft >4 ) then  -- en 10 sirve
xp.commandOnceByName("sim/autopilot/nose_down_pitch_mode")
xp.commandOnceByName("sim/autopilot/autothrottle_off")
xp.setInt(AUTOPILOT,0)
end

Bueno a ver donde estan los DESARROLLADORES de ESPAÑA o mejor dicho de que hablan ESPAÑOL ...  Sonreir

Gracias por cualquier ayuda que me puedan brindar.

Carlos Garcia

« Última modificación: 07 Junio, 2011, 22:06:22 por suministros »

07 Junio, 2011, 19:33:38 #1
jorduran
Superusuario
*******
Desconectado Desconectado

Mensajes: 9988



WWW
En línea
Re: Determinar en que fase de Vuelo esta un Avion

Podria ser interesante para que te cantara el checklist o mejor te lo recordara en pantalla, eso podria ser una buena utilidad para evitar aterrizar con la panza o olvidarse de las luces


Un buen aterrizaje es el que sales andando.
Un gran aterrizaje es cuando el avion puede seguir volando.

Telefonica ha cerrado mi WEB sin preaviso.
PHOTOBUCKET A CORTADO LAS FOTOS
07 Junio, 2011, 21:17:46 #2
CarlosGarcia
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 663



En línea
Re: Determinar en que fase de Vuelo esta un Avion

Podria ser interesante para que te cantara el checklist o mejor te lo recordara en pantalla, eso podria ser una buena utilidad para evitar aterrizar con la panza o olvidarse de las luces

Bueno esa es una de las razones del Script.... El pobre avion gritando LANDING GEAR,  LANDING GEAR , LANDING GEAR , LANDING GEAR  Llorar

Es mas ya el Script Me canta en el despegue ( con sonido grabados o con el ATC de X plane cualquiera de las dos formas funciona) los 80 Knots V1 V2 Y VR, Gear Up, Gear Down, Flaps, Positive Rate ...

Calcula para un 757 basado en el peso del avion las velocidades V1 V2 y VR

En fin algunas cosas, o también se pueden mostrar en Pantalla es muy Fácil en GIZMO, solo tienes que hacer por ejemplo

sound.say( "Subir Tren de Aterrizaje" ) -- El ATC dira "Subir Tren de Aterrizaje" con un tono de voz y acento de Norteamericano aprendiendo español.... Cheesy

Y lo incluyes en la parte del código que quieras,

Es mas el nuevo TROJAN 28 de Arnaud (arno54) http://xplane10.files.wordpress.com/2011/05/trojan-nimitz-1.jpg  utiliza esta misma tecnología (software) para simular daños en las partes mecánicas . Y poder reproducir sonidos que no son los estandar en X plane.

Por ejemplo tu puedes reproducir un sonido de explosión en caso de incendio de un motor o un sonido de hielo crujiendo cuando el motor o las alas del avión tienen hielo. En fin se pude Hacer muchas cosas, que con el X plane standar no se Puede.

Hay un ejemplo de GIZMO que es ver el mapa geográfico en pantalla mientras vas volando es excelente con la posición Lat, Lon, Altura y velocidad.  Este es el enlace https://github.com/benrussell/Gizmo-SDK/blob/master/examples/popup/MiniMap/popupMiniMap.lua

El gran problema (para mi) es que no soy programador (soy Administrador de empresas) Y muchas cosas las hago de forma empírica a Prueba y error, y de esta forma es muy difícil y hasta Me enojo conmigo mismo cuando quiero hacer algo y no me sale bien.

La idea con GIZMO es que las cosas son mucho mas fáciles de hacer que con C o Python. De todas formas yo no tengo ningún vinculo comercial con GIZMO o con su creador Ben Rusell ( es mas me retire del foro de X-pilot) por que no me gusta como trata a las personas.

Gracia por Tu sugerencia

Carlos Garcia.
« Última modificación: 07 Junio, 2011, 22:08:31 por suministros »

07 Junio, 2011, 21:33:13 #3
ssemmartin
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 963



WWW
En línea
Re: Determinar en que fase de Vuelo esta un Avion

Yo hace rato he dejado de programar super cabinas 4D y de hacer plugins por falta de tiempo  Cool (no saben cuanto me gustaría algún día poder decir este tipo de frases).
Amigo Suministros: la verdad que no tengo ni idea de los que es un script, solo se usar la PC y de manera bien básica.
Hay un importante foro de desarrollos de aviones y escenarios, seguramente habrá gente muy capacitada que pueda ayudarte.
Yo, por lo pronto, seguiré disfrutando los que USTEDES HACEN.
(mil gracias por HACERLO).


07 Junio, 2011, 23:23:20 #4
cescll
Usuario Ocasional
***
Desconectado Desconectado

Mensajes: 44



En línea
Re: Determinar en que fase de Vuelo esta un Avion

En Python se podrían implementar los condicionales con algo parecido a esto:
Código:
# The states an aircraft can be in
STATES = {"NOT_MOVED" : 0, "TAXYING": 1, "STOPPED": 2, "AIRBORNE": 3}
class Aircraft:
""" Superclass for all aircraft types """
def __init__(self, callsign, XATC):
               .............
# The current state
self.currentState = STATES["NOT_MOVED"]
               ..............
def work(self):
""" This is the main work method for the Aircraft. Subclasses must implement this method to do their stuff periodically. """
# We need to update the state we are in, based on what the aircraft is currently doing
newState = self.currentState
if (self.getAGL() > 1): newState = STATES["AIRBORNE"]
elif (self.getGroundspeed() > 3): newState = STATES["TAXYING"]
elif (self.currentState != STATES["NOT_MOVED"]): newState = STATES["STOPPED"]
if (newState != self.currentState):
self.currentState = newState
self.stateChanged()

return None

(Este código forma parte de un proyecto abandonado de ATC para X-Plane. Autor: Austin Goudge)
La funcion flare( ) tiene más tela, pero parece correcta. Acaso no anda? Qué errores da?

08 Junio, 2011, 00:36:24 #5
CarlosGarcia
Usuario Frecuente
*****
Desconectado Desconectado

Mensajes: 663



En línea
Re: Determinar en que fase de Vuelo esta un Avion

"(Este código forma parte de un proyecto abandonado de ATC para X-Plane. Autor: Austin Goudge)
La funcion flare( ) tiene más tela, pero parece correcta. Acaso no anda? Qué errores da?"

Hola cescll, Estuve mirando el código de tu PLUGIN y esta excelente, muy organizado y limpio Gracias por compartir tus conocimientos.

En cuanto a Tu código (el del ATC), es difícil determinar o mejor dicho diferenciar entre si el avión esta Aterrizando o si el avión esta Despegando solo con este condicional "if (self.getAGL() > 1): newState = STATES["AIRBORNE"]", es decir que solo con la altura no puedo determinar el comportamiento del avión por eso hay que tener en cuenta la Velocidad y la velocidad vertical.

Para al aterrizaje estoy teniendo en cuenta un condicional de si el avión se encuentra en APPR es decir ENGAGE en LOC y GS. de esta forma estoy completamente seguro que el avión esta Aterrizando y no en ninguna otra fase del vuelo.

El problema de Flare es bastante complejo. Muchas veces el avión va descendiendo bien, y ajustando la potencia del motor para disminuir la velocidad Vertical para alcanzar una velocidad vertical de -100 ft/min.

Pero muchas veces el avión acelera mucho y no alcanza a tocar la pista y esta AIRBORNE nuevamente.
Como un ingeniero aeronáutico de X Pilot me dijo "que solo con modificar la potencia del motor no vas a lograr que este disminuya la velocidad vertical, tienes que tener en cuenta la ACTITUD del avión y no solo la altitud y la potencia del motor, hay que hacer Override de algunos parámetros del piloto automático para el el avión logre hacer un Flare consistente" Al momento este ingeniero esta trabajando en un proyecto propio y la información me me da es muy poca.

En el mejor de los casos el avión toca la pista de -250 a -180 ft / min. partiendo que si dejo que aterrice solo y con el piloto automatico de X plane me da lecturas de -600 a -700 ft/min pues he logrado algo pero falta mucha tela por cortar.

Gracias

Carlos Garcia
« Última modificación: 08 Junio, 2011, 00:44:49 por suministros »

15 Junio, 2011, 16:28:17 #6
bmovie67
Usuario Ocasional
***
Desconectado Desconectado

Mensajes: 32


"En casa del herrero...buenas son tortas"



En línea
Re: Determinar en que fase de Vuelo esta un Avion

No serás programador, pero valiente si eres...Yo me he perdido varias veces leyendo tus post's. ¡¡Suerte !!

Tags:
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

www.x-plane.es.
Página creada en 0.106 segundos con 20 queries.