Como utilizar uma Action do ROS para resolver um problema prático de navegação em Python – ROS Portuguese Tutorial

Written by Anderson Nardin

07/02/2024

This tutorial is created by Rosbotics Ambassador 014 Anderson

Rosbotics Ambassador Program https://www.theconstruct.ai/rosbotics-ambassador/)


O que nós vamos aprender:

    1. Como acessar as mensagens associadas a uma ação
    2. Como criar um servidor de ações
    3. Como inicializar uma ação
    4. Como disponibilizar uma informação de odometria enquanto o robô se move

Lista de recursos usados neste post:

  1. Use este rosject: https://app.theconstructsim.com/l/5e7ce8b4/
  2. The Construct: https://app.theconstructsim.com/
  3. ROS Courses: ROS Basics in 5 Days (Python) https://app.theconstructsim.com/Course/55
  4. ROS Couses: ROS Navigation: https://app.theconstructsim.com/courses/57

Panorama
Em ROS, quando se fala em realizar uma tarefa enquanto uma outra está sendo realizada, estamos falando das “Actions”. Neste artigo, trataremos de um exemplo em ROS com o TurtleBot3 programado em Python. Basicamente, dada uma posição no espaço, teremos que iniciar uma ação que cuidará de calcular o quanto nosso robô está longe da posição inicial enquanto este se movimenta pelo ambiente.

Abrindo o rosject
Para seguir este tutorial, será útil e conveniente usar um rosject (que a grosso modo é um projeto ROS configurado para rodar um exemplo).
Acesse o link:
https://app.theconstructsim.com/l/5e7ce8b4/
Clique no botão vermelho “RUN”:

Descobrindo as mensagens associadas:
Abra um terminal clicando no ícone indicado na figura:

Na janela do primeiro terminal, insira o comando:

roscd actionlib

Você notará que o caminho para a pasta será:

user:/home/simulations/public_sim_ws/src/all/actionlib/actionlib

Isso significa que você está acessando a pasta de um pacote chamado actionlib. Neste pacote, tipos padrão de mensagens usadas para realizar ações podem ser encontradas e isso nos será útil.

Navegue para a pasta action com o comando:

cd action

Aqui, você encontra um arquivo chamado Test.action. Para visualizá-lo diretamente no terminal, rode:

cat Test.action

O seguinte conteúdo é apresentado:

int32 goal
---
int32 result
---
int32 feedback

Muitas informações importantes são extraídas deste arquivo. Por exemplo, vemos a estrutura padrão de um arquivo de ação que contém objetivo, resultado e feedback separados pelos hífens. Não necessariamente teremos variáveis associadas a esses tipos em todos os arquivos. No nosso exemplo, estamos especialmente interessados no feedback (que não precisa ter esse nome sempre).

Criando um servidor de ações
Clique no ícone para abrir a IDE e navegue nas pastas do workspace para encontrar o arquivo action_server.py.

Neste arquivo, vemos como a informação da ação é utilizada. Por exemplo, precisamos importar as possíveis mensagens, por isso temos:

from actionlib.msg import TestFeedback, TestResult, TestAction

Repare na implementação de variáveis necessárias para o código:

_feedback = TestFeedback()
_result   = TestResult()

Gaste alguns minutos lendo o código para entender como a distância para a localização inicial é calculada.
No terminal 1, rode o comando:

roslaunch realrobotlab main.launch

Você será apresentado à uma janela do Gazebo como esta:

Aproxime-se (zoom in) para visualizar o nosso robô no centro da tela:

Inicializando e verificando a ação
No terminal 2, rode o servidor de ações que acabamos de ver:

rosrun basic_project action_server.py

No terminal 3, inicialize a ação publicando na variável goal:

rostopic pub /record_odom/goal actionlib/TestActionGoal "header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: ''
goal_id:
stamp:
secs: 0
nsecs: 0
id: ''
goal:
goal: 0"

Existem outras formas de se inicializar uma ação por exemplo usando um script dedicado (action client) ou mesmo usando a interface gráfica axclient via comando:

rosrun actionlib_tools axclient.py /record_odom

obs.: Você pode usar o comando anterior no terminal 3 se preferir ao invés do comando de publição no tópico.

Clique no ícone de ferramentas gráficas para visualizar o axclient:

Independentemente da forma como você inicialize o servidor de ações, em um novo terminal (4) você pode verificar a variável feedback sendo atualizada com o valor da distância calculada entre a posição atual e a inicial do robô.

rostopic echo /record_odom/feedback

Para fazer o exemplo mais ilustrativo, você pode mover o robô usando as teclas do seu teclado, isto é, teleoperando o robô. Para teleoperar o robô, abra um novo terminal (5) e rode:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

Então, verá como a distância varia no seu terminal dedicado a ecoar tal resultado. Não se perca em meio a tantos terminais abertos simultaneamente. Algo como isto será apresentado na sua tela:

---
header:
seq: 581
stamp:
secs: 1597
nsecs:  72000000
frame_id: ''
status:
goal_id:
stamp:
secs: 1016
nsecs:  62000000
id: "/axclient_5154_1705261443951-1-1016.062"
status: 1
text: "This goal has been accepted by the simple action server"
feedback:
feedback: 58
---

Agora sim, você pode ficar tranquilo sabendo que a ação que você criou estará sempre atenta a quanto seu robô se distanciou da posição inicial. Uma ressalva importante é que neste cálculo simples de distância, os eventuais obstáculos são negligenciados.

Nós esperamos que este post seja útil para você!

Vídeo no YouTube

Este foi o post de hoje. Lembre-se que nós temos uma versão deste post em vídeo no YouTube.

Se você gostou do conteúdo, por favor, considere se inscrever no nosso canal do YouTube. Estamos publicando novos conteúdos quase todos os dias.

 

Continue avançando no seu aprendizado de ROS.

Video Tutorial

Topics: navigation | ROS
Masterclass 2023 batch2 blog banner

Check Out These Related Posts

0 Comments

Submit a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Pin It on Pinterest

Share This