Skip to content

Latest commit

 

History

History
730 lines (516 loc) · 22.6 KB

Intermediate.md

File metadata and controls

730 lines (516 loc) · 22.6 KB

Anotações: Intermediate

Creating an action

"Você aprendeu sobre ações anteriormente no tutorial Entendendo as ações do ROS 2. Assim como os outros tipos de comunicação e suas respectivas interfaces (tópicos/msg e serviços/srv), você também pode definir ações personalizadas em seus pacotes. Este tutorial mostra como definir e construir uma ação que você pode usar com o servidor de ação e o cliente de ação que você escreverá no próximo tutorial."

o principal arquivo deste pacote é o Fibonacci.action.

int32 order # Request
---
int32[] sequence # Result
---
int32[] partial_sequence # Feedback

Arquivos editados

CMakeLists.txt package.xml

Writing an action server and client (C++)

"As ações são uma forma de comunicação assíncrona no ROS. Os clientes de ação enviam solicitações de meta para servidores de ação. Os servidores de ação enviam feedback de metas e resultados para clientes de ação. "

Criando o pacote

ros2 pkg create --dependencies action_tutorials_interfaces rclcpp rclcpp_action rclcpp_components -- action_tutorials_cpp

Arquivos criados/editados: action_tutorials_cpp/CMakeLists.txt action_tutorials_cpp/package.xml action_tutorials_cpp/include/action_tutorials_cpp/visibility_control.h action_tutorials_cpp/src/fibonacci_action_server.cpp action_tutorials_cpp/src/fibonacci_action_client.cpp

Execute os comados abaixo em terminais distintos:

ros2 run action_tutorials_cpp fibonacci_action_server
ros2 run action_tutorials_cpp fibonacci_action_client

Writing an action server and client (Python)

"As ações são uma forma de comunicação assíncrona no ROS 2. Clientes de ação enviam solicitações de meta para servidores de ação. Os servidores de ação enviam feedback de metas e resultados para clientes de ação."

Criando o pacote

ros2 pkg create --build-type ament_python action_tutorials_py  --dependencies rclpy action_tutorials_interfaces

Arquivos criados/editados:

action_tutorials_py/setup.py action_tutorials_py/package.xml

action_tutorials_py/action_tutorials_py/fibonacci_action_server1.py # Arquivo inicial do tutorial action_tutorials_py/action_tutorials_py/fibonacci_action_client1.py # Arquivo inicial do tutorial action_tutorials_py/action_tutorials_py/fibonacci_action_server.py # Arquivo final do tutorial action_tutorials_py/action_tutorials_py/fibonacci_action_client.py # Arquivo final do tutorial

Na primeira etapa do tutorial é abordado um formato mais simples do server e client, onde o feedback é passado ao final do processamento, no formato final é implementado um formato de feedback incremental.

Composing multiple nodes in a single process REFAZER

"Para ver quais componentes estão registrados e disponíveis no espaço de trabalho, execute o seguinte em um shell:"

ros2 component types

Retorna:

(... components of other packages here)
composition
  composition::Talker
  composition::Listener
  composition::NodeLikeListener
  composition::Server
  composition::Client
(... components of other packages here)

Using colcon to build packages

Underlay - Instalação /opt/ros/galactic/setup.bash
Overlay - Workspace ~/ros2_study_ws

Para criar um ambiente de trabalho(Workspace ou ws):

mkdir -p ~/ros2_study_ws/src
cd ~/ros2_study_ws

Após criar o diretorio, os pacotes de trabalho devem ser adicionados ao diretorio src: obs: clonar repo git clone https://github.com/ros2/examples src/examples -b galactic

.
└── src
    └── examples
        ├── CONTRIBUTING.md
        ├── LICENSE
        ├── rclcpp
        ├── rclpy
        └── README.md

4 directories, 3 files

"Na raiz da área de trabalho, execute colcon build. Como tipos de compilação como ament_cmake não suportam o conceito de espaço devel e requerem que o pacote seja instalado, colcon suporta a opção --symlink-install. Isso permite que os arquivos instalados sejam alterados alterando os arquivos no espaço de origem (por exemplo, arquivos Python ou outros não compilados com recursos) para uma iteração mais rápida."

colcon build --symlink-install

Após o build do workspace tera os seguintes diretorios

.
├── build
├── install
├── log
└── src

4 directories, 0 files

Ainda é possivel realizar o teste do ambiente.

colcon test

Monitoring for parameter changes (C++)

"Muitas vezes, um nó precisa responder a alterações em seus próprios parâmetros ou nos parâmetros de outro nó. A classe ParameterEventHandler facilita a escuta de alterações de parâmetro para que seu código possa responder a elas. Este tutorial mostrará como usar a versão C++ da classe ParameterEventHandler para monitorar alterações nos parâmetros de um nó, bem como alterações nos parâmetros de outro nó."

ros2 pkg create --build-type ament_cmake cpp_parameter_event_handler --dependencies rclcpp

Arquivos criados/editados:

package.xml parameter_event_handler1.cpp parameter_event_handler.cpp

Primeira parte do tutorial Terminal 1

ros2 run cpp_parameter_event_handler parameter_event_handler

Terminal 2

ros2 param set node_with_parameters an_int_param 43

retorno

[INFO] [1606950498.422461764] [node_with_parameters]: cb: Received an update to parameter "an_int_param" of type integer: "43"

Segunda parte Terminal 1

ros2 run cpp_parameter_event_handler parameter_event_handler

Terminal 2

ros2 run demo_nodes_cpp parameter_blackboard

Terminal 3

ros2 param set parameter_blackboard a_double_param 3.45

Retorno

[INFO] [1606952588.237531933] [node_with_parameters]: cb2: Received an update to parameter "a_double_param" of type: double: "3.45"

Launch Tutorials

Creating a ROS 2 Launch File.

Criando um arquivo de launch para ros2

Arquivo criado no turorial src/ros_tutorials/launch/turtlesim_mimic_launch.py

cd launch
ros2 launch turtlesim_mimic_launch.py

O comando ira abrir duas instancias do turtlesim.

No segundo terminal executar o comando abaixo:

ros2 topic pub -r 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"

Para visualizar a interligação entre nós basta rodar o comando:

rqt_graph

Launching and Monitor Multiple Nodes with Launch.

"O sistema de lançamento no ROS 2 é responsável por ajudar o usuário a descrever a configuração de seu sistema e então executá-lo conforme descrito. A configuração do sistema inclui quais programas executar, onde executá-los, quais argumentos transmiti-los e convenções específicas do ROS que facilitam a reutilização de componentes em todo o sistema, fornecendo a cada um configurações diferentes. Também é responsável por monitorar o estado dos processos iniciados, reportar e/ou reagir a mudanças no estado desses processos."

Para este turorial foi utilizado o pacote my_package_py.

Arquivos criados/editados:
setup.py launch/my_script.launch.py

ros2 launch my_package_py my_script.launch.py

Using substitutions in launch files

"Os arquivos de inicialização são usados para iniciar nós, serviços e executar processos. Esse conjunto de ações pode ter argumentos, que afetam seu comportamento. As substituições podem ser usadas em argumentos para fornecer mais flexibilidade ao descrever arquivos de inicialização reutilizáveis. As substituições são variáveis que são avaliadas apenas durante a execução da descrição de execução e podem ser usadas para adquirir informações específicas como uma configuração de execução, uma variável de ambiente ou para avaliar uma expressão arbitrária do Python."

Para o Tutorial foram criados dois arquivos:

launch/example_main.launch.py launch/example_substitutions.launch.py

Terminal 1

ros2 launch launch_tutorial example_substitutions.launch.py --show-args

Terminal 2

ros2 launch launch_tutorial example_substitutions.launch.py turtlesim_ns:='turtlesim3' use_provided_red:='True' new_background_r:=200

Using Event Handlers.

"Launch in ROS 2 é um sistema que executa e gerencia processos definidos pelo usuário. Ele é responsável por monitorar o estado dos processos que lançou, bem como relatar e reagir às mudanças no estado desses processos. Essas alterações são chamadas de eventos e podem ser tratadas registrando um manipulador de eventos no sistema de inicialização. Os manipuladores de eventos podem ser registrados para eventos específicos e podem ser úteis para monitorar o estado dos processos. Além disso, eles podem ser usados para definir um conjunto complexo de regras que podem ser usadas para modificar dinamicamente o arquivo de inicialização."

