Skip to content

Correções Críticas de Concorrência, Otimização de Telemetria e Inclusão de Testes#27

Merged
MuriloBarros304 merged 1 commit intomainfrom
v0.7.7
Mar 29, 2026
Merged

Correções Críticas de Concorrência, Otimização de Telemetria e Inclusão de Testes#27
MuriloBarros304 merged 1 commit intomainfrom
v0.7.7

Conversation

@MuriloBarros304
Copy link
Copy Markdown
Member

Título do PR: Correções Críticas de Concorrência, Otimização de Telemetria e Inclusão de Testes

Descrição

Este PR resolve problemas graves de concorrência (Race Conditions) na comunicação UDP com o drone, otimiza a leitura de telemetria, corrige loops infinitos potenciais e melhora a arquitetura geral da classe TelloZune para facilitar a manutenção e os testes automatizados.

Adicionalmente, implementa a primeira suíte de testes unitários com isolamento de rede (mocks) e prepara o repositório para Integração Contínua (CI).

Alterações Realizadas

  1. Correção de Race Condition nos Comandos (Thread-Safety):

    • Problema: Múltiplas threads podiam enviar comandos e aguardar respostas simultaneamente no mesmo evento (cmd_recv_ev), causando cruzamento de pacotes UDP.
    • Solução: Implementação de um threading.Lock (self.cmd_lock) no método send_cmd_return. Agora a porta 8889 é bloqueada de forma segura até que o comando atual receba sua resposta ou sofra timeout. Foi removido também um envio duplicado que ocorria no _read_queue.
  2. Otimização da Leitura de Velocidade (Fim do gargalo de rede):

    • Problema: O método get_speed() enviava ativamente o comando "speed?" pela porta de comandos, concorrendo com os movimentos do drone e atrasando o script.
    • Solução: O get_speed() agora faz a leitura passiva dos valores vgx, vgy e vgz diretamente da memória (self.state_value), que já é populada continuamente a ~10Hz pela thread de estado na porta 8890.
  3. Prevenção de Loop Infinito no Pouso (land):

    • Problema: Se o drone perdesse a conexão durante o voo, o método land() ficaria preso para sempre num laço while answer != 'ok'.
    • Solução: Adicionado um limite de tentativas (max_trys = 3) e um timeout de 5 segundos por tentativa, garantindo que o script possa falhar graciosamente e continuar a execução/encerramento.
  4. Padronização de Imports e Refatoração:

    • Problema: Bibliotecas nativas (socket, cv2) estavam sendo importadas dentro do método __init__, ferindo a PEP 8 e dificultando a criação de mocks para testes.
    • Solução: Imports movidos para o escopo global do arquivo.
  5. Correção da Lógica de Pausa em Rotas (_execute_route):

    • Problema: O uso de time.sleep() dentro do loop de inserção da rota apenas atrasava o enfileiramento dos comandos, não o tempo de espera do drone no ar, pois a thread _read_queue consumia a fila instantaneamente.
    • Solução: Criado um "comando virtual" customizado chamado delay X. A rota agora enfileira esse comando, e a thread _read_queue o intercepta, realizando a pausa real do script (e do drone) entre os movimentos.
  6. Remoção de Lag na Thread de Estado (_state_receive):

    • Problema: Um wait(0.1) artificial estava sendo chamado logo após o recvfrom (que já é bloqueante e ditado pelo clock do drone). Isso fazia os pacotes UDP acumularem na fila do SO, gerando leituras atrasadas ao longo do tempo.
    • Solução: Remoção do wait(), permitindo que a thread processe os estados na mesma velocidade em que o Tello os envia, mantendo a lógica de period para evitar sobrecarga de processamento nas formatações.

@MuriloBarros304 MuriloBarros304 self-assigned this Mar 29, 2026
@MuriloBarros304 MuriloBarros304 merged commit 939521e into main Mar 29, 2026
1 check passed
@MuriloBarros304 MuriloBarros304 deleted the v0.7.7 branch March 29, 2026 17:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant