# MAVLink

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 por Lorenz Meier bajo el LGPL licencia.

## Aplicaciones

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

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:
| 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

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.
El algoritmo CRC de MAVLink ha sido implementado en muchos lenguajes, como Python y Java.

### Mensajes

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.
A continuación se muestra el mensaje con el ID 24 extraído del documento XML.
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. Esto puede ser una fuente de confusión al leer el código generado a partir de las definiciones de los mensajes.

## Ecosistema MAVLink

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.