Skip to content

Recopilación de recursos para estudiar conceptos de ROS 2 Humble. Materiales útiles para aprender y dominar ROS 2.

Notifications You must be signed in to change notification settings

MrDavidAlv/siro-ws

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

39 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎯PROYECTO ROS2 HUMBLE 🤖🚀🕹️

ros humble

ROS2 (Robot Operating System 2) es una plataforma de código abierto diseñada para facilitar el desarrollo, operación y mantenimiento de sistemas robóticos y de automatización industrial. Ofrece una arquitectura modular y flexible que permite la comunicación entre componentes distribuidos, soportando una variedad de sistemas operativos y arquitecturas de hardware. ROS 2 se destaca por su capacidad de escalabilidad, seguridad y robustez, lo que lo convierte en una herramienta crucial para la creación de sistemas robóticos avanzados en diversos entornos industriales y de investigación.

Historia

ROS en su primera versión, ROS1, se desarrolló en los Laboratorios de Inteligencia Artificial de Stanford (SAIL) por estudiantes de doctorado Eric Berger y Keenan Wyrobek. Se publicó bajo una licencia BSD de software libre en 2007, que permite libertad para uso comercial e investigador. Desde 2008, el instituto Willow Garage se ha encargado principalmente del desarrollo y soporte.

La idea de crear un sistema operativo era estandarizar tareas como la abstracción de hardware, control de dispositivos de bajo nivel (drivers), implementación de procesos comunes, manejo de comunicación, soporte de paquetes y otras ventajas.

ROS2 es la evolución natural del exitoso marco de trabajo ROS1. Desarrollado para abordar las limitaciones de su predecesor, ROS2 ofrece una arquitectura modular y distribuida, mejor rendimiento y escalabilidad, así como soporte multiplataforma. Lanzado oficialmente en 2015, ROS2 mantiene la flexibilidad y robustez de ROS1, al tiempo que introduce mejoras significativas en herramientas de desarrollo y comunicación. Su diseño modular permite una fácil integración con otros sistemas y una adaptación más rápida a diferentes entornos de desarrollo. Con características como compatibilidad con múltiples lenguajes de programación y una creciente comunidad de desarrolladores, ROS2 es la elección preferida para proyectos de robótica modernos y ambiciosos.

Filosofía

"ROS, nacido del corazón del código abierto, ofrece libertad y flexibilidad para que los usuarios moldeen su propia realidad robótica, trazando un camino lleno de posibilidades infinitas en el vasto horizonte de la tecnología".

DIFERENCIAS

Característica ROS 1 ROS 2
Arquitectura Basada en un sistema de nodos con comunicación XML-RPC y TCP/IP Arquitectura modular y distribuida, comunicación basada en DDS
Lenguajes de Programación Soporte para C++, Python, Lisp, entre otros Soporte para varios lenguajes, incluyendo C++, Python, y más
Rendimiento Limitaciones en rendimiento, seguridad y escalabilidad Mejoras significativas en rendimiento, seguridad y escalabilidad
Multiplataforma Principalmente enfocado en Linux Soporte multiplataforma incluyendo Linux, Windows, y macOS
Herramientas Herramientas de desarrollo y depuración limitadas Mejoras en herramientas de depuración, simulación, y gestión de paquetes
Compatibilidad No es directamente compatible con ROS 2 Introduce puentes y herramientas de migración para la compatibilidad con ROS 1
Ecosistema Ecosistema consolidado con una amplia comunidad Ecosistema en constante crecimiento con una creciente comunidad de desarrolladores

Arquitectura ROS2

La arquitectura de ROS2 se ha diseñado para abordar las limitaciones de ROS1 y proporcionar una plataforma más flexible, escalable y robusta para el desarrollo de aplicaciones robóticas. A continuación, se proporciona una explicación paso a paso de la arquitectura de ROS2:

