MAVLink
Esta página cita fontes, mas que não cobrem todo o conteúdo. |
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
editarEle é 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
editarNa 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
editarPara 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
editarO 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
editarMAVLink é 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- ↑ «Initial commit · mavlink/mavlink@a087528». GitHub
- ↑ «Archived copy». Consultado em 31 de julho de 2013. Arquivado do original em 18 de agosto de 2018
- ↑ «Serialization · MAVLink Developer Guide». mavlink.io. Consultado em 22 de agosto de 2019
- ↑ QG Control. http://qgroundcontrol.org/mavlink/crc_extra_calculation
- ↑ «GitHub - ArduPilot/pymavlink: python MAVLink interface and utilities.». 18 de agosto de 2019 – via GitHub
- ↑ «GitHub - arthurbenemann/droidplanner: Ground Control Station for Android Devices.». 2 de julho de 2019 – via GitHub
- ↑ «A Java code generator and a Java library for MAVLink: ghelle/MAVLinkJava». 4 de agosto de 2019 – via GitHub
- ↑ «GitHub - dronefleet/mavlink: A Java API for MAVLink communication.». 2 de agosto de 2019 – via GitHub
- ↑ «GitHub - mavlink/mavlink: Marshalling / communication library for drones.». 20 de agosto de 2019 – via GitHub
- ↑ QG Round Control. http://qgroundcontrol.org/mavlink/crc_extra_calculation#field_reordering
- ↑ 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