Herramientas, Launch y visualización de ROS2

17 Herramienta de comandos común

17 Herramienta de comandos común (CLI Tools)

17.1 Herramienta de gestión de paquetes ros2 pkg

17.1.1 ros2 pkg create

Función: Crear un paquete funcional, requiriendo el nombre del paquete, la forma en que se compila, las dependencias, etc.

Formato:

bash
ros2 pkg create <package_name> --build-type <build-type> --dependencies <dependencies>

En el comando ros2:

pkg: indica funciones asociadas con el paquete funcional;

create: indica la creación de un paquete funcional;

Nombre del paquete: obligatorio: nombre del nuevo paquete funcional;

build-type: obligatorio: indica si el paquete de funciones recién creado es C++ o Python; si se usa C++ o C, este es ament_cmake, y si se usa Python, ament_python;

Opciones: el paquete de funciones C++ necesita contener rclcpp, el paquete de funciones Python necesita contener rclpy y otros dependientes;

17.1.2 ros2 pkg list

Función: Ver la lista de paquetes funcionales en el sistema

bash
ros2 pkg list

17.1.3 ros2 pkg executables

Función: Ver todos los ejecutables en un paquete

bash
ros2 pkg executables <pkg_name>

17.2 Ejecución de nodo ros2 run

Función: Ejecutar el programa de nodo del paquete funcional

bash
ros2 run <pkg_name> <node_name>

17.3 Herramientas relacionadas con nodos

17.3.1 ros2 node list

bash
ros2 node list

17.3.2 ros2 node info

bash
ros2 node info <node_name>

17.4 Herramientas relacionadas con tópicos

17.4.1 ros2 topic list

bash
ros2 topic list

17.4.2 ros2 topic info

bash
ros2 topic info <topic_name>

17.4.3 ros2 topic type

bash
ros2 topic type <topic_name>

17.4.4 ros2 topic hz

bash
ros2 topic hz <topic_name>

17.4.5 ros2 topic echo

bash
ros2 topic echo <topic_name>

17.4.6 ros2 topic pub

bash
ros2 topic pub <topic_name> <message_type> <message_content>

Ejemplo:

bash
ros2 topic pub turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.2}}"

17.5 Herramientas relacionadas con interfaces ros2

bash
ros2 interface list
ros2 interface show <interface_name>

17.6 Herramientas relacionadas con servicios

bash
ros2 service list
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: 'turtle10'}"

17.7 Próximos pasos

18 Uso de RViz2 - Aprender visualización con RViz2

  1. 19 Caja de herramientas Rqt - Aprender la herramienta Rqt

18 Uso de RViz2

18 Uso de RViz2 (RViz2 Vision)

18.1 Descripción general de RViz2

Rviz2 es la herramienta de visualización tridimensional más utilizada en ROS 2 para visualizar el estado operativo de los sistemas robóticos. Puede suscribirse y mostrar una variedad de datos de tópicos de ROS 2, como nubes de puntos de radar láser, mapas, modelos robóticos (URDF), conversión de coordenadas TF, trayectoria de planificación de rutas e imágenes de cámaras, y ayudar a los desarrolladores a verificar rápidamente si el sensor, el posicionamiento, la navegación, etc. están funcionando.

18.2 Trabajo preparatorio

Si hay un robot real, puede iniciar el ejercicio rviz en el extremo de control maestro del robot. Si no hay un robot real, podemos iniciar turtlebot3 de forma realista mediante gazebo, imitando radar láser, cámara, etc., para que los próximos datos se puedan visualizar.

Instalar el paquete simulador Turtlebot3

bash
sudo apt install ros-${ROS_DISTRO}-turtlebot3*

Instalación de puentes ros y gazebo

bash
sudo apt install ros-humble-ros-gz -y

Establecer la variable de entorno turtlebot3

bash
export TURTLEBOT3_MODEL=waffle

Iniciar el entorno de simulación gazebo

bash
# source /opt/ros/humble/setup.bash
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

Nota: Es posible que Jetson no pueda iniciar, esta operación se ejecuta en X86 PC

18.3 Inicio de Rviz2

Inicia un terminal y se puede activar con el siguiente comando:

bash
rviz2

Nota: Si se inicia en docker, asegúrese de que la pantalla GUI esté abierta.

18.4 Visualización de datos de imagen

Haga clic en Add en la ventana Displays de la izquierda para encontrar el elemento de visualización Image, OK para agregar la lista de visualización después de la confirmación, y luego configurar el tópico de imagen para el elemento de visualización, para que pueda ver la imagen de la cámara del robot.

Seleccionar Fixed Frame a las coordenadas base_footprint

Seleccionar Camera Color Topic

Ahora, podemos ver la visión del robot de simulación actual en la ventana de la cámara.

18.5 Visualización de datos de radar

Haga clic en Add en la ventana Displays de la izquierda, seleccione LaserScan y configure el nombre del tópico para la suscripción.

Selección de tópico para LaserScan

En este punto, podemos ver los contornos del radar láser.

18.6 Visualización de modelos robóticos

Haga clic en Add en la ventana Displays de la izquierda, seleccione RobotModel

Seleccione el tópico para robotDescriptionTopic

Podemos ver la visualización de robots en Rviz2.

18.7 Visualización de otros datos

Los plugins predeterminados de rivz enumeran muchos plugins de visualización de datos comúnmente usados que puede usar en una u otra ocasión.

18.8 Próximos pasos

  1. 19 Caja de herramientas Rqt - Aprender la herramienta Rqt

  2. 20 Configuración de Launch - Aprender la configuración de Launch

19 Caja de herramientas Rqt

19 Caja de herramientas Rqt (Rqt Tools)

19.1 Descripción general de Rqt

rqt es un marco de herramientas gráficas basado en Qt en ROS que integra muchas funciones comunes en una interfaz visual mediante plugins. Los desarrolladores pueden visualizar y depurar el sistema viendo rqt, por ejemplo, la distribución/suscripción de Topic, el monitoreo de nodos y comunicaciones (rqt graph), la visualización en tiempo real de registros (rqt console), la referencia dinámica (rqt reconfigure) y el dibujo de datos de análisis (rqt plot).

19.2 Instalación

La caja de herramientas rqt generalmente se instala por defecto siempre que se instale la versión de escritorio; si la instalación de ros2 no es una versión completa de la instalación, se puede instalar de la siguiente manera:

bash
sudo apt install ros-${ROS_DISTRO}-rqt*

19.3 Inicio

Las órdenes comunes de inicio de rqt son:

bash
# Method 1: run `rqt` in the terminal
rqt
bash
# Method 2
ros2 run rqt_gui rqt_gui

19.4 Uso de plugins

Después de iniciar rqt, puede agregar los plugins necesarios a través de plugins:

Abra un ejemplo de tortuga pequeña para ver las suscripciones a los nodos:

bash
# Terminal 1:
ros2 run turtlesim turtlesim_node
# Terminal 2:
ros2 run turtlesim turtle_teleop_key
# Terminal 3:
rqt

19.4.1 Plugin topic

Agrega plugins de tópico y envía comandos de velocidad para controlar el movimiento de la tortuga.

19.4.2 Plugin de servicio

Agrega un plugin de servicio y envía una solicitud para crear una tortuga en una ubicación dada.

19.4.3 Plugins de parámetros

Cambia el color de fondo del formulario de la tortuga a través del plugin de parámetros dinámicamente.

19.5 Próximos pasos

  1. 20 Configuración de Launch - Aprender la configuración de Launch

Grabación y reproducción - aprender la grabación de paquetes

20 Configuración de Launch

20 Configuración de Launch (Launch Files)

20.1 Descripción general de Launch

El archivo de inicio Launch en ROS se utiliza para la gestión y activación integradas de múltiples nodos/componentes y es esencialmente un script de inicio a nivel de sistema. Puede ser preparado por Python (más comúnmente), XML o YAML, soportando la activación simultánea de múltiples nodos, configuración de parámetros, remapeo de tópicos, carga de espacios de nombres, configuración de variables de entorno, y realizando controles lógicos más avanzados, como inicio condicional, inicio retardado, activación por incidente, etc.

20.2 Lanzamiento de un solo nodo Node

20.2.1 Paquetes preparatorios

bash
cd ~/workspaces/src
ros2 pkg create learn_launch --build-type ament_python

20.2.2 Nuevo archivo launch

Crea una nueva carpeta launch bajo el paquete funcional, luego crea un nuevo archivo single_node_launch.py en la carpeta launch para copiar lo siguiente:

bash
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
  node = Node(
  package='pkg_helloworld_py',
  executable='helloworld',
  output='screen'
  )
  return LaunchDescription([node])

20.2.3 Archivos de configuración setup.py

El archivo launch a menudo se nombra después de LaunchName_launch.py, donde LaunchName se personaliza y _launch.py a menudo se considera fijo. Necesita modificar el archivo setup.py bajo el paquete funcional para agregar el documento bajo la ruta launch para que pueda compilar el archivo .py para su ejecución

bash
# 1. Import the required header files
import os
from glob import glob

# 2. Add the `launch` path and its `launch.py` file to the `data_files` list
(os.path.join('share',package_name,'launch'),glob(os.path.join('launch','*launch.py')))

20.2.4 Compilación del paquete funcional

bash
cd ~/workspaces
colcon build --packages-select learn_launch

20.2.5 Procedimientos operativos

bash
# Refresh environment variables
source install/setup.bash
ros2 launch learn_launch single_node_launch.py

20.2.6 Análisis del código fuente

Importar biblioteca relacionada

bash
from launch import LaunchDescription
from launch_ros.actions import Node

Define una función generate_launch_description y devuelve una descripción launch

bash
def generate_launch_description():
  node = Node(
  package='pkg_helloworld_py',
  executable='helloworld',
  )
  return LaunchDescription([node])

Define el valor de retorno que un Node de variable se inicia como un nodo, llama a la función Node e inicia dos parámetros importantes, type y executable.

Package: indica el paquete funcional, representando el nombre del paquete funcional.

Executable: indica el procedimiento realizado, el nombre del procedimiento ejecutable.

La última llamada a la función LaunchDescription es para ingresar el parámetro node para ejecutar el retorno.

bash
return LaunchDescription([node])

20.3 launch de múltiples nodos Node

20.3.1 Nuevo archivo launch

Nuevo archivo multi_node_launch.py, agregue lo siguiente:

bash
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
  publisher_node = Node(
  package='pkg_topic',
  executable='publisher_demo',
  output='screen'
  )
  subscriber_node = Node(
  package='pkg_topic',
  executable='subscriber_demo',
  output='screen'
  )
  return LaunchDescription([
  publisher_node,
  subscriber_node
  ])

20.3.2 Compilación del paquete funcional

bash
colcon build --packages-select learn_launch

20.3.3 Procedimientos operativos

bash
# Refresh environment variables
source install/setup.bash
ros2 launch learn_launch multi_node_launch.py

Si el terminal no imprime los contenidos, puede ver qué nodos se activan para verificar si el inicio se ha realizado correctamente.

bash
ros2 node list

20.3.4 Resolución del código fuente

Es como simple node_launch.py, ¡solo otro nodo!

20.4 Casos de remapeo de tópicos

20.4.1 Nuevo archivo launch

Crea un nuevo archivo remap_name_launch.py bajo el directorio multi_node_launch.py, agregando lo siguiente:

bash
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
  publisher_node = Node(
  package='pkg_topic',
  executable='publisher_demo',
  output='screen',
  remappings=[("/topic_demo", "/topic_update")]
  )
  return LaunchDescription([
  publisher_node
  ])

20.4.2 Compilación del paquete funcional

bash
colcon build --packages-select learn_launch

20.4.3 Procedimientos operativos

bash
# ros2 launch learn_launch multi_node_launch.py
ros2 topic list
bash
# Refresh the environment variables and run the remapped-topic program to observe the changes:
source install/setup.bash
ros2 launch learn_launch remap_name_launch.py
ros2 topic list

20.4.4 Análisis del código fuente

bash
remappings=[("/topic_demo", "/topic_update")]

Aquí se remapea el tópico original /topic_demo a /topic_update.

20.5 Inserción del archivo Launch inicia otro archivo launch

20.5.1 Nuevo archivo launch

Nuevo include_launch.py bajo el directorio multi_node_launch.py, agregue lo siguiente:

bash
from launch import LaunchDescription
from launch_ros.actions import Node
import os
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
  hello_launch = IncludeLaunchDescription(PythonLaunchDescriptionSource(
  [os.path.join(get_package_share_directory('learn_launch'), 'launch'),
  '/multi_node_launch.py']),
  )
  return LaunchDescription([
  hello_launch
  ])

20.5.2 Compilación del paquete funcional

bash
colcon build --packages-select learn_launch

20.5.3 Procedimientos operativos

bash
# Refresh environment variables
source install/setup.bash
ros2 launch learn_launch include_launch.py

20.5.4 Análisis del código fuente

Insertar el archivo launch requiere el uso de las categorías IncludeLaunchDescription y PythonLaunchDescriptionSource del sistema launch