Paso Descripción
1. Arquitectura Modular y Distribuida ROS 2 se basa en una arquitectura modular y distribuida, donde los nodos son componentes independientes que pueden ejecutarse de manera separada.
2. Comunicación Basada en DDS Utiliza DDS para la comunicación entre nodos, ofreciendo un rendimiento superior, mayor seguridad y mejor escalabilidad que el sistema de ROS 1.
3. Nodos Cada nodo en ROS 2 es un proceso independiente que realiza una tarea específica y se comunica con otros nodos intercambiando mensajes a través de DDS.
4. Middleware (DDS) DDS actúa como el middleware que facilita la comunicación entre nodos, proporcionando mecanismos eficientes para la publicación y suscripción de mensajes.
5. Interfaces de Mensajería (IDL) Utiliza interfaces de definición de lenguaje (IDL) para describir la estructura de los mensajes que se intercambian entre nodos.
6. Gestión de Recursos Incluye una capa de gestión de recursos para asignar y administrar eficientemente los recursos del sistema, como memoria y procesamiento.
7. Soporte Multiplataforma Diseñado para ser ejecutado en una variedad de sistemas operativos, incluyendo Linux, Windows y macOS, lo que proporciona mayor flexibilidad y portabilidad.

En resumen, la arquitectura de ROS2 se caracteriza por su modularidad, su sistema de comunicación basado en DDS, su soporte multiplataforma y su capacidad para gestionar eficientemente los recursos del sistema. Estas características hacen de ROS2 una plataforma poderosa y versátil para el desarrollo de aplicaciones robóticas modernas.

Arquitectura de ros

NODOS

Los nodos son bloques de código (clases) que se encargan de partes específicas de las actividades del robot. Estos se van a enlazar mediante tópicos, servicios o acciones. Básicamente nos ayudan a crear un sistema modular que se pueda modificar fácilmente y comunicar.

Comandos básicos

Usaremos el paquete turtlesim que puedes instalar aquí.

  1. Ejecutar un nodo.
ros2 run turtlesim turtlesim_node

En este caso lanzamos el nodo que mediante rqt lanza una interfaz gráfica con una tortuga en unas coordenadas especificas.

turtlesim_node

En una nueva consola ejecutamos un segundo nodo.

ros2 run turtlesim turtle_teleop_key
  1. Para visualizar los nodos en ejecución:
ros2 node list

Lo cual nos mostrara que hay dos nodos en ejecución

/teleop_turtle
/turtlesim
  1. Podemos cambiar los parámetros y argumentos en los nodos. Por ejemplo, cambiar el nombre del nodo turtlesim a myturtle, para ello vamos a abrir una nueva consola y ejecutar
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=myturtle

Visualizamos nuevamente los nodos en ejecucón

ros2 node list

En este caso nos aparecen tres nodos en ejecución

/myturtle
/teleop_turtle
/turtlesim
  1. Información de un nodo: A veces se hace necesario conocer la información de un nodo para ver las suscripciones, qué está publicando, los servicios clientes, los servicios servidores y las acciones. Podemos ver la información de esta manera.
ros2 node info /turtlesim

En este caso vemos la información del nodo /turtlesim

/turtlesim
  Subscribers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /turtle1/cmd_vel: geometry_msgs/msg/Twist
  Publishers:
    /parameter_events: rcl_interfaces/msg/ParameterEvent
    /rosout: rcl_interfaces/msg/Log
    /turtle1/color_sensor: turtlesim/msg/Color
    /turtle1/pose: turtlesim/msg/Pose
  Service Servers:
    /clear: std_srvs/srv/Empty
    /kill: turtlesim/srv/Kill
    /reset: std_srvs/srv/Empty
    /spawn: turtlesim/srv/Spawn
    /turtle1/set_pen: turtlesim/srv/SetPen
    /turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
    /turtle1/teleport_relative: turtlesim/srv/TeleportRelative
    /turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
    /turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
    /turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
    /turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
    /turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
    /turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
  Service Clients:

  Action Servers:
    /turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
  Action Clients:

TOPICOS

Son canales en los cuales unos nodos publican información y otros se suscriben para recibirla. La relación para la comunicación puede ser de muchos a uno(one to many), muchos a uno(many to one) y muchos a muchos(many to many).

Caraterísticas de los tópicos
  • Definición de Tópicos: Canales de comunicación identificados por un nombre único.
  • Tipos de Mensajes: Los mensajes transmitidos a través de los tópicos pueden ser de tipos estándar (std_msgs) o personalizados.
  • Publicación y Suscripción: Los nodos pueden publicar o suscribirse a un tópico para enviar o recibir mensajes.
  • Comunicación Desacoplada: La comunicación se realiza de forma asíncrona y desacoplada entre nodos.
  • Calidad de Servicio (QoS): Configuraciones de QoS permiten ajustar la durabilidad, fiabilidad, latencia, entre otros aspectos de la comunicación.
  • Jerarquía de Nombres de los Tópicos: Los nombres de los tópicos pueden ser jerárquicos para organizar la información.
  • Tópicos Privados: Los nodos pueden usar tópicos privados para encapsular la comunicación dentro de un nodo o grupo de nodos.
  • Herramientas para Trabajar con Tópicos: Herramientas como ros2 topic list y ros2 topic echo permiten gestionar y monitorear los tópicos.
Clasificación

En cuanto a los tipos de tópicos, no hay una clasificación específica de los tópicos en sí; más bien, los tópicos se definen por el tipo de mensajes que manejan y el propósito de los nodos que los utilizan.

  1. Tipos de mensajes estándar: ROS 2 proporciona una variedad de tipos de mensajes estándar definidos en varios paquetes como std_msgs, geometry_msgs, sensor_msgs, entre otros. Algunos ejemplos de mensajes estándar son:
  • std_msgs: Mensajes estándar.

    • std_msgs/String: Un mensaje de texto simple.
    • std_msgs/Int32: Un entero de 32 bits.
    • std_msgs/Float32: Un número de punto flotante de 32 bits.
  • geometry_msgs: Mensajes de geometría y movimiento.

    • geometry_msgs/Point

      • Representa un punto en un espacio tridimensional.
      • Contiene tres coordenadas: x, y y z.
      • Ejemplo de uso: Describir la posición de un objeto en un espacio 3D.
      geometry_msgs/Point {x: 1.0, y: 2.0, z: 3.0}
      
    • geometry_msgs/Quaternion

      • Representa una orientación en un espacio tridimensional utilizando un cuaternio.
      • Contiene cuatro componentes: x, y, z, y w.
      • Ejemplo de uso: Describir la orientación de un objeto en un espacio 3D.
      geometry_msgs/Quaternion {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
      
    • geometry_msgs/Pose

      • Representa la posición y la orientación de un objeto en un espacio tridimensional.
      • Combina Point y Quaternion.
      • Ejemplo de uso: Describir la pose de un robot o un objeto en un espacio 3D.
      geometry_msgs/Pose {position: {x: 1.0, y: 2.0, z: 3.0}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}}
      
    • geometry_msgs/Twist

      • Representa el movimiento lineal y angular de un objeto.
      • Contiene dos campos: linear (un Vector3 que describe la velocidad lineal) y angular (un Vector3 que describe la velocidad angular).
      • Ejemplo de uso: Describir la velocidad de un robot o un objeto en un espacio 3D.
      geometry_msgs/Twist {linear: {x: 0.1, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.5}}
      
    • geometry_msgs/PoseStamped

      • Similar a Pose, pero incluye un sello de tiempo (header.stamp) y un marco de referencia (header.frame_id).
      • Combina Point y Quaternion.
      • Se utiliza para describir la pose de un objeto en un determinado momento y marco de referencia.
      geometry_msgs/PoseStamped { header: {stamp: {sec: 0, nanosec: 0}, frame_id: "map"}, pose: {position: {x: 1.0, y: 2.0, z: 3.0}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}}}
      
    • geometry_msgs/Transform

      • Representa una transformación que consiste en una rotación (rotation, un Quaternion) y una traslación (translation, un Vector3).
      • Ejemplo de uso: Describir cómo se transforma un objeto en relación con otro.
      geometry_msgs/Transform {translation: {x: 1.0, y: 2.0, z: 3.0}, rotation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}}
      
    • geometry_msgs/Wrench

      • Representa fuerzas lineales y torques angulares que actúan sobre un objeto, con campos force y torque, ambos de tipo Vector3.
  • sensor_msgs: Mensajes relacionados con sensores.

    • sensor_msgs/LaserScan

      • Representa los datos de un escáner láser (LiDAR).
      • Incluye información sobre el ángulo mínimo y máximo de escaneo, el rango mínimo y máximo de detección, el ángulo entre mediciones consecutivas, y una lista de distancias medidas (rangos).
      • Ejemplo de uso: Para recibir datos de un sensor LiDAR en un robot móvil.
      sensor_msgs/LaserScan {
        header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base_laser"},
        angle_min: -1.57,
        angle_max: 1.57,
        angle_increment: 0.01,
        time_increment: 0.0,
        scan_time: 0.0,
        range_min: 0.1,
        range_max: 10.0,
        ranges: [0.5, 0.6, 0.7, ...]
      }
      
    • sensor_msgs/Imu

      • Representa datos de una unidad de medida inercial (IMU).
      • Incluye datos de orientación (como cuaterniones), aceleración lineal y velocidad angular (tasa de giro).
      • Ejemplo de uso: Para recibir datos de un IMU en un dron o robot móvil.
      sensor_msgs/Imu {
        header: {stamp: {sec: 0, nanosec: 0}, frame_id: "imu_link"},
        orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0},
        orientation_covariance: [0.0, 0.0, 0.0, ...],
        angular_velocity: {x: 0.1, y: -0.2, z: 0.3},
        angular_velocity_covariance: [0.0, 0.0, 0.0, ...],
        linear_acceleration: {x: 0.4, y: -0.5, z: 0.6},
        linear_acceleration_covariance: [0.0, 0.0, 0.0, ...]
      }
      
    • sensor_msgs/CameraInfo

      • Proporciona información sobre la configuración de una cámara, como la matriz de la cámara, el tamaño de la imagen y los coeficientes de distorsión.
      • Ejemplo de uso: Para enviar datos sobre la calibración de una cámara.
      sensor_msgs/CameraInfo {
        header: {stamp: {sec: 0, nanosec: 0}, frame_id: "camera_frame"},
        height: 720,
        width: 1280,
        distortion_model: "plumb_bob",
        D: [0.1, -0.1, 0.0, 0.0, 0.0],
        K: [1000.0, 0.0, 640.0, ...],
        R: [1.0, 0.0, 0.0, ...],
        P: [1000.0, 0.0, 640.0, ...],
        binning_x: 1,
        binning_y: 1,
        roi: {x_offset: 0, y_offset: 0, height: 720, width: 1280, do_rectify: false}
      }
      
    • sensor_msgs/PointCloud2

      • Representa un conjunto de puntos tridimensionales (nube de puntos).
      • Se utiliza para representar datos de escaneo de superficies u objetos en 3D, por ejemplo, de un sensor LiDAR o de una cámara de profundidad.
      • Ejemplo de uso: Para enviar datos de una nube de puntos capturados por un sensor.
      sensor_msgs/PointCloud2 {
        header: {stamp: {sec: 0, nanosec: 0}, frame_id: "base_link"},
        height: 1,
        width: 1000,
        fields: [{name: "x", offset: 0, datatype: 7, ...}, ...],
        point_step: 32,
        row_step: 32000,
        data: [...],
        is_bigendian: false,
        is_dense: true
      }
      
  • nav_msgs: Mensajes relacionados con la navegación robótica.

    • nav_msgs/Odometry

      • Representa datos de odometría, que describen la posición y orientación actual de un robot, así como sus velocidades lineales y angulares.
      • Incluye un header con un sello de tiempo y un marco de referencia (frame_id).
      • Contiene una PoseWithCovariance (pose con información de incertidumbre) y una TwistWithCovariance (velocidad con información de incertidumbre).
      nav_msgs/Odometry {
        header: {stamp: {sec: 0, nanosec: 0}, frame_id: "odom"},
        child_frame_id: "base_link",
        pose: {
            pose: {position: {x: 1.0, y: 2.0, z: 0.0}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}},
            covariance: [0.1, 0.0, 0.0, ...]
        },
        twist: {
            twist: {linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.1}},
            covariance: [0.1, 0.0, 0.0, ...]
        }
      }
      
    • nav_msgs/Path

      • Representa un camino o trayectoria que un robot puede seguir para navegar a través de un espacio.
      • Consiste en una lista de poses (PoseStamped) a lo largo de una trayectoria planificada.
      • Ejemplo de uso: Para especificar una ruta de navegación para un robot.
      nav_msgs/Path {
        header: {stamp: {sec: 0, nanosec: 0}, frame_id: "map"},
        poses: [
            {header: {stamp: {sec: 0, nanosec: 0}, frame_id: "map"},
            pose: {position: {x: 1.0, y: 1.0, z: 0.0}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}}},
            {header: {stamp: {sec: 0, nanosec: 0}, frame_id: "map"},
            pose: {position: {x: 2.0, y: 2.0, z: 0.0}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}}}
            // ...
        ]
      }
      
    • nav_msgs/OccupancyGrid

      • Representa un mapa de ocupación, que es una representación de un entorno en una cuadrícula bidimensional.
      • Cada celda de la cuadrícula contiene un valor que indica si está libre, ocupada o desconocida.
      • Ejemplo de uso: Para compartir un mapa de ocupación de un entorno con otros nodos o para planificar rutas.
      nav_msgs/OccupancyGrid {
        header: {stamp: {sec: 0, nanosec: 0}, frame_id: "map"},
        info: {
            map_load_time: {sec: 0, nanosec: 0},
            resolution: 0.05,
            width: 100,
            height: 100,
            origin: {
                position: {x: -2.5, y: -2.5, z: 0.0},
                orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
            }
        },
        data: [0, 100, -1, ...] // Valores de ocupación para cada celda
      }
      
    • nav_msgs/MapMetaData

      • Proporciona metadatos sobre un mapa, como la resolución, el tamaño y la posición de la cuadrícula de ocupación.
      • Se usa en conjunto con mensajes como OccupancyGrid.
      nav_msgs/MapMetaData {
        map_load_time: {sec: 0, nanosec: 0},
        resolution: 0.05,
        width: 100,
        height: 100,
        origin: {
            position: {x: -2.5, y: -2.5, z: 0.0},
            orientation: {x: 0.0, y: 0.0, z: 0.0, w: 1.0}
        }
      

    }

  1. Tipos de mensajes personalizados: Además de los tipos de mensajes estándar, puedes definir tus propios tipos de mensajes personalizados para adaptarte a las necesidades específicas de tu aplicación. Los mensajes personalizados se crean utilizando el lenguaje de definición de mensajes (IDL) de ROS 2.

  2. Tipos de mensajes de servicios y acciones: Además de los mensajes de tópicos, ROS 2 también tiene mensajes de servicios (srv) y acciones (action). Los servicios definen un tipo de solicitud y un tipo de respuesta, mientras que las acciones son una combinación de mensajes de objetivos, actualizaciones de estado y resultados.

  3. Mensajes de paquetes de terceros: Además de los paquetes estándar, existen otros paquetes de ROS 2 desarrollados por la comunidad que proporcionan más tipos de mensajes para diferentes aplicaciones, como robótica, automoción, drones, etc.

