Dec 23rd, 2022: [pt_BR] IoT, coletando dados de um drone em tempo real

Introdução
Imagine que o papai Noel esteja sobrevoando Copacabana, a caminho de sua casa para entregar os presentes. Mas você gostaria de saber o momento exato que ele chega para garantir que as crianças estejam dormindo. Em pleno 2022, imagine também que o trenó agora é um drone gigante.

Pronto, imaginou? Agora tudo ficou simples e continuaremos garantindo a magia do Natal na fantasia das crianças. Pois com esse cenário, ficou fácil monitorarmos o trenó do Papai Noel em tempo-real e vou te ensinar como fazer isso através da nossa stack Elastic. Ah, se você tem um drone, coloca nos comentários o modelo. Seria interessante sabermos se existe algum drone em que não conseguiríamos replicar esse experimento.

Pré-requisitos

Tudo que precisamos é um drone, um meio de comunicação para leitura de dados dos sensores, um banco para armazenar essa telemetria e uma tela bonita para visualizar as informações.

O Drone

Para esse experimento, vamos usar um DJI Tello que além do custo e tamanho reduzido, pode ser usado dentro de casa e possui API para programação em Python.

O Protocolo de comunicação MQTT

Para que haja comunicação entre o drone e o servidor, vamos utilizar o protocolo MQTT que trata-se de um meio de comunicação muito utilizado em arquiteturas IoT. O MQTT atua na camada de TCP, baseia-se no padrão pub/sub e permite a transmissão dos dados dos sensores em alta velocidade. Hoje, o MQTT é usado em uma ampla variedade de indústrias, como automotiva, manufatura, telecomunicações, petróleo e gás, etc.

Vamos utilizar o Mosquitto como message broker para implementar essa transmissão via MQTT.

Ingestão dos dados

Para coletar os dados publicados no MQTT, vamos utilizar o Beat da Elastic chamado Filebeat. Esse beat possui uma implementação customizada para ler diretamente os dados via MQTT.

Após a ingestão dos dados, iremos transferir os mesmos para o Elasticsearch.

O Banco de dados

A indústria 4.0 vem gerando bilhões de informações com seus projetos de robótica, carros autônomos, IIoT, etc. Então precisamos de um banco de dados que comporte essa quantidade imensa de informações geradas pelos sensores. Estas mesmas informações precisam estar disponíveis rapidamente quando solicitadas.
O Elasticsearch encaixa-se perfeitamente nesse cenário. Dessa forma, os dados chegarão ao banco através do Filebeat, e internamente as informações necessárias serão extraídas através de um pipeline de ingestão o qual armazenará no índice apropriado.

A visualização

Toda essa informação processada em tempo-real, poderá ser visualizada e analisada através do Kibana. Neste caso em específico, vamos utilizar o Kibana Canvas.

Arquitetura IoT

A arquitetura proposta então seria como na figura abaixo

Implementação

Para implementar a arquitetura acima, vamos seguir os seguintes passos:

Passo 1 - Código do Drone

Precisamos criar um código em python para ler os dados dos sensores do Drone e publicá-los no nosso broker MQTT. Toda publicação precisa de um tópico e no nosso caso será "drones/drone01". Se eu estivesse gerenciando uma frota de drones, poderia criar outros tópicos como drones/drone02, drones/drone03, etc.

Existem algumas bibliotecas que fornece mecanismos para a programação no Tello.
Aqui um exemplo da biblioteca djitellopy.

pip install djitellopy

E um simples código exemplo que imprime os dados da telemetria, coletadas do drone em pleno vôo.

# Drone telemetry with Tello
from asyncio import sleep
from djitellopy import Tello

tello = Tello()

tello.connect()

while True:
    print(tello.get_current_state())
    sleep(0.3)

Passo 2 - Criar ou usar um broker MQTT

Existem alguns brokers MQTT prontos para serem usados como teste, por exemplo: "test.mosquitto.org", sempre usando a porta 1883 como padrão de acesso via TCP, mas se você quer mais segurança, existem outras opções de portas com autenticação e encriptação.

Para nosso experimento, criei e instalei uma máquina EC2 na AWS e acionei o Mosquitto, deixando-o disponível no seguinte endereço.

tcp://ec2-18-204-19-124.compute-1.amazonaws.com:1883

Dessa forma, utilizando a biblioteca python Eclipse Paho MQTT é possível publicar e se inscrever no tópico usando o endereço do broker.

pip install paho-mqtt

from paho.mqtt import client as mqtt_client

broker = 'ec2-18-204-19-124.compute-1.amazonaws.com'
port = 1883
topic = "drones/drone01"
.
.
.
def publish(client):
    msg_count = 0
    while True:
        time.sleep(1)
        # Mock-up test for publish drone sensors in MQTT
        msg = '{"pitch": 89, "roll": 3}'
       
        result = client.publish(topic, msg)
        # result: [0, 1]
        status = result[0]
        if status == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
            print(f"Failed to send message to topic {topic}")
        msg_count += 1

Passo 3 - Instalar e configurar Filebeat

O Filebeat pode ser instalado de acordo com as instruções da documentação oficial. Em nosso caso, estamos usando a versão Cloud da Elastic.

A seguir, precisamos dizer ao Filebeat que gostaríamos de nos inscrever no tópico o qual conterá os dados publicados pelo drone.
Edite o arquivo filebeat.yml na seção inputs, como mostrado a seguir:

filebeat.inputs:
#--- drone
- type: mqtt
  hosts:
    - tcp://ec2-18-204-19-124.compute-1.amazonaws.com:1883
  topics:
    - drones/drone01
  tags:
    ["advent_calendar"]
  fields:
    fleet_id: "drone"
  fields_under_root: true

Passo 4 - Recebendo e transformando os dados dentro do Elasticsearch

A partir do momento em que o Beat se inscreve no tópico "drones/drone01" do MQTT, toda vez em que alguém publicar informações no mesmo (no caso, o nosso drone), o processo de ingestão de dados é acionado. A telemetria inicial publicada pelo drone, envia dados dos sensores no formato JSON. Dessa forma, criamos um pipeline de ingestão para que transforma os atributos do JSON em campos no nosso índice dentro do Elasticsearch. Seguindo a documentação, no menu "Stack Management>Ingest Pipelines>Create Pipelines"

Após nomear o seu pipeline, "mqtt-test", clique em "Add processor" para definir a regra do parser.

Em nosso caso, desejamos extrair os atributos do campo "message" que está no formato JSON e transformá-los em campos do próprio índice com prefixo "data-drone". Clique em "Add" para adicionar nosso processor e em seguida "Create Pipeline".

Como vocês sabem, existem várias formas de resolver problemas semelhantes no Elastic, é uma questão de arquitetura, performance, etc. Neste caso, por exemplo, poderíamos configurar um script no próprio Filebeat, mas para me beneficiar da UI e ilustrar melhor o funcionamento do processor, resolvi utilizar esta opção dentro do próprio Elasticsearch. Qual outra opção você usaria?

Criamos então o nosso pipeline "mqtt-test" :

[
  {
    "json": {
      "field": "message",
      "target_field": "drone-data"
    }
  }
]

Precisamos agora dizer ao Filebeat que acione esse pipeline após a ingestão dos dados do drone. Fazemos isso editando o arquivo filebeat.yml na seguinte seção:

output.elasticsearch:
  indices:
    - index: "my-mqtt-%{[agent.version]}-%{+yyyy.MM.dd}"
  pipeline: mqtt-test

Pronto, tudo configurado, hora de testar.

Passo 5 - Testando a telemetria

Como eu disse anteriormente, assim como existem soluções diferentes para um mesmo problema, existem diversos drones no mercado de comportamentos diferentes. Voltando ao nosso cenário, para testar todo o fluxo, precisamos ligar o drone Tello. Ao ligar, ele disponibiliza uma rede Wi-fi "TELLO***" o qual conectamos nosso computador com o código python. É possível criar vôos programaticamente, gravar vídeos, e ler a telemetria dos sensores. De acordo com a documentação do Tello, é possível ler 16 informações de sensores, como temperatura, altitude, tempo de vôo, movimentação nos eixos x,y,z, entre outros. Essa informação é coletada no seguinte formato:

“pitch:%d;roll:%d;yaw:%d;vgx:%d;vgy%d;vgz:%d;templ:%d;temph:%d;tof:%d;h:%d;bat:%d;baro:%.2f; time:%d;agx:%.2f;agy:%.2f;agz:%.2f;\r\n”

O nosso código lê esses dados na porta 8890, monta um JSON e publica no MQTT no tópico "drones/drone01" de acordo com o padrão publish/subscribe. A frequência de leitura pode ser regulada no código python (neste caso 0.3 segundos).

Antes de rodar o código da telemetria, precisamos acionar o Filebeat para que fique escutando as publicações no MQTT e enviando os dados para o Elasticsearch, através do pipeline "mqtt-test" criado anteriormente.

Na sua máquina instalada com o Filebeat, execute a sequencia de comandos no terminal para testar, configurar e executar.

./filebeat test config
./filebeat test output
./filebeat setup

#Se tudo funcionar, podemos executar
./filebeat -e

Pronto, agora com o drone ligado e conectado, acionamos o código de telemetria.

python pub-drone-telemetry.py

Enquanto os dados são coletados no drone, processados em nosso pipeline e populados em nosso índice, podemos ver os registros chegando através do "Discover" no Kibana.

Note os campos drone-data.sensorX criados na lateral esquerda da tela. Cada campo corresponde a um dado de sensor do drone no mesmo timestamp.

Passo 6 - Criando uma visualização no Kibana Canvas

Como um bom sistema de IoT, precisamos de algo como um sistema supervisório para acompanharmos em tempo real. Nada melhor que o Kibana Canvas.

Usando sua imaginação, criando queries como fonte de dados dos componentes, é possível criar seu dashboard personalizado.

Conclusão

Pronto! E assim a magia do Natal estará a salvo e as crianças poderão brincar até 5 minutos antes do Papai Noel chegar e encontrar todos dormindo...
Feliz Natal !!!

*Espero que tenha gostado desta versão de Natal. Esse assunto será detalhado em uma série que publicarei. Vamos falar bastante de IoT, Robótica, Observabilidade, Telemetria, entre outros. Fique ligado e faça pedidos, dúvidas nos comentários deste blog.

2 Likes

Muito legal, tenho um DJI Mini e vou tentar replicar

1 Like

Bacana Guilherme! Curioso para saber o resultado!

Funcionou perfeito!
Era justamente o que eu estava precisando

1 Like

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.