Saltos esporádicos del Gps en el mapa (NMEA)

Tema en 'Arduino / Multiwii' iniciado por baco2000, 7 Abr 2015.

  1. baco2000

    baco2000 New Member

    Registrado:
    21 Jul 2012
    Mensajes:
    84
    Me Gusta recibidos:
    0
    En ocasiones veía que en el mapa me hacia un salto el gps y después de analizarlo durante unos cuantos días, he observado que es debido a que si estoy en una zona donde la latitud o la longitud tienen signo negativo, este se pierde de vez en cuando. Yo creía que era de mi modulo Gps MTK3329, que se comunica vía puerto serie por el protocolo NMEA, pero después de varias comprobaciones, este funciona correctamente.

    Decidí retirar el modulo gps de mi coptero e inyectar manualmente una señal GPS para hacer varias pruebas.

    Para mi sorpresa, sigue haciendo lo mismo, por lo cual estoy muy seguro de que el problema viene del software del multiwii.

    Estoy investigando dentro del propio software y de momento no he encontrado donde pierde el signo negativo.

    A ver si alguien me puede ayudar, o por lo menos saber si a mas gente le ocurre lo mismo. No creo que sea el único que le ha ocurrido esto.
     

    Adjuntos:

    • a.jpg
      a.jpg
      Tamaño de archivo:
      21,9 KB
      Visitas:
      127
    • b.jpg
      b.jpg
      Tamaño de archivo:
      143,4 KB
      Visitas:
      45
    #1 baco2000, 7 Abr 2015
    Última edición: 7 Abr 2015
  2. baco2000

    baco2000 New Member

    Registrado:
    21 Jul 2012
    Mensajes:
    84
    Me Gusta recibidos:
    0
    ¡¡¡SOLUCIONADO!!!

    Este fallo lo daba el propio software de MultiWii tanto en la version 2.2, 2.3 y 2.4, al usar un Gps con el protocolo NMEA. A ver si en posteriores actualizaciones lo corrigen.

    Esta es la parte del código donde desglosa la trama GGA emitida por el módulo gps según el protocolo NMEA:

    Aproximadamente en la línea 1030 del archivo GPS.cpp

    Insertar CODE, HTML o PHP:
    bool GPS_newFrame(uint8_t c) {
      uint8_t frameOK = 0;
      static uint8_t param = 0, offset = 0, parity = 0;
      static char string[15];
      static uint8_t checksum_param, frame = 0;
       if (c == '$') {
        param = 0; offset = 0; parity = 0;
      } else if (c == ',' || c == '*') {
        string[offset] = 0;
        if (param == 0) { //frame identification
          frame = 0;
          if (string[0] == 'G' && string[1] == 'P' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A') frame = FRAME_GGA;
          if (string[0] == 'G' && string[1] == 'P' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C') frame = FRAME_RMC;
        } else if (frame == FRAME_GGA) {
          if      (param == 2)                     {GPS_coord[LAT] = GPS_coord_to_degrees(string);}
          else if (param == 3 && string[0] == 'S') GPS_coord[LAT] = -GPS_coord[LAT];
          else if (param == 4)                     {GPS_coord[LON] = GPS_coord_to_degrees(string);}
          else if (param == 5 && string[0] == 'W') GPS_coord[LON] = -GPS_coord[LON];
          else if (param == 6)                     {f.GPS_FIX = (string[0]  > '0');}
          else if (param == 7)                     {GPS_numSat = grab_fields(string,0);}
          else if (param == 9)                     {GPS_altitude = grab_fields(string,0);}  // altitude in meters added by Mis
        } else if (frame == FRAME_RMC) {
          if      (param == 7)                     {GPS_speed = ((uint32_t)grab_fields(string,1)*5144L)/1000L;}  //gps speed in cm/s will be used for navigation
          else if (param == 8)                     {GPS_ground_course = grab_fields(string,1); }                 //ground course deg*10 
        }
        param++; offset = 0;
        if (c == '*') checksum_param=1;
        else parity ^= c;
      } else if (c == '\r' || c == '\n') {
        if (checksum_param) { //parity checksum
          uint8_t checksum = hex_c(string[0]);
          checksum <<= 4;
          checksum += hex_c(string[1]);
          if (checksum == parity) frameOK = 1;
        }
        checksum_param=0;
      } else {
         if (offset < 15) string[offset++] = c;
         if (!checksum_param) parity ^= c;
      }
      return frameOK && (frame==FRAME_GGA);
    }
    #endif //NMEA
    Este código lo que hace lee la trama GGA en varios pasos, los cuales, cada uno es leído en un ciclo distinto del procesador. Al usar el comando "else if", al llegar al paso 2, se lee la coordenada de la Latitud del módulo Gps, pero no lee si su signo es positivo o negativo hasta el siguiente ciclo, por lo que durante un ciclo entero nos va a dar una lectura errónea de nuestra posición Gps. Esto ocurre igualmente con la Longitud del gps.

    He hecho una pequeña modificación en el código de MultiWii, para que no se introduzca en la variable que almacena dichos datos (GPS_coord[LAT] y GPS_coord[LON]) hasta que no se ha leído también el signo:

    Latitud
    N=Positivo
    S=Negativo
    Longitud
    E=Positivo
    W=Negativo.

    Insertar CODE, HTML o PHP:
    bool GPS_newFrame(uint8_t c) {
      uint8_t frameOK = 0;
      static uint8_t param = 0, offset = 0, parity = 0;
      static char string[15];
      static uint8_t checksum_param, frame = 0;
       static int32_t LAT_TEMP;
      static int32_t LON_TEMP;
       if (c == '$') {
        param = 0; offset = 0; parity = 0;
      } else if (c == ',' || c == '*') {
        string[offset] = 0;
        if (param == 0) { //frame identification
          frame = 0;
          if (string[0] == 'G' && string[1] == 'P' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A') frame = FRAME_GGA;
          if (string[0] == 'G' && string[1] == 'P' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C') frame = FRAME_RMC;
        } else if (frame == FRAME_GGA) {
          if      (param == 2)                     {LAT_TEMP = GPS_coord_to_degrees(string);}
          else if (param == 3)                     { if (string[0] == 'S') {GPS_coord[LAT] = LAT_TEMP * (-1);} else {GPS_coord[LAT] = LAT_TEMP;}}
          else if (param == 4)                     {LON_TEMP = GPS_coord_to_degrees(string);}
          else if (param == 5)                     { if (string[0] == 'W') {GPS_coord[LON] = LON_TEMP * (-1);} else {GPS_coord[LON] = LON_TEMP;}}
          else if (param == 6)                     {f.GPS_FIX = (string[0]  > '0');}
          else if (param == 7)                     {GPS_numSat = grab_fields(string,0);}
          else if (param == 9)                     {GPS_altitude = grab_fields(string,0);}  // altitude in meters added by Mis
        } else if (frame == FRAME_RMC) {
          if      (param == 7)                     {GPS_speed = ((uint32_t)grab_fields(string,1)*5144L)/1000L;}  //velocidad gps en cm/s que seran usados para la navegacion
          else if (param == 8)                     {GPS_ground_course = grab_fields(string,1); }                 //orientacion en tierra deg*10 
        }
        param++; offset = 0;
        if (c == '*') checksum_param=1;
        else parity ^= c;
      } else if (c == '\r' || c == '\n') {
        if (checksum_param) { //parity checksum
          uint8_t checksum = hex_c(string[0]);
          checksum <<= 4;
          checksum += hex_c(string[1]);
          if (checksum == parity) frameOK = 1;
        }
        checksum_param=0;
      } else {
         if (offset < 15) string[offset++] = c;
         if (!checksum_param) parity ^= c;
      }
      return frameOK && (frame==FRAME_GGA);
    }
    #endif //NMEA

    No he encontrado mucha información respecto a este fallo, cosa que me ha parecido raro que a nadie lo ocurriera, a pesar de que mucha gente utiliza Gps con protocolo Ublox en vez de NMEA, ya que un modulo gps que se ha utilizado mucho es el MTK3329 que es el que yo tengo el cual usa el protocolo NMEA.

    Espero que sea de gran ayuda.
     
    #2 baco2000, 7 Abr 2015
    Última edición: 7 Abr 2015
  3. baco2000

    baco2000 New Member

    Registrado:
    21 Jul 2012
    Mensajes:
    84
    Me Gusta recibidos:
    0
    Según mis ultimas pruebas, el software de MultiWii no tiene en cuenta el checksum del las tramas emitidas por los módulos gps NMEA.
    He estado inyectando manualmente unas tramas por el puerto del gps, y cambio valores manualmente en la latitud y en la longitud, sin cambiar el checksum, y estos se reflejan en el MultiWii_Conf, los cuales no deberia ocurrir ya que no serian tramas validas.
     
  4. ardufriki

    ardufriki Member

    Registrado:
    12 Mar 2014
    Mensajes:
    651
    Me Gusta recibidos:
    0
    buena investigación baco. ¿cómo llevas las tramas GPS del multicoptero a tu movil/tablet?
     
  5. baco2000

    baco2000 New Member

    Registrado:
    21 Jul 2012
    Mensajes:
    84
    Me Gusta recibidos:
    0
    No las llevo al movil, las llevo a un pc.
     
  6. baco2000

    baco2000 New Member

    Registrado:
    21 Jul 2012
    Mensajes:
    84
    Me Gusta recibidos:
    0
    Y le inyecto las tramas manualmente a la placa controladora, sin usar nungun modulo gps
     
  7. ardufriki

    ardufriki Member

    Registrado:
    12 Mar 2014
    Mensajes:
    651
    Me Gusta recibidos:
    0
    lo decía porque la imagen que has puesto es de un Android.

    En cualquier caso ¿que sistema usas para llevar esa telemetría?¿openlrsng?
     
  8. ardufriki

    ardufriki Member

    Registrado:
    12 Mar 2014
    Mensajes:
    651
    Me Gusta recibidos:
    0
    por cierto, si les cuelgas en el foro de multiwii la modificación seguramente la tengan en cuenta para posteriores versiones.
     
  9. baco2000

    baco2000 New Member

    Registrado:
    21 Jul 2012
    Mensajes:
    84
    Me Gusta recibidos:
    0
    He conectado el puerto UART que utiliza la controladora de vuelo para el gps, a un conversor USB-RS232, y porteriormente le he inyectado manualmente unas tramas gps.
    Las imagenes que he puesto.1 ni siquiera las he realizado yo, solo las he colocado para que se vea el efecto que tiene el salto que hace y que sebpuede apreciar en cualquier software que se conecte a nuestro coptero.
    Ya he estado hablando con gente de Multiwii, y en cuanto puedan lo hecharan un vistado. La modificacion que yo he realizado es funcional, pero se ouede mejorar ya que sigue sin hacer la comprobacion del checksum de las tranas del gps.
     
  10. romanm92

    romanm92 New Member

    Registrado:
    28 Oct 2013
    Mensajes:
    1
    Me Gusta recibidos:
    0
    Buenos dias. Se que el tema es muuuuy antiguo pero quiero agradecerte por la información. Estoy en Argentina y luego de leer y revisarlo he aplicado tu codigoy ahora funciona perfecto !!
    Una teoria de por que no hay informacion sobre esta falla pueda ser que la mayoria de usuarios de multiwii esten en la zona NE de planeta? donde las coordenadas son ambas + ??

    En fin, quisiera si no inconveniente divulgar esta información para ayudar a quienes esten en la misma situacion.

    Muchas gracias!

    Saludos!
     

Compartir esta página