Comandos básicos
  1. Para ver los topicos de los nodos turtlesim y teleop_key que previamente deben estar ejecución usamos la siguiente instrucción
ros2 topic list

Esto nos indica que deben estar ejecutándose estos tópicos.

  /parameter_events
  /rosout
  /turtle1/cmd_vel
  /turtle1/color_sensor
  /turtle1/pose

Nota: Los tópicos /parameter_events y /rosout son de la ejecución de ROS2 y no pertenecen a los paquetes y nodos en ejecución, por lo tanto, siempre van a estar presentes.

  1. Otra herramienta útil para el desarrollo de los tópicos con ROS2 es saber el tipo de los tópicos.
ros2 topic list -t

Y nos muestra la siguiente información.

  /parameter_events [rcl_interfaces/msg/ParameterEvent]
  /rosout [rcl_interfaces/msg/Log]
  /turtle1/cmd_vel [geometry_msgs/msg/Twist]
  /turtle1/color_sensor [turtlesim/msg/Color]
  /turtle1/pose [turtlesim/msg/Pose]
  1. Durante la instalación, se descargó una herramienta útil para visualizar la conexión de los nodos, tópicos, servicios y acciones de nuestro proyecto. Para visualizar la arquitectura del proyecto, podemos usar el comando.
rqt_graph

