Calificación:
  • 2 voto(s) - 4 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Proyecto low cost pylot

Debo hacer una puntualización.
La referencia de rumbo magnético no se compara directamente con el rumbo actual, ya que durante las maniobras que comporten grandes variaciones de angulo, se producirían transiciones muy bruscas.
Es por tanto necesario disponer de una nueva referencia magnética móvil que vamos a llamar referencia de piloto (En los listados de programa: NAVDAT.plt), y que es la que aparece tanto en la pantalla del mando como en el teclado Web.

Operativa WIND/VANE (Viento / veleta):
- Imaginemos una virada de +100° partiendo de un rumbo de 40°. La nueva referencia magnética será de 140° pero la consigna o referencia de rumbo para el piloto irá variando desde 40° a 140° progresivamente durante la maniobra y siempre limitada a la velocidad máxima de giro permitida.
Entonces, es esta referencia de piloto NAVDAT.plt la que va a ser modificada por las correcciones cuando varíe el angulo de viento navegando en modo WIND/VANE, y la referencia magnética inicial servirá para avisar al usuario cuando la rolada sea tal que nos obligue a apartarnos demasiado de ese rumbo inicial.
- El piloto avisará con un pitido corto por cada grado que deba modificar el rumbo para mantener constante el ángulo de viento; y con pitidos largos y el mensaje WIND SHIFT en la pantalla, cuando ese ángulo sea mayor del máximo permitido introducido en el setup de usuario.
De hecho esta operativa es exactamentente la que siguen los pilotos Raymarine que conozco. Como me gusta, pues he escrito el software para que haga lo mismo.
- El piloto aceptará correcciones de ángulo de viento y rumbo final durante las maniobras TACK / GYBE (virada y trasluchada) y fuera de ellas. Los ángulos de referencia de la incidencia del viento aparente (-) y del rumbo magnético (+) se modificarán en consonancia con el signo de la corrección.
Un ejemplo: Ceñimos con AWA de estribor de 30º y a rumbo magnético de 100º. Si pulsamos -10, le estamos indicando al piloto que queremos arribar 10º virando a babor. Lo que dará como resultado que la nueva referencia de AWA será de 40º y el nuevo rumbo HDG será de 90º. Aquí el signo de la corrección es (-), así que la modificación del ángulo de referencia del viento es (+), que pasa a 40º, y la nueva de heading es (-), que pasa a 90º.

Para los masoquistas, aquí el listado donde se prepara la maniobra de TACK / GYBE:
Código:
  case 5: case 6:                           // Tack and gybe Port / Starboard
    if (ChangeSteps) break;                 // Manouver is running
    if (NAVDAT.autom == AUTO) {             // AUTO Mode
      if (CourseDelta == 0) {
        if (keytmp == 5) CourseDelta = -Setup.TackAngle;    // Tack to port
        else             CourseDelta = Setup.TackAngle;     // Tack to starboard
      }
      ang_add(&BOATDATA.HdgRef, CourseDelta);
      NavControl(0x04);                             // To Init strong corr. (NavControl task)
    } else if (NAVDAT.autom == WIND) {      // WIND mode:
      BOATDATA.HdgRef = BOATDATA.Plt;       // New heading reference: Present Pilot angle
      WRefTmp = BOATDATA.Twa;               // Reference for Tack/Gibe. True wind
      MType = 0x04;                         // Prepare for TACK
      if (WRefTmp <= 6000) {                // TACK to Starboard     
        CourseDelta = 2 * WRefTmp;
      } else if (WRefTmp >= 30000) {     // TACK to Port
        CourseDelta = -2 * (36000 - WRefTmp);
      } else if ((Setup.Gybing == 1) || ((Setup.Gybing == 2) && (BOATDATA.Tws < 150))) {
        MType = 0x0c;                    // Motor speed limitation when gyving
        if ((WRefTmp >= 15000) && (WRefTmp < 18000)) {  // GYBING to Port
          CourseDelta = -2 * (18000 - WRefTmp);
        } else if ((WRefTmp > 18000) && (WRefTmp <= 21000)) {  // GYBING to Starboard
          CourseDelta = 2 * (WRefTmp - 18000);
        }
      } else {                      // else, No change
        beep(500);
        break;
      }
      BOATDATA.WindRef = 36000 - BOATDATA.Awa;   // New Reference: Opposite to initial Apparent wind angle
      ang_add(&BOATDATA.HdgRef, CourseDelta);
      NavControl(MType);
    } else beep(500);                                // Other modes: No change
    break;

Y aquí la ejecución del modo viento:
Código:
    case WIND:                // WIND mode
      if ((BOATDATA.Awa == 0xffff) || (NAVDAT.aws < 40)) {
        alarm_sttb(3) = 1;             // Wind Shift alarm
        PilotChangeMode(AUTO);         // Low wind speed or no wind -> AUTO
        break;
      }     
      if (Navtask_action & 0x06) {     // If Modify or Init user maneuver
        ChangeSteps = 1;
        break;
      }
      if (ChangeSteps) {         // If maneuver is running (heading control):
        i32tmp = ang_subs(BOATDATA.HdgRef, BOATDATA.Hdg);
        CorrectStep = AvgError(&LpassError, i32tmp);
        if (absol(CorrectStep) < 500) ChangeSteps = 0;   // If heading error < 5º, switch to wind control
        else {                 // Executing maneuver
          int32_t hdg_err = absol(ang_subs(HdgInit, BOATDATA.Hdg));
          if ((++ChangeSteps > 3) && (hdg_err < Setup.TurnRateLim)) {
            alarm_sttb(2) = 1;        // Off Course Alarm
            PilotChangeMode(NFU);     // (STBY);
          }
        }
        break;
      }
      // Maneuver finished or permanent state, adapting course:
      i32tmp = ang_subs(BOATDATA.HdgRef, BOATDATA.Hdg_Average);     // Normal steering
      if (absol(i32tmp) > Setup.OffCourseLim) {                 // Off Course Limit     
        alarm_sttb(3) = 1;        // Wind Shift alarm
        PilotChangeMode(AUTO);
      } else CorrectStep = AvgError(&LpassError, ang_subs(BOATDATA.Awa, BOATDATA.WindRef));
      break;

Si sientes que te duele Gaza, aunque estés a miles de kilómetros, es porque tu corazón está haciendo justo lo que tiene que hacer: sentir.
Responder
Agradecido por: Minhoca

Otra aclaración más:
Algunos pilotos comerciales permiten interrumpir el rumbo programado pulsando una tecla específica por menú, realizar un cambio como esquivar un obstáculo, y luego retomar el rumbo y modo inicial también accediendo al menú.
A mí este sistema no me gusta nada porque resulta lento y lioso. Prefiero el modo de proceder de los muy antiguos Raymarines, que sólo permiten esquivar y volver a rumbo en modo TRACK, pero volviendo a ese rumbo de waypoint de forma automática y progresiva con el paso de unas decenas de segundos. En los demás modos (NO DRIFT y WIND) el rumbo se modifica de forma permanente después de la corrección y sólo se vuelve al original si el usuario corrige después el ángulo en sentido contrario.

Operativa NO DRIFT (Sin deriva):
- Cuando se selecciona este modo, el piloto memoriza el promedio de rumbo real (COG de GPS) actual en la variable BOATDATA.CogRef en el siguiente listado, e irá corrigiendo el rumbo magnético de referencia piloto para mantenerlo.
- El modo NO DRIFT no permite ni viradas ni trasluchadas, ya que en ese modo no tienen sentido alguno.
- Si los datos de COG/SOG dejan de recibirse por más de 2 segundos, el piloto pasará automáticamente a modo AUTO (magnético).
- Si la velocidad de GPS (SOG) es inferior a 1,5 nudos (15 décimas de nudo), también pasa a modo AUTO. Esto se hace porque el COG de GPS es muy impreciso e inestable a velocidades bajas.
- Cualquier corrección (+1,-1,+10,-10) modifica el COG de referencia y por tanto también la referencia de heading magnético del piloto, esta última de forma progresiva en los siguientes segundos si la variación es grande.
- De la misma manera que en modo WID/VANE, el piloto avisará con un pitido corto cuando las correcciones regulares para mantener el COG inicial sean mayores que .
- Si en cualquier momento el piloto no es capaz de mantener el COG con un error máximo establecido en el setup de usuario, emitirá pitidos largos y contínuos, apareciendo en la pantalla el mensaje "OFF COURSE".

