
Proyecto openpilot · mqttiotORBIT (antes AdriPilot): telemetría y mando remoto sobre openpilot
Telemetría en vivo hacia fuera y órdenes hacia dentro de un coche con openpilot, sin sacar del coche nada crítico.
- Verbos de mando
- 18
- Precondiciones
- 10
- Topics v2
- 7
- Licencia
- MIT + AGPL
- año
- 2026
- estado
- Online
Qué es ORBIT
ORBIT (Open Remote Bidirectional IoV Telemetry) convierte un coche con openpilot en un nodo conectado: la telemetría sale en tiempo real, las órdenes remotas entran y el dispositivo se vincula a una cuenta con un QR. Son tres piezas: ORBITPILOT, el firmware, un fork de sunnypilot y openpilot pensado para el comma 3X; un broker MQTT con un backend en Flask sobre SQLite; y una app en Flutter.
La idea que lo ordena todo: lo que no es crítico para la seguridad sale del coche —histórico, cuentas, mapa, configuración— y el bucle de control se queda intacto. Una orden remota actúa siempre a través de los límites de actuación y seguridad del propio openpilot.

En la pantalla del coche
Vinculación del dispositivo con la app mediante un QR que caduca
De AdriPilot a ORBIT
Empezó en julio de 2025 con otro nombre. AdriPilot era una app en Flutter y un servidor en Python con Flask que recogía la telemetría por MQTT y la guardaba en PostgreSQL. En septiembre ya funcionaba el cambio de carril ordenado desde el móvil, y el otoño se fue en telemetría, mapa, cámara, eventos y órdenes.
A mediados de 2026 el prototipo dejó de serlo: porté el firmware a una base reciente de sunnypilot y el proyecto pasó a llamarse ORBIT. El backend cambió PostgreSQL por SQLite para arrancar con un solo docker compose up, llegó la vinculación por QR y el firmware quedó publicado en abierto. Nació como proyecto de investigación universitaria, y hay un artículo sobre la arquitectura en preparación.
Telemetría por canales
Ocho canales lógicos —vehículo, openpilot, salud, eventos, percepción, vía, viaje y posición— con lista blanca por campo y tres perfiles de consumo.
Mando con acuse
18 verbos declarados en una sola tabla. Cada orden termina en un acuse con fase y motivo: un bloqueo siempre dice por qué.
El conductor lo ve
Un aviso en la pantalla del coche muestra cada orden remota en curso; una frenada remota se pinta como una banda roja a todo lo ancho.
Vinculación por QR
El coche muestra un QR con un código que caduca a los 10 minutos; se escanea desde la app y se desvincula desde cualquiera de los dos lados.
Privacidad en el coche
Un interruptor local deja de emitir posición y cámara sin red y con el móvil apagado. El backend puede leerlo, pero no quitarlo.
Simulador primero
Puente con MetaDrive y menú de mods: cambiar de mapa, meter tráfico, incorporaciones bruscas y obstáculos antes de tocar el coche real.
Cómo funciona por dentro
En el coche, el bus CAN alimenta a openpilot, que ejecuta el bucle de control. A su lado corre el módulo orbit/: publica la telemetría, recibe las órdenes y, opcionalmente, habla por ZeroMQ con una NVIDIA Jetson para inferencia en el borde. Fuera, Mosquitto hace de broker, el backend guarda cuentas, vinculaciones, histórico y registro de órdenes, y la app lee la telemetría en vivo.
La app nunca publica una orden: la pide al backend por REST, que la valida, la autoriza y la publica. Y el coche no se fía de nadie: lo vuelve a comprobar todo. Lo crítico vive en el coche; fuera solo queda lo que puede fallar sin poner a nadie en peligro.
Cómo se protege la actuación remota
La regla de partida: la autoridad solo baja. Ninguna orden remota puede dar a openpilot más control del que ya tiene con el conductor delante. Después, cuatro filtros.
- Modo. Observador (solo lectura, por defecto), copiloto (ajustes que no mueven el coche; caduca a los 15 minutos), maniobra (cambio de carril y deceleración; caduca a los 2) y banco, el control físico directo, que solo se arma tocando la pantalla del comma.
- Precondiciones. Diez comprobaciones —enganchado, rango de velocidad, conductor presente y sin intervenir, enlace fresco, reloj sincronizado…— que fallan en rojo si falta un dato, y que cada componente de openpilot repite al actuar.
- Caducidad. Las órdenes caducan (un cambio de carril, a los 3 s): si llegan tarde se rechazan y, sin renovación, el actuador vuelve a neutro solo.
- Conductor. En una maniobra, tocar volante, freno o acelerador la cancela.
El freno que dejó de ser freno
La única orden que se acepta siempre, sin modo ni precondición, es disarm_all: devolverlo todo a neutro. Y el antiguo «frenado de emergencia» es hoy una deceleración asistida acotada entre −1 y −2,5 m/s², de 1,5 s como máximo. Una frenada que llega con segundos de latencia, ordenada por alguien que no ve lo que ve el coche, no evita un peligro: lo crea.
El contrato v2
Todo viaja por un contrato MQTT versionado bajo orbit/v2/, siempre con el identificador del dispositivo en la ruta:
| Topic | Sentido | Para qué |
|---|---|---|
tel | coche → nube | telemetría por canales |
cmd | backend → coche | órdenes, nunca retenidas |
ack | coche → nube | acuse con fase y motivo |
caps | coche, retenido | qué sabe hacer este coche |
cfg/desired · cfg/reported | backend ↔ coche | configuración pedida y aplicada |
presence | coche, retenido | conectado o no |
Los verbos viven en una única tabla del firmware de la que salen el router, las capacidades y la ayuda de la app, y un test cruzado la compara con la del backend. Y caps existe para que la app solo pinte lo que el coche declara: ningún botón que no haga nada.
Vida de una orden
- Pedir la orden desde la app al backend por REST.
- Validarla, autorizarla y publicarla como sobre v2: id, secuencia, verbo, argumentos, TTL y modo exigido.
- Filtrar en el coche: versión, duplicado, reloj, caducidad, argumentos, secuencia, modo y precondiciones.
- Acusar cada fase: recibida, aceptada, ejecutando y aplicada, o rechazada con su motivo.
- En un cambio de carril, esperar a que lo confirme la lógica de openpilot que lo ejecuta; si calla, la orden acaba en fallo, nunca en éxito.
Cuando se va la cobertura
Sin cobertura, la telemetría no se tira: espera en una cola SQLite de 32 MB en el coche, donde los eventos y los viajes nunca se descartan y la posición no se guarda por defecto. Lo reenviado va marcado, para no confundirlo con un coche conectado. Las órdenes, en cambio, no se encolan nunca: una maniobra diferida es un peligro.
Ojo: investigación, no conducción autónoma
ORBIT es software de investigación en fase alfa, no un producto ni conducción autónoma. openpilot es un sistema de asistencia de nivel 2: quien conduce mira la carretera, está listo para tomar el control y manda siempre. El firmware no ha pasado la validación de seguridad de comma: cada función remota debe validarse antes en simulador y en circuito cerrado, y usarlo es responsabilidad de quien lo instala. El backend de referencia está pensado para una red controlada, no para exponerse tal cual a internet.
Materiales / Compra
Tienda: Firmware sobre openpilot (comma.ai) y sunnypilot; broker Mosquitto; backend Flask con SQLite; app Flutter. Licencias: firmware MIT, backend AGPL-3.0, app MIT.
Agradecimientos
- •Al grupo de investigación con el que lo desarrollo.
- •A comma.ai y a la comunidad de openpilot.
- •Al equipo y la comunidad de sunnypilot.
Aprendizajes
Aprendí a desconfiar de mi propio sistema. Mientras el contrato vivió en tres sitios, discrepó, y la app pintaba botones que el coche no obedecía. Una sola tabla de verbos, acuses que dicen la verdad y precondiciones que fallan en rojo han hecho más por la seguridad que cualquier función nueva.
Publicaciones relacionadas

Proyecto Eficiencia Energética
App y API que leen el inversor solar y el precio de la luz, y encienden enchufes inteligentes.

HORUS EYE
Torreta DIY que sigue personas con visión artificial y las disuade con foco, láser y bocina.

DragoTerminal: 34 herramientas y 59 juegos en una terminal Matrix
Navaja suiza Android: SSH, bases de datos, red, IA y un arcade de 59 juegos, estilo Matrix.
Comentarios
0 comentarios