Para o tutorial foi criado o arquivo launch/tutorial/launch/example_event_handlers.launch.py

Executando o launch

ros2 launch launch_tutorial example_event_handlers.launch.py turtlesim_ns:='turtlesim3' use_provided_red:='True' new_background_r:=200

Passos executados pelo launch This will do the following:

Start a turtlesim node with a blue background

Spawn the second turtle

Change the color to purple

Change the color to pink after two seconds if the provided background_r argument is 200 and use_provided_red argument is True

Shutdown the launch file when the turtlesim window is closed

Additionally, it will log messages to the console when:

The turtlesim node starts

The spawn action is executed

The change_background_r action is executed

The change_background_r_conditioned action is executed

The turtlesim node exits

The launch process is asked to shutdown.

Using ROS 2 Launch For Large Projects.

"Este tutorial descreve algumas dicas para escrever arquivos de inicialização para projetos grandes. O foco está em como estruturar os arquivos de inicialização para que possam ser reutilizados o máximo possível em diferentes situações. Além disso, abrange exemplos de uso de diferentes ferramentas de inicialização do ROS 2, como parâmetros, arquivos YAML, remapeamentos, namespaces, argumentos padrão e configurações RViz."

Arquivos criados no tutorial:

launch/launch_turtlesim.launch.py launch/turtlesim_world_1.launch.py launch/turtlesim_world_2.launch.py launch/turtlesim_world_3.launch.py launch/broadcaster_listener.launch.py launch/mimic.launch.py launch/turtlesim_rviz.launch.py launch/fixed_broadcaster.launch.py config/turtlesim.yaml

ros2 launch launch_tutorial launch_turtlesim.launch.py

  • Nescessario instalar pacote sudo apt install ros-galactic-turtle-tf2-py

tf2 Tutorials

  • Learning tf2

1. Introduction to tf2

"Objetivo: Executar uma demonstração do turtlesim e ver um pouco do poder do tf2 em um exemplo multi-robô usando o turtlesim."

Para este tutorial o pacote a seguir deve ser instalado:

sudo apt-get install ros-galactic-turtle-tf2-py ros-galactic-tf2-tools ros-galactic-tf-transformations
pip3 install transforms3d

tf2 tools

1 Using view_frames

ros2 run tf2_tools view_frames

2 Using tf2_echo

ros2 run tf2_ros tf2_echo turtle2 turtle1

rviz and tf2

ros2 run rviz2 rviz2 -d $(ros2 pkg prefix --share turtle_tf2_py)/rviz/turtle_rviz.rviz

2. Writing a tf2 static broadcaster

Pacote utilizado no tutorial

ros2 pkg create --build-type ament_python learning_tf2_py

Arquivos criados no tutorial: learning_tf2_py/learning_tf2_py/static_turtle_tf2_broadcaster.py

Terminal 1

ros2 run learning_tf2_py static_turtle_tf2_broadcaster mystaticturtle 0 0 1 0 0 0

Terminal 2

ros2 topic echo --qos-reliability reliable --qos-durability transient_local /tf_static

Retorna

transforms:
- header:
   stamp:
      sec: 1622908754
      nanosec: 208515730
   frame_id: world
child_frame_id: mystaticturtle
transform:
   translation:
      x: 0.0
      y: 0.0
      z: 1.0
   rotation:
      x: 0.0
      y: 0.0
      z: 0.0
      w: 1.0

Pesar de ser possivel escrever o porpio codigo para trabalhar com transformadas, é sugerido que seja utlizado o comando apropiado para isso:

ros2 run tf2_ros static_transform_publisher x y z yaw pitch roll frame_id child_frame_id

ou

ros2 run tf2_ros static_transform_publisher x y z yaw pitch roll frame_id child_frame_id

