fedepompeo/proyecto-drones-v4

Python

2

19 commits

updated May 31, 2026

See the code

README

Control de Drones con Reconstrucción 3D en Tiempo Real o Post Vuelo

Version Python PyTorch MQTT WebRTC License

Sistema de control de drones con streaming de vídeo WebRTC, reconstrucción 3D automática y detección de objetos YOLO — todo desde el navegador.

Arquitectura · Instalación · Estructura del proyecto · Configuración · Visor PLY · Troubleshooting· Agradecimientos


Drones

Hexsoon EDU-450
Hexsoon EDU-450
DJI RoboMaster TT Tello Talent
DJI RoboMaster TT (Tello Talent)
DronUsoProtocoloLibrería
Hexsoon EDU-450Vuelos exterioresMAVLink (ArduPilot)dronLink/
DJI RoboMaster TT (Tello Talent)Vuelos interioresSDK Tello (Wi-Fi UDP)telloLink/

El Hexsoon EDU-450 es un quadrotor de 450 mm de distancia entre ejes que monta una controladora compatible con ArduPilot (ArduCopter). Se comunica con el Ordenador 2 via MAVLink sobre puerto serie o UDP, gestionado por dronLink/ y pymavlink.

El DJI RoboMaster TT (Tello Talent) es la variante programable del Tello, con soporte para la SDK oficial de Tello. Se comunica con el Ordenador 2 via Wi-Fi UDP en la red 192.168.10.x, gestionado por telloLink/ y djitellopy.

Ambos drones se controlan desde la misma interfaz web.

Capturas de pantalla

Interfaz de controlNube de puntos 3D
Control UIPoint Cloud

Video de demostración

DEMO Interior - DJI RoboMaster TT - LingBot-Map: Ver demo

https://github.com/user-attachments/assets/15316532-2248-4f3b-9dc9-f83f9c7394cf

DEMO Interior - DJI RoboMaster TT - DA3: Ver demo

DEMO Interior - DJI RoboMaster TT - LingBot-Map: Ver demo

DEMO Exterior - Hexsoon EDU-450 - LingBot-Map: Ver demo

https://github.com/user-attachments/assets/7b510468-1b10-41ab-9ad5-08ca1745d716


Características

CaracterísticaDescripción
Control de dronesArduPilot (MAVLink) y DJI Tello desde una sola interfaz
Video en tiempo realStreaming WebRTC de baja latencia con corrección fisheye
Reconstrucción 3DLingBot-Map (streaming) + Depth Anything 3 (batch)
Detección YOLODetección de objetos COCO en tiempo real sobre el vídeo
Control por vozComandos de voz integrados en la interfaz web
Comunicación seguraMQTT sobre WSS + SSL autogenerado (NordVPN Meshnet)
Exportación PLYNubes de puntos exportables y visualizables en el navegador

Arquitectura del sistema

El sistema está diseñado para funcionar en dos ordenadores conectados a la misma red (o via NordVPN Meshnet):

Control UI

Flujo de comunicación paso a paso

[Usuario]
   │ 1. Abre https://<IP_SERVIDOR>:5002
   ▼
[Navegador Web]
   │ 2. Conecta MQTT → broker.hivemq.com:8884
   │ 3. Envía comando (ej. "takeOff" → autopilot_queue)
   ▼
[HiveMQ Broker] ──── MQTT ────► [AutopilotService.py]
                                         │
                                         │ 4. Traduce comando → dronLink / telloLink
                                         ▼
                    [Hexsoon EDU-450 / DJI RoboMaster TT]
                                         │
                                         │ 5. Telemetría de vuelta
                                         ▼
                        [AutopilotService] ──── MQTT ────► [Navegador]

[CameraService.py]
   │ 6. Captura vídeo (local camera / Tello stream)
   │    Aplica corrección fisheye + detección YOLO
   │ 7. Conecta WebRTC → WSS :8108 (señalización)
   ▼
[serverMQTT_https.py]
   │ 8. Relay SDP/ICE ↔ Navegador
   ▼
[Navegador] ◄─── WebRTC P2P ──── [CameraService]
   │
   │ 9. Envía frames de vídeo → WSS :8108
   ▼
[model_worker.py]
   │ 10a. LingBot-Map: procesa frame a frame → nube incremental
   │ 10b. DA3: acumula frames → procesa al finalizar → PLY global
   ▼
[Navegador] ← nubes de puntos 3D renderizadas en Three.js

Requisitos del sistema

Ordenador 1 — Servidor

ComponenteMínimoRecomendado
Python3.103.11
GPUCUDA 12.1+ (NVIDIA)CUDA 12.1+ (NVIDIA)
VRAM6 GB12 GB
OSWindows / LinuxWindows / Linux

