Para lograr que un robot inicie automáticamente sus módulos funcionales al arrancar el sistema, es necesario abordar dos aspectos clave: la preparación de un script de inicio que ejecute los nodos y archivos launch de ROS en el orden correcto, y la configuración del sistema operativo para ejecutar dicho script al inicio.
La estabilidad en el autoarranque puede verse afectada por la asignación de puertos USB. Para solucionar posibles inconsistencias con los dispositivos seriales, se recomienda configurar reglas udev para fijar los nombres de los puertos.
1. Preparación del entorno y scripts de lanzamiento
Primero, asegúrese de que el antorno de trabajo de ROS se cargue automáticamente. Edite el archivo ~/.bashrc y añada la línea de sourcing correspondiente a su workspace:
source /home/usuario/proyecto_ws/devel/setup.bash
Existen dos enfoques principales para orquestar el inicio de múltiples componentes ROS.
Opción A: Utilizando un archivo launch maestro
Este método centraliza la ejecución en un único archivo launch que incluye otros launch o define nodos directamente. Permite un control preciso del orden de ejecución mediante etiquetas como include.
<launch>
<!-- Carga el modelo del robot -->
<include file="$(find paquete_robot)/launch/modelo.launch" />
<!-- Espera y luego inicia la navegación -->
<include file="$(find paquete_navegacion)/launch/navegar.launch" />
<!-- Lanza un nodo con terminal visible para depuración -->
<node pkg="paquete_robot" type="monitor_sensor.py" name="monitor" output="screen"
launch-prefix="xterm -e" />
<!-- Otros nodos independientes -->
<node pkg="servidor_mapas" type="cargador_mapas" name="mapa_loader" />
</launch>
Para ejecutarlo, simplemente invoque roslaunch paquete_robot inicio_maestro.launch.
Opción B: Mediante un script de orquestación
Un script en Python o Bash puede ofrecer mayor flexibilidad, como añadir retrasos personalizados o manejar errores de forma granular. El siguiente ejemplo en Python ilustra una estrategia de ejecución secuencial con tiempos de espera configurables:
#!/usr/bin/env python3
import subprocess
import sys
import time
def ejecutar_comando(comando, esperar=True, retraso_posterior=0):
"""Lanza un proceso ROS y opcionalmente espera su finalización."""
try:
proc = subprocess.Popen(comando)
if esperar:
proc.wait()
if proc.returncode != 0:
print(f"Fallo en: {' '.join(comando)}")
sys.exit(proc.returncode)
if retraso_posterior > 0:
time.sleep(retraso_posterior)
return proc
except FileNotFoundError:
print(f"Comando no encontrado: {comando[0]}")
sys.exit(1)
if __name__ == "__main__":
print("Iniciando secuencia de carga del sistema...")
try:
# Fase 1: Cargar drivers y modelo
ejecutar_comando(
["roslaunch", "paquete_robot", "drivers.launch"],
esperar=False,
retraso_posterior=3
)
# Fase 2: Iniciar sistemas de navegación
ejecutar_comando(
["roslaunch", "paquete_navegacion", "slam.launch"],
esperar=False
)
print("Módulos ROS lanzados.")
except Exception as e:
print(f"Error en la secuencia de arranque: {e}")
sys.exit(1)
2. Configuración del autoarranque en el sistema
Una vez que el script de inicio funciona correctamente, se debe configurar el sistema para que lo ejecute al encenderse.
2.1 Crear un script de shell ejecutable
Cree un archivo inicio_robot.sh con el contenido básico. Este script cargará el entorno de ROS y ejecutará el launch o script principal.
#!/bin/bash
# Cargar el entorno de ROS y del workspace
source /opt/ros/noetic/setup.bash
source /home/robot/proyecto_ws/devel/setup.bash
# Iniciar el sistema (usar launch o script Python)
roslaunch paquete_robot inicio_maestro.launch
exit 0
2.2 Asignar permisos de ejecución
Es un paso obligatorio para que el sistema pueda correr el script.
sudo chmod +x /home/robot/inicio_robot.sh
2.3 Registrar en el gestor de inicio de sesión
En sistemas Ubuntu con entorno gráfico GNOME, se puede añadir el script a las aplicaciones de inicio mediante la herramienta gnome-session-properties. En la interfaz, agregue una nueva entrada donde el "Comando" sea la ruta completa al script /home/robot/inicio_robot.sh.
Tras reiniciar el equipo, los nodos y procesos ROS definidos deberían iniciarse de forma automática.