¿En qué está integrado el software Mars Curiosity Rover?

544

El rover Mars Curiosity ha aterrizado con éxito, y uno de los videos promocionales "7 minutes of terror" se jacta de que hay 500,000 líneas de código. Es un problema complicado, sin duda. Pero eso es mucho código, seguramente hubo un gran esfuerzo de programación detrás de él. ¿Alguien sabe algo sobre este proyecto? Solo puedo imaginar que es algún tipo de C. incrustado

InfinitiesLoop
fuente
9191
¿Por qué se supone que solo hay un idioma involucrado en el proyecto?
Aparejo
55
Buen punto, claro, probablemente tiene una gran variedad de tecnología asociada. Quiero saber más sobre todo eso :)
InfinitiesLoop
3
¿Qué parte? La nave espacial? ¿El vagabundo? Instrumentos? El sistema de tierra? Como indican otros comentarios, probablemente hay varios idiomas utilizados en los diferentes componentes. No está fuera de duda que el ensamblador se usó para algunos de los componentes críticos.
GreenMatt
67
Para ser honesto, cuando vi la cifra de 500kloc me sorprendí pensando "¿Solo?" Podría haber sido realista si hubiera sido Haskell, pero habiendo leído un poco sobre proyectos anteriores y sus idiomas de bajo nivel, esto parecía demasiado bajo. El código C 2.5mio loc que se cita a continuación es más creíble.
Philip Kamenarsky
19
Una pregunta más interesante que "¿en qué idioma?" es "con qué proceso?" . Es el proceso que marca la diferencia, y la NASA ha estado utilizando uno riguroso durante décadas.
dmckee

Respuestas:

506

Está ejecutando 2.5 millones de líneas de C en un procesador RAD750 fabricado por BAE . El JPL tiene un poco más de información, pero sospecho que muchos de los detalles no se publicitan. Parece que los scripts de prueba fueron escritos en Python.

El sistema operativo subyacente es VxWorks RTOS de Wind River . El RTOS en cuestión se puede programar en C, C ++, Ada o Java. Sin embargo, solo C y C ++ son estándar para el sistema operativo, Ada y Java son compatibles con extensiones. Wind River proporciona una gran cantidad de detalles en cuanto a cómo y por qué de VxWorks .

El chipset subyacente es casi absurdamente robusto . Sus especificaciones pueden no parecer mucho al principio, pero se le permite tener una y solo una "pantalla azul" cada 15 años. Tenga en cuenta que esto está bajo el bombardeo de radiación que mataría a un humano muchas veces. En el espacio, la robustez gana a la velocidad. Por supuesto, la robustez como esa tiene un costo. En este caso, es genial $ 200,000 a $ 500,000.

Un programador de Erlang habla sobre las características de las computadoras y la base de código en Curiosity.

Ingeniero mundial
fuente
48
Estándares de codificación de lenguaje JPL C, específicamente para entornos integrados en lugar de "software básico" como lo llaman. lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf
Patrick Hughes
80
@ Dinámico: es una misión tan importante que la NASA no la arriesgaría. Los humanos que escriben ensambles cometen más errores, eso es un hecho medido.
MSalters
22
El código C compilado es código de máquina, el lenguaje ensamblador es código de máquina, no veo la diferencia. No hay una gran diferencia de rendimiento cuando te pones a ello.
Ramhound
23
La NASA es extremadamente cuidadosa con su código. Todo (TODO) se hace primero en la especificación y se revisa, verifica y refina repetidamente. Cuando se coloca en el flujo de código de vida, es casi un corte y pegado de la referencia de la especificación. Los scripts de prueba reciben al menos tanta atención como el código y no se permiten trucos de código 'llamativos' o inteligentes a menos que sean críticamente necesarios.
Stefan
99
@Amarghosh: sí, y ver lo bien que funciona su teléfono celular cuando se pasa a través de un entorno de alta radiación, tales como el espacio exterior :)
Whatsisname
175

El código se basa en el de MER ( Spirit and Opportunity ), que se basó en su primer módulo de aterrizaje, MPF ( Sojourner ). Son 3,5 millones de líneas de C (gran parte de ellas autogeneradas), que se ejecutan en un procesador RA50 fabricado por BAE y el sistema operativo VxWorks . Más de un millón de líneas fueron codificadas a mano.

El código se implementa como 150 módulos separados, cada uno realizando una función diferente. Los módulos altamente acoplados se organizan en componentes que abstraen los módulos que contienen y "especifican una función, actividad o comportamiento específico". Estos componentes se organizan en capas y "no hay más de 10 componentes de nivel superior".