Y nos habilita la ventana para ver el rqt_graph.

rqt_graph
  1. Para visualizar el flujo de información de un tópico cmd_vel usamos el siguiente comando.
ros2 topic echo  /turtle1/cmd_vel

Esto nos habilitará información enviada a travás del tópico /turtle/cmd_vel.

  linear:
    x: 2.0
    y: 0.0
    z: 0.0
  angular:
    x: 0.0
    y: 0.0
    z: 0.0
  ---
  1. Tambien podemos ver la información del tópico pose pose.
ros2 topic echo  /turtle1/pose

Nos imprimira la posición y ángulo de la tortuga.

  x: 5.544444561004639
  y: 5.544444561004639
  theta: 0.0
  linear_velocity: 0.0
  angular_velocity: 0.0
  ---
  1. En el caso de querer ver la información de un tópico usamos:
ros2 topic info /turtle1/cmd_vel

Lo cual nos retorna el tipo de nodo, número de nodos suscritos y número de nodos publicando.

  Type: geometry_msgs/msg/Twist
  Publisher count: 1
  Subscription count: 1
  1. Ver la extructura de mensaje enviada en el tópico.
ros2 interface show geometry_msgs/msg/Twist

Retorna la extructura.

  # This expresses velocity in free space broken into its linear and angular parts.

  Vector3  linear
          float64 x
          float64 y
          float64 z
  Vector3  angular 
          float64 x
          float64 y
          float64 z
  1. Publicar información a través del tópico.