os.path.join (get_package_share_directory('learn_launch'): toma la posición del paquete funcional, donde el nombre del paquete funcional es learn_launch;

'launch': significa una carpeta que contiene los archivos launch bajo un paquete funcional;

'/multi_node_launch.py': denota un archivo /multi_node_launch.py bajo la carpeta launch.

20.6 Ejemplos de archivos launch compuestos

Esta demo muestra principalmente cómo se preparan los archivos launch complejos, y la funcionalidad del programa es insignificante.

20.6.1 Nuevo archivo launch

Crea un nuevo archivo complex_launch.py bajo el directorio multi_node_launch.py, agregando lo siguiente:

bash
# complex_launch.py
import os
from ament_index_python import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.actions import IncludeLaunchDescription
from launch.actions import GroupAction
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
from launch.substitutions import TextSubstitution
from launch_ros.actions import Node
from launch_ros.actions import PushRosNamespace


def generate_launch_description():

  # args that can be set from the command line or a default will be used
  background_r_launch_arg = DeclareLaunchArgument(
  "background_r", default_value=TextSubstitution(text="0")
  )
  background_g_launch_arg = DeclareLaunchArgument(
  "background_g", default_value=TextSubstitution(text="255")
  )
  background_b_launch_arg = DeclareLaunchArgument(
  "background_b", default_value=TextSubstitution(text="0")
  )
  chatter_ns_launch_arg = DeclareLaunchArgument(
  "chatter_ns", default_value=TextSubstitution(text="my/chatter/ns")
  )

  # include another launch file
  launch_include = IncludeLaunchDescription(
  PythonLaunchDescriptionSource(
  os.path.join(
  get_package_share_directory('demo_nodes_cpp'),
  'launch/topics/talker_listener.launch.py'))
  )
  # include another launch file in the chatter_ns namespace
  launch_include_with_namespace = GroupAction(
  actions=[
  # push-ros-namespace to set namespace of included nodes
  PushRosNamespace(LaunchConfiguration('chatter_ns')),
  IncludeLaunchDescription(
  PythonLaunchDescriptionSource(
  os.path.join(
  get_package_share_directory('demo_nodes_cpp'),
  'launch/topics/talker_listener.launch.py'))
  ),
  ]
  )

  # start a turtlesim_node in the turtlesim1 namespace
  turtlesim_node = Node(
  package='turtlesim',
  namespace='turtlesim1',
  executable='turtlesim_node',
  name='sim'
  )

  # start another turtlesim_node in the turtlesim2 namespace
  # and use args to set parameters
  turtlesim_node_with_parameters = Node(
  package='turtlesim',
  namespace='turtlesim2',
  executable='turtlesim_node',
  name='sim',
  parameters=[{
  "background_r": LaunchConfiguration('background_r'),
  "background_g": LaunchConfiguration('background_g'),
  "background_b": LaunchConfiguration('background_b'),
  }]
  )

  # perform remap so both turtles listen to the same command topic
  forward_turtlesim_commands_to_second_turtlesim_node = Node(
  package='turtlesim',
  executable='mimic',
  name='mimic',
  remappings=[
  ('/input/pose', '/turtlesim1/turtle1/pose'),
  ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
  ]
  )

  return LaunchDescription([
  background_r_launch_arg,
  background_g_launch_arg,
  background_b_launch_arg,
  chatter_ns_launch_arg,
  launch_include,
  launch_include_with_namespace,
  turtlesim_node,
  turtlesim_node_with_parameters,
  forward_turtlesim_commands_to_second_turtlesim_node,
  ])

20.6.2 Compilación del workspace

bash
colcon build --packages-select learn_launch

20.6.3 Procedimientos operativos

bash
# source install/setup.bash
ros2 launch learn_launch complex_launch.py

Se mostrarán dos tortugas en Jetson.

Inicie el nodo de control de teclado y agregue el espacio de nombres (porque agregamos el espacio de nombres al iniciar el nodo en los archivos launch)

bash
ros2 run turtlesim turtle_teleop_key --ros-args -r __ns:=/turtlesim1

Use los botones derecho e izquierdo para controlar el movimiento de la tortuga 1. La tortuga 2 es una copia perfecta de la tortuga 1.

20.6.4 Descripción del procedimiento

El proceso consistió principalmente en iniciar:

Uno, demo_nodes_cpp talker_listener,

  1. Nodo talker_listener con espacio de nombres

Tres, turtlesim1 es una pequeña tortuga en un espacio nombrado.

4 y Turtlesim2 son espacios nombrados para tortugas2

Cinco, remapear para que ambas tortugas puedan escuchar el mismo tema de comando.

20.7 Implementación xml

20.7.1 Nuevo archivo launch

Nuevo archivo Complex_Launch.py bajo el directorio de complex_launch.xml, agregue lo siguiente:

bash
<launch>

  <!-- args that can be set from the command line or a default will be used -->
  <arg name="background_r" default="0"/>
  <arg name="background_g" default="255"/>
  <arg name="background_b" default="0"/>
  <arg name="chatter_ns" default="my/chatter/ns"/>

  <!-- include another launch file -->
  <include file="$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener.launch.py"/>
  <!-- include another launch file in the chatter_ns namespace-->
  <group>
  <!-- push-ros-namespace to set namespace of included nodes -->
  <push-ros-namespace namespace="$(var chatter_ns)"/>
  <include file="$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener.launch.py"/>
  </group>

  <!-- start a turtlesim_node in the turtlesim1 namespace -->
  <node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
  <!-- start another turtlesim_node in the turtlesim2 namespace
  and use args to set parameters -->
  <node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2">
  <param name="background_r" value="$(var background_r)"/>
  <param name="background_g" value="$(var background_g)"/>
  <param name="background_b" value="$(var background_b)"/>
  </node>
  <!-- perform remap so both turtles listen to the same command topic -->
  <node pkg="turtlesim" exec="mimic" name="mimic">
  <remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
  <remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
  </node>
</launch>

20.7.2 Configuración del archivo setup.py

El sistema necesita configurar el archivo compilado y copiar nuestros archivos launch .xml al directorio de instalación install para encontrar nuestros archivos

bash
(os.path.join('share',package_name,'launch'),glob(os.path.join('launch','*launch.xml'))),

20.7.3 Compilación del paquete funcional

bash
cd ~/workspaces
colcon build --packages-select learn_launch

20.7.4 Procedimientos operativos

bash
# ros2 launch learn_launch complex_launch.xml

Se esperan dos pequeñas tortugas, y el terminal imprime información de registro.

Inicie el nodo de control de teclado y agregue el espacio de nombres

bash
ros2 run turtlesim turtle_teleop_key --ros-args -r __ns:=/turtlesim1

20.8 Implementación Yaml

20.8.1 Nuevo archivo launch

Nuevo archivo Complex_Launch.yaml bajo el directorio de complex_launch.py, agregue lo siguiente:

bash
launch:

# args that can be set from the command line or a default will be used
- arg:
  name: "background_r"
  default: "0"
- arg:
  name: "background_g"
  default: "255"
- arg:
  name: "background_b"
  default: "0"
- arg:
  name: "chatter_ns"
  default: "my/chatter/ns"


# include another launch file
- include:
  file: "$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener.launch.py"

# include another launch file in the chatter_ns namespace
- group:
  - push-ros-namespace:
  namespace: "$(var chatter_ns)"
  - include:
  file: "$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener.launch.py"

# start a turtlesim_node in the turtlesim1 namespace
- node:
  pkg: "turtlesim"
  exec: "turtlesim_node"
  name: "sim"
  namespace: "turtlesim1"

# start another turtlesim_node in the turtlesim2 namespace and use args to set parameters
- node:
  pkg: "turtlesim"
  exec: "turtlesim_node"
  name: "sim"
  namespace: "turtlesim2"
  param:
  -
  name: "background_r"
  value: "$(var background_r)"
  -
  name: "background_g"
  value: "$(var background_g)"
  -
  name: "background_b"
  value: "$(var background_b)"

# perform remap so both turtles listen to the same command topic
- node:
  pkg: "turtlesim"
  exec: "mimic"
  name: "mimic"
  remap:
  -
  from: "/input/pose"
  to: "/turtlesim1/turtle1/pose"
  -
  from: "/output/cmd_vel"
  to: "/turtlesim2/turtle1/cmd_vel"

20.8.2 Configuración

Necesita configurar el archivo compilado para copiar nuestros archivos launch en formato .yaml al directorio de instalación Install antes de que el sistema ros pueda encontrar nuestros archivos

bash
(os.path.join('share',package_name,'launch'),glob(os.path.join('launch','*launch.yaml'))),

20.8.3 Compilación del paquete funcional

bash
colcon build --packages-select learn_launch

20.8.4 Procedimientos operativos

bash
# Refresh environment variables
source install/setup.bash
ros2 launch learn_launch complex_launch.yaml

Inicie el nodo de control de teclado y agregue el espacio de nombres

bash
ros2 run turtlesim turtle_teleop_key --ros-args -r __ns:=/turtlesim1

Usando el control de teclado para activar la tortuga uno, la tortuga dos es una imitación perfecta de la tortuga uno.

20.9 Próximos pasos

1.21 Grabación y reproducción - aprender la grabación de paquetes

  1. 22 Modelos URL - aprender el modelado robótico

21 Grabación y reproducción

21 Reproducción de grabación

21.1 Descripción general de Rosbag2