Para adicionar esse comando a um arquivo de launch:

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
   return LaunchDescription([
      Node(
            package='tf2_ros',
            executable='static_transform_publisher',
            arguments = ['0', '0', '1', '0', '0', '0', 'world', 'mystaticturtle']
      ),
   ])

Pacote utilizado no tutorial

ros2 pkg create --build-type ament_cmake learning_tf2_cpp

Arquivos criados no tutorial: src/static_turtle_tf2_broadcaster.cpp

3. Writing a tf2 broadcaster

"Nos próximos dois tutoriais, escreveremos o código para reproduzir a demonstração do tutorial Introdução ao tf2. Depois disso, os tutoriais a seguir se concentram em estender a demonstração com recursos tf2 mais avançados, incluindo o uso de tempos limite em pesquisas de transformação e viagens no tempo."

Arquivos criados no tutorial: learning_tf2_py/learning_tf2_py/turtle_tf2_broadcaster.py learning_tf2_py/launch/turtle_tf2_demo.launch.py

Update: setup.py package.xml

Rodar tutorial Terminal 1

ros2 launch learning_tf2_py turtle_tf2_demo.launch.py

Terminal 2

ros2 run turtlesim turtle_teleop_key

Terminal 3

ros2 run tf2_ros tf2_echo world turtle1

Resposta:

At time 1651597783.967794171
- Translation: [6.971, 6.643, 0.000]
- Rotation: in Quaternion [0.000, 0.000, -0.774, 0.633]

Arquivos criados e ou editados no tutorial: learning_f2_cpp/src/turtle_tf2_broadcaster.cpp learning_f2_cpp/launch/turtle_tf2_demo.launch.py CMaKeList.txt package.xml

Execurar o tutorial

Terminal 1

ros2 launch learning_tf2_cpp turtle_tf2_demo.launch.py

Terminal 2

ros2 run turtlesim turtle_teleop_key

Terminal 3

ros2 run tf2_ros tf2_echo world turtle1

Resposta:

[INFO] [1652213515.939368866] [tf2_echo]: Waiting for transform world ->  turtle1: Invalid frame ID "world" passed to canTransform argument target_frame - frame does not exist
At time 1652213516.929271505
- Translation: [5.544, 5.544, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]
At time 1652213517.937710474
- Translation: [5.544, 5.544, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]
At time 1652213518.929866449
- Translation: [5.544, 5.544, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]

4. Writing a tf2 listener.

Arquivos criados no tutorial: learning_tf2_py/learning_tf2_py/turtle_tf2_listener.py

Update: setup.py package.xml

Adicionar a linha a seguir no arquivo setup.py:

'console_scripts': [
...
'turtle_tf2_listener = learning_tf2_py.turtle_tf2_listener:main',
...
],

Terminal 1

ros2 launch learning_tf2_py turtle_tf2_demo.launch.py

Terminal 2

ros2 run turtlesim turtle_teleop_key

Arquivos criados no tutorial: learning_tf2_cpp/src/turtle_tf2_listener.cpp learning_tf2_cpp/launch/turtle_tf2_demo.launch.py # Editado

ros2 launch learning_tf2_cpp turtle_tf2_demo.launch.py
ros2 run turtlesim turtle_teleop_key

5. Adding a frame

  • Python

Arquivos criados no tutorial: learning_tf2_py/learning_tf2_py/fixed_frame_tf2_broadcaster.py learning_tf2_py/launch/turtle_tf2_dynamic_frame_demo.launch.py

Formatos para envio de argumentos

1 - Via terminal:

ros2 launch learning_tf2_py turtle_tf2_fixed_frame_demo.launch.py **target_frame:=carrot1**

2 - Via launch file:

def generate_launch_description():
   demo_nodes = IncludeLaunchDescription(
      ...,
      launch_arguments={'target_frame': 'carrot1'}.items(),
      )

Arquivos criados no tutorial: learning_tf2_cpp/learning_tf2_py/fixed_frame_tf2_broadcaster.cpp learning_tf2_py/launch/turtle_tf2_fixed_frame_demo.launch.py learning_tf2_cpp/src/dynamic_frame_tf2_broadcaster.cpp learning_tf2_py/launch/turtle_tf2_dynamic_frame_demo.launch.py

