Dados los pequeños recursos computacionales, ¿cómo se implementó la navegación? (No son muestras de software de guía antiguo)

Actualización 2 : El video de youtube Cómo dirigió la NASA el Saturno V responde a esta pregunta y algo más, algo que debe ver.

Actualización : Realmente quería saber cómo funcionaban las computadoras de navegación de naves espaciales (no de orientación), dados los pequeños recursos computacionales. Pregunté en otra pregunta y edité esta pregunta para limitar las respuestas a ejemplos de código fuente de software de guía antiguo. Para aquellos interesados ​​en muestras de software de guía antiguo, consulte Muestras de software de guía antiguo que utilizan recursos computacionales en la Tierra implementando la navegación en el espacio . Dejando el original (pregunta incorrecta a continuación como estaba para que las respuestas no parezcan irrelevantes).

En un artículo me encontré con algo así como "X usó un programa de hardware para la misión Venus con 65 KB (¿no estoy seguro si este número es correcto?) de memoria".

Soy desarrollador de software y con todos los recursos disponibles en la actualidad, no puedo imaginar dónde se podría siquiera comenzar con tal esfuerzo.

¿Hay un archivo (museo) de software antiguo/antiguo que fue escrito (hard o soft) para misiones interplanetarias? si hay algo en un nivel más alto que el ensamblaje o el equivalente en los lenguajes de programación Java, Pascal, C #, etc. de hoy en día sin tener en cuenta el uso de la memoria y el disco, entonces eso sería aún mejor.

Por lo poco que entendí parece una tarea equivalente a la construcción de pirámides con herramientas primitivas. ¿Hay alguna simulación o herramienta para que un programador simplón de hoy en día pueda echar un vistazo y apreciar lo que hicieron esos gigantes?

El intercambio de información por dispositivos que son "inherentemente capaces de lanzar armas nucleares" generalmente está mal visto. IIRC, hay tratados en contra.
@Mazura, ¿cuál es la relación entre guiar a Venus o Marte que tiene que ver con las armas nucleares? Muchos países de dos bits tienen acceso al software de guía de misiles. Esta pregunta es sobre cómo diablos alguien puede hacer un programa de hardware con 65kb donde el bloc de notas de Windows es de 244kb. Qué hay de malo con eso ?
La relación es que tanto las 'sondas espaciales' como los misiles balísticos intercontinentales deben abandonar la Tierra primero. - "Muestras de software de guía antiguo" para un Saturn-V... que no encontrará.
@Mazura eso es genial, fue solo después de una explicación de cómo diablos con 65 KB se puede guiar una sonda interplanetaria cuando el bloc de notas de Windows tiene 244 KB, asumí que puede detectar su posición relativa al sol o a su destino final Marte, Neptuno, Venus, qué alguna vez. La cantidad de cálculos necesarios es demasiado para un programa pequeño. Gracias a la respuesta aceptada se resuelve el misterio, es un sistema de guiado y no de navegación. Lo confundí con que también hace navegación además de guía. El sistema de guía es un sistema de control simple.
@Arjang, es posible que el software de transferencia orbital no sea adecuado para los misiles balísticos intercontinentales, pero estoy bastante seguro de que el software de guía de reentrada de Apolo sí lo es.
@Mark gracias, ¿Apolo no fue guiado por los astronautas? No pensé que estaba completamente automatizado. Mi punto de partida fue cuando escuché sobre la teoría de la accesibilidad, o cómo supieron que pueden aterrizar dos sondas de Marte en los lados opuestos de Marte.
@Arjang Para ser honesto, la respuesta aceptada actual no responde a la pregunta "Muestras de software de orientación antiguo". Le sugiero que edite la pregunta para que refleje mejor lo que realmente quería saber (cómo funcionan las computadoras de guía de naves espaciales, dados los pequeños recursos computacionales) o pregunte eso en otra pregunta y edite esta pregunta para limitar las respuestas a ejemplos de software de guía antiguo. código fuente. De esta forma, los futuros visitantes encontrarán lo que esperan del título de la pregunta.
Incluso algo simple como el bloc de notas tiene una gran cantidad de capas de compatibilidad con el sistema operativo, la interfaz gráfica de usuario y otras bibliotecas en las que se basa... Está escrito en un lenguaje de nivel bastante alto, dirigido a la plataforma x86 bastante compleja y tiene una sorprendente cantidad de funcionalidad. Cuando empiezas a ensamblar y optimizar el tamaño, puedes hacer cosas increíbles, por ejemplo, theverge.com/2012/5/14/3014698/assembly-4k-demoscene-fractals
Los pequeños procesadores todavía están vivos y bien; probablemente tengas varios, especialmente si tienes un automóvil. Por ejemplo, la familia de chips PIC10 tiene hasta 896 bytes de almacenamiento de código y 64 bytes (sí, bytes) de RAM. Si está comprando a granel, cuestan alrededor de 30 centavos cada uno.
@Ludo: Sí, tienes razón, estoy agregando una nota de edición. Tengo miedo de editar la pregunta ya que de otros sitios de SE he aprendido que no es justo hacer que las respuestas a la pregunta original parezcan irrelevantes.
@Baldrickk: santo infierno, sí, eso es más parecido, no tenía idea de por qué uno intentaría ahorrar espacio en una PC, y mucho menos hay competencias para ello. Gracias por el enlace.
@Arjang, además del Apolo 13, el vuelo manual durante el Apolo consistió en 1) el aterrizaje final en la Luna, 2) el acoplamiento del Módulo de Comando y el Módulo Lunar, y 3) varios cambios menores de actitud. El reingreso atmosférico, en particular, estaba completamente automatizado, aunque practicaron procedimientos manuales en caso de que la computadora de guía dejara de funcionar.
Nadie 'voló' el transbordador espacial tampoco. Y, sin embargo, la gente se queja de que otros usan MechJeb (piloto automático) en el Programa espacial Kerbal.
Reclamar el título de "desarrollador de software" sin entender cómo un código eficiente puede resolver pequeños problemas es más que un poco dudoso, y quizás evidente de cuán ineficientes son muchos de los hábitos actuales. Realmente no hay sustituto para comprender el problema y comprender la máquina que está disponible para resolverlo.
Como programador, le recomiendo encarecidamente que pruebe la programación de microcontroladores. Un Arduino es una gran introducción. El modelo básico tiene 1k de RAM. Te sorprendería lo mucho que puedes lograr con 1k de RAM. La gente ha escrito de todo, desde controladores de cuadricópteros (drones), receptores de radiocontrol, controladores de robots ambulantes hasta software de guía/navegación de piloto automático de aviones, todo en 1k de RAM. Empecé a programar microcontroladores con el PIC16F84 que tiene 68 bytes (sí, bytes, no kilobytes) de RAM e implementé muchos proyectos con él.
Eres demasiado joven, no te das cuenta de lo que solíamos hacer en los viejos tiempos con un mínimo de memoria. Sin todo el bagaje de los programas y bibliotecas modernos y cuando se escribe en ensamblador se puede hacer mucho con muy poca memoria, muy a menudo los datos ocupan mucho más que el código. He escrito múltiples programas útiles por debajo de 1k.
El código de máquina que no se preocupa por nada más que el trabajo en cuestión es increíblemente poderoso. Incluso los microprocesadores antiguos de 8 bits funcionaron de maravilla. Un amigo escribió un programa de puntaje de baloncesto que manejaba dos pantallas de puntaje numérico, realizaba un seguimiento de los puntajes y el cronometraje y algo más en 512 BYTES . | Una vez pude ingresar en un teclado hexadecimal el código de máquina (no ensamblador) para un programa de mensaje móvil alfanumérico (de algún tipo) que se muestra en una pantalla multiplexada numérica de 7 segmentos más su mensaje "fuera de mi cabeza". Probablemente unas pocas docenas de bytes de código real. [86DD, B70120, CE.... - :-)]
@Mazura cada aterrizaje del transbordador se realizó a mano.
@Mazura: ¿Eso significa que el tamaño del programa de guía para el transbordador era de 0 bytes (no es necesario)? Supongo que toda la navegación se hacía por tierra.
¿Qué sistema(s) operativo(s) se utilizaron en el transbordador espacial? - Todo se ejecutó en 400k líneas de código. IIRC, el PASS que se ejecutó en los 4 cpus fue de ~ 40k líneas. El BFS eran 1000 líneas de código, nunca usadas, que podrían haberlo hecho. Ambos fueron probablemente los mejores programas jamás escritos. ("Tampoco es del todo correcto que "nunca se usó": sus funciones SM se usaron durante el ascenso y la entrada". - Organic Marble)

