Ir al contenido

2026 04 30 ux workflow audit vs basabot

Esta página aún no está disponible en tu idioma.

Auditoría UX/Workflow — Robotics Module vs BasaBot Cockpit Spec

Section titled “Auditoría UX/Workflow — Robotics Module vs BasaBot Cockpit Spec”

Fecha: 2026-04-30 Referencia: BasaBot Cockpit v2.0 — Especificación de Interfaz de Gestión de Flotas


El módulo robotics implementa ~35% de las capacidades descritas en el spec de referencia. Los aciertos están en la arquitectura de transporte (SSE+WS dual) y la estructura base del cockpit. Las carencias principales están en seguridad funcional (deadman, latency lockout, re-arm procedure), gestión de flota avanzada (tabla de estado, filtros, acciones globales), y post-misión (inexistente).


AspectoEstadoNota
RBAC✅ ParcialLa plataforma (Keycloak) define roles: PlatformAdmin, TenantAdmin, Farmer. El módulo no aplica diferenciación visual ni funcional por rol.
AuthhttpOnly cookie nkz_token, SSO Keycloak
MFA⚠️Delegado a Keycloak — no forzado desde el módulo
Sesión única por robotNo hay bloqueo de control. Dos operadores pueden abrir el cockpit del mismo robot simultáneamente.
Caducidad por inactividad⚠️Delegado a la plataforma (cookie expiry). No hay timeout específico del módulo.
RequisitoPrioridadEsfuerzo
Bloqueo pesimista de control por robot (solo un operador a la vez)AltaMedio — requiere estado compartido (Redis/Orion-LD)
Separación Admin no teleopera / Operador no configuraMediaBajo — ocultar botones según rol
Timeout de inactividad en cockpit (15 min → volver a flota)MediaBajo — timer en CockpitLayout

ComponenteEstadoNota
Grid de tarjetasRobotCard con batería, modo, GPS, timestamp
Búsqueda por nombreFiltro de texto en FleetDashboard
Mapa GISFleetMap con Cesium, puntos coloreados por modo
Click en mapa → cockpitScreenSpaceEventHandler
Filtros por estadoSolo búsqueda textual. Sin “Solo con alertas”, “Detenidos”, “Sin comunicación”
Tabla de estadoSolo vista de tarjetas. Sin columnas ordenables: ID, Estado, SOC, ETA, Apero, Operador
Ordenación inteligenteSin priorización: fallos → detenidos → ejecutando → espera
Acciones globalesSin “Pause All” ni “E-Stop All”
Capa meteorológicaSin API de viento/precipitación/temperatura
Gestor de misionesSin carga de waypoints ni polígonos de cobertura
Vectores direccionalesFleetMap usa puntos, no flechas con heading RTK
Capas dinámicasSin zonas de exclusión temporales ni coordinación de enjambre
RequisitoPrioridadEsfuerzo
Tabla de estado con columnas mínimas + filtros rápidos preconfiguradosAltaMedio — nueva vista de tabla + useFleet enriquecido
Ordenación: fallos primero, nunca paginar ocultando alertasAltaBajo — lógica en useFleet
Flechas direccionales con heading RTK en FleetMapAltaBajo — cambiar point por billboard con rotación
Colores semánticos estrictos: Verde=Nominal, Amarillo=Aviso, Naranja=Advertencia, Rojo=Fallo, Gris=Sin datosAltaBajo — CSS variables ya definidas, falta usarlas consistentemente
Botón “Pause All” + “E-Stop All” con confirmación doble pasoMediaMedio — nuevo endpoint batch + UI
Capa meteorológicaBajaAlto — integración API externa
Gestor de misiones (waypoints, cobertura)BajaAlto — spec pendiente

3. Vista Micro — Teleoperación y Diagnóstico

Section titled “3. Vista Micro — Teleoperación y Diagnóstico”

3.1 Módulo de Cinemática y Tracción (4WS)