ros2 topic pub --once /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.5}}"
  1. Publicar información a través del tópico con una determinada frecuencia.
ros2 topic pub --rate /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.5}}"
  1. Para visualizar la frecuencia con la que un nodo publica.
ros2 topic hz /turtle1/cmd_vel

Retorna la velocidad de publicación.

  average rate: 0.200
          min: 4.999s max: 5.001s std dev: 0.00058s window: 2
  average rate: 0.200
          min: 4.999s max: 5.001s std dev: 0.00070s window: 3
  average rate: 0.200
          min: 4.999s max: 5.001s std dev: 0.00090s window: 4
  average rate: 0.200

SERVICIOS

En ROS 2, los servicios son un mecanismo de comunicación que permite a los nodos intercambiar datos de forma síncrona. A través de los servicios, un nodo (el servidor) puede ofrecer una funcionalidad específica que otros nodos (los clientes) pueden solicitar. Cuando un cliente hace una solicitud a un servicio, espera una respuesta inmediata del servidor. Esto es diferente de los temas (o topics), que son de naturaleza asíncrona.

Un servicio en ROS 2 tiene tres componentes principales:

  1. Definición del servicio: Similar a los mensajes, los servicios también tienen su propio tipo de definición, que incluye tanto los datos de la solicitud (request) como los datos de la respuesta (response).

  2. Nodo servidor: Es el nodo que implementa la funcionalidad del servicio. Escucha las solicitudes de los nodos clientes y, cuando recibe una, realiza la operación solicitada y responde con los datos apropiados.

  3. Nodo cliente: Es el nodo que solicita la funcionalidad proporcionada por el servidor. Realiza una llamada al servicio y espera una respuesta.