Código:
    case NODRIFT:              // NO DRIFT mode
      // If Unfiltered data or low speed switch to AUTO mode
      if ((BOATDATA.Cog == 0xffff) || (NAVDAT.sog <= 15))
        PilotChangeMode(AUTO);     // No FIX or Low speed -> AUTO mode
      else {
        i32tmp = ang_subs(BOATDATA.CogRef, BOATDATA.Cog);
        if (absol(i32tmp) > Setup.OffCourseLim) {
          alarm_sttb(2) = 1;     // Off Course Limit    
        } else CorrectStep = AvgError(&LpassError, i32tmp);
      }
      break;

Nota: Es evidente que no está toda la operativa en este pequeño listado, en particular falta la gestión de teclado, la interacción con el usuario, la reducción de potencia de motor, temporización y control de la secuencia en las maniobras.

Si sientes que te duele Gaza, aunque estés a miles de kilómetros, es porque tu corazón está haciendo justo lo que tiene que hacer: sentir.
Responder
Agradecido por: onilum, Minhoca

He retocado un montón de veces los post anteriores para ver si se hacen "Más digeribles..."

Ahora viene la descripción del modo que ha sido más complejo de diseñar y escribir.
Modo TRACK/NAV (Navegación siguiendo ruta o hacia un waypoint):

Este modo de trabajo permite que un Plotter o MFD pata negra, o PC con OpenCPN, QTVlm, Adrena o Maxsea Timezero controlen el rumbo real del barco, ya sea siguiendo una ruta creada con varios waypoints o navegando hacia un punto de la carta (En OpenCPN -> Botón derecho -> Navegar hasta aquí,).
Dado que Navionics Boating no merece la categoría de software de navegación, este modo TRACK no podrá funcionar con esa app porque esa basura es incapaz de generar ni sentencias de navegación, ni ninguna otra (Sólo recibe datos, y pinta unos pocos).

Como expliqué, las referencias en este modo (BRG y XTE) son enviadas cada segundo por esos programas hacia el piloto, normalmente por cable (NMEA2000 o NMEA0183), aunque también puede hacerse mediante conexión WiFi.

Siguiendo una ruta de varios waypoints, el piloto avisará al usuario cuándo se produzca un cambio de segmento (Leg), y le pedirá confirmación (esta interacción aún no está terminada en el software del control remoto).
Como norma, los navegadores (plotters) envían también información adicional referente a los waypoints, tales como sus nombres o números, coordenadas, distancia, y avisos de llegada y de paso de largo.
Hay varias formas de identificar un cambio de segmento aprovechando estos datos auxiliares, pero la que me ha parecido más fiable es la detección de cambio de coordenadas del waypoint destino o intermedio de ruta.

Antes de seguir leyendo, sugiero repasar este post del hilo "Piloto automático, nivel usuario":
https://foronavegantes.net/thread-3552-p...l#pid80608
De hecho, creo que sería interesante el repaso completo de ese hilo, que no es muy extenso.

Si sientes que te duele Gaza, aunque estés a miles de kilómetros, es porque tu corazón está haciendo justo lo que tiene que hacer: sentir.
Responder
Agradecido por: Martin Iut, Minhoca

