Fundamentos y configuración de ROS2

Capítulo IX ROS2-Humble

NombrePropietarioModificadoCreado
01 Introducción a ROS2Yujiang2026-01-09 14:032026-01-09 14:03
02 Instalar HumbleYujiang2026-01-26 12:122026-01-09 14:03
03 Entorno de desarrollo integradoYujiang2026-01-26 14:552026-01-09 14:24
04 Espacio de trabajoYujiang2026-01-12 12:222026-01-09 14:25
05 PaqueteYujiang2026-01-12 12:222026-01-09 14:26
06 NodoYujiang2026-02-13 13:282026-01-09 14:26
07 Comunicación de tópicosYujiang2026-02-13 13:292026-01-09 14:27
08 Comunicaciones de servicioYujiang2026-02-06 13:572026-01-09 14:27
09 Comunicaciones de acciónYujiang2026-01-27 14:482026-01-09 14:27
10 Transformación de coordenadas TF2Yujiang2026-01-27 14:552026-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

ObjetivoPor qué importa
Compatibilidad con tiempo realMejor soporte para cargas de trabajo robóticas de baja latencia
Implementación distribuidaMúltiples nodos pueden ejecutarse en muchos procesos o máquinas
Confiabilidad y mantenibilidadMás adecuado para robótica de producción que las suposiciones de la era ROS 1
SeguridadSoporta comunicación segura y control de acceso
Soporte multiplataformaSe ejecuta en Linux, objetivos integrados y otros entornos modernos

1.1.3 Valores fundamentales de ROS 2

  1. Diseño modular: código organizado en paquetes separados que son fáciles de mantener, reutilizar y distribuir

  2. Comunicación distribuida: arquitectura informática distribuida multiprocesador, multimáquina

  3. Ecosistema rico: contiene un gran número de paquetes funcionales y herramientas de desarrollo de código abierto

  4. 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ísticaDescripción
AsíncronoLos publicadores y suscriptores no se bloquean entre sí
Uno a muchosMúltiples suscriptores pueden consumir el mismo tópico
Acoplamiento débilLos nodos solo acuerdan el nombre del tópico y el tipo de mensaje
Compatible con flujoBien adecuado para datos de sensores, telemetría y control continuo

Ejemplos típicos de tópicos:

Nombre del temaTipo de mensajePropósito
/cmd_velgeometry_msgs/msg/TwistComando de control de velocidad
/odomnav_msgs/msg/Odometrydatos de kilometraje
/scansensor_msgs/msg/LaserScanDatos de radar láser
/camera/image_rawsensor_msgs/msg/ImageDatos 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.

StreamPropósito
GoalDescribe la tarea a ejecutar
FeedbackReporta el progreso mientras la tarea se está ejecutando
ResultDevuelve 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.

Code
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)

BibliotecaLenguajeUso típico
rclcppC++Nodos de producción de alto rendimiento
rclpyPythonPrototipado rápido y scripting
rclcCMicro-ROS y sistemas con recursos limitados
rcljavaJavaIntegraciones de ROS 2 basadas en JVM
rclnodejsJavaScript / Node.jsIntegraciones web y de herramientas
cpp
#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_;
};
python
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 RMWBackend DDSCódigo abierto/comercialCaracterísticas
rmw_cyclonedds_cppCycloneDDSCódigo abiertoSelección predeterminada, eficiencia ligera
rmw_fastrtps_cppFastDDSCódigo abiertoEs muy funcional y de alto rendimiento.
rmw_connext_cppRTI ConnextComercialSoporte de nivel industrial, lo más completo

1.4 Diferencias principales entre ROS 1 y ROS 2

1.4.2 Tablas comparativas detalladas

Dimensiones relativasROS 1ROS 2
Comunicaciones intermediasProtocolo personalizado TCP/UDPProtocolo estándar DDS
Mecanismos de descubrimientoROS Master (centralizado)Descubrimiento de DDS (descentralización)
Sistema de construcciónCatkinColcon / Ament
Versión PythonPython 2/3Solo Python 3
Sistemas operativos compatiblesPrincipalmente LinuxLinux / Windows / macOS / RTOS
Soporte en tiempo realSin garantía en tiempo realSoporta tiempo real duro
Comunicaciones de múltiples robotsSe requiere configuración adicionalSoporte nativo (ROS_DOMAIN_ID)
SeguridadSin cifrado ni autenticaciónSoporta cifrado, autenticación, control de acceso
VersiónNoetic (versión final)Humble, Iron, Jazzy...

1.5 Versión de ROS 2

1.5.1 Historial de versiones