Exemplo 1 Terminal 1

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py target_frame:=carrot1

Terminal 2

ros2 run turtlesim turtle_teleop_key

Exemplo 2 Terminal unico

ros2 launch learning_tf2_cpp turtle_tf2_dynamic_frame_demo.launch.py

6. Learning about tf2 and time

"Nos tutoriais anteriores, recriamos a demonstração da tartaruga escrevendo um transmissor tf2 e um ouvinte tf2. Também aprendemos como adicionar um novo quadro à árvore de transformação. Agora vamos aprender mais sobre o argumento timeout que faz o lookup_transform esperar pela transformação especificada até a duração especificada antes de lançar uma exceção. Essa ferramenta pode ser útil para ouvir transformações publicadas em taxas variadas ou fontes de entrada com rede não confiável e latência não desprezível. Este tutorial ensinará como usar o timeout na função lookup_transform para esperar que uma transformação esteja disponível na árvore tf2"

Arquivos editados no tutorial: src/learning_tf2_py/learning_tf2_py/turtle_tf2_listener.py

Para correto funcionamento foi nescessario adicionar a linha

from rclpy.duration import Duration

Executando o tutorial Terminal 1

ros2 launch learning_tf2_py turtle_tf2_demo.launch.py

Terminal 2

ros2 run turtlesim turtle_teleop_key

A tartatura 2 tera a posição da tartaruga 1 um segundo atrás como referencia de posicionamentos.

Arquivos editados no tutorial: src/learning_tf2_cpp/learning_tf2_cpp/turtle_tf2_listener.cpp

Executando o tutorial Terminal 1

ros2 launch learning_tf2_cpp turtle_tf2_demo.launch.py

Terminal 2

ros2 run turtlesim turtle_teleop_key

7. Time travel with tf2.

"No tutorial anterior, discutimos os conceitos básicos de tf2 e tempo. Este tutorial nos levará um passo adiante e exporá um poderoso truque do tf2: a viagem no tempo. Em suma, uma das principais características da biblioteca tf2 é que ela é capaz de transformar dados no tempo e no espaço.

Esse recurso de viagem no tempo do tf2 pode ser útil para várias tarefas, como monitorar a pose do robô por um longo período de tempo ou construir um robô seguidor que seguirá os “passos” do líder. Usaremos esse recurso de viagem no tempo para procurar transformações de volta no tempo e programar turtle2 para seguir 5 segundos atrás de cenoura1."

Arquivos editados no tutorial: src/learning_tf2_py/learning_tf2_py/turtle_tf2_listener.py

Terminal 1

ros2 launch learning_tf2_py turtle_tf2_fixed_frame_demo.launch.py

Terminal 2

ros2 run turtlesim turtle_teleop_key

Arquivos editados no tutorial: src/learning_tf2_cpp/learning_tf2_cpp/turtle_tf2_listener.cpp

Terminal 1

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py

Terminal 2

ros2 run turtlesim turtle_teleop_key

Debugging tf2

"Um quaternion é uma representação de orientação de 4 tuplas(tradução errada, provavelmente tratase de tupla de 4 posições), que é mais concisa do que uma matriz de rotação. Os quatérnions são muito eficientes para analisar situações em que estão envolvidas rotações em três dimensões. Quaternions são amplamente utilizados em robótica, mecânica quântica, visão computacional e animação 3D."

Instalando tf_transformations

sudo apt-get install ros-galactic-tf-transformations

Codigo da biblioteca tf_transformations.

Referêsncias externas A Sutileza dos Quatérnions no Movimento de Rotação de Corpos Rígidos

(O que são números Quaternions?)[https://www.youtube.com/watch?v=8WeatzzMT_A] (Dinâmica de Sistemas Mecânicos, Professor Samuel da Silva )[https://www.youtube.com/watch?v=x4GhXt7yvks&list=PLHtj55JNGdtmqJUZud-Vsdc68Q4Ez21By]

No tutorial cita a linha

std::string to_frame_rel = "turtle2";

Porem no codigo esta escrito:

std::string toFrameRel = "turtle2";

Using sensor messages with tf2

URDF Tutorials