Fundamentos y configuración de ROS2
Capítulo IX ROS2-Humble
| Nombre | Propietario | Modificado | Creado |
|---|---|---|---|
| 01 Introducción a ROS2 | Yujiang | 2026-01-09 14:03 | 2026-01-09 14:03 |
| 02 Instalar Humble | Yujiang | 2026-01-26 12:12 | 2026-01-09 14:03 |
| 03 Entorno de desarrollo integrado | Yujiang | 2026-01-26 14:55 | 2026-01-09 14:24 |
| 04 Espacio de trabajo | Yujiang | 2026-01-12 12:22 | 2026-01-09 14:25 |
| 05 Paquete | Yujiang | 2026-01-12 12:22 | 2026-01-09 14:26 |
| 06 Nodo | Yujiang | 2026-02-13 13:28 | 2026-01-09 14:26 |
| 07 Comunicación de tópicos | Yujiang | 2026-02-13 13:29 | 2026-01-09 14:27 |
| 08 Comunicaciones de servicio | Yujiang | 2026-02-06 13:57 | 2026-01-09 14:27 |
| 09 Comunicaciones de acción | Yujiang | 2026-01-27 14:48 | 2026-01-09 14:27 |
| 10 Transformación de coordenadas TF2 | Yujiang | 2026-01-27 14:55 | 2026-01-09 14:28 |
Mantenimiento del contenido...
01 Introducción a ROS2
1.1 Qué es ROS 2
ROS 2 (Robot Operation System 2) es un marco intermediario de código abierto para el desarrollo de software robótico. Aunque el nombre contiene "sistema operativo", ROS 2 no es en realidad un sistema operativo tradicional, sino un repositorio de software y herramientas que ayudan a los desarrolladores a crear aplicaciones robóticas.
1.1.1 Definición de ROS 2
ROS 2 proporciona el servicio del sistema operativo, que generalmente transmite mensajes entre procesos y ejecuta la gestión de paquetes. Es un marco distribuido que permite a las aplicaciones controlar el hardware robótico, procesar datos de sensores, ejecutar algoritmos y comunicarse con otras aplicaciones o sistemas.
1.1.2 Objetivos de diseño para ROS 2
| Objetivo | Por qué importa |
|---|---|
| Compatibilidad con tiempo real | Mejor soporte para cargas de trabajo robóticas de baja latencia |
| Implementación distribuida | Múltiples nodos pueden ejecutarse en muchos procesos o máquinas |
| Confiabilidad y mantenibilidad | Más adecuado para robótica de producción que las suposiciones de la era ROS 1 |
| Seguridad | Soporta comunicación segura y control de acceso |
| Soporte multiplataforma | Se ejecuta en Linux, objetivos integrados y otros entornos modernos |
1.1.3 Valores fundamentales de ROS 2
-
Diseño modular: código organizado en paquetes separados que son fáciles de mantener, reutilizar y distribuir
-
Comunicación distribuida: arquitectura informática distribuida multiprocesador, multimáquina
-
Ecosistema rico: contiene un gran número de paquetes funcionales y herramientas de desarrollo de código abierto
-
Comunidades activas: una contribución sostenida de desarrolladores globales y un soporte activo de empresas comerciales
1.2 Concepto fundamental de ROS 2
1.2.1 Nodos (Nodes)
Un nodo es la unidad de cálculo más básica en ROS 2. Un nodo es un proceso que utiliza la API de ROS 2 para comunicarse con otros nodos.
1.2.2 Tópicos (Topics)
El tópico es el mecanismo para la comunicación insular entre nodos, utilizando la publicación/suscripción (Pub/Sub).
| Característica | Descripción |
|---|---|
| Asíncrono | Los publicadores y suscriptores no se bloquean entre sí |
| Uno a muchos | Múltiples suscriptores pueden consumir el mismo tópico |
| Acoplamiento débil | Los nodos solo acuerdan el nombre del tópico y el tipo de mensaje |
| Compatible con flujo | Bien adecuado para datos de sensores, telemetría y control continuo |
Ejemplos típicos de tópicos:
| Nombre del tema | Tipo de mensaje | Propósito |
|---|---|---|
| /cmd_vel | geometry_msgs/msg/Twist | Comando de control de velocidad |
| /odom | nav_msgs/msg/Odometry | datos de kilometraje |
| /scan | sensor_msgs/msg/LaserScan | Datos de radar láser |
| /camera/image_raw | sensor_msgs/msg/Image | Datos de imagen original |
1.2.3 Servicios (Services)
Los servicios son el mecanismo para la comunicación sincrónica entre nodos, utilizando el modelo cliente/servidor (Client/Server).
1.2.4 Acciones (Actions)
Las acciones son mecanismos de comunicación que se utilizan para manejar asignaciones a largo plazo para apoyar la retroalimentación y la cancelación de las asignaciones.
| Stream | Propósito |
|---|---|
| Goal | Describe la tarea a ejecutar |
| Feedback | Reporta el progreso mientras la tarea se está ejecutando |
| Result | Devuelve el resultado final cuando la tarea termina |
1.2.5 Parámetros (Parameters)
Los parámetros son valores de configuración para los nodos, que pueden establecerse al iniciar los nodos o modificarse dinámicamente durante la ejecución.
Plain Text
Node: camera_node
├── Parameter: frame_id = "camera_link"
├── Parameter: width = 640
├── Parameter: height = 480
├── Parameter: fps = 30
└── Parameter: exposure_mode = "auto"
Dynamic update example:
$ ros2 param set camera_node exposure_mode "manual"1.3 Estructura de ROS 2
1.3.2 Bibliotecas de cliente (Client Libraries)
| Biblioteca | Lenguaje | Uso típico |
|---|---|---|
rclcpp | C++ | Nodos de producción de alto rendimiento |
rclpy | Python | Prototipado rápido y scripting |
rclc | C | Micro-ROS y sistemas con recursos limitados |
rcljava | Java | Integraciones de ROS 2 basadas en JVM |
rclnodejs | JavaScript / Node.js | Integraciones web y de herramientas |
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class Publisher : public rclcpp::Node {
public:
Publisher() : Node("publisher") {
publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
timer_ = this->create_wall_timer(
std::chrono::milliseconds(500),
[this]() { this->timer_callback(); });
}
private:
void timer_callback() {
auto msg = std_msgs::msg::String();
msg.data = "Hello ROS 2";
publisher_->publish(msg);
}
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
};import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class Publisher(Node):
def __init__(self):
super().__init__('publisher')
self.publisher_ = self.create_publisher(String, 'topic', 10)
self.timer = self.create_timer(0.5, self.timer_callback)
def timer_callback(self):
msg = String()
msg.data = 'Hello ROS 2'
self.publisher_.publish(msg)1.3.3 RMW y DDS
| Implementación RMW | Backend DDS | Código abierto/comercial | Características |
|---|---|---|---|
| rmw_cyclonedds_cpp | CycloneDDS | Código abierto | Selección predeterminada, eficiencia ligera |
| rmw_fastrtps_cpp | FastDDS | Código abierto | Es muy funcional y de alto rendimiento. |
| rmw_connext_cpp | RTI Connext | Comercial | Soporte de nivel industrial, lo más completo |
1.4 Diferencias principales entre ROS 1 y ROS 2
1.4.2 Tablas comparativas detalladas
| Dimensiones relativas | ROS 1 | ROS 2 |
|---|---|---|
| Comunicaciones intermedias | Protocolo personalizado TCP/UDP | Protocolo estándar DDS |
| Mecanismos de descubrimiento | ROS Master (centralizado) | Descubrimiento de DDS (descentralización) |
| Sistema de construcción | Catkin | Colcon / Ament |
| Versión Python | Python 2/3 | Solo Python 3 |
| Sistemas operativos compatibles | Principalmente Linux | Linux / Windows / macOS / RTOS |
| Soporte en tiempo real | Sin garantía en tiempo real | Soporta tiempo real duro |
| Comunicaciones de múltiples robots | Se requiere configuración adicional | Soporte nativo (ROS_DOMAIN_ID) |
| Seguridad | Sin cifrado ni autenticación | Soporta cifrado, autenticación, control de acceso |
| Versión | Noetic (versión final) | Humble, Iron, Jazzy... |
1.5 Versión de ROS 2
1.5.1 Historial de versiones
| Designador de versión | Tiempo de lanzamiento | Sistema soportado | Estado de soporte | Fecha límite |
|---|---|---|---|---|
| Ardent | 2017.12 | Ubuntu 16.04 | Terminado | 2019.04 |
| Bouncy | 2018.06 | Ubuntu 16.04/18.04 | Terminado | 2019.09 |
| Crystal | 2018.12 | Ubuntu 16.04/18.04 | Terminado | 2020.12 |
| Dashing | 2019.05 | Ubuntu 16.04/18.04 | Terminado | 2021.05 |
| Eloquent | 2019.11 | Ubuntu 18.04 | Terminado | 2021.11 |
| Foxy | 2020.06 | Ubuntu 18.04/20.04 | Terminado | 2023.05 |
| Galactic | 2021.05 | Ubuntu 20.04 | Terminado | 2022.11 |
| Humble | 2022.05 | Ubuntu 22.04 | LTS | 2027.05 |
| Iron | 2023.05 | Ubuntu 22.04 | Terminado | 2024.11 |
| Jazzy | 2024.05 | Ubuntu 24.04 | LTS | 2029.05 |
1.5.3 Propuesta para la selección de una versión
| Usar escena | Versión recomendada | Razón |
|---|---|---|
| Entorno de producción | Humble | Estable, soporte a largo plazo |
| Desarrollo de nuevos proyectos | Jazzy | LTS más reciente, soporte a largo plazo |
| Estudio/experimento | Reciente Scroll | Funciones recientes |
| Mantenimiento de sistemas antiguos | Humble | La compatibilidad es buena. |
03 Entorno de desarrollo integrado
03 Entorno de desarrollo integrado (IDE Setup)
3.1 General
Una buena configuración del entorno de desarrollo puede mejorar significativamente la eficiencia del desarrollo de ROS 2. Este capítulo proporcionará información detallada sobre cómo configurar Visual Studio Code (VS Code) como el entorno de desarrollo principal para ROS 2, incluida la instalación de plugins, la finalización inteligente de código, la configuración de depuración, etc.
3.2 Instalación de Visual Studio Code
3.2.1 Instalación de VS Code
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
sudo install -o root -g root -m 644 packages.microsoft.gpg /etc/apt/trusted.gpg.d/
sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/trusted.gpg.d/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt update
sudo apt install -y codesudo snap install --classic codecode --version3.3 Plugins requeridos
| Nombre del plugin | Editor | Propósito |
|---|---|---|
| ROS | Microsoft | Soporte de ROS |
| C/C++ | Microsoft | Soporte del lenguaje C++ |
| Python | Microsoft | Soporte del lenguaje Python |
| CMake Tools | Microsoft | Soporte de CMake |
code --install-extension ms-iot.vscode-ros
code --install-extension ms-vscode.cpptools
code --install-extension ms-python.python
code --install-extension ms-vscode.cmake-tools3.4 Configuración del espacio de trabajo de ROS 2
code ~/ros2_ws{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/opt/ros/humble/include/**",
"/usr/include/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "linux-gcc-x64",
"compileCommands": "${workspaceFolder}/build/compile_commands.json"
}
],
"version": 4
}cd ~/ros2_ws
colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
ln -s build/compile_commands.json3.4.4 Configurar el entorno Python
{
"python.autoComplete.extraPaths": [
"${workspaceFolder}/install/*/lib/python3.10/site-packages",
"/opt/ros/humble/lib/python3.10/site-packages"
],
"python.analysis.extraPaths": [
"${workspaceFolder}/install/*/lib/python3.10/site-packages",
"/opt/ros/humble/lib/python3.10/site-packages"
],
"python.formatting.provider": "black",
"python.linting.enabled": true,
"python.linting.pylintEnabled": true
}3.5 Configuración del trabajo de VS Code
{
"version": "2.0.0",
"tasks": [
{
"label": "colcon build",
"type": "shell",
"command": "colcon build --symlink-install",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": []
}
]
}3.6 Configuración de depuración
{
"version": "0.2.0",
"configurations": [
{
"name": "ROS2: C++ Node",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/install/${input:packageName}/lib/${input:packageName}/${input:executableName}",
"args": [],
"cwd": "${workspaceFolder}",
"MIMode": "gdb"
}
]
}| Atajos | Funciones |
|---|---|
| F5 | Iniciar depuración |
| Ctrl+Shift+F5 | Reiniciar depuración |
| Shift+F5 | Detener depuración |
| F9 | Establecer/cerrar breakpoint |
| F10 | Step Over |
| F11 | Step Into |
| Shift+F11 | Step Out |
3.11 Instalación de Terminator
sudo apt install terminator3.11.1 Inicio
Atajo Ctrl+Alt+T
3.12 Uso de Git
sudo apt install gitgit init
git add .
git commit| Comando | Propósito |
|---|---|
git init | Crear un nuevo repositorio local |
git status | Verificar el estado actual del repositorio |
git add <file> | Stagear un archivo para el siguiente commit |
git commit -m "message" | Crear un nuevo snapshot con un mensaje |
git diff | Mostrar cambios sin staged |
git log | Mostrar historial de commits |
git remote -v | Listar remotos configurados |
git push -u origin main | Push y establecer rama upstream |
git pull | Obtener y fusionar actualizaciones remotas |
3.13 Próximos pasos
04 Espacio de trabajo - Aprender la gestión del espacio de trabajo
05 Paquete funcional - Crear paquete funcional
06 Nodo - Escribir código de nodo
04 Espacio de trabajo
04 Espacio de trabajo (Workspace)
4.1 Visión general del espacio de trabajo
4.1.1 ¿Qué es un espacio de trabajo?
El espacio de trabajo es la estructura de directorios para organizar y gestionar paquetes funcionales en ROS 2. Es un directorio raíz que contiene código fuente, productos de compilación y documentos de instalación y es el entorno básico para el desarrollo de ROS 2.
4.1.2 Estructura del directorio del espacio de trabajo
| Directorios | Propósito | Si es control de versiones |
|---|---|---|
| Src/ | Almacenar la fuente del paquete funcional | Sí |
| build/ | Compilar productos intermedios | No |
| Install/ | Archivos de instalación final | No |
| log/ | Compilar y probar registros | No |
4.1.3 Tipo de área de trabajo
| Tipo | Ejemplo de ruta | Propósito |
|---|---|---|
| Espacio de trabajo del sistema | /opt/ros/humble/ | Software ROS 2 instalado |
| Espacio de trabajo del usuario | ~/ros2_ws/ | Desarrollo personal del espacio de trabajo |
| Espacio de trabajo de cobertura | ~/overlay_ws/ | Expandir o sobrescribir paquetes existentes |
4.2 Creación de espacios de trabajo
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
tree -L 24.3 Sistema compilador Colcon
sudo apt install -y python3-colcon-common-extensions
colcon --helpcd ~/ros2_ws
colcon build
colcon build --packages-select <package_name>
colcon build --packages-skip <package_name>colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Debug
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
colcon build --symlink-install --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON4.4 Cobertura del espacio de trabajo (Overlaying)
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
source ~/overlay_ws/install/setup.bash4.5 Configuración detallada del entorno
source install/setup.bash
echo $ROS_DOMAIN_ID
echo $AMENT_PREFIX_PATH
echo $LD_LIBRARY_PATHecho "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc4.6 Gestión de paquetes
ros2 pkg list
ros2 pkg prefix <package_name>
find src -maxdepth 2 -name package.xml -exec dirname {} \;ros2 pkg xml <package_name>
ros2 pkg dependencies <package_name>
ros2 pkg list > packages_list.txt4.7 Traducción incremental
colcon build
colcon build --packages-select <modified_package>colcon build --packages-select <package_name> --cmake-force-configure
rm -rf build install log
colcon build4.8 Prueba y certificación
colcon test
colcon test --packages-select <package_name>
colcon test-result --all
colcon test-result --verbose4.12 Próximos pasos
1.05 Paquete - Aprender a crear y administrar paquetes funcionales
2.06 Nodo - Preparación del primer nodo
05 Paquete
05 Paquetes funcionales (Packages)
5.1 Resumen de paquetes funcionales
5.1.1 ¿Qué es un paquete funcional?
El paquete es la unidad básica del código de la organización en ROS 2. Contiene códigos fuente, archivos de configuración, archivos de datos, scripts de construcción y documentos para funciones específicas.
5.1.3 Tipo de paquete funcional
| Tipo | Sistema de construcción | Lenguajes principales | Propósito |
|---|---|---|---|
| ament_cmake | CMake | C++ | Nodos C++, elementos mixtos |
| ament_python | Setuptools | Python | Proyecto Python puro |
| ament_cmake_python | CMake + Python | Mixto | Elementos mixtos C++ y Python |
5.2 Crear paquetes funcionales
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake my_cpp_pkg
ros2 pkg create --build-type ament_cmake \
--dependencies rclcpp std_msgs \
my_robot_controller
ros2 pkg create --build-type ament_cmake \
--dependencies rclcpp std_msgs geometry_msgs \
--node-name my_node \
--library-name my_library \
my_cpp_pkgcd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_py_pkg
ros2 pkg create --build-type ament_python \
--dependencies rclpy std_msgs \
my_python_package
ros2 pkg create --build-type ament_python \
--dependencies rclpy \
--node-name my_node \
my_py_pkg5.3 Configuración package.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>my_package</name>
<version>1.0.0</version>
<description>My ROS 2 package description</description>
<maintainer email="user@example.com">Your Name</maintainer>
<license>Apache-2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<depend>std_msgs</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package><depend>rclcpp</depend>
<depend>rclpy</depend>
<depend>std_msgs</depend>
<depend>geometry_msgs</depend>
<depend>sensor_msgs</depend>
<depend>nav_msgs</depend>
<depend>tf2</depend>
<depend>tf2_ros</depend>
<depend>tf2_geometry_msgs</depend>5.5 Configuración setup.py (Python)
from setuptools import setup
package_name = 'my_py_pkg'
setup(
name=package_name,
version='1.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='Your Name',
maintainer_email='user@example.com',
description='My ROS 2 Python package',
license='Apache-2.0',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'my_node = my_py_pkg.my_node:main',
],
},
)entry_points={
'console_scripts': [
'talker = my_py_pkg.talker:main',
'listener = my_py_pkg.listener:main',
'camera_node = my_py_pkg.camera:main',
],
}5.6 Compilación e instalación de paquetes
cd ~/ros2_ws
colcon build --packages-select my_cpp_pkg
colcon build --packages-select my_cpp_pkg --event-handlers console_direct+colcon build --packages-select pkg1 pkg2 pkg3
colcon build --packages-skip pkg_to_skipcolcon build --symlink-install
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON5.7 Confianza en la gestión
ros2 pkg dependencies my_package
ros2 pkg dependencies my_package --all
ros2 pkg dependents my_package
ros2 pkg xml my_package