Este patrón de solicitud-respuesta es útil para cuando se necesita una interacción puntual y sincrónica entre nodos, en contraste con el modelo de publicación-suscripción que es más adecuado para comunicaciones asíncronas y continuas.

Clasificación
  1. Servicios estándar: En ROS2, hay varios servicios estándar que forman parte de los paquetes básicos de ROS2 y proporcionan funcionalidad común que es útil para muchas aplicaciones.

    • Servicios básicos (std_srvs):
      • Empty: Un servicio sin datos de solicitud ni de respuesta.
      • SetBool: Servicio que toma un valor booleano como solicitud y devuelve un valor booleano y una cadena de respuesta.
      • Trigger: Servicio que no tiene datos de solicitud, pero devuelve un valor.
    • Servicios de interfaces del sistema (rcl_interfaces):
      • SetParameters: Permite configurar los parámetros de un nodo.
      • GetParameters: Permite obtener los parámetros de un nodo específico.
      • GetParameterTypes: Permite obtener los tipos de parámetros de un nodo.
      • DescribeParameters: Ofrece información sobre los parámetros de un nodo, incluidos los descriptores.
      • ListParameters: Proporciona una lista de los parámetros disponibles en un nodo.
    • Servicios de la biblioteca de imagen (image_transport):
      • GetTransportInfo: Servicio que proporciona información sobre los transportes de imágenes disponibles.
    • Servicios de transformación (tf2_msgs)
      • LookupTransform: Proporciona información sobre las transformaciones de coordenadas.
  2. Servicios no estándar: Los servicios no estándar son aquellos definidos por los desarrolladores para aplicaciones específicas. Estos servicios pueden variar ampliamente según el ámbito de la aplicación, el paquete ROS 2 utilizado y los requerimientos del sistema. Los archivos .srv dentro de los paquetes describen los servicios específicos.

Comandos básicos
  1. Listar servicios.
ros2 service list

Retorna

  /clear
  /kill
  /reset
  /spawn
  /teleop_turtle/describe_parameters
  /teleop_turtle/get_parameter_types
  /teleop_turtle/get_parameters
  /teleop_turtle/list_parameters
  /teleop_turtle/set_parameters
  /teleop_turtle/set_parameters_atomically
  /turtle1/set_pen
  /turtle1/teleport_absolute
  /turtle1/teleport_relative
  /turtlesim/describe_parameters
  /turtlesim/get_parameter_types
  /turtlesim/get_parameters
  /turtlesim/list_parameters
  /turtlesim/set_parameters
  /turtlesim/set_parameters_atomically
  1. Ver el tipo de los servicios.
ros2 service list 

Retorna

  /clear [std_srvs/srv/Empty]
  /kill [turtlesim/srv/Kill]
  /reset [std_srvs/srv/Empty]
  /spawn [turtlesim/srv/Spawn]
  /teleop_turtle/describe_parameters [rcl_interfaces/srv/DescribeParameters]
  /teleop_turtle/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
  /teleop_turtle/get_parameters [rcl_interfaces/srv/GetParameters]
  /teleop_turtle/list_parameters [rcl_interfaces/srv/ListParameters]
  /teleop_turtle/set_parameters [rcl_interfaces/srv/SetParameters]
  /teleop_turtle/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
  /turtle1/set_pen [turtlesim/srv/SetPen]
  /turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
  /turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
  /turtlesim/describe_parameters [rcl_interfaces/srv/DescribeParameters]
  /turtlesim/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
  /turtlesim/get_parameters [rcl_interfaces/srv/GetParameters]
  /turtlesim/list_parameters [rcl_interfaces/srv/ListParameters]
  /turtlesim/set_parameters [rcl_interfaces/srv/SetParameters]
  /turtlesim/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
  1. Ver rl tipo de un servicio en específico.
ros2 service type /clear

El tipo de servicio es un servicio estandar vacio.

  std_srvs/srv/Empty
  1. Visualizar si los servicios de algún tipo están ejecutándose.
ros2 servide find std_srvs/srv/Empty