Operativa del modo TRACK/NAV:
- Supervisa los datos que provienen del navegador o plotter y del GPS. Pasará a modo NO DRIFT si deja de recibir info del navegador (datos referentes al waypoint). Pasará a modo AUTO (rumbo magnético, si deja de recibir datos GPS), de la misma manera que hace el modo NO DRIFT.
- Compara las coordenadas de los waypoints inicial y final actuales con los memorizados al activar ese modo y en los cambios de segmento. Si son diferentes, avisa al usuario para que confirme el cambio de rumbo. Cuando el usuario confirma, las nuevas coordenadas de segmento son actualizadas, y se procede a seguir con las correcciones atendiendo a los datos BRG y XTE.
- Las correcciones de rumbo se hacen a tres niveles dependiendo de lo grandes que sean las diferencias entre BRG (demora al waypoint) y COG, y al error de distancia transversal XTE:
1 - Cuando la diferencia entre demora y rumbo verdadero sea superior al valor máximo admitido "Fuera de rumbo", introducido en el setup. En este caso se reduce la potencia del motor y se procede a un progresivo cambio de rumbo. Si se mantiene esta situación, se genera una alarma de OFF COURSE "fuera de rumbo".
2 - Cuando nos "salimos de la autopista", es decir XTE sea mayor que 0,1 milla, pero no se cumpla el punto 1, el piloto no intentará la aproximación inmediata al carril porque entenderá que el usuario no desea seguir estrictamente la línea, sino que irá corrigiendo el rumbo COG para igualarlo al BRG, a potencia normal del motor.
3 - Cuando se parta de una situación donde el barco no presente ninguna diferencia importante en estos dos parámetros, el piloto establecerá correcciones tanto para reducir la diferencia entre BRG y COG como para reducir el error transversal XTE. O sea, se aplican las dos acciones simultáneas. En este caso, el piloto entiende que el usuario ha operado correctamente accionando el modo TRACK justo después de haber activado el modo de navegación en el plotter.

Esta manera de proceder intenta evitar los sustos del usuario cuando en la mayoría de casos activa el modo de navegación en el plotter antes de salir de puerto y mucho antes de activar el modo TRACK en el piloto. Los pilotos pata negra que conozco se dirigen rápidamente al punto más próximo de la "carretera", dando muchas veces unos giros monumentales que los ponen por corbata...

Las formas de operar en los puntos 1, 2 y 3 las estoy retocando aún. Al principio, en el punto 3 calculaba el arco tangente usando XTE y una hipotética distancia Y a 0,1 milla por delante del barco. Eso lo he simplificado porque ese XTE en milésimas de milla, puede sumarse en ese rango directamente al error de rumbo aunque se trate de magnitudes diferentes. (Vamos, que sumo peras y limones: Los ángulos en centésimas de grado y ese XTE en milésimas de milla).

- Si navegando en este modo, el usuario quiere sortear un obstáculo como una boya o evitar una colisión, pulsará las teclas de corrección (+1,-1,+10,-10), y el piloto modificará el rumbo atendiendo a esos valores. A continuación irá retomando el rumbo al waypoint de forma progresiva durante los siguientes segundos.

Si sientes que te duele Gaza, aunque estés a miles de kilómetros, es porque tu corazón está haciendo justo lo que tiene que hacer: sentir.
Responder
Agradecido por: Martin Iut, Minhoca

Ya puestos y entrados en calor de este modo TRACK/NAV:
Los Plotters / MFD's actuales, y las nuevas versiones de OpenCPN tienen la opción de "ZERO XTE".
A ver si lo explico para que se entienda.
Primera manera de definirlo: Esa opción pone a cero la distancia XTE sustituyendo las coordenadas del punto inicial del segmento actual de la ruta por la posición actual del barco.
Creo que estará más claro si vemos este dibujo del hilo de los pilotos: https://foronavegantes.net/thread-3552-p...l#pid80608
Qué se consigue: Que el barco no vire de forma exagerada para ir a buscar la línea de la "carretera", simplemente moviendo esa carretera virtual y poniéndola debajo del barco.

En un principio pensé en hacer que el piloto calculara de forma independiente tanto el BRG como XTE. Así, si hacía que las coordenadas iniciales del segmento fueran en todo momento las del barco, conseguía poner siempre a 0 el XTE, y así un problema menos. Esto lo dije en Cruisers Forum hace años, y salió un sueco diciéndome que ROTUNDAMENTE NO, porque el navegaba por pasos estrechos en los fiordos donde es necesario seguir con la máxima precisión la "carretera" entre las coordenadas de los waypoints de la ruta:
[Imagen: Ruta.jpg]
Os hacéis la idea, verdad?
Como se puede ir viendo, desarrollar un buen piloto no es algo que salga de la chistera... (En catalán, no es bufar i fer ampolles)

Si sientes que te duele Gaza, aunque estés a miles de kilómetros, es porque tu corazón está haciendo justo lo que tiene que hacer: sentir.
Responder
Agradecido por: Martin Iut, hopetos, Minhoca, Panafunk

