Ir al contenido

Middleware ZMQ

El middleware es la parte del coordinador de la NUC que mueve mensajes: los cuatro canales ZeroMQ con el visor y los dos puentes serie hacia las placas embebidas.

Código dentro del coordinador de la NUC, no un programa aparte. Abre cuatro puertos ZeroMQ, uno por tipo de dato, y mantiene dos puertos serie. Esta página lo describe desde dentro de la NUC; el contrato entre subsistemas, con la tabla de puertos verificados, está en Comunicaciones del sistema.

Puertos ZMQ del middleware de la NUC
PuertoRol NUCRol UnityTipo
5555PUBSUBVideo: frames JPEG comprimidos
5001PUBSUBSensores y estado: JSON por tópico
5002SUBPUBComandos desde Unity hacia la NUC
5007PUBSUBParedes y puntos LiDAR: datos binarios

Tres decisiones de diseño gobiernan el reparto:

  • Puertos separados por tipo de dato. El video y los datos binarios no pueden bloquear el canal JSON, que es el que lleva el estado y los comandos.
  • Streaming selectivo. Cada modo publica solo mientras está activo, así que un sensor apagado no cuesta ni CPU ni ancho de banda.
  • High watermark por canal. Cada puerto tiene su propio límite de cola, y la diferencia entre ellos es deliberada.
High watermark de envío por canal
ParámetroValorUnidadNotas
Video (5555)2mensajesUn frame viejo no sirve: mejor descartarlo que acumular retraso
Sensores y estado (5001)300mensajesJSON pequeño; conviene no perder eventos de estado
Paredes y puntos (5007)50mensajesPunto medio: paquetes grandes, pero tolera algo de cola

El límite de 2 en video es lo que mantiene la teleoperación utilizable. Con una cola profunda, el operador vería frames cada vez más viejos conforme la red se degrada, en lugar de perder algunos y seguir viendo el presente.

Los canales que el middleware atiende: ZeroMQ hacia el visor y serie hacia las dos placas que reciben órdenes directas de la NUC.

  1. NUCcoordinador · Python 3.12
  2. Meta Quest 3cliente Unity
  3. ZMQ por WiFiMeta Quest 3 → NUC: 5002 · cmd JSONNUC → Meta Quest 3: 5555 · 5001 · 5007
  4. Puente H maestrotracción y manipulador
  5. COM4 · 115 200 baudNUC → Puente H maestro: POSE {base} {codo} {muneca}Puente H maestro → NUC: estado
  6. Controlador del gripperpinza
  7. COM5 · 115 200 baudNUC → Controlador del gripper: m {mm}Controlador del gripper → NUC: GRIPPER_STATE
TópicoFrecuenciaContenido
stat~2 HzEstado global: sensores OK, modos activos, ángulos del manipulador, gripper_mm
mode_ackAl cambiar modoConfirmación de cambio de modo
lidar_grid~12 HzGrid de ocupación linealizado del modo activo
manip_state~4 HzÁngulos actuales del manipulador y finales de carrera
gripper_state~4 HzPosición del gripper en mm, busy, calibrated
vision~10 HzResultados YOLOv8 (pose o segmentación)
cam_infoContinuoIntrínsecos de la RealSense y escala de profundidad

Todos los comandos viajan como JSON. Estos son los más relevantes, agrupados por función:

FamiliaEjemplo
Modo de percepción{"type": "set_camera_mode", "mode": "normal|pose|segment|off"}
Habilitar control{"type": "master_arm"} / {"type": "master_disarm"} / {"type": "stop_all"}
Base móvil{"type": "drive_cmd", "v": 0.5, "w": -0.3, "enabled": true}
Manipulador{"type": "manip_cmd", "q": [base_deg, codo_deg, muneca_deg]}
Gripper{"type": "gripper_cmd", "opening_mm": 30.0}

drive_cmd usa modelo uniciclo: la NUC mezcla v/w y envía al Puente H maestro a 15 Hz.

Valores que gobiernan el mando y sus paros
ParámetroValorUnidadNotas
Envío de tracción al maestro15Hz
Timeout de drive_cmd0,35sSin comando nuevo, la tracción se detiene
Zona muerta del joystick0,08—Evita deriva por reposo impreciso del control
Consigna máxima al puente H255crudo
Timeout de heartbeat de comandos2,0s
Consulta de estado al manipulador4Hz
Consulta de estado al gripper4Hz
Envío de comandos al gripper20Hz
Reintento de reconexión serie1,0s

Los dos timeouts cubren fallos distintos. El de drive_cmd (0,35 s) actúa cuando el operador deja de mandar pero la conexión sigue viva. El de heartbeat (2 s) actúa cuando se cae el enlace entero.