Fuente: Charla magistral de Benjamin Cichy en el Taller 2010 sobre software de vuelo de naves espaciales (FSW-10) , diapositivas, audio y video (comienza con una descripción general de la misión, discusión de arquitectura en la diapositiva 80).


Alguien en Hacker News preguntó "No estoy seguro de qué significa que la mayoría del código C se genera automáticamente. ¿De qué?"

No estoy 100% seguro, aunque probablemente haya una presentación por separado en ese año o un año diferente que describa su proceso de generación automática. Sé que fue un tema popular en general en la conferencia FSW-11.

Simulink es una posibilidad. Es un componente de MATLAB popular entre los ingenieros mecánicos y, por lo tanto, la mayoría de los ingenieros de navegación y control, y les permite 'codificar' y simular cosas sin pensar que están codificando.

La programación basada en modelos es definitivamente algo de lo que la industria se está dando cuenta lentamente, pero no sé qué tan bien se está dando cuenta en JPL o si hubieran elegido usarlo cuando comenzó el proyecto.

La tercera y más probable posibilidad es para el código de comunicación. Con todos los sistemas espaciales, debe enviar comandos al software de vuelo desde el software de tierra y recibir telemetría del software de vuelo y procesarlo con el software de tierra. Cada paquete de comando / telemetría es una estructura de datos heterogénea, y es necesario que ambos lados trabajen exactamente desde la misma definición de paquete, y formatee el paquete para que esté formateado correctamente en un lado y analizado en el otro lado. Esto implica hacer un montón de cosas correctas, incluido el tipo de datos, el tamaño y la resistencia (aunque esto último suele ser una cuestión global; podría tener múltiples procesadores a bordo con diferente capacidad).

Pero esa es solo la superficie. Necesita mucho código repetitivo en ambos lados para manejar cosas como el registro, la validación de comandos / telemetría, la verificación de límites y el manejo de errores. Y luego puedes hacer cosas más sofisticadas. Supongamos que tiene un comando para establecer un valor de registro de hardware, y ese valor se devuelve en telemetría en un paquete en particular. Podría generar un software de tierra que supervise ese punto de telemetría para garantizar que cuando se establece este valor de registro, eventualmente, la telemetría cambie para reflejar el cambio. Y, por supuesto, algunos puntos de telemetría son más importantes que otros (por ejemplo, la corriente del bus principal) y están designados para reducirse en múltiples paquetes, lo que implica una copia adicional en el lado del vuelo y la desduplicación de datos en el lado del suelo.

Con todo eso, es mucho más fácil (en mi opinión) escribir una colección de archivos de texto estático (en XML, CSV o algún DSL / what-have-you), ejecutarlos a través de un script Perl / Python, ¡y listo! ¡Código!

No trabajo en JPL, por lo que no puedo proporcionar ningún detalle que no esté en el video, con una excepción. He oído que el código C autogenerado está escrito por scripts de Python, y la cantidad de autocodificación en un proyecto varía mucho dependiendo de quién sea el líder de FSW.

Nate Parsons
fuente
8
Esto podría arrojar algo de luz sobre Wind River, el contratista que hace VxWorks: windriver.com/news/press/pr.html?ID=10901 He leído que la NASA tiene un equipo de personas cuyo trabajo es encontrar tantos errores como pueden en el código del sistema de control escrito por otro equipo. El equipo de búsqueda de errores es recompensado por los errores que encuentran y son realmente muy buenos para encontrar errores arcanos. Cuando se encuentra un error, se realiza un análisis de tipo 5Y para descubrir cómo se podría mejorar el proceso de desarrollo del software para eliminar la posibilidad de errores similares en el futuro. Un proceso muy laborioso y costoso.
Jim Raden
15
@JimRaden Cuando el costo directo del fallo de una sonda va de varios cientos de millones a varios miles de millones de dólares y varios años (si es que lo hay) para un intento de rehacer, se justifica la paranoia extrema en QA. Los costos indirectos en forma de docenas / cientos de estudiantes de posgrado que pierden años de trabajo y tienen que reiniciar su trabajo de doctorado y varios nuevos profesores que contaban con datos para proporcionar su investigación de seguimiento de tenencia es otro gran éxito, pero mucho más difícil de lograr. cuantificar que las partidas en el presupuesto de la NASA.
Dan Neely
1
¿De qué se generó automáticamente la C? Por favor dime que no fue Simulink. :-)
William Payne
2
@William Payne La nota clave establece que algunas de ellas son rutinas de codificación / decodificación de protocolos autogeneradas (para la comunicación con la tierra), generadas por programas de Python a partir de descripciones XML.
nos
1
Generar código automáticamente a partir de ICD es algo genial. ¡Me gusta la idea! Sin embargo, hubiera usado YAML en lugar de XML. :-)
William Payne