Ordenador 2 — Drone Manager

ComponenteRequisito
Python3.10+
Conexión al dronWi-Fi (RoboMaster TT) / MAVLink serial o UDP (Hexsoon EDU-450)
CámaraWebcam, cámara IP, o cámara del Tello Talent

Red

  • Ambos ordenadores deben ser accesibles entre sí (misma LAN o NordVPN Meshnet)
  • El Ordenador 2 necesita acceso a wss://<IP_SERVIDOR>:8108
  • Puerto 5002 (HTTPS) y 8108 (WSS) abiertos en el Servidor

Instalación

Ordenador 1 — Servidor (serverMQTT_https.py)

# 1. Clonar el repositorio
git clone https://github.com/fedepompeo/proyecto-drones-v4.git
cd PythonProject

# 2. Crear entorno virtual
python -m venv .venv
# Windows:
.\.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate

Windows — instalacion automatica (recomendado):

install.bat

El script detecta tu version de CUDA con nvidia-smi, instala PyTorch con soporte GPU, el resto de dependencias y los submodulos locales automaticamente.

Instalacion manual (Linux/macOS o si prefieres hacerlo a mano):

# 3a. Instalar PyTorch con CUDA (sustituye cu128 por tu version)
#     Comprueba tu CUDA con: nvidia-smi
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
pip install xformers          --index-url https://download.pytorch.org/whl/cu128

# 3b. Instalar el resto de dependencias
pip install -r requirements.txt

# 3c. Instalar submodulos de modelos 3D
pip install -e lingbot-map/      --no-deps
pip install -e depth-anything-3/ --no-deps

Importante: pip install torch sin --index-url instala siempre la version CPU. Los modelos no podran usar la GPU.

# 4. Configurar variables de entorno
cp .env.example .env
# Editar .env con tu IP y configuracion (ver seccion Configuracion)

# 5. Ejecutar servidor
python serverMQTT_https.py

Primera ejecucion: LingBot-Map descarga el checkpoint desde HuggingFace (~500 MB). DA3 se descarga automaticamente.

Accede a la interfaz en: https://<TU_IP>:5002


Ordenador 2 — Drone Manager (DroneManager.py)

# 1. Clonar el mismo repositorio
git clone https://github.com/fedepompeo/proyecto-drones-v4.git
cd PythonProject

# 2. Crear entorno virtual
python -m venv .venv
.\.venv\Scripts\activate   # o source .venv/bin/activate

# 3. Instalar dependencias (solo las del drone manager)
pip install paho-mqtt aiortc av djitellopy pymavlink opencv-python \
            python-dotenv colorlog websockets cryptography Pillow

# 4. Configurar .env apuntando al Servidor
# Editar .env:
#   SERVER_IP=<IP_DEL_ORDENADOR_1>
#   SIGNALING_SERVER_URL=wss://<IP_DEL_ORDENADOR_1>:8108

# 5. Ejecutar
python DroneManager.py

DroneManager.py lanza automáticamente CameraService.py y AutopilotService.py en threads.


Configuración (.env)

# ── Red ─────────────────────────────────────────────────────────────────
SERVER_IP=<IP>          # IP del Ordenador 1 (NordVPN Meshnet o LAN)
SIGNALING_SERVER_URL=wss://<IP> :8108   # URL del servidor WSS
FLASK_PORT=5002                   # Puerto de la interfaz web
USE_SSL=true                      # Certificados SSL (autogenerados)
STUN_SERVER_URL=stun:stun.l.google.com:19302     # STUN para WebRTC

# ── MQTT Topics ──────────────────────────────────────────────────────────
AUTOPILOT_QUEUE=autopilot_queue           # Comandos Hexsoon EDU-450 (ArduPilot)
TELLO_QUEUE=autopilot_tello_queue         # Comandos DJI RoboMaster TT
DASHBOARD_WEB_QUEUE=webApp                # Actualizaciones interfaz
TELEMETRY_QUEUE=telemetryService          # Telemetría GPS

# ── LingBot-Map (modo streaming) ─────────────────────────────────────────
LINGBOT_CHECKPOINT=lingbot-map/checkpoints/lingbot-map.pt
LINGBOT_MAX_FRAMES=320            # Buffer máximo de frames
LINGBOT_KEYFRAME_INTERVAL=1       # Frame clave cada N frames
LINGBOT_SCALE_FRAMES=8            # Frames de escala
LINGBOT_USE_SDPA=1                # Atención escalada (más rápido)
LINGBOT_CONF_THRESHOLD=0.3        # Umbral de confianza mínima
LINGBOT_PROCESS_RES=336           # Resolución (múltiplo de 14)

# ── Depth Anything 3 (modo batch) ────────────────────────────────────────
DA3_MODEL_ID=depth-anything/da3-small   # da3-small / da3-base / da3-large
DA3_BATCH_SIZE=29                        # Frames por batch
DA3_PROCESS_RES=336                     # Resolución
DA3_CONF_PERCENTILE_FILTER=0.30

# ── GPU ──────────────────────────────────────────────────────────────────
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
PC_SUBSAMPLE_STEP=2               # Submuestreo nube de puntos (mayor = menos puntos)

Modos de reconstrucción 3D

ModoCuándo usarloResultado
LingBot-Map (streaming)Durante el vuelo, en tiempo realNube de puntos incremental
Depth Anything 3 (batch)Post-vuelo, mayor calidadNube de puntos global .ply

Visor 3D Interactivo

GitHub preview

GitHub renderiza automáticamente cualquier .ply / .stl / .glb subido al repositorio con un visor 3D interactivo. Haz clic en el nombre del archivo para abrir el visor:

ModeloDescripciónMiniatura
1779444538045.plyInterior — DJI RoboMaster TT — DA3Captura de pantalla
1779444312385.plyInterior — DJI RoboMaster TT — LingBot-MapCaptura de pantalla
1779443901413.plyInterior — DJI RoboMaster TT — LingBot-MapCaptura de pantalla
1779443225239.plyExterior — Hexsoon EDU-450 — DA3Captura de pantalla
1779441216581.plyExterior — Hexsoon EDU-450 — LingBot-MapCaptura de pantalla
1779440574725.plyExterior — Hexsoon EDU-450 — LingBot-MapCaptura de pantalla
1779721537234.plyInterior — DJI RoboMaster TT — LingBot-MapCaptura de pantalla
1779722973955.plyInterior — DJI RoboMaster TT — LingBot-MapCaptura de pantalla
1779724088022.plyInterior — DJI RoboMaster TT — DA3Captura de pantalla

Estructura del proyecto

PythonProject/
│
├── SERVIDOR (Ordenador 1)
│   ├── serverMQTT_https.py          # Punto de entrada principal
│   ├── model_worker.py              # Worker de inferencia 3D (subprocess)
│   ├── templates/
│   │   └── drone-control-interface-v2_new.html  # Interfaz web
│   └── static/
│       ├── js/voiceControl.js       # Control por voz
│       └── lib/                     # Bootstrap, Leaflet, MQTT.js
│
├── DRONE MANAGER (Ordenador 2)
│   ├── DroneManager.py              # Orquestador (lanza los servicios)
│   ├── CameraService.py             # WebRTC + YOLO
│   ├── AutopilotService.py          # MQTT → dron
│   └── objects_yolo.py              # Clases COCO para YOLO
│
├── LIBRERIAS DE DRONES
│   ├── dronLink/                    # Hexsoon EDU-450 (ArduPilot / MAVLink)
│   │   ├── Dron.py
│   │   └── modules/                 # arm, goto, telemetry, mission...
│   └── telloLink/                   # DJI RoboMaster TT (Tello Talent)
│       ├── Dron.py
│       └── modules/
│
├── MODELOS 3D (submodulos)
│   ├── lingbot-map/                 # LingBot-Map (streaming 3D)
│   │   ├── lingbot_map/
│   │   └── checkpoints/             # lingbot-map.pt (descargado en runtime)
│   └── depth-anything-3/            # Depth Anything 3 (batch 3D)
│       └── src/depth_anything_3/
│
├── CONFIGURACION
│   ├── .env                         # Variables de entorno
│   ├── calibration_data_fisheye.yaml # Calibración cámara fisheye
│   ├── certs/                       # SSL autogenerado en runtime
│   └── requirements.txt
│
└── RUNTIME (generados, no en git)
    ├── images/                      # Fotos capturadas
    ├── output_da3/                  # Nubes de puntos .ply
    └── depth_weights/               # Pesos DA3

SSL y conectividad

El servidor genera certificados SSL autofirmados al arrancar. Para que el Ordenador 2 confíe en el servidor:

# En Ordenador 2, descargar el certificado del servidor:
curl -k https://<IP_SERVIDOR>:5002/download-cert -o server_cert.pem

CameraService.py hace esto automáticamente al arrancar.

NordVPN Meshnet (recomendado)

Para conectar los dos ordenadores de forma segura sin configurar puertos:

  1. Instalar NordVPN en ambos
  2. Activar Meshnet en la app
  3. Usar la IP Meshnet del Servidor en .env (SERVER_IP)

Troubleshooting

Error: "lingbot_map.models.gct_stream not found"

