Mapa del repositorio · nasa/openmct
¿Qué es Open MCT y cómo le mostramos la telemetría de Percy?
Open MCT es el tablero de control que la NASA usa en una página web: junta en pantallas los datos que mandan sus naves y robots para verlos en vivo, en gráficas y tablas.
Por dentro tiene un núcleo pequeño al que se le enchufan piezas (plugins). Cada fuente de datos, cada tipo de gráfica y cada pantalla es una de esas piezas. Para mostrar a Percy (Perseverance) hay que escribir una pieza más.
- Plugin: pieza que se enchufa al núcleo.
- Proveedor: quien entrega los datos.
- Pedido (request): «dame lo que pasó antes».
- Suscripción (subscribe): «avísame en vivo».
- archivo:línea: dónde está cada cosa en el código.
El mapa en un dibujo
Arriba, cómo está armado. Abajo, el viaje de un dato desde quien lo produce hasta la línea de la gráfica. Cada caja dice en qué archivo y línea pasa; el enlace abre esa línea exacta en GitHub (en el commit analizado).
El mismo diagrama, como lista (para leer o copiar)
Cómo está armado
- Nace Open MCT. Se crea un único objeto
openmct— openmct.js:35 - El núcleo arma sus servicios (objetos, tipos, vistas, telemetría…) — src/MCT.js:175 objetos, src/MCT.js:183 telemetría
- El enchufe de plugins: instalar un plugin es solo llamarlo con
openmct— src/MCT.js:436 - Plugins de serie: 31 que se instalan siempre, empezando por la gráfica (Plot) — src/MCT.js:285
- La app elige sus plugins y arranca (instala el generador de ejemplo y luego
start) — index.html:104 y index.html:240 - Elige la vista preguntándole a cada vista si puede mostrar el objeto — src/ui/registries/ViewRegistry.js:60
El viaje de un dato (historial)
- Se registra el proveedor de datos de ejemplo (onda seno) — example/generator/plugin.js:166
- La gráfica pide los datos del rango de tiempo visible — src/plugins/plot/configuration/PlotSeries.js:228
- El núcleo busca al proveedor que sabe responder y le pasa el pedido — src/api/telemetry/TelemetryAPI.js:495
- Nace el dato
{ utc, sin }en un trabajador en segundo plano — example/generator/generatorWorker.js:175 - «¡Llegó un punto!»: la serie lo guarda y avisa — src/plugins/plot/configuration/PlotSeries.js:471
- Se dibuja la línea con la tarjeta gráfica (WebGL) — src/plugins/plot/draw/DrawWebGL.js:204
En vivo: src/plugins/plot/configuration/PlotSeries.js:214 (se suscribe) → src/api/telemetry/TelemetryAPI.js:560 (el núcleo avisa al proveedor) → example/generator/GeneratorProvider.js:104 (abre el canal) → pasos 5 y 6.
Las 5 piezas para conectar a Percy
Con estas cinco piezas, Open MCT ya sabe qué es Percy, dónde mostrarlo y de dónde sacar sus datos. La gráfica viene incluida: es un plugin de serie (src/MCT.js:285) y aparece sola cuando un objeto tiene un número para dibujar (src/plugins/plot/PlotViewProvider.js:39).
El plugin (el enchufe)
Una función que recibe openmct y registra todo lo de Percy.
src/MCT.js:435–436
El tipo de objeto
Le dice a Open MCT qué es «una medición de Percy» (nombre e ícono).
src/api/types/TypeRegistry.js:59
La raíz y el proveedor de objetos
Crea la carpeta «Percy» en el árbol de la izquierda y entrega sus mediciones (velocidad, rumbo…).
src/api/objects/ObjectAPI.js:498 y :168
Las etiquetas de cada valor
Cuál número es la hora (eje horizontal, utc con domain) y cuál es la medida (eje vertical, range).
example/generator/GeneratorMetadataProvider.js:10–14 y :45–50 · src/plugins/plot/configuration/XAxisModel.js:103
El proveedor de telemetría
Responde «lo que pasó antes» (request) y «avísame en vivo» (subscribe). El último registrado gana.
src/api/telemetry/TelemetryAPI.js:167–169 · example/generator/GeneratorProvider.js:98 y :104
Cómo conectamos Percy
Es un plan: no se instaló nada. Aclaración honesta: la NASA no publica la telemetría de ingeniería de Perseverance en vivo. «Percy» aquí es nuestro rover simulado, que ya calcula su telemetría en src/ui/telemetry.js.
- Elegir qué medir. De la telemetría del simulador, los valores numéricos: velocidad (cm/s), recorrido (m), rumbo (°), cabeceo y alabeo (°), posición x/z (m) y muestras. El estado y lo de Ingenuity son texto: van en una tabla, no en una gráfica (Open MCT solo ofrece gráfica si hay un número, src/api/telemetry/TelemetryAPI.js:322). La energía es un valor fijo, no una medición.
- Transmitir desde el simulador. En
update()desrc/ui/telemetry.js, que ya corre 10 veces por segundo, mandar cada lectura por un canal del navegador:new BroadcastChannel('percy-telemetria').postMessage({ utc: Date.now(), velocidad, rumbo, … }). La hora va enutcporque es la clave del eje horizontal (src/plugins/plot/configuration/XAxisModel.js:103). - Hacer una página de control (por ejemplo
control.html) servida desde el mismo sitio que el simulador, que cargue Open MCT e instale el sistema de tiempo UTC y el conductor de tiempo, igual que el ejemplo (index.html:119 y index.html:131). Cargar Open MCT necesita descargarlo (npm o un CDN): eso se hará más adelante y solo con permiso. - Escribir el plugin de Percy con las piezas 1 a 4: tipo
percy.medicion, raízpercy:rover, una carpeta con una medición por cada valor, y en cada unatelemetry.valuesconutc(domain) y el valor (range). - Agregar el proveedor de telemetría (pieza 5):
subscribeescucha el canal y pasa cada lectura a la gráfica;requestdevuelve lo guardado en un búfer de los últimos minutos para el historial. - Instalar y arrancar:
openmct.install(PercyPlugin())yopenmct.start(). En el árbol aparece «Percy › Velocidad» con su gráfica, que viene de serie. - Probar con dos ventanas lado a lado (no pestañas): una pestaña oculta pausa la simulación y la gráfica se quedaría quieta.
- Para una misión de verdad, cambiar el canal del navegador por un WebSocket con un servidor, que es lo que hacen las misiones reales.
Para curiosos: cómo se vería el plugin (esquema)
function PercyPlugin() {
return function install(openmct) {
openmct.types.addType('percy.medicion', { name: 'Medición de Percy', cssClass: 'icon-telemetry' });
openmct.objects.addRoot({ namespace: 'percy', key: 'rover' });
openmct.objects.addProvider('percy', { get: (id) => /* carpeta o medición */ });
const canal = new BroadcastChannel('percy-telemetria');
openmct.telemetry.addProvider({
supportsSubscribe: (objeto) => objeto.type === 'percy.medicion',
subscribe(objeto, avisar) {
const alLlegar = ({ data }) => avisar({ utc: data.utc, value: data[objeto.identifier.key] });
canal.addEventListener('message', alLlegar);
return () => canal.removeEventListener('message', alLlegar);
},
supportsRequest: (objeto) => objeto.type === 'percy.medicion',
request: (objeto, { start, end }) => /* lecturas guardadas entre start y end */
});
};
}
Comprobaciones
Antes de entregar volví a abrir en el código tres referencias del dibujo (una de cómo está armado y dos del viaje del dato) y confirmé que la línea hace lo que dice la caja.
| Referencia | Lo que dice la caja | Línea real del código | Resultado |
|---|---|---|---|
| src/MCT.js:436 | El enchufe de plugins: plugin(this) | plugin(this); dentro de install(plugin) { (línea 435) | ✓ Coincide |
| src/plugins/plot/configuration/PlotSeries.js:228 | 2 · La gráfica pide los datos: telemetry.request | const points = await this.openmct.telemetry.request(this.domainObject, options); | ✓ Coincide |
| src/api/telemetry/TelemetryAPI.js:495 | 3 · El núcleo busca al proveedor: provider.request | const telemetry = await provider.request(...arguments); | ✓ Coincide |
El commit analizado
- Repositorio
- github.com/nasa/openmct · rama
master· versión 4.3.1 - Commit
e09bfaf(e09bfaf47856b2b7ae2ea74334800b26fd27a41e)- Fecha
- 6 de octubre de 2026, 17:01 (hora del Pacífico) = 7 de octubre, 00:01 UTC
- Autor
- John Hill
- Mensaje
- «[Documentation] Add AGENTS.md contributor guidance (#8379)» — agrega una guía para colaboradores.
- Sin cambios
- Se clonó solo esa versión y se leyó sin instalar nada;
git status --porcelainsalió vacío.