Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Desenhar pista com encoders na dashboard #65

Open
Matheus-de-Sousa opened this issue Jan 26, 2023 · 3 comments
Open

Desenhar pista com encoders na dashboard #65

Matheus-de-Sousa opened this issue Jan 26, 2023 · 3 comments
Assignees
Labels
enhancement New feature or request

Comments

@Matheus-de-Sousa
Copy link
Collaborator

  • Criar visualização automática para a pista a partir das leituras do encoder.
  • Gerar automaticamente o desenho da pista e integrar alterações nela, como marcação de pontos e alterações de marcações.
  • Fazer isso de forma integrada com a dashboard atual.
@Matheus-de-Sousa
Copy link
Collaborator Author

Uma das formas para desenhar a pista é através da coleta de vários pontos no plano cartesiano que estão contidos na pista e com esses pontos traçar uma reta para interligar cada par de pontos, levando à um desenho cada vez mais fiel à pista original conforme a quantidade de pontos coletados aumentar. Após coletar os pontos armazená-los na memória flash do robô e permitir que eles sejam lidos e enviados para a dashboard no formato JSON.

Obs: Antes de testar a plotagem dos pontos na dashboard pode ser interessante testá-los, por exemplo, no python com algum algoritmo simples de plotagem de polígonos.

@Matheus-de-Sousa
Copy link
Collaborator Author

Entretanto, para coletar os pontos com o robô e os encoders será necessário converter os pulsos dos encoders em pontos no plano XY, isso pode ser feito inicialmente padronizando algumas medidas, no caso seria necessário calcular a partir dos pulsos dos encoders direito e esquerdo o deslocamento linear e angular do robô.

  • O deslocamento linear, pode ser calculado com a média dos pulsos dos encoders multiplicada por PI x Diâmetro das rodas e após isso dividir o resultado pelo CPR dos encoders. Como mostrado abaixo:
    $$\Delta s = (\Delta EncDir + \Delta EncEsq) \times \pi D_{wheel} \over{2 \times CPR}$$
  • O deslocamento angular pode ser calculado com base no comprimento do arco de circunferência que o robô teria percorrido se ele tivesse girado em torno do próprio eixo. Como mostrado abaixo:
    $$\Delta\theta = (\Delta EncDir - \Delta EncEsq) \times \pi D_{wheel} \over{2 \times CPR \times R_{robot}}$$

Onde:

  • $\Delta EncDir$ : Variação dos pulsos do encoder direito;
  • $\Delta EncEsq$ : Variação dos pulsos do encoder esquerdo;
  • $D_{wheel}$ : Diâmetro da roda;
  • CPR : Quantidade de pulsos do encoder para uma volta da roda, no caso do código, a variável com esse dado se chama MPR;
  • $R_{Robot}$ : "Raio do robô" (distância do centro do robô para o centro de uma de suas rodas);
  • $\Delta s$ : Deslocamento linear;
  • $\Delta\theta$ : Deslocamento angular.

Obs: Se a variação angular ou linear serão positivas ou negativas dependerá da orientação adotada para o sistema de coordenadas. Para que seja possível calcular a variação dos deslocamentos é necessário utilizar alguma referência para os cálculos, no caso das fórmulas apresentadas, a referência é o ponto anterior, logo a variação é relativa à variação do deslocamento do ponto calculado anteriormente e o ponto atual.

@Matheus-de-Sousa
Copy link
Collaborator Author

Matheus-de-Sousa commented Apr 8, 2023

Com os deslocamentos calculados se é possível obter a posição do robô no plano XY para cada ponto calculado com base nas relações trigonométricas de um triângulo retângulo. Esses cálculos todos devem ser feitos no serviço speedService.cpp. Todos esses dados devem ser armazenados em alguma estrutura de dados como um vector de pairs, matrizes contendo os vetores da posição ou outras estruturas que melhor se adequarem para a situação.

Para o cálculo das fórmulas apresentadas, algumas variáveis já foram implementadas, são elas:

  • CPR (MPR) - Para ler ela utilizar o comando robot->getSpeed()->MPR->getData(), essa é a forma mais geral de ler essa variável, mas ela já pode estar sendo lida no escopo onde está sendo trabalhado e também para certos casos pode ser lida de maneiras mais simples.
  • $D_{wheel}$ - Para ler ela utilizar o comando robot->getSpeed()->WheelDiameter->getData(), note que para ler as variáveis existe um padrão que é **robot->get(nome da classe em que a variável se encontra)->(nome da variável)->getData().
  • EncEsq - Para ler ela utilizar o comando robot->getSpeed()->EncLeft->getData() (retorna o último valor armazenado dos pulsos do encoder, essa variável recebe novos valores no speedService) ou enc_motEsq.getCount() (funciona somente dentro do speedsevice e retorna o valor atual dos pulsos do encoder)
  • EncDir, funciona de modo análogo ao EncEsq.

Obs: será necessário criar a variável para o "raio do robô" que deve ser editável pela dashboard, essa variável pode ser criada na estrutura de dados slatMarks

Obs2: O c++ possui a biblioteca math.h, que contém funcões para obter PI e funções trigonométricas.

Utilizando os dados descritos acima é possível utilizar as fórmulas e encontrar os pontos da pista, o armazenamento desses pontos poderá ser feito com uma classe desenvolvida em outra branch com o objetivo de criar gráficos, a branch se chama feature/GraphComponent. Após a primeira etapa ser finalizada, o código dela será revisado e será feito o merge da branch graphComponent para a branch relativa a esta issue, como a classe da branch graphComponent já se encarrega de transformar os dados em JSON essa parte também não precisará ser implementada. Porém ainda será necessário implementar o armazenamento desses dados na flash, isso pode ser feito na branch feature/GraphComponent permitindo que qualquer gráfico gerado com ela seja armazenado na flash e por fim, para enviar os dados para a dashboard será necessário criar um comando para isso na biblioteca Cmd_Wrapper no arquivo cmd_param.cpp.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants