Interfaces avanzadas y middleware de ROS2
10 Transformación de coordenadas TF2
10 Transformación de coordenadas TF2 (TF2 Transform)
10.1 Visión general de TF2
10.1.1 Qué es TF2
TF2 (Transform 2) es la biblioteca utilizada en ROS 2 para gestionar los cambios de coordenadas. Realiza un seguimiento de las relaciones entre múltiples sistemas de coordenadas y permite a los desarrolladores convertir datos (por ejemplo, punto, vector, actitud) entre diferentes sistemas de coordenadas.
10.1.2 Uso de TF2
| Aplicar | Anotaciones |
|---|---|
| Integración de sensores | Convertir datos de diferentes sensores al sistema de coordenadas unificado |
| Navegación | Convertir el sistema de coordenadas del mapa a coordenadas robóticas. |
| Brazo mecánico | Calcula la actitud del implementador terminal sobre la base |
| Visualizar | Mostrar el estado del robot correctamente en RViz2 |
10.1.3 Designación de coordenadas
| Nombre | Propósito |
|---|---|
| Map | Coordenadas globales/del mundo, fijas e inmutables |
| odom | El sistema de coordenadas de kilometraje para el posicionamiento. |
| base_link | El sistema de coordenadas base del robot. |
| base_footprint | El proyecto de chasis del robot al suelo. |
| Camera_link | Sistema de coordenadas de la cámara |
| Laser_link | Sistema de coordenadas del radar láser |
23. Coordenadas convertidas de ROS2 TF2.
Introducción a TF2
Los sistemas coordinados son un concepto muy familiar y una base importante en la robótica, y habrá muchos sistemas de coordinación en un sistema robótico completo, ¿y cómo se debería gestionar la ubicación de estas coordenadas? ROS nos proporcionó un decorador coordinado: TF2
2. Sistemas de coordenadas en robots
Las coordenadas son igualmente importantes en los sistemas robóticos móviles. Por ejemplo, el punto central de un robot móvil es base_link, la posición del radar se llama islaser_link de coordenadas de radar, donde el robot se mueve, y los metros cúbicos se acumulan, lo que se llama odom, lo que a su vez tiene error acumulativo y deriva, y la ubicación absoluta se llama coordenadas del mapa Map Map.

El principio inferior de la función TF en ROS es que estas variaciones matemáticas están encapsuladas, y el conocimiento teórico detallado está disponible para todos ustedes en el currículo de robótica, y principalmente explicamos cómo se utilizan los sistemas de gestión de coordenadas TF.
3 Operaciones de línea de comandos TF
3.1. Instalación de herramientas
sudo apt install ros-${ROS_DISTRO}-turtle-tf2-py ros-humble-tf2-tools
sudo pip3 install transforms3d
sudo apt install ros-${ROS_DISTRO}-rqt-tf-tree3.2. Iniciar
# ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py
ros2 run turtlesim turtle_teleop_key3.3. Ver el árbol TF
ros2 run rqt_tf_tree rqt_tf_tree3.4. Coordenadas de consulta para cambiar la información
ros2 run tf2_ros tf2_echo turtle2 turtle13.5. Visualización de coordenadas
rviz24. Conversión estática de coordenadas
4.1. Distribución de A a B posiciones
ros2 run tf2_ros static_transform_publisher 0 0 3 0 0 3.14 A B4.2. Intercepción/acceso a relaciones TF
ros2 run tf2_ros tf2_echo A B4.3, visualización rivz
rviz25. Presentación de casos
7. Nuevo paquete funcional
ros2 pkg create pkg_tf --build-type ament_python --dependencies rclpy --node-name turtle_tf_broadcasterimport math
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import TransformStamped
from tf2_ros import TransformBroadcaster
from turtlesim.msg import Pose
def quaternion_from_euler(roll, pitch, yaw):
cy = math.cos(yaw * 0.5)
sy = math.sin(yaw * 0.5)
cp = math.cos(pitch * 0.5)
sp = math.sin(pitch * 0.5)
cr = math.cos(roll * 0.5)
sr = math.sin(roll * 0.5)
w = cr * cp * cy + sr * sp * sy
x = sr * cp * cy - cr * sp * sy
y = cr * sp * cy + sr * cp * sy
z = cr * cp * sy - sr * sp * cy
return (x, y, z, w)
class TurtleTFBroadcaster(Node):
def __init__(self, name):
super().__init__(name)
self.turtlename = self.declare_parameter('turtlename', 'turtle').value
self.tf_broadcaster = TransformBroadcaster(self)
self.subscription = self.create_subscription(
Pose,
f'/{self.turtlename}/pose',
self.turtle_pose_callback, 1)
def turtle_pose_callback(self, msg):
transform = TransformStamped()
transform.header.stamp = self.get_clock().now().to_msg()
transform.header.frame_id = 'world'
transform.child_frame_id = self.turtlename
transform.transform.translation.x = msg.x
transform.transform.translation.y = msg.y
transform.transform.translation.z = 0.0
q = quaternion_from_euler(0, 0, msg.theta)
transform.transform.rotation.x = q[0]
transform.transform.rotation.y = q[1]
transform.transform.rotation.z = q[2]
transform.transform.rotation.w = q[3]
self.tf_broadcaster.sendTransform(transform)
def main(args=None):
rclpy.init(args=args)
node = TurtleTFBroadcaster("turtle_tf_broadcaster")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
DeclareLaunchArgument('source_frame', default_value='turtle1', description='Target frame name.'),
Node(package='turtlesim', executable='turtlesim_node'),
Node(package='pkg_tf', executable='turtle_tf_broadcaster',
name='broadcaster1', parameters=[{'turtlename': 'turtle1'}]),
Node(package='pkg_tf', executable='turtle_tf_broadcaster',
name='broadcaster2', parameters=[{'turtlename': 'turtle2'}]),
Node(package='pkg_tf', executable='turtle_following',
name='listener', parameters=[{'source_frame': LaunchConfiguration('source_frame')}]),
])8. Editar archivos de configuración
import os
from glob import glob(os.path.join('share',package_name,'launch'),glob('launch/*')),9. Compilador de paquete funcional
colcon build --packages-select pkg_tfProcedimientos operativos
# source install/setup.bash
ros2 launch pkg_tf turtle_following.launch.pyros2 run turtlesim turtle_teleop_keyMensaje de interfaz personalizada
11 Mensajes de interfaz personalizada
En el sistema ROS, los tres tipos de mecanismos de comunicación, Topic, Service y Action, todos dependen de un concepto central: la interfaz de comunicación.
11.1 Crear un proceso de interfaz personalizado
Los pasos principales son los siguientes:
Crear paquete funcional de interfaz
Crear y editar archivos .msg, archivos .srv, archivos .action
Editar archivo de configuración
Compilar
Probar
11.2 Crear una interfaz personalizada para comunicaciones de acción
11.3 Crear una interfaz personalizada para comunicaciones de tópicos
string name
int32 age
float64 height# CMakeLists.txt
rosidl_generate_interfaces(${PROJECT_NAME}
"action/Progress.action"
"msg/Person.msg"
)# package.xml
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<depend>action_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group>cd ~/workspace
colcon build --packages-select pkg_interfacesros2 interface show pkg_interfaces/msg/Person11.4 Crear una interfaz personalizada para comunicaciones de servicio
int32 num1
int32 num2
---
int32 sumrosidl_generate_interfaces(${PROJECT_NAME}
"action/Progress.action"
"msg/Person.msg"
"srv/Add.srv"
)<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<depend>action_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group>cd ~/workspace
colcon build --packages-select pkg_interfaces
source install/setup.bashros2 interface show pkg_interfaces/srv/Add11.5 Próximos pasos
1.12 Casos de servicio de parámetros
2.13 Paquetes de metafunciones
12 Casos de servicio de parámetros
12 Servicios de parámetros (Parameters)
12.1 Resumen de los parámetros
En los sistemas robóticos ROS, los parámetros actúan como variables globales C++ y proporcionan mecanismos sencillos de intercambio de datos para múltiples nodos.
12.2 Parámetros en la rutina de la pequeña tortuga
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_keyros2 param listros2 param describe turtlesim background_b
ros2 param get turtlesim background_b
ros2 param set turtlesim background_b 10ros2 param dump turtlesim >> turtlesim.yaml
ros2 param load turtlesim turtlesim.yaml12.3 Casos de parámetros
12.3.1 Nuevo paquete funcional
ros2 pkg create pkg_param --build-type ament_python --dependencies rclpy --node-name param_demo12.3.2 Realización de código
import rclpy
from rclpy.node import Node
class ParameterNode(Node):
def __init__(self, name):
super().__init__(name)
self.timer = self.create_timer(2.0, self.timer_callback)
self.declare_parameter('robot_name', 'muto')
def timer_callback(self):
robot_name_param = self.get_parameter('robot_name').get_parameter_value().string_value
self.get_logger().info('Hello %s!' % robot_name_param)
def main(args=None):
rclpy.init(args=args)
node = ParameterNode("param_declare")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()12.3.3 Compilador de paquete funcional
colcon build --packages-select pkg_param12.3.4 Procedimientos operativos
# source install/setup.bash
ros2 run pkg_param param_demoros2 param set param_declare robot_name robot12.4 Próximos pasos
1.13 Paquetes de metafunciones
2.14 Comunicación distribuida
13 Metapaquete
13 Metapaquetes
13.1 Resumen de los paquetes de metafunciones
13.1.1 ¿Qué es un kit metafuncional?
sudo apt install ros-humble-desktop13.1.2 Función de los paquetes de metafunciones
| Propósito | Anotaciones |
|---|---|
| Organización | Agrupar paquetes funcionales relacionados |
| Instalación simplificada | Instalación de múltiples paquetes a la vez |
| Dependencia de la gestión | Gestión unificada de dependencias |
| Documentación | Estructura clara del proyecto |
| Control de versiones | Publicación y gestión armonizadas de versiones |
13.2 Casos de implementación
ros2 pkg create pkg_metapackage<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>pkg_metapackage</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="1461190907@qq.com">root</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<exec_depend>pkg_interfaces</exec_depend>
<exec_depend>pkg_helloworld_py</exec_depend>
<exec_depend>pkg_topic</exec_depend>
<exec_depend>pkg_service</exec_depend>
<exec_depend>pkg_action</exec_depend>
<exec_depend>pkg_param</exec_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>cmake_minimum_required(VERSION 3.5)
project(pkg_metapackage)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
ament_package()colcon build --packages-select pkg_metapackage13.3 Próximos pasos
1.14 Comunicación distribuida - aprender comunicaciones distribuidas
DDS - Aprender DDS intermedio
14 Comunicación distribuida
14 Comunicaciones distribuidas
14.1 Resumen de las comunicaciones distribuidas
ROS2 es un poderoso marco de comunicaciones distribuidas que permite una fácil interacción de datos de red entre hosts. La parte inferior se basa en el middleware DDS (Data Distribution Service), que gestiona las comunicaciones a través de ROS_DOMAIN_ID: cuando los nodos en diferentes dispositivos establecen el mismo ID de dominio y están en la misma red, automáticamente se detectan y se comunican libremente; por el contrario, los ID están separados unos de otros.
14.1.1 Qué son las comunicaciones distribuidas
ROS 2 distributed communications permite que múltiples nodos de computadora se comuniquen entre sí sin servidores centrales. Esto se logra a través de DDS (Data Distribution Service).
14.1.2 Características de las comunicaciones distribuidas
| Características | Anotaciones |
|---|---|
| Sin centralización | No es necesario, ROS Master. |
| Autodescubrimiento | El nodo encuentra automáticamente otros nodos en la red |
| Plataforma cruzada | Comunicaciones entre diferentes sistemas operativos |
| Transmisión confiable | Soporta múltiples políticas QoS |
14.2 ROS_DOMAIN_ID
14.2.1 Concepto de ID de dominio
ROS_DOMAIN_ID se utiliza para aislar diferentes redes ROS2.
14.3 Logrado
14.3.1 Logro predeterminado
ros2 run demo_nodes_py talker
ros2 run demo_nodes_py listener14.3.2 Subgrupos de redes distributivas
$ export ROS_DOMAIN_ID=<your_domain_id>14.3.3 Caso 1
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
source ~/.bashrc
ros2 run demo_nodes_py talkerecho "export ROS_DOMAIN_ID=6" >> ~/.bashrc
source ~/.bashrc
ros2 run demo_nodes_py listenerCaso 2
ros2 run turtlesim turtlesim_noderos2 run turtlesim turtle_teleop_key14.4 Atención
14.5 Reglas para calcular los valores de ID de dominio DDS (conocimiento de nivel)
14.6 Próximos pasos
DDS - Aprendizaje en profundidad de DDS intermedio
API relacionada con el tiempo - Aprender Time API
https://fast-dds.docs.eprosima.com/en/latest/
15 DDS
15 DDS (Data Distribution Service)
15.1 Resumen de DDS
15.1.1 ¿Qué es DDS?
DDS (Data Distribution Service) es un estándar de middleware de publicación-suscripción centrado en datos, y ROS 2 utiliza DDS para lograr comunicaciones de nivel inferior.
15.1.2 Funciones principales de DDS
| Funciones | Anotaciones |
|---|---|
| Mecanismos de descubrimiento | Encontrar automáticamente participantes DDS en la red |
| Lanzamiento/suscripción | Modo de transferencia de datos resuelto |
| Política QoS | Calidad de servicios disponible |
| Sistema de tipos | Definición de datos de tipo fuerte |
| Cero copias | Transferencia de datos eficiente |
15.2 Modelos de comunicaciones
15.3 Aplicaciones de DDS en ROS2
15.4 Estrategia de servicios de calidad
QoS puede entenderse como una regla de transmisión basada en la web: la aplicación declarará su comportamiento de calidad de transmisión deseado, mientras que el mecanismo QoS es responsable de cumplir con estos requisitos en la medida de lo posible.
La estrategia es la siguiente:
Estrategia DEADLINE: indica que cada comunicación de datos debe completarse al menos una vez dentro del plazo prescrito;
Política HISTORY: indica límites de tamaño en cachés de datos históricos;
Política RELIABILITY: representa un patrón confiable de transmisión de datos.
Política DURABILITY: se puede configurar para proporcionar datos históricos para nodos que llegan tarde.
15.5. Casos de prueba
Caso 1 - Configurar DDS por línea de orden
ros2 topic pub /chatter std_msgs/msg/Int32 "data: 66" --qos-reliability best_effortros2 topic echo /chatter --qos-reliability reliable