MAVLink ou Micro Air Vehicle Link (Tradução literal: Comunicação de Micro Veículo Aéreo) é um protocolo de comunicação para pequenos veículos não tripulados. Ele é projetado como uma biblioteca de mensagens apenas de cabeçalho. MAVLink foi lançado pela primeira vez no início de 2009.[1] por Lorenz Meier sob a licença LGPL.[2]

Aplicações editar

Ele é usado principalmente para comunicação entre uma Estação de Controle de Solo e veículo aéreo não tripulado, e na intercomunicação do subsistema do veículo. Ela pode ser usada para transmitir a orientação do veículo, sua localização GPS e velocidade.

Estrutura dos Pacotes editar

Na versão 1.0, a estrutura do pacote é a seguinte:

Field name Index (Bytes) Purpose
Start-of-frame 0 Denota o início da transmissão do quadro (v1.0: 0xFE)
Payload-length 1 tamanho do payload (n)
Packet sequence 2 Cada componente conta sua seqüência de envio. Permitindo a detecção de perda de pacotes.
System ID 3 Identificação do sistema de SENDING. Permite diferenciar diferentes sistemas na mesma rede.
Component ID 4 Identificação do componente SENDING. Permite diferenciar diferentes componentes de um mesmo sistema, por exemplo, a IMU e o piloto automático.
Message ID 5 Identificação da mensagem - o id define o que o payload "deve conter" e como ela deve ser corretamente decodificada.
Payload 6 to (n+6) Os dados na mensagem, dependem da identificação da mensagem.
CRC (n+7) to (n+8) Verificação da soma de todo o pacote, excluindo o sinal de partida do pacote (LSB para MSB)

Após a Versão 2, a estrutura do pacote foi expandida para o seguinte:[3]

Field name Index (Bytes) Purpose
Start-of-frame 0 Denota o início da transmissão do quadro (v2: 0xFD)
Payload-length 1 tamanho do payload (n)
incompatibility flags 2 Bandeiras que devem ser interpretadas para a compatibilidade do MAVLink
compatibility flags 3 Bandeiras que podem ser ignoradas se não forem interpretadas
Packet sequence 4 Cada componente conta sua seqüência de envio. Permitindo a detecção de perda de pacotes.
System ID 5 Identificação do sistema de SENDING. Permite diferenciar diferentes sistemas na mesma rede.
Component ID 6 Identificação do componente SENDING. Permite diferenciar diferentes componentes de um mesmo sistema, por exemplo, a IMU e o piloto automático.
Message ID 7 to 9 Identificação da mensagem - o id define o que o payload "deve conter" e como ela deve ser corretamente decodificada.
Payload 10 to (n+10) Os dados na mensagem, dependem da identificação da mensagem.
CRC (n+11) to (n+12) Verificação da soma de todo o pacote, excluindo o sinal de partida do pacote (LSB para MSB)
Signature (n+13) to (n+25) Assinatura para verificar se as mensagens são originadas de uma fonte confiável. (opcional)

Campo CRC editar

Para garantir a integridade da mensagem, uma verificação de redundância cíclica (CRC) é calculada para cada mensagem nos dois últimos bytes. Outra função do campo CRC é garantir que o remetente e o receptor concordem na mensagem que está sendo transferida. Ele é calculado usando um hash ITU X.25SAE AS-4 dos bytes no pacote, excluindo o indicador de Início de Margem (assim 6+n+1 bytes são avaliados, o extra +1 é o valor da semente). A semente é gerada com cada novo conjunto de mensagens do protocolo, e é apresentada de forma semelhante aos pacotes de cada especificação de mensagem. Os sistemas que usam o protocolo MAVLink podem usar uma matriz pré-calculada para este propósito.[4]

O algoritmo CRC do MAVLink foi implementado em muitas linguagens, como Python[5] e Java.[6][7][8]

Mensagens editar

O payload dos pacotes descritos acima são mensagens do MAVLink. Cada mensagem é identificável pelo campo ID no pacote, que contém um payload com os dados da mensagem. Um documento XML no código-fonte do MAVLink[9] possui a definição dos dados armazenados neste payload.

Abaixo está a mensagem com o ID 24 extraído do 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>

Observação: O documento XML descreve a ordenação lógica dos campos para o protocolo. O formato real do fio (e a representação típica em memória) tem os campos reordenados[10] afim de reduzir Alinhamento da estrutura de dados os problemas. Isto pode ser uma fonte de confusão ao ler o código gerado a partir das definições da mensagem.

Ecossistema do MAVLink editar

MAVLink é usado como protocolo de comunicação em muitos projetos, o que pode significar que há alguma compatibilidade entre eles. Um interessante tutorial explicando os conceitos básicos do MAVLink foi escrito.[11]

Referências editar

  1. «Initial commit · mavlink/mavlink@a087528». GitHub 
  2. «Archived copy». Consultado em 31 de julho de 2013. Arquivado do original em 18 de agosto de 2018 
  3. «Serialization · MAVLink Developer Guide». mavlink.io. Consultado em 22 de agosto de 2019 
  4. QG Control. http://qgroundcontrol.org/mavlink/crc_extra_calculation
  5. «GitHub - ArduPilot/pymavlink: python MAVLink interface and utilities.». 18 de agosto de 2019 – via GitHub 
  6. «GitHub - arthurbenemann/droidplanner: Ground Control Station for Android Devices.». 2 de julho de 2019 – via GitHub 
  7. «A Java code generator and a Java library for MAVLink: ghelle/MAVLinkJava». 4 de agosto de 2019 – via GitHub 
  8. «GitHub - dronefleet/mavlink: A Java API for MAVLink communication.». 2 de agosto de 2019 – via GitHub 
  9. «GitHub - mavlink/mavlink: Marshalling / communication library for drones.». 20 de agosto de 2019 – via GitHub 
  10. QG Round Control. http://qgroundcontrol.org/mavlink/crc_extra_calculation#field_reordering
  11. Posted by Shyam Balasubramanian on November 15, 2013 at 2:36pm in ArduCopter User Group; Discussions, Back to ArduCopter User Group. «MAVLink Tutorial for Absolute Dummies (Part –I)». diydrones.com