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.

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).

Diagrama de Open MCT: núcleo, plugins y viaje de un dato de telemetría Fila de arriba: nace Open MCT, el núcleo arma sus servicios, el enchufe de plugins, los plugins de serie, la app arranca y se elige la vista. Fila de abajo: se registra el proveedor, la gráfica pide datos, el núcleo busca al proveedor, nace el dato, la serie avisa que llegó un punto y se dibuja con la GPU. Debajo, el camino en vivo. CÓMO ESTÁ ARMADO · NÚCLEO Y PLUGINS Nace Open MCT new MCT() (raíz del repo) openmct.js:35 El núcleo arma sus servicios objetos, telemetría… src/ MCT.js:183 El enchufe de plugins plugin(this) src/ MCT.js:436 Plugins de serie (Plot y 30 más) install(Plot()) src/ MCT.js:285 La app elige y arranca openmct.start() (raíz del repo) index.html:240 Elige la vista de cada objeto canView() src/ui/registries/ ViewRegistry.js:60 un proveedor de datos también se enchufa como plugin el plugin Plot pone la gráfica EL VIAJE DE UN DATO · DEL PROVEEDOR A LA GRÁFICA (HISTORIAL) 1 Se registra el proveedor telemetry.addProvider example/generator/ plugin.js:166 2 La gráfica pide los datos telemetry.request src/plugins/plot/ configuration/ PlotSeries.js:228 3 El núcleo busca al proveedor provider.request src/api/telemetry/ TelemetryAPI.js:495 4 Nace el dato { utc: hora, sin: valor } example/generator/ generatorWorker.js:175 5 «¡Llegó un punto!» emit('add') src/plugins/plot/ configuration/ PlotSeries.js:471 6 Se dibuja con la GPU gl.drawArrays src/plugins/plot/draw/ DrawWebGL.js:204 En vivo es casi igual: la gráfica se suscribe una vez y el proveedor manda cada punto nuevo sin que nadie lo pida. PlotSeries.js:214 se suscribe TelemetryAPI.js:560 el núcleo avisa al proveedor GeneratorProvider.js:104 abre el canal …y cada punto que llega sigue igual que en los pasos 5 y 6.
El mismo diagrama, como lista (para leer o copiar)

Cómo está armado

  1. Nace Open MCT. Se crea un único objeto openmct — openmct.js:35
  2. El núcleo arma sus servicios (objetos, tipos, vistas, telemetría…) — src/MCT.js:175 objetos, src/MCT.js:183 telemetría
  3. El enchufe de plugins: instalar un plugin es solo llamarlo con openmct — src/MCT.js:436
  4. Plugins de serie: 31 que se instalan siempre, empezando por la gráfica (Plot) — src/MCT.js:285
  5. La app elige sus plugins y arranca (instala el generador de ejemplo y luego start) — index.html:104 y index.html:240
  6. 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)

  1. Se registra el proveedor de datos de ejemplo (onda seno) — example/generator/plugin.js:166
  2. La gráfica pide los datos del rango de tiempo visible — src/plugins/plot/configuration/PlotSeries.js:228
  3. El núcleo busca al proveedor que sabe responder y le pasa el pedido — src/api/telemetry/TelemetryAPI.js:495
  4. Nace el dato { utc, sin } en un trabajador en segundo plano — example/generator/generatorWorker.js:175
  5. «¡Llegó un punto!»: la serie lo guarda y avisa — src/plugins/plot/configuration/PlotSeries.js:471
  6. 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).

1

El plugin (el enchufe)

Una función que recibe openmct y registra todo lo de Percy.

src/MCT.js:435–436

2

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

3

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

4

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

5

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.

  1. 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.
  2. Transmitir desde el simulador. En update() de src/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 en utc porque es la clave del eje horizontal (src/plugins/plot/configuration/XAxisModel.js:103).
  3. 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.
  4. Escribir el plugin de Percy con las piezas 1 a 4: tipo percy.medicion, raíz percy:rover, una carpeta con una medición por cada valor, y en cada una telemetry.values con utc (domain) y el valor (range).
  5. Agregar el proveedor de telemetría (pieza 5): subscribe escucha el canal y pasa cada lectura a la gráfica; request devuelve lo guardado en un búfer de los últimos minutos para el historial.
  6. Instalar y arrancar: openmct.install(PercyPlugin()) y openmct.start(). En el árbol aparece «Percy › Velocidad» con su gráfica, que viene de serie.
  7. 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.
  8. 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.

ReferenciaLo que dice la cajaLínea real del códigoResultado
src/MCT.js:436El enchufe de plugins: plugin(this)plugin(this); dentro de install(plugin) { (línea 435)✓ Coincide
src/plugins/plot/configuration/PlotSeries.js:2282 · La gráfica pide los datos: telemetry.requestconst points = await this.openmct.telemetry.request(this.domainObject, options);✓ Coincide
src/api/telemetry/TelemetryAPI.js:4953 · El núcleo busca al proveedor: provider.requestconst 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 --porcelain salió vacío.