pip install -e lingbot-map/

Error: "depth_anything_3.api not found"

pip install -e depth-anything-3/

Certificado SSL inválido / ERR_CERT_AUTHORITY_INVALID

Acepta la excepción en el navegador (certificado autofirmado) o regenera:

# Detener servidor, borrar certs y reiniciar
del certs\cert.pem certs\key.pem
python serverMQTT_https.py

CUDA out of memory

# Reducir en .env:
DA3_BATCH_SIZE=15
LINGBOT_MAX_FRAMES=100
DA3_MODEL_ID=depth-anything/da3-small

CameraService no conecta al servidor WSS

  • Verificar que SIGNALING_SERVER_URL en .env apunta a la IP correcta del Servidor
  • Verificar que el puerto 8108 está abierto
  • Asegurarse de que el servidor está corriendo antes que el DroneManager

DJI RoboMaster TT no responde

  • El RoboMaster TT debe estar en la misma red Wi-Fi que el Ordenador 2
  • Confirmar IP del Tello: 192.168.10.X
  • Usar switchDroneType para seleccionar Tello en la interfaz

Hexsoon EDU-450 no conecta (ArduPilot)

  • Verificar puerto serie / UDP en AutopilotService.py
  • Confirmar que pymavlink / dronLink está instalado

Documentación técnica de los modelos

Documentos detallados sobre cómo el código utiliza cada modelo y cómo funcionan internamente (nivel ingeniería):

DocumentoContenido
LINGBOT_MAP_TECNICO.mdArquitectura GCTStream, KV cache, back-projection, pipeline completo
DEPTH_ANYTHING_3_TECNICO.mdArquitectura DA3, modo batch, sub-batches

Agradecimientos

Este proyecto no sería posible sin el trabajo de los siguientes equipos de investigación, a quienes agradecemos enormemente por publicar sus modelos de forma abierta:


LingBot-Map — Geometric Context Transformer for Streaming 3D Reconstruction

"Un modelo 3D feed-forward que unifica coordenadas, señales geométricas densas y corrección de deriva a largo plazo en un único framework de streaming, permitiendo inferencia estable a ~20 FPS sobre secuencias de más de 10.000 frames."

Autores: Lin-Zhuo Chen*, Jian Gao*, Yihang Chen, Ka Leong Cheng, Yipengjing Sun, Liangxiao Hu, Nan Xue, Xing Zhu, Yujun Shen, Yao Yao†, Yinghao Xu†
Organización: Robbyant Team
Paper: arXiv:2604.14141 (2026)
Repositorio: github.com/Robbyant/lingbot-map
Modelo: HuggingFace — robbyant/lingbot-map

BibTeX
@article{chen2026geometric,
  title={Geometric Context Transformer for Streaming 3D Reconstruction},
  author={Chen, Lin-Zhuo and Gao, Jian and Chen, Yihang and Cheng, Ka Leong and
          Sun, Yipengjing and Hu, Liangxiao and Xue, Nan and Zhu, Xing and
          Shen, Yujun and Yao, Yao and Xu, Yinghao},
  journal={arXiv preprint arXiv:2604.14141},
  year={2026}
}

Depth Anything 3 — Recovering the Visual Space from Any Views

"DA3 predice geometría espacialmente consistente a partir de un número arbitrario de imágenes, con o sin poses de cámara conocidas, usando un único transformer DINO sin especialización arquitectónica. Supera al estado del arte anterior (VGGT) en un 35.7% en estimación de pose y 23.6% en precisión geométrica."

Autores: Haotong Lin*, Sili Chen*, Jun Hao Liew*, Donny Y. Chen*, Zhenyu Li, Guang Shi, Jiashi Feng, Bingyi Kang†
Organización: ByteDance Seed
Paper: arXiv:2511.10647 (2025) · ICLR 2026
Repositorio: github.com/ByteDance-Seed/Depth-Anything-3
Proyecto: depth-anything-3.github.io
Demo: HuggingFace Spaces

BibTeX
@article{depthanything3,
  title={Depth Anything 3: Recovering the visual space from any views},
  author={Haotong Lin and Sili Chen and Jun Hao Liew and Donny Y. Chen and
          Zhenyu Li and Guang Shi and Jiashi Feng and Bingyi Kang},
  journal={arXiv preprint arXiv:2511.10647},
  year={2025}
}

Referencias


Licencia

  • LingBot-Map: Ver lingbot-map/LICENSE.txt
  • Depth Anything 3: Apache 2.0 (depth-anything-3/LICENSE)
  • dronLink / telloLink: Ver cada módulo

Desarrollado con fines educativos para proyecto de drones - EETAC 2026

fedepompeo/proyecto-drones-v4

Python

2

19 commits

updated May 31, 2026

See the code

README

Control de Drones con Reconstrucción 3D en Tiempo Real o Post Vuelo

Version Python PyTorch MQTT WebRTC License

Sistema de control de drones con streaming de vídeo WebRTC, reconstrucción 3D automática y detección de objetos YOLO — todo desde el navegador.

Arquitectura · Instalación · Estructura del proyecto · Configuración · Visor PLY · Troubleshooting· Agradecimientos


Drones

Hexsoon EDU-450
Hexsoon EDU-450
DJI RoboMaster TT Tello Talent
DJI RoboMaster TT (Tello Talent)
DronUsoProtocoloLibrería
Hexsoon EDU-450Vuelos exterioresMAVLink (ArduPilot)dronLink/
DJI RoboMaster TT (Tello Talent)Vuelos interioresSDK Tello (Wi-Fi UDP)telloLink/

El Hexsoon EDU-450 es un quadrotor de 450 mm de distancia entre ejes que monta una controladora compatible con ArduPilot (ArduCopter). Se comunica con el Ordenador 2 via MAVLink sobre puerto serie o UDP, gestionado por dronLink/ y pymavlink.

El DJI RoboMaster TT (Tello Talent) es la variante programable del Tello, con soporte para la SDK oficial de Tello. Se comunica con el Ordenador 2 via Wi-Fi UDP en la red 192.168.10.x, gestionado por telloLink/ y djitellopy.

Ambos drones se controlan desde la misma interfaz web.

Capturas de pantalla

Interfaz de controlNube de puntos 3D
Control UIPoint Cloud

Video de demostración

DEMO Interior - DJI RoboMaster TT - LingBot-Map: Ver demo

https://github.com/user-attachments/assets/15316532-2248-4f3b-9dc9-f83f9c7394cf

DEMO Interior - DJI RoboMaster TT - DA3: Ver demo

DEMO Interior - DJI RoboMaster TT - LingBot-Map: Ver demo

DEMO Exterior - Hexsoon EDU-450 - LingBot-Map: Ver demo

https://github.com/user-attachments/assets/7b510468-1b10-41ab-9ad5-08ca1745d716


Características

CaracterísticaDescripción
Control de dronesArduPilot (MAVLink) y DJI Tello desde una sola interfaz
Video en tiempo realStreaming WebRTC de baja latencia con corrección fisheye
Reconstrucción 3DLingBot-Map (streaming) + Depth Anything 3 (batch)
Detección YOLODetección de objetos COCO en tiempo real sobre el vídeo
Control por vozComandos de voz integrados en la interfaz web
Comunicación seguraMQTT sobre WSS + SSL autogenerado (NordVPN Meshnet)
Exportación PLYNubes de puntos exportables y visualizables en el navegador

Arquitectura del sistema

El sistema está diseñado para funcionar en dos ordenadores conectados a la misma red (o via NordVPN Meshnet):

Control UI

Flujo de comunicación paso a paso

[Usuario]
   │ 1. Abre https://<IP_SERVIDOR>:5002
   ▼
[Navegador Web]
   │ 2. Conecta MQTT → broker.hivemq.com:8884
   │ 3. Envía comando (ej. "takeOff" → autopilot_queue)
   ▼
[HiveMQ Broker] ──── MQTT ────► [AutopilotService.py]
                                         │
                                         │ 4. Traduce comando → dronLink / telloLink
                                         ▼
                    [Hexsoon EDU-450 / DJI RoboMaster TT]
                                         │
                                         │ 5. Telemetría de vuelta
                                         ▼
                        [AutopilotService] ──── MQTT ────► [Navegador]

[CameraService.py]
   │ 6. Captura vídeo (local camera / Tello stream)
   │    Aplica corrección fisheye + detección YOLO
   │ 7. Conecta WebRTC → WSS :8108 (señalización)
   ▼
[serverMQTT_https.py]
   │ 8. Relay SDP/ICE ↔ Navegador
   ▼
[Navegador] ◄─── WebRTC P2P ──── [CameraService]
   │
   │ 9. Envía frames de vídeo → WSS :8108
   ▼
[model_worker.py]
   │ 10a. LingBot-Map: procesa frame a frame → nube incremental
   │ 10b. DA3: acumula frames → procesa al finalizar → PLY global
   ▼
[Navegador] ← nubes de puntos 3D renderizadas en Three.js

Requisitos del sistema

Ordenador 1 — Servidor

ComponenteMínimoRecomendado
Python3.103.11
GPUCUDA 12.1+ (NVIDIA)CUDA 12.1+ (NVIDIA)
VRAM6 GB12 GB
OSWindows / LinuxWindows / Linux

Ordenador 2 — Drone Manager

ComponenteRequisito
Python3.10+
Conexión al dronWi-Fi (RoboMaster TT) / MAVLink serial o UDP (Hexsoon EDU-450)
CámaraWebcam, cámara IP, o cámara del Tello Talent

Red

  • Ambos ordenadores deben ser accesibles entre sí (misma LAN o NordVPN Meshnet)
  • El Ordenador 2 necesita acceso a wss://<IP_SERVIDOR>:8108
  • Puerto 5002 (HTTPS) y 8108 (WSS) abiertos en el Servidor

Instalación

Ordenador 1 — Servidor (serverMQTT_https.py)

# 1. Clonar el repositorio
git clone https://github.com/fedepompeo/proyecto-drones-v4.git
cd PythonProject

# 2. Crear entorno virtual
python -m venv .venv
# Windows:
.\.venv\Scripts\activate
# Linux/macOS:
source .venv/bin/activate

Windows — instalacion automatica (recomendado):

install.bat

El script detecta tu version de CUDA con nvidia-smi, instala PyTorch con soporte GPU, el resto de dependencias y los submodulos locales automaticamente.

Instalacion manual (Linux/macOS o si prefieres hacerlo a mano):

# 3a. Instalar PyTorch con CUDA (sustituye cu128 por tu version)
#     Comprueba tu CUDA con: nvidia-smi
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
pip install xformers          --index-url https://download.pytorch.org/whl/cu128

# 3b. Instalar el resto de dependencias
pip install -r requirements.txt

# 3c. Instalar submodulos de modelos 3D
pip install -e lingbot-map/      --no-deps
pip install -e depth-anything-3/ --no-deps

Importante: pip install torch sin --index-url instala siempre la version CPU. Los modelos no podran usar la GPU.

# 4. Configurar variables de entorno
cp .env.example .env
# Editar .env con tu IP y configuracion (ver seccion Configuracion)

# 5. Ejecutar servidor
python serverMQTT_https.py

Primera ejecucion: LingBot-Map descarga el checkpoint desde HuggingFace (~500 MB). DA3 se descarga automaticamente.

Accede a la interfaz en: https://<TU_IP>:5002


Ordenador 2 — Drone Manager (DroneManager.py)

# 1. Clonar el mismo repositorio
git clone https://github.com/fedepompeo/proyecto-drones-v4.git
cd PythonProject

# 2. Crear entorno virtual
python -m venv .venv
.\.venv\Scripts\activate   # o source .venv/bin/activate

# 3. Instalar dependencias (solo las del drone manager)
pip install paho-mqtt aiortc av djitellopy pymavlink opencv-python \
            python-dotenv colorlog websockets cryptography Pillow

# 4. Configurar .env apuntando al Servidor
# Editar .env:
#   SERVER_IP=<IP_DEL_ORDENADOR_1>
#   SIGNALING_SERVER_URL=wss://<IP_DEL_ORDENADOR_1>:8108

# 5. Ejecutar
python DroneManager.py

DroneManager.py lanza automáticamente CameraService.py y AutopilotService.py en threads.


Configuración (.env)

# ── Red ─────────────────────────────────────────────────────────────────
SERVER_IP=<IP>          # IP del Ordenador 1 (NordVPN Meshnet o LAN)
SIGNALING_SERVER_URL=wss://<IP> :8108   # URL del servidor WSS
FLASK_PORT=5002                   # Puerto de la interfaz web
USE_SSL=true                      # Certificados SSL (autogenerados)
STUN_SERVER_URL=stun:stun.l.google.com:19302     # STUN para WebRTC

# ── MQTT Topics ──────────────────────────────────────────────────────────
AUTOPILOT_QUEUE=autopilot_queue           # Comandos Hexsoon EDU-450 (ArduPilot)
TELLO_QUEUE=autopilot_tello_queue         # Comandos DJI RoboMaster TT
DASHBOARD_WEB_QUEUE=webApp                # Actualizaciones interfaz
TELEMETRY_QUEUE=telemetryService          # Telemetría GPS

# ── LingBot-Map (modo streaming) ─────────────────────────────────────────
LINGBOT_CHECKPOINT=lingbot-map/checkpoints/lingbot-map.pt
LINGBOT_MAX_FRAMES=320            # Buffer máximo de frames
LINGBOT_KEYFRAME_INTERVAL=1       # Frame clave cada N frames
LINGBOT_SCALE_FRAMES=8            # Frames de escala
LINGBOT_USE_SDPA=1                # Atención escalada (más rápido)
LINGBOT_CONF_THRESHOLD=0.3        # Umbral de confianza mínima
LINGBOT_PROCESS_RES=336           # Resolución (múltiplo de 14)

