tutoriales.com

Robots con Lidar: Mapeo y Navegación SLAM para Entornos Interiores 🗺️

Descubre cómo equipar a tu robot con capacidades avanzadas de percepción y navegación utilizando tecnología Lidar para la creación de mapas (SLAM) y la localización en entornos interiores. Este tutorial te guiará paso a paso en los fundamentos, la selección de hardware y la implementación práctica para que tu robot pueda explorar y desplazarse de forma autónoma. Prepárate para darle inteligencia espacial a tus proyectos de robótica.

Intermedio20 min de lectura6 views
Reportar error

La robótica móvil ha avanzado a pasos agigantados, y gran parte de ese progreso se debe a la mejora en los sensores de percepción y los algoritmos de navegación. Uno de los pilares de la navegación autónoma es la capacidad del robot para construir un mapa de su entorno mientras se localiza dentro de ese mapa. Esto se conoce como SLAM: Simultaneous Localization and Mapping (Localización y Mapeo Simultáneos).

En este tutorial, nos centraremos en el uso de sensores Lidar (Light Detection and Ranging) para implementar SLAM en robots que operarán en entornos interiores. Los Lidar ofrecen una precisión y fiabilidad excepcionales para la detección de distancias y la creación de nubes de puntos 3D o mapas 2D, lo que los convierte en una herramienta invaluable para la navegación robótica.


🎯 ¿Qué aprenderás en este tutorial?

Al finalizar este tutorial, serás capaz de:

  • Comprender los principios básicos de la tecnología Lidar y su aplicación en robótica.
  • Entender el concepto de SLAM y por qué es crucial para la navegación autónoma.
  • Seleccionar el hardware Lidar adecuado para tu proyecto.
  • Configurar un entorno de desarrollo para SLAM (ej. con ROS).
  • Implementar algoritmos de SLAM para crear mapas de entornos interiores.
  • Utilizar esos mapas para la navegación autónoma del robot.

📖 Fundamentos de Lidar y SLAM

Antes de sumergirnos en la implementación, es fundamental comprender la teoría detrás de los Lidar y el SLAM.

¿Qué es un Lidar? 💡

Un Lidar es un sensor que mide distancias utilizando luz láser. Funciona emitiendo pulsos de luz láser y midiendo el tiempo que tarda esa luz en rebotar en un objeto y regresar al sensor (principio de tiempo de vuelo). Al hacer esto miles de veces por segundo y en diferentes direcciones (rotando el sensor), el Lidar puede construir una "nube de puntos" que representa la geometría del entorno.

💡 Consejo: A diferencia de los sensores de infrarrojos o ultrasonidos que dan una única medida de distancia, un Lidar genera un escaneo completo del entorno, proporcionando una imagen mucho más rica y detallada.

Tipos de Lidar para Robótica Móvil

Existen varios tipos, pero para robótica móvil en interiores, los más comunes son:

  • Lidar 2D (o de barrido): Giran 360 grados y miden distancias en un plano horizontal, creando un mapa 2D. Son ideales para SLAM 2D y evitación de obstáculos en superficies planas.
  • Lidar 3D (o de estado sólido/multicapa): Miden distancias en múltiples planos o con un campo de visión 3D, generando nubes de puntos tridimensionales. Más complejos y costosos, pero ofrecen una percepción espacial superior.

Para este tutorial, nos centraremos en los Lidar 2D debido a su popularidad, coste-efectividad y facilidad de integración para aplicaciones SLAM 2D en interiores.

Entendiendo SLAM: Localización y Mapeo Simultáneos 🗺️

SLAM es el problema de construir o actualizar un mapa de un entorno desconocido mientras, al mismo tiempo, se rastrea la posición de un agente dentro de ese mapa. Imagina que entras en una habitación a oscuras con una linterna (tu Lidar). A medida que te mueves y iluminas, vas dibujando mentalmente un mapa de la habitación y, simultáneamente, sabes dónde estás en ese mapa.

