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

AplicarAnotaciones
Integración de sensoresConvertir datos de diferentes sensores al sistema de coordenadas unificado
NavegaciónConvertir el sistema de coordenadas del mapa a coordenadas robóticas.
Brazo mecánicoCalcula la actitud del implementador terminal sobre la base
VisualizarMostrar el estado del robot correctamente en RViz2

10.1.3 Designación de coordenadas

NombrePropósito
MapCoordenadas globales/del mundo, fijas e inmutables
odomEl sistema de coordenadas de kilometraje para el posicionamiento.
base_linkEl sistema de coordenadas base del robot.
base_footprintEl proyecto de chasis del robot al suelo.
Camera_linkSistema de coordenadas de la cámara
Laser_linkSistema 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

bash
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-tree

3.2. Iniciar

bash
# ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py
ros2 run turtlesim turtle_teleop_key

3.3. Ver el árbol TF

bash
ros2 run rqt_tf_tree rqt_tf_tree

3.4. Coordenadas de consulta para cambiar la información

bash
ros2 run tf2_ros tf2_echo turtle2 turtle1

3.5. Visualización de coordenadas

bash
rviz2

4. Conversión estática de coordenadas

4.1. Distribución de A a B posiciones

bash
ros2 run tf2_ros static_transform_publisher 0 0 3 0 0 3.14 A B

4.2. Intercepción/acceso a relaciones TF

bash
ros2 run tf2_ros tf2_echo A B

4.3, visualización rivz

bash
rviz2

5. Presentación de casos

7. Nuevo paquete funcional

bash
ros2 pkg create pkg_tf --build-type ament_python --dependencies rclpy --node-name turtle_tf_broadcaster
bash
import 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()
python
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

bash
import os
from glob import glob
bash
(os.path.join('share',package_name,'launch'),glob('launch/*')),

9. Compilador de paquete funcional

bash
colcon build --packages-select pkg_tf

Procedimientos operativos

bash
# source install/setup.bash
ros2 launch pkg_tf turtle_following.launch.py
bash
ros2 run turtlesim turtle_teleop_key

Mensaje 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

bash
string  name
int32  age
float64  height
bash
# CMakeLists.txt
rosidl_generate_interfaces(${PROJECT_NAME}
  "action/Progress.action"
  "msg/Person.msg"
)
bash
# 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>
bash
cd ~/workspace
colcon build --packages-select pkg_interfaces
bash
ros2 interface show pkg_interfaces/msg/Person

11.4 Crear una interfaz personalizada para comunicaciones de servicio

bash
int32 num1
int32 num2
---
int32 sum
bash
rosidl_generate_interfaces(${PROJECT_NAME}
  "action/Progress.action"
  "msg/Person.msg"
  "srv/Add.srv"
)
bash
<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>
bash
cd ~/workspace
colcon build --packages-select pkg_interfaces
source install/setup.bash
bash
ros2 interface show pkg_interfaces/srv/Add

11.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

bash
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
bash
ros2 param list
bash
ros2 param describe turtlesim background_b
ros2 param get turtlesim background_b
ros2 param set turtlesim background_b 10
bash
ros2 param dump turtlesim >> turtlesim.yaml
ros2 param load turtlesim turtlesim.yaml

12.3 Casos de parámetros

12.3.1 Nuevo paquete funcional

bash
ros2 pkg create pkg_param --build-type ament_python --dependencies rclpy --node-name param_demo

12.3.2 Realización de código

bash
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

bash
colcon build --packages-select pkg_param

12.3.4 Procedimientos operativos

bash
# source install/setup.bash
ros2 run pkg_param param_demo
bash
ros2 param set param_declare robot_name robot

12.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?

bash
sudo apt install ros-humble-desktop

13.1.2 Función de los paquetes de metafunciones

PropósitoAnotaciones
OrganizaciónAgrupar paquetes funcionales relacionados
Instalación simplificadaInstalación de múltiples paquetes a la vez
Dependencia de la gestiónGestión unificada de dependencias
DocumentaciónEstructura clara del proyecto
Control de versionesPublicación y gestión armonizadas de versiones

13.2 Casos de implementación

bash
ros2 pkg create pkg_metapackage
bash
<?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>
bash
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()
bash
colcon build --packages-select pkg_metapackage

13.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ísticasAnotaciones
Sin centralizaciónNo es necesario, ROS Master.
AutodescubrimientoEl nodo encuentra automáticamente otros nodos en la red
Plataforma cruzadaComunicaciones entre diferentes sistemas operativos
Transmisión confiableSoporta 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

bash
ros2 run demo_nodes_py talker
ros2 run demo_nodes_py listener

14.3.2 Subgrupos de redes distributivas

bash
$ export ROS_DOMAIN_ID=<your_domain_id>

14.3.3 Caso 1

bash
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
source ~/.bashrc
ros2 run demo_nodes_py talker
bash
echo "export ROS_DOMAIN_ID=6" >> ~/.bashrc
source ~/.bashrc
ros2 run demo_nodes_py listener

Caso 2

bash
ros2 run turtlesim turtlesim_node
bash
ros2 run turtlesim turtle_teleop_key

14.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

FuncionesAnotaciones
Mecanismos de descubrimientoEncontrar automáticamente participantes DDS en la red
Lanzamiento/suscripciónModo de transferencia de datos resuelto
Política QoSCalidad de servicios disponible
Sistema de tiposDefinición de datos de tipo fuerte
Cero copiasTransferencia 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

bash
ros2 topic pub /chatter std_msgs/msg/Int32 "data: 66" --qos-reliability best_effort
bash
ros2 topic echo /chatter --qos-reliability reliable