En este caso tenemos dos servicios de este tipo.

  /clear
  /reset
  1. Para llamar i usar un servicio.
ros2 service call /clear std_srvs/srv/Empty

Retorna valores de la solicitud

  requester: making request: std_srvs.srv.Empty_Request()

  response:
  std_srvs.srv.Empty_Response()
  1. Para ver la estructura del request y el response.
ros2 interface show turtlesim/srv/Spawn

Retorna

  float32 x
  float32 y
  float32 theta
  string name # Optional.  A unique name will be created and returned if this is empty
  ---
  string name
  1. Llamar el servicio Spawm
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: 'tortuga_mario'}"

Retorna en consola y dibuja una segunda tortuga.

requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='tortuga_mario')

response:
turtlesim.srv.Spawn_Response(name='tortuga_mario')

ACCIONES

En ROS 2, las acciones son un mecanismo de comunicación que permite a los nodos ejecutar tareas complejas de manera asíncrona, con retroalimentación sobre el progreso y la capacidad de cancelación. Las acciones son útiles cuando se necesita ejecutar operaciones que pueden tomar un tiempo considerable y requieren seguimiento del progreso.

Clasificación
  1. Simple: Una acción simple consta de una sola meta que el cliente envía al servidor para su ejecución. El servidor procesa la meta y devuelve un resultado al cliente.

  2. Compuesta: Una acción compuesta puede involucrar múltiples pasos o sub-tareas. El cliente envía una serie de metas secuenciales al servidor, y este último ejecuta las tareas en orden y proporciona retroalimentación del progreso entre cada paso.

Tipos
  1. actionlib (acciones de acción simple):Este es el sistema de acciones original en ROS 1. Aunque no está incluido en la distribución principal de ROS 2, todavía es compatible a través del puente de compatibilidad ROS 1-ROS 2.

  2. rcl_action (acciones de ROS 2):Es el sistema de acciones nativo de ROS 2 y proporciona una implementación más eficiente y flexible que actionlib. Incluye soporte tanto para acciones simples como compuestas.


VIRTUALIZACIÓN DE UN ROBOT

En ROS (Robot Operating System), el URDF (Unified Robot Description Format) es un formato de archivo XML utilizado para describir la geometría del robot, es decir, su estructura física, en términos de enlaces (links) y juntas (joints). Los enlaces representan las partes sólidas del robot (como eslabones o piezas), mientras que las juntas describen cómo estos enlaces están conectados y pueden moverse entre sí (como articulaciones rotativas o prismáticas).

Urdf

El Xacro es una extensión de XML utilizada para escribir URDF de manera más eficiente y modular. Permite la reutilización de código y la parametrización de modelos, lo que simplifica la descripción y mantenimiento de robots complejos.

El SDF (Simulation Description Format) es un formato de archivo XML utilizado en el simulador Gazebo. Describe tanto la geometría como la física de los modelos de robots y entornos de simulación. Mientras que el URDF y el Xacro se centran en la geometría y la cinemática del robot, el SDF agrega información adicional necesaria para la simulación, como propiedades de los materiales, colisiones y restricciones físicas.

sdf

REPASO DE MATRICES(Álgebra lineal)

REPASO ROBÓTICA(Quaterniones, Transformadas, ...)

Python es lento porque es interpretado

Nodes

Discovery

Interfaces

Topics

Services

Actions

Parameters

Introspection with command line tools

Launch

Client libraries




Preparación del espacio de trabajo

Creación del proyecto Ros2

  1. Creación del workspace.

mkdir -p siro_ws/src

  1. Ingresamos a siro_ws

cd siro_ws

  1. Compilación del proyecto

colcon build

Al compilar se crean 3 direcorios nuevos

    \build
    \install
    \log
  1. Actualizar las fuentes compiladas

source install/setup.bash

Realizar el paso 3 y 4 cada vez que se realice un cambio

--

About

Recopilación de recursos para estudiar conceptos de ROS 2 Humble. Materiales útiles para aprender y dominar ROS 2.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published