Section titled “3.1 Módulo de Cinemática y Tracción (4WS)”
Requisito BasaBotTenemosGap
Selector de modo 4WS (5 modos)✅ 4 modos (falta Ackermann Trasero)Añadir ACKERMANN_REAR
Joystick virtual
Soporte gamepad físico
Monitor de deslizamiento (slip)Nuevo: gráfico odometría vs GNSS
Visor cenital del chasis con ángulos realesNuevo: SVG interactivo de 4 ruedas
Estado de tracción por rueda (par, RPM, temp, consumo)Nuevo: 4 widgets de rueda
Hold-to-drive (deadman)CRÍTICOSin deadman, soltar joystick NO detiene el robot
Limitador de velocidad en modo manual (1.0 m/s)CRÍTICOJoystick puede enviar linear.x ilimitado
Fail-safe de latencia (>200ms por 2s → lockout)CRÍTICOEl header muestra latencia pero no bloquea
Indicador de “En intervención por Sin estado compartido de control
Requisito BasaBotTenemosGap
SOC %battery_pct en HUD
Voltaje de bus, consumo instantáneo (kW)Solo porcentaje
SOH %Sin degradación de batería
Diagnóstico de celdas (ΔV balanceo)Sin datos de BMS
Temperaturas (pack, inversores, conector)
Predicción de autonomía vs misión
Requisito BasaBotTenemosGap
Reconocimiento del apero activo⚠️Hardcoded “Sprayer” con valores mock
Tripuntal (posición 0-100%, fuerza)
PTO eléctrica (ON/OFF, RPM, par)
Compatibilidad ISOBUS TIM
Requisito BasaBotTenemosGap
Video multi-cámaraSelector front/rear/implement
Latencia y timestamp en pantallaEl canvas no muestra timestamp ni latencia
Adaptación de calidad (1080p/720p/480p)Sin control de perfil
Visor Nav2 / costmapsSin representación de navegación autónoma
Calidad GNSS (RTK Fix → No Fix)Solo coordenadas, sin indicador de calidad
Correcciones NTRIP (latencia, mountpoint)
EKF health indicator

3.5 Seguridad Funcional y Hardware (§5 BasaBot)

Section titled “3.5 Seguridad Funcional y Hardware (§5 BasaBot)”
Requisito BasaBotTenemosGap
Topología visual del lazo E-StopSin representación de setas, bumpers, cortinas
Categorías de parada (Cat 0 vs Cat 1)Solo un tipo de E-STOP indiferenciado
Procedimiento de re-armado (4 pasos)Sin flujo de re-armado
Estado de contactores (precarga, tracción, PTO)
Salud de red (RSSI, RSRP, failover)
Watchdogs y heartbeats por subsistemaSolo heartbeat del robot completo

4. Vista Post-Misión — Analítica y Mantenimiento (§6 BasaBot)

Section titled “4. Vista Post-Misión — Analítica y Mantenimiento (§6 BasaBot)”

Estado actual: Inexistente (0% implementado)

RequisitoPrioridad
Mapa de compactación / durezaBaja (fase 2)
Mapa de cobertura efectivaBaja (fase 2)
Mapa de calidad RTKBaja (fase 2)
Mapa de velocidad realBaja (fase 2)
Visor de logs (rosbag2)Baja (fase 2)
Mantenimiento predictivo (alertas por horas/ciclos)Media (fase 2)

Requisito BasaBotEstado actualGap
Dark mode por defectobg-slate-950
Diseño responsivo 3 breakpoints (1024, 1440, 2560)⚠️Solo responsive genérico + HMI mode. Sin bloqueo de teleop < 1024px
Paleta semántica estricta⚠️Variables CSS definidas (--nkz-critical, --nkz-warning, --nkz-ok) pero NO se usan consistentemente en componentes
Operabilidad con guantes (≥48px)⚠️HMI mode lo aplica. Modo normal: botones de 36-40px
WCAG 2.1 AASin contraste verificado, sin roles ARIA, sin navegación por teclado
Información no codificada solo por colorStatusBadge usa solo color + icono pequeño. El indicador de latencia es solo color (verde/rojo)
i18n (es, eu, en)✅ es + en; ❌ euFalta euskera

6. Ciberseguridad y Auditoría (§8 BasaBot)

Section titled “6. Ciberseguridad y Auditoría (§8 BasaBot)”
RequisitoTenemosGap
TLS 1.3 en transporteZenoh sobre TLS
mTLS robot-brokerSolo TLS servidor. Decisión de diseño documentada (campo agrícola)
Certificado X.509 por robotUser/password en lugar de certificados
AuthN OIDC con refreshVía plataforma
RBAC server-side⚠️Tenant middleware extrae rol. No se aplica en UI
Audit log inmutable (12 meses)Sin trazabilidad de acciones
Segmentación de redDelegado a K8s NetworkPolicy (no definido)
OTA con firma criptográficaFuera de scope del módulo

7. Presupuesto de Latencias y SLA (§9 BasaBot)

Section titled “7. Presupuesto de Latencias y SLA (§9 BasaBot)”

Comparativa de nuestros valores actuales vs el spec:

FunciónObjetivo BasaBotNuestro valorEstado
Telemetría no crítica≤ 1 sDepende de Zenoh SSE✅ Implementado, no verificado
Vídeo (glass-to-glass)≤ 300 msMJPEG sobre WS⚠️ Sin medición
Comando teleoperación RTT≤ 150 msWebSocket ping✅ Medimos latencia
E-STOP remoto (clic→corte)≤ 200 msSin garantía❌ Sin medición ni SLA
Heartbeat watchdog interno100 msConfigurable⚠️ Sin enforce
Fail-safe latencia200 ms/2s → lockoutNO IMPLEMENTADOCRÍTICO