📌 Nota: El "problema del pollo y el huevo" de SLAM reside en que necesitas un mapa para localizarte, pero necesitas saber tu localización para construir un mapa. Los algoritmos SLAM resuelven esto iterativamente, refinando tanto la posición como el mapa con cada nueva medida.

Componentes clave de SLAM

  1. Sensores: Los Lidar son excelentes, pero también se pueden usar cámaras (SLAM visual), sensores de profundidad (Kinect), o una combinación de ellos (SLAM multisensor).
  2. Odometría: Información sobre el movimiento del robot (ej. de encoders de ruedas). Ayuda a estimar la posición actual, aunque suele acumular errores.
  3. Algoritmos de Mapeo: Procesan los datos del sensor para construir y actualizar el mapa. Pueden ser basados en cuadrículas (grid maps) o basados en características (feature maps).
  4. Algoritmos de Localización: Utilizan el mapa existente y los datos del sensor para estimar la posición del robot dentro de ese mapa.
  5. Cierre de Bucle (Loop Closure): Detectar si el robot ha regresado a una ubicación previamente visitada. Esto es crucial para corregir la acumulación de errores en el mapa y la odometría.

🛠️ Selección de Hardware: El Kit Básico

Para este proyecto, necesitaremos un robot móvil y un sensor Lidar.

Robot Base

Cualquier plataforma robótica móvil diferencial (dos ruedas motrices y una rueda loca) es adecuada. Asegúrate de que tenga suficiente espacio y capacidad de carga para el Lidar y una placa de control.

  • Chasis: Preferiblemente con una base plana para montar componentes.
  • Motores con encoders: Los encoders son cruciales para obtener una odometría fiable, que es la estimación del movimiento del robot basada en la rotación de las ruedas.
  • Controlador de motor: Compatible con tus motores.
  • Placa de control: Una Raspberry Pi, Jetson Nano o incluso una ESP32 potente (si tu Lidar tiene drivers para ella) son buenas opciones. Nos decantaremos por Raspberry Pi por su soporte con ROS.
  • Batería y regulador de voltaje: Para alimentar todos los componentes.

Sensor Lidar Recomendado (2D)

Para empezar, un Lidar 2D es lo ideal. Algunas opciones populares incluyen:

  • RPLidar A1/A2/A3/S1: Son muy comunes, tienen buen rendimiento para interiores y drivers bien documentados en ROS. Ofrecen un buen equilibrio entre precio y prestaciones.
  • YDlidar G4/G2: Alternativas a RPLidar, también con buen soporte en ROS.
🔥 Importante: Verifica que el Lidar que elijas tenga un driver ROS (si planeas usar ROS, lo cual es altamente recomendable para SLAM) y que su rango y precisión sean adecuados para el tamaño de tu entorno.

Conectividad del Lidar

La mayoría de los Lidar se conectan a la placa de control (Raspberry Pi, por ejemplo) a través de USB o UART (serial). Necesitarás un cable o adaptador adecuado.

Tabla de especificaciones de Lidar (ejemplo RPLidar A1M8):

CaracterísticaValorNotas
---------
Rango de Medición0.15 - 12 metrosSuficiente para la mayoría de interiores
Frecuencia de Escaneo5.5 HzPermite mapeo en tiempo real
---------
Resolución Angular0.9 - 2.2 gradosDetalle adecuado para formas de habitaciones
InterfazUART / USBFácil de conectar a Raspberry Pi
---------
Voltaje Operativo5VAlimentación estándar

⚙️ Entorno de Desarrollo: ROS para SLAM

Para este tutorial, utilizaremos ROS (Robot Operating System) por su robustez, la gran cantidad de herramientas y paquetes disponibles para robótica, incluyendo SLAM y navegación.

Instalación de ROS en Raspberry Pi

Asumiremos que tienes una Raspberry Pi con Raspberry Pi OS (anteriormente Raspbian). Necesitarás una instalación de ROS (preferiblemente Noetic si estás en Ubuntu 20.04/Raspberry Pi OS Bullseye, o Humble si es más reciente).

  1. Actualizar el sistema:
sudo apt update
sudo apt upgrade
  1. Instalar ROS Noetic (ejemplo): Sigue las instrucciones oficiales de ROS para la instalación de "Desktop-Full Install" o "ROS-Base Install" si el espacio es una preocupación. Para Raspberry Pi, la instalación desde paquetes Debian es la más sencilla.
# Configurar fuentes de ROS
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt install curl # if you haven't already installed curl
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo apt update

# Instalación base (para entornos con recursos limitados)
sudo apt install ros-noetic-ros-base

# Inicializar rosdep
sudo rosdep init
rosdep update

# Configurar el entorno ROS
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

Paquetes ROS Necesarios

Necesitaremos varios paquetes:

  • Driver del Lidar: ros-noetic-rplidar-ros (o el equivalente para tu Lidar).
  • SLAM GMapping: ros-noetic-slam-gmapping (un algoritmo SLAM popular y efectivo para Lidar 2D).
  • Navigation Stack: ros-noetic-navigation (para la navegación autónoma una vez que tengamos un mapa).
sudo apt install ros-noetic-rplidar-ros ros-noetic-slam-gmapping ros-noetic-navigation

🚀 Puesta en Marcha: Adquiriendo Datos del Lidar

Una vez que tengas todo instalado y conectado, el primer paso es verificar que el Lidar esté funcionando y publicando datos en ROS.

  1. Conecta el Lidar: Asegúrate de que el Lidar esté correctamente conectado a tu Raspberry Pi (generalmente por USB).

  2. Identifica el puerto serie: El Lidar se montará como un dispositivo serie. Puedes encontrarlo con ls /dev/tty* y buscar algo como /dev/ttyUSB0 o /dev/ttyACM0.

  3. Lanza el driver del Lidar: Cada Lidar tiene su propio paquete ROS con un nodo que se encarga de comunicarse con el hardware y publicar los datos de escaneo como mensajes sensor_msgs/LaserScan.

    Para RPLidar, puedes usar el siguiente comando (sustituye /dev/ttyUSB0 por tu puerto real si es diferente):

roslaunch rplidar_ros view_rplidar.launch
Este comando iniciará el driver y RVIZ (una herramienta de visualización de ROS) para que puedas ver los escaneos en tiempo real. Si no quieres RVIZ en la Raspberry Pi (que consume muchos recursos), puedes ejecutar solo el nodo del driver:
roslaunch rplidar_ros rplidar.launch
Y luego usar RVIZ en una máquina de desarrollo conectada a la misma red, configurando la variable `ROS_MASTER_URI`.

4. Verifica los datos: Abre una nueva terminal y usa rostopic list para ver los tópicos disponibles. Deberías ver /scan. Luego, rostopic echo /scan para ver los datos del Lidar en formato de mensaje.

Lidar Raspberry Pi (USB/UART) Nodo ROS del Lidar Tópico /scan (ROS)

🏗️ Mapeo con SLAM GMapping

Una vez que el Lidar está publicando datos, podemos iniciar el proceso de mapeo utilizando un algoritmo SLAM. GMapping es una opción excelente y ampliamente utilizada para Lidar 2D.

Preparando el Robot para el Mapeo

Para que GMapping funcione correctamente, necesita no solo los datos del Lidar, sino también una estimación de la odometría del robot. Esto se logra con:

  1. Nodo de Odometría: Si tu robot tiene encoders, necesitarás un nodo ROS que lea los encoders, calcule la pose (posición y orientación) del robot y publique mensajes nav_msgs/Odometry en un tópico (ej. /odom). Este nodo también debe publicar la transformación tf de base_link a odom.

  2. Transformación Estática del Lidar: Debes especificar la posición y orientación del Lidar en relación con el base_link del robot. Esto se hace con un static_transform_publisher o en un archivo URDF/XACRO del robot.

    Ejemplo de static_transform_publisher (si el Lidar está centrado en base_link):

rosrun tf static_transform_publisher 0 0 0 0 0 0 base_link laser 100
Aquí: `x y z yaw pitch roll parent_frame child_frame rate`.

Lanzando GMapping

El paquete slam_gmapping proporciona un nodo que se suscribe a los tópicos /scan y /odom y publica el mapa como nav_msgs/OccupancyGrid en /map y la transformación tf de map a odom.

Puedes lanzar GMapping con:

roslaunch slam_gmapping gmapping_demo.launch

El archivo gmapping_demo.launch es un ejemplo genérico. Es probable que necesites crear tu propio archivo .launch personalizado para ajustar los parámetros de GMapping a tu robot y entorno, y para asegurar que los nombres de los tópicos (scan_topic, odom_frame, base_frame) sean correctos.

⚠️ Advertencia: Los parámetros de GMapping (como `map_update_interval`, `linear_update`, `angular_update`, `maxUrange`) son críticos para el rendimiento del mapeo. Puede que necesites experimentar con ellos para obtener los mejores resultados en tu entorno.

Visualización del Mapa en RVIZ

Mientras GMapping se ejecuta, puedes visualizar el mapa que se está construyendo en RVIZ. Necesitarás añadir los siguientes displays:

  • Map: Suscríbete al tópico /map.
  • LaserScan: Suscríbete al tópico /scan.
  • TF: Para ver las transformaciones de los frames.

A medida que muevas el robot lentamente por el entorno, verás cómo se va construyendo el mapa. Intenta cubrir todo el espacio de forma sistemática para obtener un mapa completo y preciso.

Usuario (Mover Robot) Sensores Odometría (encoders) LiDAR (/scan) Nodo GMapping Mapa /map (OccupancyGrid) Transformación tf (map -> odom)

Guardar el Mapa

Una vez que estés satisfecho con el mapa, puedes guardarlo utilizando la herramienta map_saver de ROS:

rosrun map_server map_saver -f my_indoor_map

Esto creará dos archivos en tu directorio actual: my_indoor_map.pgm (la imagen del mapa en escala de grises) y my_indoor_map.yaml (metadatos del mapa, como la resolución y el origen).


🚶 Navegación Autónoma con el Mapa Creado

Con un mapa guardado, el siguiente paso es permitir que el robot navegue de forma autónoma hasta un punto objetivo. Esto se logra con el navigation_stack de ROS, que incluye paquetes como amcl para localización y move_base para planificación de rutas.

Localización con AMCL (Adaptive Monte Carlo Localization)

AMCL es un algoritmo de localización probabilística que utiliza filtros de partículas para estimar la pose del robot en un mapa conocido. Toma los datos del Lidar y la odometría, y los compara con el mapa guardado para determinar la posición más probable del robot.

  1. Cargar el mapa: Primero, debes cargar el mapa que guardaste. Esto se hace con el nodo map_server:
rosrun map_server map_server my_indoor_map.yaml
  1. Lanzar AMCL: El nodo AMCL se encarga de la localización. Puedes usar un archivo de lanzamiento como amcl_demo.launch del paquete navigation o crear uno propio, asegurándote de que los parámetros (scan_topic, initial_pose_x, initial_pose_y, etc.) sean correctos.
roslaunch turtlebot3_navigation amcl.launch map_file:=/path/to/my_indoor_map.yaml
(Este es un ejemplo de Turtlebot3, adapta el archivo `launch` para tu robot). Lo importante es que `amcl` reciba los datos del Lidar (`/scan`) y la odometría (`/odom`), y que tenga acceso al mapa (`/map`).

3. Configuración inicial en RVIZ: Cuando AMCL se inicia, el robot no sabe dónde está. Debes darle una estimación inicial de su posición en el mapa. Esto se hace en RVIZ usando la herramienta "2D Pose Estimate" y haciendo clic y arrastrando sobre el mapa para indicar dónde crees que está el robot y hacia dónde mira.

<div class="callout tip">💡 <strong>Consejo:</strong> Si AMCL pierde la localización, puedes reiniciar el proceso o darle otra estimación de pose. Un buen ajuste de parámetros (`min_particles`, `max_particles`, `update_min_d`, `update_min_a`) es crucial para una localización robusta.</div>

Planificación y Ejecución con Move Base

