Unity y comunicación ZMQ
Requisitos
La aplicación Unity debía:
- Ejecutarse en Meta Quest 3 con modo passthrough MR
- Recibir video RGB y datos de sensores desde la NUC en tiempo real
- Enviar comandos de modo de percepción a la NUC
- Ser extensible para agregar control del robot y gemelo digital en etapas futuras
Diseño
Stack tecnológico
| Paquete | Función |
|---|---|
| Meta XR SDK (All-in-One) 83.0 | SDK principal para Meta Quest, passthrough y controladores |
| AsyncZMQ (NetMQ) | Cliente ZeroMQ para comunicación con la NUC |
| Unity XR Interaction Toolkit | Gestión de ray interaction y EventSystem VR/MR |
Arquitectura de comunicación
La NUC embarcada expone tres endpoints ZMQ. Unity actúa como cliente en los tres:
| Puerto | Tipo ZMQ | Dirección | Contenido |
|---|---|---|---|
:5555 | PUB/SUB | NUC → Unity | video_rgb — frames JPEG del stream principal |
:5001 | PUB/SUB | NUC → Unity | stat, mode_ack, lidar_grid, cam_info, vision, error |
:5002 | PUB/SUB | Unity → NUC | cmd — comandos JSON (modos, y en el futuro control del robot) |
Implementación
Componentes ZMQ en Unity
ZmqVideoReceiver.cs
- Se suscribe a
tcp://<NUC_IP>:5555topicvideo_rgb - Decodifica JPEG en hilo secundario y actualiza un
RawImageenVideoPanel - Mantiene métricas locales: FPS, resolución, estado de conexión
- Envía comandos de modo de cámara a port 5002
ZmqSensorReceiver.cs
- Se suscribe a
tcp://<NUC_IP>:5001topicsstatymode_ack - Actualiza el estado global:
camera_ok,lidar_ok, modo activo - Alimenta al
RobotStatusPanel
ZmqLidarGridView.cs
- Se suscribe a
tcp://<NUC_IP>:5001topiclidar_grid - Reconstruye el grid como
Texture2Dy lo renderiza enLidarPanel - Adapta el tamaño de textura dinámicamente al cambiar modo
- Envía comandos de modo de lidar a port 5002
Los comandos UI se reenvían varias veces con pequeña separación temporal para compensar el problema de slow joiner de ZMQ PUB/SUB.
Jerarquía de la escena
SampleScene
├── Main_menu
│ └── CanvasRoot
│ ├── UIBackplate
│ │ ├── BotonesVideo (dropdown camera mode)
│ │ ├── BotonesLidar (dropdown lidar mode)
│ │ ├── StatusPanel
│ │ ├── VideoPanel
│ │ │ └── VideoRawImage
│ │ └── LidarPanel
│ │ └── LidarRawImage
│ ├── SensorReceiver
│ └── ISDK_RayCanvasInteraction
├── EventSystem
└── (demás objetos de escena MR)
Validación
| Función | Estado |
|---|---|
| Proyecto compilado y desplegado en Meta Quest 3 | ✅ Sin errores |
| SDK Meta XR inicializado, passthrough activo | ✅ Verificado |
| Comunicación ZMQ establecida (video + sensores + comandos) | ✅ Verificado |
Dropdowns sincronizados con backend via mode_ack | ✅ Verificado |
| Importación de modelo URDF (gemelo digital) | ⏳ Mediano plazo |
Pendiente: Documentar el procedimiento completo de build e instalación APK en Meta Quest 3.