Ir al contenido

El proceso coordinador de la NUC usa ZeroMQ con cuatro puertos, uno por tipo de dato. Esta página los describe desde dentro del sistema —cómo los abre y los atiende el coordinador—; el contrato entre subsistemas, con la tabla de puertos verificados, está en Comunicaciones del sistema.

Nivel de replicación

Reproducible

Están los archivos de fabricación. Puedes producir una copia idéntica sin rediseñar nada.

Lo que encuentras aquí

  • Código fuente completo del coordinador, 2409 líneas
  • Puertos, tópicos y esquema de comandos con sus frecuencias
  • Dependencias de Python y hardware necesario
  • Todos los parámetros de red, watchdog y puentes serie

Lo que falta

  • Versiones exactas de las dependencias: el código no trae requirements.txt ni fija versión de ultralytics, pyrealsense2 u OpenCV
  • Script de arranque automático al encender la NUC

Artefacto

PYCoordinador de la NUC — nuc_master_code.py

80 KB

El coordinador es un único proceso de Python que abre los cuatro puertos ZeroMQ, conecta los sensores y mantiene los dos puentes serie. No hay orquestador ni servicio: se lanza a mano.

Dependencias del coordinador
PaquetePara quéNota
pyzmqLos cuatro canales ZeroMQNúcleo del middleware
opencv-pythonCompresión JPEG y morfología del pipeline de paredesSe importa como cv2
numpyGrids, máscaras y nubes de puntos
pyrealsense2RealSense D435iRequiere el SDK de Intel instalado
ultralyticsYOLO en los modos pose y segmentaciónDescarga los pesos la primera vez
pyserialPuentes COM4 y COM5Import opcional: sin él, el arranque no falla
rplidarc1RPLiDAR C1Con respaldo a un módulo scanner local

El código tolera que falten pyserial y el módulo del LiDAR: los envuelve en try/except y arranca igual, sin ese periférico. Eso permite desarrollar la parte de percepción o de red sin el robot conectado.

Los puertos serie están fijados en el código (COM4, COM5, COM3), no son configurables por argumento ni por variable de entorno. En otra máquina hay que editarlos.

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

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,08Evita 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.

Puentes serie de la NUC hacia la electrónica embebida
PuertoBaudrateDestinoEjemplo de comando de salida
COM4115 200Puente H maestro — base y manipuladorPOSE {base} {codo} {muneca}
COM5115 200Controlador del gripperm {mm}
FuncionalidadEstado
Streaming video, grid LiDAR, statVerificado
Cambio de modos cámara/LiDAR desde UnityVerificado vía mode_ack
Control de base móvil y manipuladorImplementado
Telemetría de manipulador y gripperImplementada
Watchdog de timeout de drive_cmd (0,35 s)Implementado
Watchdog de conexión ZMQ con paro seguroPendiente