Respuestas (6)

En muchas de las primeras sondas, hasta cerca de Apolo, no había verdaderas computadoras en las sondas espaciales. Toda la computación se realizó en la Tierra y la electrónica a bordo se conocía como secuenciador, para Pioneer 10 tenía 222 comandos posibles, 5 de los cuales podían prepararse. Las primeras sondas de Venus enviaban datos cambiando mecánicamente diferentes sensores para modular un transmisor de CW a su vez y clasificándolo todo en la Tierra.

Esto también se aplicó a gran parte del proceso de lanzamiento de Apollo, donde el hardware en la plataforma de lanzamiento no ejecutó un verdadero software sino una secuencia (desde aquí ) de 'espera, activa esto, espera, mide eso y si está fuera de los límites, espera, continúa'. .

Junto con el enlace de código AGC de Ludo, puede ver el controlador de cancelación como un ejemplo a menor escala de cómo se hicieron las cosas (bucle fijo de pasos y tiempos conocidos).

Incluso hoy en día, es muy raro enviar un código a una nave espacial que no se reduzca a una secuencia de instrucciones muy específicas que deben ejecutarse en orden. Curiosity tiene cierta capacidad de navegación autónoma y toma de fotografías, pero generalmente el código de bifurcación está ahí para desencadenar un retroceso/a prueba de fallas 'ups, detener, resolver el problema de orientación de la antena y llamar a casa para obtener instrucciones' en lugar de IA o código de aprendizaje.

En términos generales, el código se hizo para adaptarse a la misma forma en que la gente programa hoy en día para los microcontroladores:

No tener ningún tipo de interfaz de usuario en código (Apollo DSKY era en gran parte hardware)

Usando aproximación o matemáticas enteras sobre punto flotante (muchas cosas son posibles donde pi = 3) o precalcule constantes en la Tierra y cárguelas cuando sea necesario (por ejemplo, gravedad o rendimiento del motor)

Diseño personalizado de hardware de soporte como rastreadores de estrellas para ser precargados con constantes de la Tierra y para generar una salida preformateada y encuadernada verificada para el siguiente paso de procesamiento. De hecho, los límites verifican solo una vez, dónde se obtienen los datos y aseguran que ningún paso siguiente pueda desbordarlos.

Diseñe algoritmos para trabajar en registros en lugar de ubicaciones de memoria (lo que hace que la fuente sea horrible ya que no tiene variables), pero significa que puede evitar muchos valores móviles dentro y fuera de la memoria.

Evite los problemas generales para lo específico, para las naves espaciales se trataba de navegación, informes de estados de sensores/instrumentos y orientación. Todos estos podrían tener un código cuidadosamente elaborado que funcionó bien en un rango específico de entradas ( Aunque ver ).

Confíe en sus datos (en sentido de seguridad) ( aunque la naturaleza aún puede atraparlo )

"Curiosity tiene cierta capacidad de navegación autónoma y toma de fotografías, pero generalmente el código de bifurcación está ahí para desencadenar un 'ups, detener, resolver el problema de orientación de la antena y llamar a casa para obtener instrucciones' en lugar de IA o código de aprendizaje". Bueno, Mars Pathfinder (de los años 90) tenía un sistema operativo en tiempo real ( VxWorks ) con suficiente complejidad de programación de tareas como para tener un problema de inversión de prioridad . Complejo, Complejo.
No necesitas una computadora que pueda ejecutar Space War cuando estás volando una nave espacial real :)

