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:
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
ros2 pkg list17.1.3 ros2 pkg executables
Función: Ver todos los ejecutables en un paquete
ros2 pkg executables <pkg_name>17.2 Ejecución de nodo ros2 run
Función: Ejecutar el programa de nodo del paquete funcional
ros2 run <pkg_name> <node_name>17.3 Herramientas relacionadas con nodos
17.3.1 ros2 node list
ros2 node list17.3.2 ros2 node info
ros2 node info <node_name>17.4 Herramientas relacionadas con tópicos
17.4.1 ros2 topic list
ros2 topic list17.4.2 ros2 topic info
ros2 topic info <topic_name>17.4.3 ros2 topic type
ros2 topic type <topic_name>17.4.4 ros2 topic hz
ros2 topic hz <topic_name>17.4.5 ros2 topic echo
ros2 topic echo <topic_name>17.4.6 ros2 topic pub
ros2 topic pub <topic_name> <message_type> <message_content>Ejemplo:
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
ros2 interface list
ros2 interface show <interface_name>17.6 Herramientas relacionadas con servicios
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
- 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
sudo apt install ros-${ROS_DISTRO}-turtlebot3*Instalación de puentes ros y gazebo
sudo apt install ros-humble-ros-gz -yEstablecer la variable de entorno turtlebot3
export TURTLEBOT3_MODEL=waffleIniciar el entorno de simulación gazebo
# source /opt/ros/humble/setup.bash
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.pyNota: 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:
rviz2Nota: 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
-
19 Caja de herramientas Rqt - Aprender la herramienta Rqt
-
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:
sudo apt install ros-${ROS_DISTRO}-rqt*19.3 Inicio
Las órdenes comunes de inicio de rqt son:
# Method 1: run `rqt` in the terminal
rqt# Method 2
ros2 run rqt_gui rqt_gui19.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:
# Terminal 1:
ros2 run turtlesim turtlesim_node
# Terminal 2:
ros2 run turtlesim turtle_teleop_key
# Terminal 3:
rqt19.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
- 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
cd ~/workspaces/src
ros2 pkg create learn_launch --build-type ament_python20.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:
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
# 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
cd ~/workspaces
colcon build --packages-select learn_launch20.2.5 Procedimientos operativos
# Refresh environment variables
source install/setup.bash
ros2 launch learn_launch single_node_launch.py20.2.6 Análisis del código fuente
Importar biblioteca relacionada
from launch import LaunchDescription
from launch_ros.actions import NodeDefine una función generate_launch_description y devuelve una descripción launch
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.
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:
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
colcon build --packages-select learn_launch20.3.3 Procedimientos operativos
# Refresh environment variables
source install/setup.bash
ros2 launch learn_launch multi_node_launch.pySi el terminal no imprime los contenidos, puede ver qué nodos se activan para verificar si el inicio se ha realizado correctamente.
ros2 node list20.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:
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
colcon build --packages-select learn_launch20.4.3 Procedimientos operativos
# ros2 launch learn_launch multi_node_launch.py
ros2 topic list# 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 list20.4.4 Análisis del código fuente
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:
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
colcon build --packages-select learn_launch20.5.3 Procedimientos operativos
# Refresh environment variables
source install/setup.bash
ros2 launch learn_launch include_launch.py20.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:
# 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
colcon build --packages-select learn_launch20.6.3 Procedimientos operativos
# source install/setup.bash
ros2 launch learn_launch complex_launch.pySe 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)
ros2 run turtlesim turtle_teleop_key --ros-args -r __ns:=/turtlesim1Use 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,
- 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:
<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
(os.path.join('share',package_name,'launch'),glob(os.path.join('launch','*launch.xml'))),20.7.3 Compilación del paquete funcional
cd ~/workspaces
colcon build --packages-select learn_launch20.7.4 Procedimientos operativos
# ros2 launch learn_launch complex_launch.xmlSe 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
ros2 run turtlesim turtle_teleop_key --ros-args -r __ns:=/turtlesim120.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:
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
(os.path.join('share',package_name,'launch'),glob(os.path.join('launch','*launch.yaml'))),20.8.3 Compilación del paquete funcional
colcon build --packages-select learn_launch20.8.4 Procedimientos operativos
# Refresh environment variables
source install/setup.bash
ros2 launch learn_launch complex_launch.yamlInicie el nodo de control de teclado y agregue el espacio de nombres
ros2 run turtlesim turtle_teleop_key --ros-args -r __ns:=/turtlesim1Usando 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
- 22 Modelos URL - aprender el modelado robótico