MAVLink

De Wikipedia, la enciclopedia libre

MAVLink o Micro Air Vehicle Link es un protocolo para comunicarse con pequeños vehículos no tripulados. Está diseñado como una librería de marshaling de mensajes sólo de cabecera. MAVLink fue publicado por primera vez a principios de 2009[1]​ por Lorenz Meier bajo el LGPL licencia.[2]

Aplicaciones[editar]

Se utiliza mayoritariamente para la comunicación entre una Estación de Control en Tierra (GCS) y vehículos no tripulados, y en la intercomunicación del subsistema del vehículo. Puede utilizarse para transmitir la orientación del vehículo, su ubicación GPS y su velocidad.

Estructura de paquete[editar]

En la versión 1.0 la estructura de paquete es el siguiente:

Nombre de campo Índice (Bytes) Propósito
Inicio-de-marco 0 Denota el inicio de transmisión de marco (v1.0: 0xFE)
Longitud de carga útil 1 Longitud de la carga útil (n)
Secuencia de paquete 2 Cada componente cuenta su secuencia de envío. Permite detectar la pérdida de paquetes.
Sistema ID 3 Identificación del sistema REMITENTE. Permite diferenciar diferentes sistemas en la misma red.
Componente ID 4 Identificación del componente REMITENTE. Permite diferenciar diferentes componentes de un mismo sistema, por ejemplo, la IMU y el piloto automático.
Mensaje ID 5 Identificación del mensaje - el id define lo que la carga útil "significa" y cómo debe ser decodificada correctamente.
Carga útil 6 a (n+6) Los datos dentro del mensaje, dependen del id del mensaje.
CRC (n+7) a (n+8) Suma de comprobación de todo el paquete, excluyendo el signo de inicio del paquete (LSB a MSB)

Después de la versión 2, la estructura de paquete estuvo expandida al siguiente:[3]

Nombre de campo Índice (Bytes) Propósito
Inicio-de-marco 0 Denota el inicio de transmisión de marco (v2: 0xFD)
Longitud de carga útil 1 Longitud de la carga útil (n)
Banderas de incompatibilidad 2 Banderas que deben ser entendidas para la compatibilidad MAVLink
Banderas de compatibilidad 3 Banderas que puede ser ignoradas si no se entendiden
Secuencia de paquete 4 Cada componente cuenta su secuencia de envío. Permite detectar la pérdida de paquetes.
Sistema ID 5 Identificación del sistema EMISOR. Permite diferenciar diferentes sistemas en la misma red.
Componente ID 6 Identificación del componente REMITENTE. Permite diferenciar diferentes componentes de un mismo sistema, por ejemplo, la IMU y el piloto automático.
Mensaje ID 7 a 9 Identificación del mensaje - el id define lo que lo que la carga útil "significa" y cómo debe ser decodificada correctamente.
Carga útil 10 a (n+10) Los datos dentro del mensaje, dependen del id del mensaje.
CRC (n+11) a (n+12) Suma de comprobación de todo el paquete, excluyendo el signo de inicio del paquete (LSB a MSB)
Firma (n+13) a (n+25) Firma para verificar que los mensajes proceden de una fuente de confianza. (opcional)

CRC Campo[editar]

Para garantizar la integridad de mensaje, se calcula una comprobación de redundancia cíclica (CRC) en los dos últimos bytes de cada mensaje. Otra función del campo CRC es asegurar que el emisor y el receptor coinciden en el mensaje que se está transfiriendo. Se calcula utilizando un hash ITU X.25/SAE AS-4 de los bytes del paquete, excluyendo el indicador de inicio de trama (por lo que se evalúan 6+n+1 bytes, el +1 extra es el valor semilla).

Además, se añade un valor de semilla al final de los datos cuando se calcula el CRC. La semilla se genera con cada conjunto nuevo de mensajes del protocolo, y se hashifica de forma similar a los paquetes de cada especificación de mensajes. Los sistemas que utilizan el protocolo MAVLink pueden utilizar una matriz precalculada para este fin.[4]

El algoritmo CRC de MAVLink ha sido implementado en muchos lenguajes, como Python[5]​ y Java.[6][7][8]

Mensajes[editar]

La carga útil de los paquetes descritos anteriormente son mensajes MAVLink. Cada mensaje es identificable por el campo ID del paquete, y la carga útil contiene los datos del mensaje. Un documento XML en la fuente de MAVlink tiene la definición de los datos almacenados en esta carga útil.[9]

A continuación se muestra el mensaje con el ID 24 extraído del documento XML.

<message id="24" name="GPS_RAW_INT">
        <description>The global position, as returned by the Global Positioning System (GPS). This is NOT the global position estimate of the system, but rather a RAW sensor value. See message GLOBAL_POSITION for the global position estimate. Coordinate frame is right-handed, Z-axis up (GPS frame).</description>
        <field type="uint64_t" name="time_usec">Timestamp (microseconds since UNIX epoch or microseconds since system boot)</field>
        <field type="uint8_t" name="fix_type">0-1: no fix, 2: 2D fix, 3: 3D fix. Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix.</field>
        <field type="int32_t" name="lat">Latitude (WGS84), in degrees * 1E7</field>
        <field type="int32_t" name="lon">Longitude (WGS84), in degrees * 1E7</field>
        <field type="int32_t" name="alt">Altitude (WGS84), in meters * 1000 (positive for up)</field>
        <field type="uint16_t" name="eph">GPS HDOP horizontal dilution of position in cm (m*100). If unknown, set to: UINT16_MAX</field>
        <field type="uint16_t" name="epv">GPS VDOP vertical dilution of position in cm (m*100). If unknown, set to: UINT16_MAX</field>
        <field type="uint16_t" name="vel">GPS ground speed (m/s * 100). If unknown, set to: UINT16_MAX</field>
        <field type="uint16_t" name="cog">Course over ground (NOT heading, but direction of movement) in degrees * 100, 0.0..359.99 degrees. If unknown, set to: UINT16_MAX</field>
        <field type="uint8_t" name="satellites_visible">Number of satellites visible. If unknown, set to 255</field>
</message>

Nota: El documento XML describe el orden lógico de los campos para el protocolo. El formato de cable real (y la representación típica en memoria) tiene los campos reordenados para reducir los problemas de alineación de la estructura de datos.[10]​ Esto puede ser una fuente de confusión al leer el código generado a partir de las definiciones de los mensajes.

Ecosistema MAVLink[editar]

MAVLink se utiliza como protocolo de comunicación en muchos proyectos, lo que puede significar que hay cierta compatibilidad entre ellos. Se ha escrito un tutorial que explica los fundamentos de MAVLink.[11]

Referencias[editar]

  1. «Initial commit · mavlink/mavlink@a087528». GitHub. 
  2. «Archived copy». Archivado desde el original el 18 de agosto de 2018. Consultado el 31 de julio de 2013. 
  3. «Serialization · MAVLink Developer Guide». mavlink.io. Consultado el 22 de agosto de 2019. 
  4. «Field Reordering and CRC Extra Calculation - QGroundControl GCS». qgroundcontrol.org. Archivado desde el original el 15 de junio de 2013. 
  5. «GitHub - ArduPilot/pymavlink: python MAVLink interface and utilities.». 18 de agosto de 2019. 
  6. «GitHub - arthurbenemann/droidplanner: Ground Control Station for Android Devices.». 2 de julio de 2019. 
  7. «A Java code generator and a Java library for MAVLink: ghelle/MAVLinkJava». 4 de agosto de 2019. 
  8. «GitHub - dronefleet/mavlink: A Java API for MAVLink communication.». 2 de agosto de 2019. 
  9. «GitHub - mavlink/mavlink: Marshalling / communication library for drones.». 20 de agosto de 2019. 
  10. «Field Reordering and CRC Extra Calculation - QGroundControl GCS». qgroundcontrol.org. Archivado desde el original el 15 de junio de 2013. 
  11. Posted by Shyam Balasubramanian on November 15, 2013 at 2:36pm in ArduCopter User Group. «MAVLink Tutorial for Absolute Dummies (Part –I)». diydrones.com.