Robótica

Clase 03

Semana 4 - 07/04/2025

Resumen Clase 02

  • ROS 2 - Jazzy

    • Nodos

    • Topics

    • Mensajes

ROS2: Contexto y namespaces

Similaridad a una estructura de carpetas


Tipos

  • Global

  • Relativo

  • Base

  • Privado

/
├── sim1/
│ └── robot/
│     ├── cmd_vel       /sim1/robot/cmd_vel
│     └── odometry      /sim1/robot/odometry
└── sim2/
    └── robot/
        ├── cmd_vel     /sim2/robot/cmd_vel
        └── odometry    /sim2/robot/odometry

Base:       robot

Privado:    ~/cmd_vel
            ~/odometry

ROS2: Servicios

Modelo de llamada-respuesta

Bidireccional

Solo proveen información cuando son invocados

Comunicación es 1 a N

ROS2: Parámetros

Valores de configuración para un nodo

Cada nodo posee sus propios parámetros

  • int
  • float
  • bool
  • string
  • list[]

Laboratorio (parte 1)

  • Invocar y analizar servicios

  • Comandos para setear y obtener comandos

Entorno de ROS y workspace

Dos niveles:

  • overlay ➡️ Nuestros paquetes
  • underlay ➡️ Paquetes instalados

Workspace

📂 ros_ws
  📁 src
  📁 build      ⚠️
  📁 install    ⚠️
  📁 log        ⚠️



Workspace de desarrollo
. install/local_setup.bash
Paquete de ROS instalados
source /opt/ros/jazzy/setup.bash

Paquete de ROS

Contiene

  • Código fuente
  • Archivos de configuración
  • Archivos “launch”
  • Definición de mensajes, servicios, etc
  • Metadatos e información
  • Documentación
📂 src
  📂 nombre_paquete
      📁 nombre_paquete
          📄 __init__.py
          ...
      📁 resource
          📄 nombre_paquete
      📄 package.xml
      📄 setup.cfg
      📄 setup.py

Paquete de ROS: 📄 package.xml

Contiene

  • Propiedades e información del paquete
  • Formato XML
<?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>nombre_paquete</name>
    <version>0.0.0</version>
    <description>Descripción del paquete</description>
    <maintainer email="user@todo.todo">user</maintainer>
    <license>Licencia</license>

    <url type="website">https://github.com/...</url>
    <author email="user@todo.todo">user</author>

    <depend>nombre_paquete_dependencia</depend>

    <export>
        <build_type>ament_python</build_type>
    </export>
</package>

Paquete de ROS: 📄 setup.py

Contiene

  • Instrucciones de cómo se debe instalar el paquete (para el sistema de compilación)
  • Deben coincidir la información y los metadatos con los del package.xml
from setuptools import setup

package_name = 'nombre_paquete'

setup(
  name=package_name,
  version='0.0.0',
  # Packages to export
  packages=[package_name],
  # Files we want to install, specifically launch files
  data_files=[
      # Install marker file in the package index
      ('share/ament_index/resource_index/packages',
             ['resource/' + package_name]),
      # Include our package.xml file
      ('share/' + package_name, ['package.xml']),
    ],
  # This is important as well
  install_requires=['setuptools'],
  zip_safe=True,
  maintainer='TODO',
  maintainer_email='TODO',
  description='TODO: Package description',
  license='TODO: License declaration',
  tests_require=['pytest'],
  entry_points={
      'console_scripts': [
              'nombre_nodo = nombre_paquete.nombre_nodo:main'
      ],
    },
)

Paquete de ROS: 📄 setup.cfg

Si el paquete posee un ejecutable, para que ros2 run lo pueda encontrar

[develop]
script_dir=$base/lib/<nombre_paquete>

[install]
install_scripts=$base/lib/<nombre_paquete>

rclpy: ROS Client Library (Python)

Acceso a los componentes de ROS

  • Inicialización y ejecución de callbacks
  • Gestión de nodos
  • Topics, servicios, acciones, etc.
  • Logs
import rclpy

rclpy: ROS Client Library (Python)

Partes básicas del programa

  1. Inicialización

     rclpy.init(..)

Antes que cualquier otra función de ROS

Define el contexto

rclpy: ROS Client Library (Python)

Partes básicas del programa

  1. Inicialización

     rclpy.init(..)
  2. Creación de 1 o más nodos

     rclpy.create_node(..)

Punto de acceso al sistema de ROS (topics, parámetros, servicios, etc.)

En POO sería a través de una instancia ‘node’

rclpy: ROS Client Library (Python)

Partes básicas del programa

  1. Inicialización

     rclpy.init(..)
  2. Creación de 1 o más nodos

     rclpy.create_node(..)
  3. Procesamiento de callbacks (spinning)

     rclpy.spin(..)

Se procesan los callbacks y demás tareas del nodo

rclpy: ROS Client Library (Python)

Partes básicas del programa

  1. Inicialización

     rclpy.init(..)
  2. Creación de 1 o más nodos

     rclpy.create_node(..)
  3. Procesamiento de callbacks (spinning)

     rclpy.spin(..)
  4. Apagado / finalización (shutdown)

     rclpy.shutdown()

rclpy: ROS Client Library (Python)

Gestión de nodos

  • Crear un publisher: node.create_publisher(..)
  • Crear un suscriber: node.create_subscription(..)
  • Timer: node.create_timer(..)
  • Log: node.get_logger(..)

Compilación del paquete

Creación de paquetes:

    ros2 pkg create --build-type ament_python <nombre_paquete>

Herramienta de compilación: colcon

    colcon build [--symlink-install] [--packages-select <nombre_paquete>]

Dependencias:

    rosdep update

    rosdep install -i --from-path src --rosdistro jazzy -y

Ejecutar en la raíz del workspace