Extensiones de la simulación - plaa/Modular GitHub Wiki
Esta página describe las características o ejemplos introducidos en OpenRocket versión 1.1.6. Las versiones más recientes del programa pueden tener diferentes funcionalidades o diseños de ejemplo. |
Las Extensiones de la simulación es una forma avanzada de monitorizar e interactuar con la simulación del vuelo mientras se está ejecutando. Estas extensiones se integran mediante la definición de unos enlaces a otros programas externos personalizados que son invocados en determinados momentos durante la simulación. OpenRocket permite obtener un control total del vuelo del cohete durante la simulación. Esto permite por ejemplo simular ráfagas de viento, activar mecanismos de control, o realizar cálculos adicionales con otros parámetros del vuelo en tiempo real.
La utilización de las Extensiones de la simulación requiere un amplio conocimiento del entorno de programación en Java y saber cómo utilizar la línea de comandos.
Los pasos básicos para la implementación y el uso de las Extensiones de la simulación son los siguientes:
- Implementar la Extensión de la simulación en Java.
- Compilar el archivo de Clases de Java.
- Iniciar OpenRocket e incluir el archivo de Clases en el directorio de clases.
- Añadir la Extensión a la simulación y ejecutarla.
El siguiente ejemplo muestra cómo simular el inicio de un lanzamiento en el aire a 1000 metros de altitud.
Primero necesitamos implementar la Extensión de la simulación en Java. El siguiente código puede encontrarlo en el archivo "AirStart.java":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import net.sf.openrocket.simulation.SimulationStatus; import net.sf.openrocket.simulation.exception.SimulationException; import net.sf.openrocket.simulation.listeners.AbstractSimulationListener; import net.sf.openrocket.util.Coordinate; /** * Extensión de la simulación que lanza un cohete desde una altitud específica. */ public class AirStart extends AbstractSimulationListener { /** Altitud de lanzamiento en metros */ private static final double ALTITUDE = 1000.0; @Override public void startSimulation(SimulationStatus status) throws SimulationException { Coordinate position = status.getRocketPosition(); position = position.add(0, 0, ALTITUDE); status.setRocketPosition(position); } } |
Las Líneas 1-4 importan las clases necesarias para utilizar las clases de OpenRocket.
La Línea 9 define la clase AirStart. La clase que expande la clase AbstractSimulationListener, que es la forma recomendada de definer los Extensiones de la simulación. Esto permite una major compatibilidad en el future, y le permite reutilizar el código e implementar solo los métodos relevantes que necesite.
La Línea 12 define una constante que contiene la altitud de lanzamiento. Actualmente OpenRocket no soporta la configuración de los Extensiones de la simulación, por lo que todas las propiedades de los Extensiones deben declararse en la codificación o leerse desde alguna fuente externa.
Las Líneas 14-15 reescriben el método startSimulation. Este método es invocado al inicio de la simulación. Este es el lugar indicado para configurar las condiciones iniciales de la simulación. El método toma el objeto SimulationStatus como argumento, el cual contiene todos los detalles de la posición del cohete, orientación y movimiento, así como todos los detalles de la simulación. Esto puede modificarse libremente para ajustarse a las necesidades de personalización.
Las Líneas 16-18 contienen la implementación real del procedimiento air-start. En la línea 16 tomamos la posición actual del cohete mediante una coordenada cartesiana de tres dimensiones (lacual debería establecerse en el origen (0,0,0)). En la línea 17 añadimos la altitud de lanzamiento al eje Z, que corresponde a la altitud sobre la superficie terrestre. Finalmente en la línea 18 establecemos dicha posición en el objeto SimulationStatus.
Una vez que se haya implementado la Extensión, es necesario compilarla en Java. Esto requiere disponer del directorio de clases de OpenRocket para que la dependencia de clases sea conocida. Asumiendo que el archivo JAR de OpenRocket y el archivo AirStart.java están en el mismo directorio, el archivo puede compilarse por ejemplo en la línea de comandos (Inicio->Ejecutar) con: r
$ javac -cp OpenRocket-1.1.6.jar AirStart.java
Esto genera el AirStart.class, que es el archivo de clases compilado.
Seguidamente necesitamos ejecutar OpenRocket con el archivo de clases incluido en el directorio. La ejecución de las clases al inicio necesita ser definido explicitamente, porque al utilizar la opción -jar podría sobreescribir el camino a las clasesoption would override the classpath set on the command line. From the command line:
$ java -cp OpenRocket-1.1.6.jar:. net.sf.openrocket.startup.Startup
Finalmente necesitamos añadir la Extensiñon a la simulación. Abra el ejemplo de diseño Three-stage rocket. Genere una nueva simulación que utilice la configuración de motor [C6-5;]. Entonces abra la pestaña de las Opciones de la simulación, y haga clic en Añadir debajo de Extensiones de la Simulación. Teclee dentro AirStart, haga clic en OK y ejecute la simulación.
Debería obtener un apogeo a una altitud entre 1400-1500 metros. Cuando saque un gráfico de la simulación, el cohete despega desde una altitud de 1000 metros, sube hasta 1450 metros, y finalmente desciende hasta los 0 metros.
En el paquete de OpenRocket se incluye una versión de este ejemplo que puede utilizarse directamente con el nombre net.sf.openrocket.simulation.listeners.example.AirStart. El código fuente es available in SVN.
Las Extensiones de la simulación pueden actuar y modificar el estado de un cohete en cualquiera de los siguientes instantes (los nombres de los métodos están indicados entre paréntesis):
- Antes y después de la simulación (startSimulation, endSimulation)
- Antes y después de un único paso de la simulación (preStep, postStep)
- Antes de añadir un evento del vuelo a la cola de eventos (addFlightEvent)
- Antes de producirse un evento del vuelo (handleFlightEvent)
- Antes de cualquier ignición de motor (motorIgnition) o despliegue del Sistema de Recuperación (recoveryDeviceDeployment)
- Antes y después de cualquier cálculo (pre<em>Xyz</em>, post<em>Xyz</em>)
El método recomendado para implementar las Extensiones es ampliando la clase AbstractSimulationListener. Esta clase implementa todos los métodos con implementaciones abstractas que no hacen nada. En futuros desarrollos las interfaces pueden aumentar o cambiar significativamente, pero las clases abstractas contendrán llamadas antiguas perfectamente compatibles.
Los métodos pueden ser de tres tipos dependiendo de los valores que devuelven.
- Las instrucciones startSimulation, endSimulation y postStep son ejecutadas en un punto específico de la simulación. Son métodos de tipo void, es decir, que no devuelven valores.
- La instrucción preStep y las que están relacionadas con eventos devuelven un valor booleano (verdadero o falso) indicando si la acción será realizada o no. Un retorno de valor verdadero indica que la acción deberá realizarse como normalmente se debería de ejecutar (valor por defecto), y un valor falso anulará la acción.
- Los métodos previos y postetiores a la computación pueden devolver el valor calculado, que puede ser un objeto o un valor doble. Los métodos previos a la computación permiten establecer a cero (vaciar) todos los cálculos, mientras que los métodos posteriores a la computación permiten establecer valores (argumentos) para los cálculos. Estos métodos pueden devolver un valor null o Double.NaN según sea si se van a utilizar los valores originales (por defecto), o para devolver un valor reescrito.
Cada método de la Extensión también puede provocar una SimulationException. Esto se considera un error durante la ejecución de la simulación, y provoca que se muestre un cuadro de diálogo emergente al usuario con el mensaje de la excepción. Por tanto los datos de la simulación no se almacenan. También puede provocar un RuntimeException que se considera un error en el programa, y se mostrrá el mensaje de error.
Si una Extensión de la simulación quiere detener la ejecución de la simulación sin provocar una condición de error, necesita añadir un evento del vuelo o un tipo SIMULATION_END a la cola de eventos de la simulación:
status.getEventQueue().add(new FlightEvent(FlightEvent.Type.SIMULATION_END, status.getSimulationTime(), null));
Esto provocará que la simulación termine de forma normal.