# ── Depth Anything 3 (modo batch) ────────────────────────────────────────
DA3_MODEL_ID=depth-anything/da3-small   # da3-small / da3-base / da3-large
DA3_BATCH_SIZE=29                        # Frames por batch
DA3_PROCESS_RES=336                     # Resolución
DA3_CONF_PERCENTILE_FILTER=0.30

# ── GPU ──────────────────────────────────────────────────────────────────
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
PC_SUBSAMPLE_STEP=2               # Submuestreo nube de puntos (mayor = menos puntos)

Modos de reconstrucción 3D

ModoCuándo usarloResultado
LingBot-Map (streaming)Durante el vuelo, en tiempo realNube de puntos incremental
Depth Anything 3 (batch)Post-vuelo, mayor calidadNube de puntos global .ply

Visor 3D Interactivo

GitHub preview

GitHub renderiza automáticamente cualquier .ply / .stl / .glb subido al repositorio con un visor 3D interactivo. Haz clic en el nombre del archivo para abrir el visor:

ModeloDescripciónMiniatura
1779444538045.plyInterior — DJI RoboMaster TT — DA3Captura de pantalla
1779444312385.plyInterior — DJI RoboMaster TT — LingBot-MapCaptura de pantalla
1779443901413.plyInterior — DJI RoboMaster TT — LingBot-MapCaptura de pantalla
1779443225239.plyExterior — Hexsoon EDU-450 — DA3Captura de pantalla
1779441216581.plyExterior — Hexsoon EDU-450 — LingBot-MapCaptura de pantalla
1779440574725.plyExterior — Hexsoon EDU-450 — LingBot-MapCaptura de pantalla
1779721537234.plyInterior — DJI RoboMaster TT — LingBot-MapCaptura de pantalla
1779722973955.plyInterior — DJI RoboMaster TT — LingBot-MapCaptura de pantalla
1779724088022.plyInterior — DJI RoboMaster TT — DA3Captura de pantalla

Estructura del proyecto

PythonProject/
│
├── SERVIDOR (Ordenador 1)
│   ├── serverMQTT_https.py          # Punto de entrada principal
│   ├── model_worker.py              # Worker de inferencia 3D (subprocess)
│   ├── templates/
│   │   └── drone-control-interface-v2_new.html  # Interfaz web
│   └── static/
│       ├── js/voiceControl.js       # Control por voz
│       └── lib/                     # Bootstrap, Leaflet, MQTT.js
│
├── DRONE MANAGER (Ordenador 2)
│   ├── DroneManager.py              # Orquestador (lanza los servicios)
│   ├── CameraService.py             # WebRTC + YOLO
│   ├── AutopilotService.py          # MQTT → dron
│   └── objects_yolo.py              # Clases COCO para YOLO
│
├── LIBRERIAS DE DRONES
│   ├── dronLink/                    # Hexsoon EDU-450 (ArduPilot / MAVLink)
│   │   ├── Dron.py
│   │   └── modules/                 # arm, goto, telemetry, mission...
│   └── telloLink/                   # DJI RoboMaster TT (Tello Talent)
│       ├── Dron.py
│       └── modules/
│
├── MODELOS 3D (submodulos)
│   ├── lingbot-map/                 # LingBot-Map (streaming 3D)
│   │   ├── lingbot_map/
│   │   └── checkpoints/             # lingbot-map.pt (descargado en runtime)
│   └── depth-anything-3/            # Depth Anything 3 (batch 3D)
│       └── src/depth_anything_3/
│
├── CONFIGURACION
│   ├── .env                         # Variables de entorno
│   ├── calibration_data_fisheye.yaml # Calibración cámara fisheye
│   ├── certs/                       # SSL autogenerado en runtime
│   └── requirements.txt
│
└── RUNTIME (generados, no en git)
    ├── images/                      # Fotos capturadas
    ├── output_da3/                  # Nubes de puntos .ply
    └── depth_weights/               # Pesos DA3

SSL y conectividad

El servidor genera certificados SSL autofirmados al arrancar. Para que el Ordenador 2 confíe en el servidor:

# En Ordenador 2, descargar el certificado del servidor:
curl -k https://<IP_SERVIDOR>:5002/download-cert -o server_cert.pem

CameraService.py hace esto automáticamente al arrancar.

NordVPN Meshnet (recomendado)

Para conectar los dos ordenadores de forma segura sin configurar puertos:

  1. Instalar NordVPN en ambos
  2. Activar Meshnet en la app
  3. Usar la IP Meshnet del Servidor en .env (SERVER_IP)

Troubleshooting

Error: "lingbot_map.models.gct_stream not found"