8. Resumen de puntos de fricción y bloqueo

Section titled “8. Resumen de puntos de fricción y bloqueo”

Bloqueantes (impiden uso seguro en producción)

Section titled “Bloqueantes (impiden uso seguro en producción)”
#IssueUbicaciónImpacto
1Sin deadman (hold-to-drive)CockpitLayout, JoystickSoltar joystick NO detiene el robot. Riesgo de seguridad grave.
2Sin limitador de velocidad en modo manualCockpitLayout.handleCmdVelJoystick puede enviar linear.x = 100.0 sin límite.
3Sin fail-safe por latenciaSafetyHeaderEl operador no sabe que perdió control. Si latency > 200ms por 2s, debe lockout.
4Sin bloqueo de control exclusivoApp.tsxDos operadores pueden teleoperar el mismo robot simultáneamente.
5E-STOP sin latencia garantizadateleoperation.pySin medición ni SLA de 200ms para el E-STOP remoto.

Fricción alta (degradan la experiencia significativamente)

Section titled “Fricción alta (degradan la experiencia significativamente)”
#IssueUbicación
6FleetDashboard sin tabla de estado ordenable ni filtros rápidosFleetDashboard
7Marcadores en mapa son puntos, no flechas con headingFleetMap
8Sin indicador de calidad GNSS (RTK Fix vs Single)TelemetryHUD
9Valores de implemento hardcodeados (presión=2.4, caudal=12)ImplementPanel
10Sin timestamp ni latencia en el videoVideoViewport
11Paleta semántica definida pero no usada consistentementeTodos los componentes
12Sin flujo de re-armado post E-STOPCockpitLayout
#Issue
13Sin modo solo-consulta en viewports < 1024px (bloquear teleop)
14Sin indicador visual de “En intervención por ” en fleet
15E-STOP indiferenciado (Cat 0 vs Cat 1 según origen)
16Sin representación visual del lazo de seguridad (qué disparó el E-STOP)
17Sin SOH de batería ni balanceo de celdas
18Sin monitor de deslizamiento (slip odometría vs GNSS)
19Sin visor cenital del chasis con ángulos reales de ruedas
20Sin accesibilidad WCAG AA (sin roles ARIA, sin teclado)

9. Plan de acción recomendado (orden de prioridad)

Section titled “9. Plan de acción recomendado (orden de prioridad)”

Fase A — Seguridad funcional (obligatorio antes de producción)

Section titled “Fase A — Seguridad funcional (obligatorio antes de producción)”
  1. Deadman (hold-to-drive): Modificar Joystick y gamepad para que requieran presión continua. Soltar → cmd_vel cero + transición a MONITOR.
  2. Limitador de velocidad: Clamp linear.x ∈ [-1.0, 1.0] y angular.z ∈ [-1.0, 1.0] en CockpitLayout.handleCmdVel.
  3. Fail-safe de latencia: En useRoboticsWS, si latencyMs > 200 durante 2s continuos → bloquear controles + mostrar overlay “Control bloqueado — latencia excesiva”.
  4. Bloqueo de control exclusivo: Estado en Orion-LD (AgriRobot.controlledBy) consultado antes de entrar a MANUAL. Si ya está controlado, mostrar “Robot bajo control de ”.
  5. Garantía E-STOP: Medir round-trip real del E-STOP en teleoperation.py. Priorizar el mensaje sobre cualquier otro tráfico en el WebSocket.
  1. Tabla de estado con filtros rápidos: Alternar entre vista grid (actual) y tabla con columnas + filtros “Solo advertencias”, “Detenidos”, “Sin comunicación”.
  2. Flechas direccionales en FleetMap: Cambiar point por billboard con imagen de flecha rotada según heading.
  3. Indicador GNSS: Añadir al HUD: RTK Fix ✓, RTK Float ~, DGPS, Single ⚠, No Fix ✗.
  4. Paleta semántica: Refactorizar todos los componentes para usar --nkz-ok, --nkz-warning, --nkz-critical consistentemente.
  1. Flujo de re-armado: Post E-STOP → overlay “Causa: E-STOP remoto por . Resolver causa → Confirmar → Robot en espera”.
  2. WCAG AA: roles ARIA, navegación por teclado, contraste verificado.
  3. Euskera: Añadir eu.json.
  4. Valores de implemento desde telemetría real: Conectar ImplementPanel a datos del SSE en lugar de hardcoded.