Clase 03
Semana 4 - 07/04/2025
Nodos
Topics
Mensajes
namespaces
Similaridad a una estructura de carpetas
/
├── 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
Modelo de llamada-respuesta
Bidireccional
Solo proveen información cuando son invocados
Comunicación es 1 a N
Valores de configuración para un nodo
Cada nodo posee sus propios parámetros
int
float
bool
string
list[]
Invocar y analizar servicios
Comandos para setear y obtener comandos
workspace
overlay
➡️ Nuestros paquetesunderlay
➡️ Paquetes instalados
Workspace
📂 ros_ws 📁 src 📁 build ⚠️ 📁 install ⚠️ 📁 log ⚠️
Workspace de desarrollo. install/local_setup.bash |
Paquete de ROS instaladossource /opt/ros/jazzy/setup.bash |
📂 src 📂 nombre_paquete 📁 nombre_paquete 📄 __init__.py ... 📁 resource 📄 nombre_paquete 📄 package.xml 📄 setup.cfg 📄 setup.py
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>
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'
],
},
)
Si el paquete posee un ejecutable, para que
ros2 run
lo pueda encontrar
rclpy
: ROS Client Library (Python)Acceso a los componentes de ROS
rclpy
: ROS Client Library (Python)Partes básicas del programa
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
Inicialización
rclpy.init(..)
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
Inicialización
rclpy.init(..)
Creación de 1 o más nodos
rclpy.create_node(..)
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
Inicialización
rclpy.init(..)
Creación de 1 o más nodos
rclpy.create_node(..)
Procesamiento de callbacks (spinning
)
rclpy.spin(..)
Apagado / finalización (shutdown
)
rclpy.shutdown()
rclpy
: ROS Client Library (Python)Gestión de nodos
node.create_publisher(..)
node.create_subscription(..)
node.create_timer(..)
node.get_logger(..)
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
Robótica - TUAR - FICH - UNL