Este proyecto implementa una simulación completa de un robot móvil de tracción diferencial. Integra SLAM (Simultaneous Localization and Mapping) para la generación de mapas y el stack Nav2 para la navegación autónoma, evasión de obstáculos y planificación de rutas.
- Simulación Física Realista: Robot modelado en URDF/Xacro con propiedades inerciales y físicas.
- Sensores Simulados: Lidar 2D (Ray Sensor) y Odometría precisa mediante plugin
DiffDrive. - Mapeo: Generación de mapas de ocupación estáticos usando
slam_toolboxen modo asíncrono. - Navegación Inteligente: Uso de Nav2 para ir de un Punto A a un Punto B esquivando obstáculos estáticos y dinámicos.
Asegúrate de tener instalado lo siguiente en Ubuntu 24.04:
- ROS 2 Jazzy Jalisco
- Gazebo Harmonic
- Paquetes de Navegación y Simulación:
sudo apt update sudo apt install ros-jazzy-navigation2 ros-jazzy-nav2-bringup \ ros-jazzy-slam-toolbox ros-jazzy-ros-gz-sim \ ros-jazzy-teleop-twist-keyboard ros-jazzy-xacro \ ros-jazzy-nav2-simple-commander
# Instrucciones de Ejecución y Simulación
Sigue estos pasos para compilar el entorno y ejecutar la simulación de navegación autónoma.
## 🛠️ Instalación y Compilación
**1. Clonar el repositorio**
```bash
git clone <https://github.com/jerimore/Nav_Autonoma_RobotDiferencial_RAMMEL.git>
2. Acceder al directorio de trabajo
cd ~/Nav_Autonoma_RobotDiferencial_RAMMEL/3. Construir el paquete
Utilizamos colcon con la opción de enlaces simbólicos para reflejar cambios en Python sin recompensar:
colcon build --symlink-install
4. Configurar el entorno (Source)
source install/setup.bash
5. Lanzar el entorno de navegación Ejecuta el siguiente comando para iniciar Gazebo ("Mundo Prueba") y RViz con la configuración de Nav2:
ros2 launch nav_bot navigation.launch.py
6. Estimación de la Pose Inicial (2D Pose Estimate) Una vez abiertos RViz y Gazebo, es crucial sincronizar la posición del robot.
- Nota: Asegúrate de que el mapa en RViz y el mundo en Gazebo tengan la misma orientación.
- Utiliza la herramienta 2D Pose Estimate en RViz para indicar dónde está el robot y hacia dónde mira.
Verificación de Estado:
Confirma que no existan errores en el panel izquierdo de RViz (Displays) ni en el estado de Nav2.

Tienes tres opciones para controlar el robot:
- Teleoperación: Usando el paquete
teleop_twist_keyboard. - Navegación por GUI: Usando Nav2 Goal.
- Navegación por Script: Ejecutando una misión automática en Python.
Utiliza la herramienta Nav2 Goal en la barra superior de RViz para establecer un objetivo en el mapa.
Resultado esperado:
El robot planificará la ruta y se orientará hacia el punto indicado por la flecha.

Este script envía al robot a una secuencia de puntos predefinidos (Punto A -> Espera 3s -> Punto B).
- Abre una nueva terminal.
- Navega a la carpeta del repositorio.
- Configura el entorno nuevamente:
source install/setup.bash
- Ejecuta el script de misión:
python3 mision_autonoma.py
Resultado de la misión: Verás en la consola el progreso del desplazamiento. En la simulación, el robot navegará automáticamente al Punto A, esperará 3 segundos y continuará hacia el Punto B.
## 🔧 Solución de Problemas Comunes (Troubleshooting)
### 🔴 Error: "No map received" en RViz
Este error puede deberse a dos causas principales. Verifica cuál es tu caso:
**Causa 1: Configuración de QoS incorrecta en RViz**
* **Solución:** En el panel izquierdo de RViz, despliega las propiedades del elemento **Map**. Busca la opción **Topic** -> **Durability Policy** y cámbiala a `Transient Local`.
**Causa 2: Mapa inexistente para un nuevo mundo**
* **Diagnóstico:** Si estás usando un mundo nuevo (`.sdf`) pero no has generado su mapa correspondiente (`.yaml` y `.pgm`), Nav2 no tendrá referencia para navegar.
* **Solución:** Debes realizar una sesión de mapeo (SLAM) antes de navegar. Sigue estos pasos:
1. **Lanza la simulación con tu mundo:**
```bash
ros2 launch nav_bot sim.launch.py
```
2. **Inicia SLAM Toolbox (Mapeo en vivo):**
```bash
ros2 launch slam_toolbox online_async_launch.py use_sim_time:=True
```
3. **Explora el entorno:**
Mueve el robot por toda el área para escanear los obstáculos.
```bash
ros2 run teleop_twist_keyboard teleop_twist_keyboard
```
4. **Guarda el mapa:**
Cuando el mapa en RViz esté completo, guárdalo:
```bash
ros2 run nav2_map_server map_saver_cli -f ~/ros2_ws/src/nav_bot/maps/mapa_nuevo
```
> **Nota:** Recuerda actualizar tu archivo `navigation.launch.py` para que apunte a `mapa_nuevo.yaml` antes de volver a lanzar la navegación.
---
### 🔴 Error: El robot no detecta obstáculos (Lidar no visible)
* **Causa:** Falta el plugin de sensores en el archivo de descripción del mundo (`.sdf`).
* **Solución:** Abre tu archivo `.sdf` y asegúrate de que el bloque `<world>` incluya el siguiente plugin:
```xml
<plugin name='gz::sim::systems::Sensors' filename='gz-sim-sensors-system'>
<render_engine>ogre2</render_engine>
</plugin>
```
---
### 🔴 Error: El mapa no carga al iniciar `navigation.launch.py`
* **Causa:** Ruta del archivo incorrecta o falta de compilación.
* **Solución:**
1. Verifica que el nombre del archivo en `navigation.launch.py` coincida exactamente con el archivo en la carpeta `maps/`.
2. Asegúrate de que los cambios se hayan reflejado en la carpeta `install` recompilando el paquete:
```bash
colcon build --symlink-install
source install/setup.bash
```


