Saltearse al contenido

DRC controls — input + autoridad

El control manual de drones en ARGUS se alimenta de una capa compartida de mapeo de input (controls-prefs.service.ts) que enruta los inputs del operador a través de una abstracción de transporte al drone — handhelds, aeronaves MAVLink, o aeronaves de DJI dock. El mismo mapeo funciona entre los tres; la capa de transporte maneja las diferencias de protocolo.

El mapa de control

Los bindings viven en un objeto ControlsMapping en Settings → Input controls. Todos los bindings están sin asignar por defecto — el sistema se entrega con un mapeo vacío para que los operadores enlacen explícitamente lo que quieren. Esto es intencional para evitar inputs sorpresa.

El conjunto completo de controles enlazables:

Comandos de vuelo

  • droneTakeoff — iniciar auto-despegue.
  • droneLand — iniciar auto-aterrizaje.
  • droneGoHome — enviar RTH.
  • droneCancelTakeoff / droneCancelLand / droneCancelGoHome — cancelar cada uno de los anteriores mientras están en progreso.
  • emergencyStop — ESTOP, corte total de potencia. Usar con extrema precaución — la aeronave cae.

Grab de autoridad (DJI DRC)

  • authorityGrabFlight — tomar autoridad de vuelo DRC Clase-A de DJI.
  • authorityGrabPayload — tomar autoridad de payload DRC Clase-B (cámara/gimbal) de DJI.

La autoridad es de un solo operador a la vez. Hacer grab mientras otro operador la mantiene dispara una confirmación de force-grab en la UI.

Comandos de dock (sólo DJI dock)

  • dockCoverOpen / dockCoverClose — cubierta física.
  • poiModeToggle — iniciar / detener modo orbit POI de DJI.

Cámara + gimbal

  • camLensChange — ciclar lente (WIDE / ZOOM / IR).
  • camTakePicture — disparador.
  • camStartRecording / camStopRecording — toggle de grabación de vídeo.
  • droneFlyToPoint / takeoffToPoint — vuelo autónomo a un objetivo.

UI / seguridad

  • masterCaution — reconocer alertas críticas actuales.

Ejes analógicos (inputs de valor continuo)

  • droneAxisPitch, droneAxisRoll, droneAxisYaw, droneAxisThrottle — ejes del stick de vuelo.
  • gimbalAxisPitch, gimbalAxisYaw, gimbalAxisZoom — ejes del gimbal.

Cada eje se vincula a un eje físico en un gamepad o a un “eje digital” de teclado (dos teclas que mueven un stick virtual a tope a la izquierda / tope a la derecha).

Soporte de gamepad

La capa de input detecta gamepads vía la Gamepad API del navegador + fallback WebHID para controladores HOTAS que no se exponen como gamepads estándar.

  • Auto-detección — conecta un dispositivo, aparece en la página input-controls.
  • Modo-2 por defecto — si aceptas el mapeo sugerido, vincula el stick izquierdo a pitch/roll, el stick derecho a yaw/throttle. Los modos 1, 3 y 4 están disponibles mediante re-mapeo manual.
  • Curva de stick (expo) — valor de expo por eje 0-1 vía el slider de curva de stick. 0 = lineal, 1 = expo máximo. La mayoría de operadores se asientan alrededor de 0.3.
  • Fuente preferidapreferredDroneInputSource puede ser webhid, gamepad, native-bridge o serial. Si múltiples fuentes están conectadas todas producen eventos; la preferida gana.

Teclado

Cualquier control puede enlazarse a una tecla de teclado vía el panel Settings → Input controls. Bindings comunes que los operadores se ponen a sí mismos (ninguno viene de fábrica):

  • T — takeoff.
  • L — land.
  • H — return-to-home.
  • Esc — release authority.
  • Space — PTT (consulta PTT — ya reservada por el sistema PTT; no la reasignes).

Envelope de seguridad

La capa de input recorta los inputs antes de enviarlos al transporte:

  • Saturación de stick — cada eje analógico se recorta a [-1.0, 1.0].
  • Gate del modo virtual-stick — si isVirtualStickModeEnabled es false en el drone, los inputs del stick de vuelo se descartan antes de la transmisión; la aeronave los rechaza igualmente pero la UI hace short-circuit.
  • Modo avanzadoisVirtualStickAdvancedModeEnabled desbloquea comandos de envelope de vuelo extendidos (override del cap de altitud, mayores velocidades horizontales). Configurable por admin.
  • Geofence / no-fly — el pipeline de seguridad geofence recorta inputs que empujarían el drone más allá de un límite de polígono.

Actualmente NO hay una opción de soft-clipping (p. ej. “50 % máximo de throttle”) — el recorte es duro en ±1.0.

Flujo de autoridad DRC (sólo DJI dock)

Para volar manualmente una aeronave de DJI dock vía DRC:

  1. Selecciona el drone en el tile de flota. El tile se enlaza a él.
  2. Toma autoridad — haz clic en Take control en la barra del drone-stream, o dispara el input enlazado authorityGrabFlight. ARGUS publica drc_grab_authority. Si alguien más está volando, un diálogo de confirmación ofrece force-grab o esperar.
  3. Arranca el heartbeat — el DjiCloudControlTransport empieza a enviar un comando de heartbeat a 1 Hz para mantener viva la sesión DRC. Pausa cuando la pestaña del navegador está oculta (sin ancho de banda desperdiciado) pero la sesión expira tras ~60 s de silencio.
  4. Vuela — tus ejes de input + comandos de botón fluyen al drone. El heartbeat sigue ejecutándose.
  5. Release — pulsa la tecla enlazada Release, cierra el tile de drone-stream o navega fuera. ARGUS publica drc_release_authority para devolver la autoridad.

Si el heartbeat se detiene (pestaña colgada, red caída), la sesión DRC a nivel de flight-controller del dock expira autónomamente y la aeronave se queda en hover en su sitio — no se estrella.

Controles de cámara vía DRC

  • Apuntado del gimbal — los dos ejes del gimbal (pitch / yaw) más zoom; la pose del gimbal sigue los valores de eje en casi tiempo real.
  • Cambio de lentecamLensChange cicla entre las lentes disponibles.
  • FotocamTakePicture dispara un único disparo.
  • Grabar — toggle camStartRecording / camStopRecording.
  • Look-at a un punto en el mapa — click derecho en un punto del mapa → Look at this point. Despacha un comando de pose de gimbal absoluto para que el gimbal apunte a la coordenada.
  • Fly-to a un punto — click derecho en el mapa → Fly to here. Despacha droneFlyToPoint.

La identidad del peer para DJI DRC

Cuando el tile de drone-stream está en modo djiCloud, los comandos fluyen vía el DjiCloudControlTransport. Ese transporte usa peer id dji-dock-{sn} (el mismo peer id que usa el LivekitParticipantManager en el lado argus-dji) para que los streams de telemetría + control del dock compartan una identidad.

Limitaciones conocidas

  • Sin perfil de curva por control — un único slider de curva de stick se aplica a todos los ejes de vuelo. Las curvas por eje están planificadas.
  • Sin “soft cap” en throttle / yaw / roll — sólo el recorte duro ±1.0.
  • Sin editor de deadband de joystick — depende del deadband natural de cada dispositivo.

Relacionado