Mover Tartaruga (TurtleSim)
Abstract
Move Turtle é um script simples em Python para ROS que move a tartaruga no TurtleSim do ROS para coordenadas (pontos) especificados. Este projeto começou como um projeto de aula para CSCI473 na Colorado School of Mines (CSOM) e depois evoluiu para um projeto que usei para aprender como sistemas de malha fechada podem ser criados, conhecimento que foi usado para me ajudar no trabalho no Laboratório de Robótica Human Center (HCR) da CSOM.
Context
Para algum contexto, ROS significa Robot Operating Systems. ROS é um middleware de robótica de código aberto, geralmente emparelhado com o sistema operacional Ubuntu, que é usado para gerenciar melhor os componentes/clusters de software de um sistema robótico. Você pode aprender mais sobre como usar ROS através da wiki oficial do ROS. O código que você escreve no ROS é em C++ ou Python.
TurtleSim é um simulador de robô 2D simples usado como introdução ao ROS e aos pacotes ROS para novos usuários do ROS. Tudo que o TurtleSim faz é abrir uma exibição 2D simples com uma tartaruga. Essa tartaruga atua como o “robô” e você pode enviar mensagens para esse “robô” para mover e/ou girar. Bem, movendo, o TurtleSim gera algum erro aleatório para simular a física do mundo real de forma simples.
Sabendo o que são ROS e TurtleSim, por que eu os estava usando? Bem, na primavera de 2020 eu estava fazendo uma disciplina chamada “Human Centered Robotics” na Colorado School of Mines como parte da minha carga de disciplinas de ciência da computação de graduação. A disciplina foi ministrada pelo Dr. Hao Zhang. A disciplina consistia em três projetos e o primeiro projeto consistia em configurar o ROS, aprender a usar o ROS e implementar um algoritmo de malha aberta ou malha fechada que fizesse a tartaruga no TurtleSim desenhar um M. A descrição original do projeto pode ser vista AQUI.
Quando eu estava fazendo a disciplina, concluí este projeto implementando um algoritmo de malha aberta. Essa solução funcionou, mas era muito ruim e desenhou um A que era “bom o suficiente”, mas de forma alguma “ótimo”. Depois de submeter o projeto por volta de meados de fevereiro de 2020, eu o esqueci até um ano depois, por volta de fevereiro de 2021.
Challenge
Em fevereiro de 2021, fui contratado como Assistente de Pesquisa no Laboratório de Robótica Human Center (HCR) na Colorado School of Mines, onde trabalhei sob a orientação do Dr. Hao Zhang. O objetivo do laboratório é pesquisar “autonomia colaborativa ao longo da vida, com o objetivo de permitir que robôs operem e se adaptem por longos períodos”. A partir de 1‑9‑2022 (1 de setembro de 2022), o laboratório mudou da Colorado School of Mines para a University of Massachusetts Amherst. Mas, quando eu trabalhei lá, eles ainda estavam localizados no Colorado.
No Laboratório HCR, fui encarregado de trabalhar no projeto Triton. O projeto Triton consistia em múltiplos, dezenas, de robôs chamados Tritons. Os Tritons eram robôs terrestres omni wheel triangulares que se pareciam com isto:
Junto aos Tritons, havia oito Câmeras IR da OptiTrack dispostas em uma “ordem octogonal” a alguns pés acima do chão. Usando essas câmeras, o software Motive da OptiTrack, um PC rodando Windows 10 e ROS; cria‑se um espaço de 2 m × 2 m × 2 m (x, y, z) onde a posição real exata de objetos com marcadores de captura de movimento pode ser determinada.
Minha primeira tarefa no projeto Triton foi criar scripts que fizessem o robô Triton mover‑se para uma posição real específica. Na época, eu não tinha certeza de como alcançar isso, mas me lembrei do primeiro projeto da CSCI473 onde a ideia de um sistema de malha fechada foi introduzida a mim, então comecei a pesquisar seriamente sistemas de malha fechada e, por sua vez, sistemas de realimentação.
Research
Durante minha pesquisa, descobri este ótimo vídeo do AerospaceControlsLab:
Neste vídeo, a ideia de um sistema PID foi mostrada e explicada para mim. Um sistema PID é um sistema de controle de malha fechada que produz saída(s) específicas com base em dados do mundo real. Em termos básicos, é um sistema de realimentação que ajusta sua saída com base na diferença entre o valor desejado e o valor medido. Esta é a fórmula para um controlador PID:
$$ u(t) = K_p e(t) + K_i \int e(t) dt + K_d \frac{de(t)}{dt} $$
- $u(t)$ é o sinal de controle.
- $K_p$, $K_i$, $K_d$ são os ganhos proporcional, integral e derivativo, respectivamente.
- $e(t)$ é o sinal de erro (a diferença entre o valor desejado e a saída real).
- $\int e(t) dt$ é a integral do erro ao longo do tempo.
- $\frac{de(t)}{dt}$ é a derivada do erro.
Para saber mais, confira o vídeo do AerospaceControlsLab ou este incrível artigo da Wikipedia de onde a fórmula foi tirada.
Depois de fazer minha pesquisa e receber ajuda de amigos e professores inteligentes, determinei que usar um Controlador Proporcional, Controlador P, seria o melhor para ajudar o Triton a alcançar uma coordenada específica.
Como o Triton é um robô terrestre, só preciso me preocupar com as coordenadas X e Y. Sabendo disso, tive que determinar quais valores desejados e medidos medir e processar dentro do(s) Controlador(es) P. Em minha pesquisa encontrei este post incrível na wiki do ROS chamado Go to Goal onde eles focam nos seguintes erros:
- Erro de Distância: A diferença de distância entre a localização desejada (X, Y) e a localização atual (X, Y).
- Erro de Theta: A diferença entre a orientação desejada e a orientação atual.
Proposed Solution
Sabendo tudo isso, a solução para fazer o Triton mover‑se para uma coordenada real específica é usar um Controlador Proporcional para o erro de distância do Triton e o erro de theta em relação à coordenada alvo e à coordenada atual do Triton. Mas antes de implementar isso em um sistema físico, eu queria testar a ideia em uma simulação e, na época, pensei que usar o TurtleSim como simulação era a melhor escolha.
Testing In Simulation
Com a solução teórica delineada, optei por inicialmente validá‑la através de simulação, em vez de um cenário do mundo real. O mundo real costuma estar cheio de ruído que pode atrapalhar a eficácia da solução e levar a lidar com questões irrelevantes. Reconhecendo isso, revisitei meu projeto da CSCI473 e o adaptei como um campo de testes para essa solução teórica.
Depois de atualizar o código antigo de ROS Melodic para ROS Noetic e com algumas refinamentos iterativos, consegui fazer a solução proposta funcionar no TurtleSim. Demonstrações de sua funcionalidade, com alguns caminhos de coordenadas de objetivo legais, podem ser encontradas ao final deste post. O código de tudo isso pode ser visto AQUI.
Conclusion
Em resumo, através deste projeto, a tartaruga do TurtleSim navega efetivamente até coordenadas definidas usando o sistema de malha fechada, superando significativamente meu sistema de malha aberta inicial de 2020. Testada com sucesso, implementei essa solução nos robôs Triton. Mas o ruído do mundo real introduziu problemas inesperados que exigiram semanas de depuração e testes reais. Após essas semanas, consegui finalmente fazer o Triton alcançar coordenadas reais específicas usando a solução que testei no TurtleSim. Aqui está uma demonstração do Triton movendo‑se para coordenadas reais específicas usando o método testado no TurtleSim:
Em retrospectiva, gostaria de ter usado uma simulação que simulasse melhor a física do mundo real. O TurtleSim é ótimo para aprendizado, mas não é ótimo para testar ideias de robótica no mundo real. Na época, pensei que seria suficiente para meu caso de uso simples, mas isso foi provado posteriormente como não sendo o caso.
O objetivo principal deste post era delinear a criação de um sistema de malha fechada que permitisse à tartaruga no TurtleSim, e subsequentemente aos robôs Triton, navegar precisamente até posições‑alvo especificadas (X, Y). Acredito que esse objetivo foi alcançado, embora possa ter despertado algum interesse em meu trabalho no Laboratório HCR. Sabendo disso, tenho planos de fazer mais posts sobre minha experiência de trabalho no Laboratório HCR…
Moving Turtle (TurtleSim) Demos
This video contains the following demos:
- Cayley Nodal: A simple Cayley Nodal design
- Circles: A spider-web like design
- Inner Circles: A “circles inside of circles” design
- M: A very simple M design