¿Cómo optimizar el tiempo de ignición para una quema en órbita y/o una fase de inercia en ascenso?

He estado jugando con las leyes de orientación basadas en la tangente lineal (específicamente la antigua guía Atlas-Centaur Surveyor, Apollo IGM y el código PEG del transbordador espacial) y aunque PEG tiene una opción para una fase de costa antes de la quema final, no hay ningún modo donde el predictor-corrector optimizará esa costa. Parece ser un parámetro externo.

He encontrado documentos como, por ejemplo:

Ping Lu, Brian J. Griffin, Gregory A. Dukeman y Frank R. Chavez. "Orientación y planificación de ascenso rápido óptimo de múltiples quemaduras", Journal of Guidance, Control, and Dynamics, vol. 31, núm. 6 (2008), págs. 1656-1664.

Pero sacar las entrañas del algoritmo PEG y reemplazarlo con un enfoque como ese va a ser bastante agresivo (y no estoy seguro de que sea capaz de hacerlo ahora). Tampoco necesito necesariamente la optimización hasta el último dV de combustible, y la simplicidad y la convergencia serían más importantes para mí, por lo que los algoritmos que la NASA usa actualmente son probablemente más extensos de lo que estoy pidiendo.

Sospecho que hay algunos algoritmos simples de la era de finales de los 60 y principios de los 70 para producir respuestas al menos lo suficientemente buenas para:

  • fase de costa antes de la quemadura final a la inserción orbital
  • tiempo de ignición antes de una maniobra de empuje finito en órbita
  • tiempo de ignición antes de una quema de descenso para aterrizar en un cuerpo (sin aire)

Y esta es, en última instancia, una pregunta del Programa Espacial Kerbal. Y desafortunadamente mi último curso de cálculo de variaciones fue hace unos 20 años, así que estoy un poco oxidado en matemáticas.

Entiendo vagamente la teoría del vector primario, y ciertamente parece que la función de cambio bang-bang es lo que me gustaría llegar, pero no sé cómo sacarlo de PEG o cómo conectarlo a PEG. .

Algunas posibles aclaraciones: no creo que me preocupe la optimización de circuito cerrado. Sospecho que lo que quiero está más cerca del algoritmo OPGUID y el algoritmo SWITCH definido en:

Brown, KR, Harrold, EF y Johnson, GW 1969. Optimización rápida de vuelos de cohetes de combustión múltiple. Informe técnico NASA CR-1430, NASA, Marshall Space Flight Center.

Lo que no sé es si hay enfoques más simples que podría usar que podrían aprovechar los algoritmos estándar más recientes (más específicamente, ya tengo un enlace con http://www.alglib.net/optimization/ para Levenberg-Marquardt optimizador allí, y tiene muchos otros optimizadores que pueden hacer que resolver el problema de optimización de trayectoria sea mucho más simple, pero no tengo experiencia para saber qué podría ser útil).

Y creo que mi pregunta se reduce a si debo sumergirme en los algoritmos OPGUID y SWITCH, y en docenas de páginas de código Fortran que son más antiguas que yo, o si hay una forma más simple y moderna de hacer esto que yo estoy perdido? Sujeto a la restricción externa de que hasta ahora he tenido más éxito en la implementación de viejos TD de la NASA que en los algoritmos de la literatura.

¡Las aclaraciones son útiles!+1

Respuestas (1)

Aquí hay diagramas de bloques disponibles para el código PEG-4 que se ocupan de las maniobras de onorbit y deorbit:

https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19760024151.pdf

Es necesario en el código TURNR tener el límite máximo de phi a < 45 grados. Y también es necesario implementar la limitación de magnitud lambdaDot_xz a 0,35 de la frecuencia de Schuler en la quema. Hay más detalles en el artículo de 1979 sobre el algoritmo PEG:

https://ntrs.nasa.gov/search.jsp?R=19790048206

El código del transbordador usó algunas subrutinas llamadas LTVCON y TRANSTIME para manejar la orientación de la costa quemada para integrarse a través de la quemadura y la costa, incluidos los efectos J2 de la oblación de la Tierra, para alcanzar el objetivo ar, v.

Lo que encontré es que es suficiente (en KSP) para implementar en el corrector:

  1. proyectar rp en el plano iy objetivo normalmente
  2. establecer rd = rp (sin restricción en la posición de quemado)
  3. calcule el ángulo con signo entre rd y el periapsis de la órbita objetivo para obtener la verdadera anomalía de la posición de quemado (la cruz del periapsis rd debe estar en la dirección -iy; el producto escalar de eso con -iy debe ser positivo; de lo contrario, invierta el signo en el ángulo)
  4. establezca vd igual a la velocidad de la órbita objetivo en esa anomalía verdadera
  5. establezca la ganancia igual a 1.0 (ya que no hay integración a través de ninguna fase de costa)

La mayor parte de la complejidad de LTVCON y TRANSTIME parece estar relacionada con el uso del predictor preciso en el código de transporte para tener en cuenta los efectos J2 durante la fase de costa (o la mayor parte de la fase de costa, ya que la posición de agotamiento cambia debido a PEG el tiempo de la costa varía según la costa delta y creo que se alimenta a través de una predicción precisa con J2 = 0, ¿probablemente por razones de eficiencia numérica o razones de estabilidad numérica?). También estoy algo desconcertado por las constantes C1 y C2 en la rutina LTVCON (particularmente para qué se usa C1).

Para el tiempo de espera, descubrí que simplemente liderar la quema por tgo/2 funciona bien, aunque podría no ser perfectamente óptimo. Sospecho que dejar que PEG se ejecute continuamente y luego ejecutar la quema en J/L antes de la quema podría ser un poco más preciso (en ausencia de un mejor planificador de trayectoria basado en el cálculo de variaciones).

ACTUALIZACIÓN: creo que entiendo un poco mejor ahora que las restricciones lambdaDot_xz en la rutina TURNR se usan para Abort Once Around y deorbit burns. Lo que terminé haciendo fue usar la rutina TURNR estándar que calcula rgo desdergo = rd - ( r + v * tgo + rgrav ) + rbias(que usa rd, que es donde creo que la restricción de posición retroalimenta la rutina) y luego calcula lambdaDot normalmente y usa las integrales de empuje rthrust y vthrust. Donde me encontré con la dificultad es que incluso 50-60 segundos después del final de la quema, el cálculo de lambdaDot se vuelve completamente inestable. Terminé sujetando lambdaDot a 0.35 * el valor de frecuencia de Schuler, por lo que la abrazadera se aplica a lambdaDot y se vuelve cero cuando tgo se vuelve cero. Forzar esa abrazadera a lo largo de todo el quemado (como lo hace la desorbitación o AOA) significaba que la ubicación del quemado tenía un gran valor de polarización, por lo que no era precisa.

C1 y C2 son coeficientes en una ecuación lineal que establece la relación entre la velocidad horizontal y vertical: V(vert) = C2 * V(horiz) + C1. Para la quema del transbordador OMS1 u OMS2, el punto objetivo siempre fue un punto de apogeo o perigeo, lo que implicaba que la velocidad vertical era cero. Por lo tanto, C1 y C2 deben ser cero. Para una quema de salida de órbita, la velocidad vertical debe ser un número negativo en El, que es el punto objetivo. Para maniobras de salida de órbita, C1 sería un número positivo grande y C2 estaría entre 0 y -1. Una salida de órbita de una órbita de 150 nm podría tener C1 = 15 434 y C2 = - 0,6200.
Todavía me falta algo porque ¿por qué no solo tienes C2 y luego pones la velocidad horizontal en el objetivo y luego lees la velocidad vertical y estableces C1 = 0?
Recuerdo algo sobre ?guía?Tgo?Vgo? dejando de converger hacia el final de una quema de Shuttle OMS. Veré lo que puedo encontrar.
Para que quede claro, existe la inestabilidad de la guía terminal normal que ocurre con PEG y requiere soltar la abrazadera de posición (rd = rp) 40 segundos antes del final de la quema, y ​​luego toda la guía activa parece realmente necesitar terminar 10 segundos antes del final de la quemadura Esta era una inestabilidad adicional además de eso. (También encontré más referencias en C1 y C2 y creo que estoy empezando a entenderlas mejor)
@OrganicMarble en la página 40 Jaggers analiza problemas en los últimos 40 segundos de una quema de OMS en las integrales J y Q: ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19760020204.pdf
Descubrí que accidentalmente eliminé la abrazadera stop-updating-lambdaDot-en-los-últimos-40 segundos de mi código, pero aún no explica del todo cómo lambdaDot se volvió loco antes de que faltaran 40 segundos, aunque estoy empezando a sospechar que 40 segundos estaban sintonizados con el transbordador y sus motores.
También me encontré con una declaración en un documento que PEG se basa en la detección correcta de la aceleración en la fase terminal para evitar la inestabilidad, y localicé un error de errores que tenía alrededor de eso. No estaba contando vgo regresivamente durante la fase terminal real usando solo dV detectado e implementando eso (para que pudiera verlo funcionando sin que PEG lo corrigiera) y corrigiendo errores hasta que vgo llegó a 0.1 cuando tgo llegó a 0.0 todo se volvió mucho más estable y orbita se volvió más preciso.