(respondido originalmente a "Ejemplos de software de guía antiguo")

Lo primero que me viene a la mente es el repositorio Github de la Computadora de Orientación (AGC) del Apolo 11 . El repositorio tiene el software Command Module y Lunar Module, pero tenga en cuenta que se transcribe de copias impresas, por lo que es posible que no esté completamente completo (todavía). Puede encontrar un simulador de AGC en el sitio web de Virtual AGC (también hay muchas otras referencias).

Soy desarrollador de software y con todos los recursos disponibles en la actualidad, no puedo imaginar dónde se podría siquiera comenzar con tal esfuerzo.

Hay muchos sistemas basados ​​en computadora hasta el día de hoy que tienen que vivir con tales limitaciones. Hay muchos sistemas integrados en los que 2^16 (65536) bytes de memoria siguen siendo un lujo. Después de todo, en las máquinas que usan direcciones de memoria de 16 bits (muchas de las cuales todavía existen y todavía se fabrican hasta el día de hoy), no tiene sentido tener más de 65636 bytes de memoria. Y así como no hay problema con una computadora con direcciones de 64 bits que tienen menos de 18+ exabytes de memoria, no hay problema con una computadora que usa direcciones de 16 bits que tienen menos de 2^16 bytes de memoria.

Hay muchas maneras de comenzar con tal esfuerzo. La regla número uno es evitar el uso de un sistema operativo. Muchos (¿la mayoría?) de los sistemas integrados son máquinas desnudas . No hay sistema operativo, y solo hay un programa ejecutándose, siempre. Su horno de microondas tiene una computadora que funciona como un sistema integrado y no tiene sistema operativo. Si su automóvil se fabricó en los últimos 25 años o más, tiene muchos sistemas integrados ejecutándose. Si su automóvil se parece a lo moderno, tiene varias docenas de microcontroladores que, en conjunto, ejecutan varios millones de líneas de código.

Muchos de los microcontroladores de un automóvil moderno no están sujetos al límite de direcciones de 64K (2^16 o 65536). En el pasado, ese era un límite muy común e inherentemente limitaba el tamaño de la memoria. Pero no limitó el almacenamiento. El problema de que el tamaño del disco supere las limitaciones de direcciones se resolvió en las décadas de 1950 y 1960. Una solución común era utilizar superposiciones de memoria . Esta técnica, que me alegro de haber olvidado (en su mayoría), sigue siendo común hasta el día de hoy en la programación de sistemas integrados.

Otra técnica ampliamente utilizada fue y es hacer que la máquina integrada siga una arquitectura de Harvard en oposición a una arquitectura de von Neumann . No hay distinción entre código y datos en una máquina de Von Neumann. El código y los datos son cosas muy diferentes en una máquina de arquitectura Harvard, posiblemente con diferentes tamaños de palabra. Lo más probable es que su computadora portátil o de escritorio sea una máquina de arquitectura von Neumann, al menos en la superficie. En el fondo, se parece más a una máquina de Harvard, con cachés separados para código y datos.

Sí, debería haber dicho desarrollador de aplicaciones en PC con cantidades (casi) ilimitadas de todo, se olvidó de los sistemas integrados y todos sus desafíos para una memoria y almacenamiento extremadamente limitados. No debería estar diciendo "Soy un desarrollador de software" tan a la ligera.
Cuando era estudiante de física salió el HP-25; podría contener 49 pasos de programa. Lo programé para que actuara como un módulo de aterrizaje lunar, donde el usuario ingresaba la duración de la quemadura y el empuje. Todas las constantes físicas, masa del módulo de aterrizaje, masa de combustible, velocidad inicial y altitud eran correctas. Ignoré el control de actitud / vector, pero el punto es que eran 49 pasos y correctos. Y fue condenadamente difícil aterrizar. ¡Neil Armstrong fue un gran piloto!