Por si hay algún masoquista por aqui, así es como está quedando este modo TRACK/NAV:
Código:
    case TRACK:               // TRACK mode
      if ((BOATDATA.Cog == 0xffff) || (NAVDAT.sog <= 15)) {
        PilotChangeMode(AUTO);        // No FIX or Low speed -> AUTO mode
        break;
      } else if (BOATDATA.Brg == 0xffff) {
        PilotChangeMode(NODRIFT);     // No NAV DATA -> No DRIFT
        break;
      }                        // NAV and GPS OK:
      // If leg change detected:
      if ((WptCoord.Lat != Wpt2Coord.Lat) || (WptCoord.Lon != Wpt2Coord.Lon)) {
        if (Navtask_action & 0x01) {        // If user confirmation:
          NAVDAT.warning &= 0xfe;           // Leg change, User confirmation ???? ->remote
          Wpt1Coord.Lat = Wpt2Coord.Lat;    // Zero XTE, Point 1. Waypoint advance
          Wpt1Coord.Lon = Wpt2Coord.Lon;
          Wpt2Coord.Lat = WptCoord.Lat;     // XTE, Point 2
          Wpt2Coord.Lon = WptCoord.Lon;
        } else {
          NAVDAT.warning |= 0x01;           // Leg change, User confirmation request ????
          beep(500);
          break;                            // AP maintains the actual heading
        }
      }
      i32tmp = ang_subs(BOATDATA.Brg, BOATDATA.Cog);
      if (absol(i32tmp) > Setup.OffCourseLim) {             // Normal operation
        CorrectStep = AvgError(&LpassError, iSqr(i32tmp));  // Square root of error, XTE not used
        PowLimit = SlowPower;     // Motor Power to 75%
        ChangeSteps = 1;          // maneuvering
        alarm_sttb(2) = 1;        // Off Course Limit
      } else if (absol(rte_xte) > 1000) {   // XTE > 0.1NM
        CorrectStep = AvgError(&LpassError, i32tmp);
        PowLimit = NormalPower;
        ChangeSteps = 1;          // maneuvering
        alarm_sttb(2) = 1;        // Off Course Limit
      } else {
        CorrectStep = AvgError(&LpassError, i32tmp - rte_xte);
/*        if (rte_xte > 0) i32tmp -= (int32_t) (100. * atan2f((float) rte_xte, 1000.));
        else             i32tmp += (int32_t) (100. * atan2f((float) -rte_xte, 1000.)); 
        CorrectStep = AvgError(&LpassError, i32tmp); */  
        PowLimit = NormalPower;
        ChangeSteps = 0;
        alarm_sttb(2) = 0;     // Clear Off Course Limit alarm
      }
      break;
  }
  if ((CorrectStep > 100) || (CorrectStep < -100)) beep(100);
  ang_add(&BOATDATA.Plt, CorrectStep);       // Apply Correction
Los interrogantes ???? son para recordarme que aún tengo que escribir la parte correspondiente en el software del control remoto.
La penúltima línea sirve para avisar cuando la corrección es de más de 1 grado (100 centésimas de grado).
La última aplica la corrección a la referencia magnética del piloto BOATDATA.Plt, en cada vuelta que se hace entre 1 y 10 segundos según la velocidad del barco.

Si sientes que te duele Gaza, aunque estés a miles de kilómetros, es porque tu corazón está haciendo justo lo que tiene que hacer: sentir.
Responder
Agradecido por: Minhoca

NOTA final de esta serie de post:
Acabo de realizar más cambios y ampliaciones en los mensajes precedentes.
Creo que la taladrada es suficiente. De momento no voy a escribir más si nadie pide más explicaciones.


Informaré cuando tenga novedades sobre la puesta en marcha real en el agua.
Gracias a los que hayan aguantado el tipo hasta aquí.

Si sientes que te duele Gaza, aunque estés a miles de kilómetros, es porque tu corazón está haciendo justo lo que tiene que hacer: sentir.
Responder


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje
Último mensaje por krunch6
09-01-2025, 05:16 PM

Salto de foro:


Usuarios navegando en este tema: 5 invitado(s)