Designador de versiónTiempo de lanzamientoSistema soportadoEstado de soporteFecha límite
Ardent2017.12Ubuntu 16.04Terminado2019.04
Bouncy2018.06Ubuntu 16.04/18.04Terminado2019.09
Crystal2018.12Ubuntu 16.04/18.04Terminado2020.12
Dashing2019.05Ubuntu 16.04/18.04Terminado2021.05
Eloquent2019.11Ubuntu 18.04Terminado2021.11
Foxy2020.06Ubuntu 18.04/20.04Terminado2023.05
Galactic2021.05Ubuntu 20.04Terminado2022.11
Humble2022.05Ubuntu 22.04LTS2027.05
Iron2023.05Ubuntu 22.04Terminado2024.11
Jazzy2024.05Ubuntu 24.04LTS2029.05

1.5.3 Propuesta para la selección de una versión

Usar escenaVersión recomendadaRazón
Entorno de producciónHumbleEstable, soporte a largo plazo
Desarrollo de nuevos proyectosJazzyLTS más reciente, soporte a largo plazo
Estudio/experimentoReciente ScrollFunciones recientes
Mantenimiento de sistemas antiguosHumbleLa 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

bash
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 code
bash
sudo snap install --classic code
bash
code --version

3.3 Plugins requeridos

Nombre del pluginEditorPropósito
ROSMicrosoftSoporte de ROS
C/C++MicrosoftSoporte del lenguaje C++
PythonMicrosoftSoporte del lenguaje Python
CMake ToolsMicrosoftSoporte de CMake
bash
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-tools

3.4 Configuración del espacio de trabajo de ROS 2

bash
code ~/ros2_ws
json
{
  "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
}
bash
cd ~/ros2_ws
colcon build --cmake-args -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
ln -s build/compile_commands.json

3.4.4 Configurar el entorno Python

json
{
  "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

json
{
  "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

json
{
  "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"
  }
  ]
}
AtajosFunciones
F5Iniciar depuración
Ctrl+Shift+F5Reiniciar depuración
Shift+F5Detener depuración
F9Establecer/cerrar breakpoint
F10Step Over
F11Step Into
Shift+F11Step Out

3.11 Instalación de Terminator

bash
sudo apt install terminator

3.11.1 Inicio

Atajo Ctrl+Alt+T

3.12 Uso de Git

bash
sudo apt install git
bash
git init
git add .
git commit
ComandoPropósito
git initCrear un nuevo repositorio local
git statusVerificar 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 diffMostrar cambios sin staged
git logMostrar historial de commits
git remote -vListar remotos configurados
git push -u origin mainPush y establecer rama upstream
git pullObtener 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

DirectoriosPropósitoSi es control de versiones
Src/Almacenar la fuente del paquete funcional
build/Compilar productos intermediosNo
Install/Archivos de instalación finalNo
log/Compilar y probar registrosNo

4.1.3 Tipo de área de trabajo

TipoEjemplo de rutaPropó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

bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
tree -L 2

4.3 Sistema compilador Colcon

bash
sudo apt install -y python3-colcon-common-extensions
colcon --help
bash
cd ~/ros2_ws
colcon build
colcon build --packages-select <package_name>
colcon build --packages-skip <package_name>
bash
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=ON

4.4 Cobertura del espacio de trabajo (Overlaying)

bash
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
source ~/overlay_ws/install/setup.bash

4.5 Configuración detallada del entorno

bash
source install/setup.bash
echo $ROS_DOMAIN_ID
echo $AMENT_PREFIX_PATH
echo $LD_LIBRARY_PATH
bash
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

4.6 Gestión de paquetes

bash
ros2 pkg list
ros2 pkg prefix <package_name>
find src -maxdepth 2 -name package.xml -exec dirname {} \;
bash
ros2 pkg xml <package_name>
ros2 pkg dependencies <package_name>
ros2 pkg list > packages_list.txt

4.7 Traducción incremental

bash
colcon build
colcon build --packages-select <modified_package>
bash
colcon build --packages-select <package_name> --cmake-force-configure
rm -rf build install log
colcon build

4.8 Prueba y certificación

bash
colcon test
colcon test --packages-select <package_name>
colcon test-result --all
colcon test-result --verbose

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

TipoSistema de construcciónLenguajes principalesPropósito
ament_cmakeCMakeC++Nodos C++, elementos mixtos
ament_pythonSetuptoolsPythonProyecto Python puro
ament_cmake_pythonCMake + PythonMixtoElementos mixtos C++ y Python

5.2 Crear paquetes funcionales

bash
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_pkg
bash
cd ~/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_pkg

5.3 Configuración package.xml

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>
xml
<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)

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',
  ],
  },
)
python
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

bash
cd ~/ros2_ws
colcon build --packages-select my_cpp_pkg
colcon build --packages-select my_cpp_pkg --event-handlers console_direct+
bash
colcon build --packages-select pkg1 pkg2 pkg3
colcon build --packages-skip pkg_to_skip
bash
colcon 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=ON

5.7 Confianza en la gestión

bash
ros2 pkg dependencies my_package
ros2 pkg dependencies my_package --all
ros2 pkg dependents my_package
ros2 pkg xml my_package