La forma en que se implementó en el mundo ICBM fue que había seis personas sentadas alrededor de una mesa que diseñaban las rutinas matemáticas y la arquitectura general, la codificación detallada del componente del programa y el hardware de la computadora, todo al mismo tiempo. Cinco líneas de código por día se consideraban un buen día de trabajo. La mayor parte del tiempo se dedicó a discutir si hacer algo con hardware o software. Los circuitos integrados habían avanzado hasta el punto de disponer de registros de cuatro bits. Fueron utilizados para los dos registros de la CPU.

No había memoria direccionable en el sistema en el que trabajé. Solo un disco con un montón de cabezales fijos. El código fue registrado en el disco. Había un bus superior e inferior y dos registros de una palabra de longitud, pero era una palabra grande.

Terminó habiendo cuatro programas que podrían intercambiarse mediante el cambio de datos remoto. Solo uno era para vuelo, los otros eran programas terrestres.

El hardware hizo la mayor parte del trabajo, cosas como matemáticas de matriz de 3 x 3 se realizaron con algunas instrucciones de microcódigo que dieron como resultado que una nueva matriz reemplazara a una anterior en la misma ubicación en el disco.

La CPU a menudo tenía áreas que no se usaban durante estas instrucciones más largas, por lo que podían colar pequeñas sumas, restas, multiplicaciones y divisiones en el medio. Estas instrucciones solo cambiaron pequeñas partes de la CPU, y había MUCHAS instrucciones disponibles. Solo tenía que asegurarse de que todo estuviera en el lugar correcto en el disco para que estuviera disponible cuando hubiera un poco de tiempo libre. Tenían cinco instrucciones diferentes para dividir dos números, difiriendo solo en la ruta y el tiempo del proceso dentro de la CPU para evitar colisiones con otros cálculos en curso. Muchas de las funciones de contabilidad se realizaron de esta manera.

La parte realmente divertida era que podías comenzar una instrucción larga antes de tener todos los números para completarla. Mientras molía en la parte delantera, podía iniciar una operación de suma y dejarla en un registro para que la instrucción larga la encontrara más tarde. Incluso podría escribirlo en el disco. Estos fueron un verdadero placer para rastrear y depurar.

La computadora de navegación tuvo que manejar tres señales de salida para dirigir el cohete. No sabía nada de puesta en escena ni nada más. Tenía una tabla que decía que debería ver los conteos del acelerómetro de x, y, z en el tiempo t (los pulsos acumulados igualaban la velocidad del eje del acelerómetro). Comparó los conteos reales con la tabla preprogramada y calculó nuevas señales de dirección.

La conclusión es que los programadores tenían un objetivo bastante limitado y tenían un mapa completo de la CPU en su cabeza y podían seguir toda la operación de la CPU en su cabeza a medida que se ejecutaban los componentes del programa.

No estuve en la fase de diseño, pero uno de los muchachos que estaban sentados en la mesa me entrenó en la CPU y el microcódigo.

Interesante. ¿Para qué misil era esto?
Minuteman. En el momento de su lanzamiento, los sistemas informáticos de MM representaban más de la mitad de la potencia informática de punto flotante del mundo. En realidad, había varias partes diferentes en el sistema. Además de la computadora de vuelo, había una computadora de tierra en cada silo, y una diferente en cada cápsula de mando, además de las que cortaban las cintas de telemetría. El sistema usó el mismo hardware hasta que se disolvió SAC, que fue cuando me fui.

Echa un vistazo al idioma FORTH. No hace distinción entre el código de usuario y el código en el (pequeño) núcleo del sistema operativo. Se utilizó en el firmware de los primeros satélites. Una buena descripción está aquí: https://en.wikipedia.org/wiki/Forth_(programming_language)

Esto está cerca de ser una "respuesta de solo enlace"

Es posible que desee leer este libro: https://www.goodreads.com/book/show/7754526-the-apollo-guidance-computer

La primera mitad es una descripción detallada de la arquitectura de hardware de la computadora de guía Apollo y el software que se ejecuta en ella. Hay algunas discusiones fascinantes sobre las limitaciones del hardware y lo que hicieron los diseñadores para superar esas limitaciones.