move_base es el corazón del stack de navegación de ROS. Coordina los planificadores globales y locales, la recuperación y la interfaz con el robot para enviarle comandos de velocidad.

  1. Lanzar move_base: Necesitas un archivo de lanzamiento que configure move_base y sus plugins. Este archivo típicamente incluirá:

    • costmap_common_params.yaml
    • global_costmap_params.yaml
    • local_costmap_params.yaml
    • base_local_planner_params.yaml

    Estos archivos definen cómo move_base construye los costmaps (mapas de costos que incluyen obstáculos y áreas prohibidas) y cómo el planificador local genera comandos de velocidad.

roslaunch your_robot_navigation move_base.launch
Donde `your_robot_navigation` es tu propio paquete de navegación y `move_base.launch` contiene la configuración necesaria.

2. Enviar un objetivo de navegación: En RVIZ, usa la herramienta "2D Nav Goal". Haz clic en el punto del mapa al que quieres que vaya el robot y arrastra para indicar la orientación final deseada.

El robot calculará una ruta global, luego una ruta local, y empezará a moverse. Si encuentra obstáculos inesperados, el planificador local intentará evitarlos. Si se bloquea, puede intentar recuperarse.
Mapa (map_server) Lidar (/scan) Odometría (/odom) Costmaps (G/L) Meta (Nav Goal) AMCL Pose del Robot Move Base cmd_vel (Robot)
Parámetros clave de move_base El archivo `move_base.launch` y sus archivos YAML de configuración son donde realmente se personaliza el comportamiento de navegación. Algunos parámetros importantes incluyen:
  • global_frame, robot_base_frame, odom_frame: Asegúrate de que coincidan con tus marcos TF.
  • footprint: La forma física del robot, crucial para la detección de colisiones.
  • inflation_radius: Área alrededor de los obstáculos que el robot evitará.
  • max_vel_x, max_vel_theta: Velocidades máximas del robot.
  • yaw_goal_tolerance, xy_goal_tolerance: Criterios para considerar que el robot ha llegado al objetivo.

Dedica tiempo a ajustar estos parámetros para que la navegación sea suave y segura en tu entorno.

Consideraciones Adicionales

  • Seguridad: Asegúrate de que tu robot esté programado para detenerse o tomar acciones seguras si hay un fallo en la navegación o detección de obstáculos críticos.
  • Rendimiento: SLAM y navegación pueden ser intensivos en computación. Una Raspberry Pi 4 es una buena opción, pero para entornos muy grandes o Lidar 3D, podrías necesitar una Jetson Nano o incluso una mini-PC.
  • Diagnóstico: Utiliza rqt_graph para visualizar el grafo de nodos y tópicos, y rviz para monitorear el estado del robot, el mapa y la planificación en tiempo real.

✅ Conclusión y Pasos Siguientes

¡Felicidades! Has completado un recorrido exhaustivo por los fundamentos y la implementación práctica de robots con Lidar para mapeo y navegación SLAM en entornos interiores. Has aprendido a integrar un sensor Lidar, a usar GMapping para construir mapas y a emplear AMCL y Move Base para la localización y navegación autónoma.

La robótica es un campo en constante evolución, y hay mucho más por explorar. Aquí tienes algunas ideas para llevar tu proyecto al siguiente nivel:

  • SLAM 3D: Explora Lidar 3D y algoritmos SLAM 3D como Cartographer o LOAM para una percepción y mapeo aún más detallados.
  • Fusión de Sensores: Combina el Lidar con cámaras (SLAM visual-Lidar) o IMUs para mejorar la robustez y precisión del SLAM.
  • Exploración Autónoma: Implementa algoritmos de exploración para que el robot mapee un entorno desconocido de forma completamente autónoma, sin intervención manual.
  • Manipulación: Una vez que el robot sabe dónde está, puedes añadir un brazo manipulador para interactuar con objetos en el entorno mapeado.

La capacidad de un robot para comprender y navegar por su entorno es fundamental para su utilidad. Con el Lidar y las herramientas de ROS, tienes una base sólida para construir sistemas robóticos autónomos e inteligentes.

Tutorial Completado

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!