pip install -e lingbot-map/

Error: "depth_anything_3.api not found"

pip install -e depth-anything-3/

Certificado SSL inválido / ERR_CERT_AUTHORITY_INVALID

Acepta la excepción en el navegador (certificado autofirmado) o regenera:

# Detener servidor, borrar certs y reiniciar
del certs\cert.pem certs\key.pem
python serverMQTT_https.py

CUDA out of memory

# Reducir en .env:
DA3_BATCH_SIZE=15
LINGBOT_MAX_FRAMES=100
DA3_MODEL_ID=depth-anything/da3-small

CameraService no conecta al servidor WSS

  • Verificar que SIGNALING_SERVER_URL en .env apunta a la IP correcta del Servidor
  • Verificar que el puerto 8108 está abierto
  • Asegurarse de que el servidor está corriendo antes que el DroneManager

DJI RoboMaster TT no responde

  • El RoboMaster TT debe estar en la misma red Wi-Fi que el Ordenador 2
  • Confirmar IP del Tello: 192.168.10.X
  • Usar switchDroneType para seleccionar Tello en la interfaz

Hexsoon EDU-450 no conecta (ArduPilot)

  • Verificar puerto serie / UDP en AutopilotService.py
  • Confirmar que pymavlink / dronLink está instalado

Documentación técnica de los modelos

Documentos detallados sobre cómo el código utiliza cada modelo y cómo funcionan internamente (nivel ingeniería):

DocumentoContenido
LINGBOT_MAP_TECNICO.mdArquitectura GCTStream, KV cache, back-projection, pipeline completo
DEPTH_ANYTHING_3_TECNICO.mdArquitectura DA3, modo batch, sub-batches

Agradecimientos

Este proyecto no sería posible sin el trabajo de los siguientes equipos de investigación, a quienes agradecemos enormemente por publicar sus modelos de forma abierta:


LingBot-Map — Geometric Context Transformer for Streaming 3D Reconstruction

"Un modelo 3D feed-forward que unifica coordenadas, señales geométricas densas y corrección de deriva a largo plazo en un único framework de streaming, permitiendo inferencia estable a ~20 FPS sobre secuencias de más de 10.000 frames."

Autores: Lin-Zhuo Chen*, Jian Gao*, Yihang Chen, Ka Leong Cheng, Yipengjing Sun, Liangxiao Hu, Nan Xue, Xing Zhu, Yujun Shen, Yao Yao†, Yinghao Xu†
Organización: Robbyant Team
Paper: arXiv:2604.14141 (2026)
Repositorio: github.com/Robbyant/lingbot-map
Modelo: HuggingFace — robbyant/lingbot-map

BibTeX
@article{chen2026geometric,
  title={Geometric Context Transformer for Streaming 3D Reconstruction},
  author={Chen, Lin-Zhuo and Gao, Jian and Chen, Yihang and Cheng, Ka Leong and
          Sun, Yipengjing and Hu, Liangxiao and Xue, Nan and Zhu, Xing and
          Shen, Yujun and Yao, Yao and Xu, Yinghao},
  journal={arXiv preprint arXiv:2604.14141},
  year={2026}
}

Depth Anything 3 — Recovering the Visual Space from Any Views

"DA3 predice geometría espacialmente consistente a partir de un número arbitrario de imágenes, con o sin poses de cámara conocidas, usando un único transformer DINO sin especialización arquitectónica. Supera al estado del arte anterior (VGGT) en un 35.7% en estimación de pose y 23.6% en precisión geométrica."

Autores: Haotong Lin*, Sili Chen*, Jun Hao Liew*, Donny Y. Chen*, Zhenyu Li, Guang Shi, Jiashi Feng, Bingyi Kang†
Organización: ByteDance Seed
Paper: arXiv:2511.10647 (2025) · ICLR 2026
Repositorio: github.com/ByteDance-Seed/Depth-Anything-3
Proyecto: depth-anything-3.github.io
Demo: HuggingFace Spaces

BibTeX
@article{depthanything3,
  title={Depth Anything 3: Recovering the visual space from any views},
  author={Haotong Lin and Sili Chen and Jun Hao Liew and Donny Y. Chen and
          Zhenyu Li and Guang Shi and Jiashi Feng and Bingyi Kang},
  journal={arXiv preprint arXiv:2511.10647},
  year={2025}
}

Referencias


Licencia

  • LingBot-Map: Ver lingbot-map/LICENSE.txt
  • Depth Anything 3: Apache 2.0 (depth-anything-3/LICENSE)
  • dronLink / telloLink: Ver cada módulo

Desarrollado con fines educativos para proyecto de drones - EETAC 2026