Sistema de calibración de IMU mediante GPS RTK para obtener orientación absoluta en robots móviles autónomos.
- Descripción General
- El Problema
- La Solución
- Características Principales
- Requisitos
- Instalación
- Uso
- Arquitectura del Sistema
- Parámetros de Configuración
- Validación y Precisión
- Troubleshooting
- Contribución
- Licencia
- Autores
imu_satellital_calibration es un paquete ROS Noetic que resuelve uno de los desafíos fundamentales en robótica móvil autónoma: obtener la orientación absoluta (norte verdadero) de un robot sin depender de magnetómetros.
El sistema utiliza GPS RTK de alta precisión para calibrar una IMU, permitiendo que robots móviles naveguen de forma autónoma con orientación absoluta referenciada a coordenadas geográficas (ENU/UTM).
En navegación autónoma, conocer la orientación absoluta del robot es crucial para:
- Fusión de sensores (GPS + IMU) en
robot_localization - Planificación de trayectorias en
move_base - Localización global sin puntos de referencia artificiales
- Navegación en exteriores donde no hay landmarks confiables
Las IMUs tradicionales (acelerómetro + giroscopio + magnetómetro) presentan varios problemas:
- Las IMUs solo entregan orientación relativa
- El error se acumula con el tiempo (deriva)
- Sin referencia absoluta, la orientación se vuelve inútil en minutos
- Los magnetómetros son extremadamente sensibles a:
- Motores eléctricos del robot
- Estructuras metálicas
- Cables de potencia
- Baterías
- Electrónica cercana
- Calibración magnética compleja y poco confiable
- Variación magnética geográfica
Robot con IMU convencional:
┌─────────────┐
│ Orientación│ ← Solo relativa, sin norte verdadero
│ relativa │ ← Deriva con el tiempo
│ (magnética)│ ← Interferencias magnéticas
└─────────────┘
↓
⚠️ No apta para navegación autónoma de largo plazo
Este paquete implementa un método innovador que elimina completamente la dependencia del magnetómetro:
┌─────────────────────────────────────────────────────────┐
│ CALIBRACIÓN SATELITAL IMU │
│ │
│ GPS RTK (±2cm) + Trayectoria Controlada │
│ ↓ │
│ Orientación Absoluta (Norte Verdadero) │
│ ↓ │
│ IMU con Orientación Absoluta ENU/UTM │
└─────────────────────────────────────────────────────────┘
FASE 1: Datum P1 FASE 2: Trayectoria FASE 3: Datum P2
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ GPS RTK │ │ Robot avanza │ │ GPS RTK │
│ Punto Origen │ ────────────▶│ en línea │───────────▶│ Punto Destino│
│ (2 min) │ │ recta (30m) │ │ (2 min) │
└──────────────┘ └──────────────┘ └──────────────┘
Lat1, Lon1 Control PID Lat2, Lon2
│ │ │
└──────────────────────────────┴───────────────────────────┘
│
FASE 4: Cálculo Ángulo
┌──────────────────────┐
│ Bearing P1 → P2 │
│ (Norte Verdadero) │
└──────────────────────┘
│
FASE 5: Republicador IMU
┌──────────────────────┐
│ /imu/data_absolute │
│ Orientación Absoluta │
│ + Integración Gyro │
└──────────────────────┘
✅ Sin magnetómetro - Elimina interferencias electromagnéticas
✅ Precisión centimétrica - RTK FIX proporciona ±2-5 cm
✅ Norte verdadero - Orientación geodésica absoluta
✅ Integración de giroscopio - Mantiene orientación entre mediciones GPS
✅ Compatible con ROS - Funciona con robot_localization, move_base, etc.
✅ Automático - Un solo comando ejecuta todo el proceso
- Verifica calidad RTK FIX antes de recolectar datos
- Requiere N muestras consecutivas estables
- Timeout configurable
- Detección de pérdida de señal
- Algoritmo MAD (Median Absolute Deviation)
- Elimina mediciones espurias
- Threshold configurable
- Estadísticas de calidad
- PID para mantener línea recta
- Perfil de velocidad trapezoidal
- Parámetros configurables
- Monitoreo en tiempo real
- Fórmula Haversine para distancia
- Bearing inicial entre puntos
- Conversión GPS → ENU/UTM
- Normalización angular
- Orientación absoluta inicial
- Integración de velocidades angulares
- Covarianzas apropiadas
- Frame absoluto
/imu/data_absolute
| Componente | Especificación | Requerido |
|---|---|---|
| GPS RTK | Receptor con correcciones RTK, topic NMEA GGA | ✅ Sí |
| IMU | Con giroscopio (BNO080, MPU9250, etc.) | ✅ Sí |
| Robot Móvil | Capacidad de movimiento controlado | ✅ Sí |
| Espacio Abierto | 50m mínimo, vista despejada al cielo | ✅ Sí |
| Estación Base RTK | O servicio NTRIP para correcciones | ✅ Sí |
| Dependencia | Versión | Instalación |
|---|---|---|
| ROS | Noetic (Ubuntu 20.04) | sudo apt install ros-noetic-desktop-full |
| Python | 3.8+ | Incluido en Ubuntu 20.04 |
| NumPy | - | sudo apt install python3-numpy |
| PyYAML | - | sudo apt install python3-yaml |
| TF | - | sudo apt install ros-noetic-tf |
sudo apt install \
ros-noetic-sensor-msgs \
ros-noetic-geometry-msgs \
ros-noetic-nmea-msgs# 1. Navegar al workspace de catkin
cd ~/catkin_ws/src
# 2. Clonar el repositorio
git clone https://github.com/tu-usuario/imu_satellital_calibration.git
# 3. Compilar
cd ~/catkin_ws
catkin_make
# 4. Source del workspace
source devel/setup.bash# 1. Crear el paquete
cd ~/catkin_ws/src
mkdir -p imu_satellital_calibration/{scripts,launch,src/imu_satellital_calibration}
# 2. Copiar archivos
cd imu_satellital_calibration
# Copiar CMakeLists.txt, package.xml, setup.py
# 3. Copiar scripts Python
cp *.py scripts/
chmod +x scripts/*.py
# 4. Copiar launch files
cp *.launch launch/
# 5. Crear __init__.py
touch src/imu_satellital_calibration/__init__.py
# 6. Compilar
cd ~/catkin_ws
catkin_make
source devel/setup.bash# Verificar que el paquete se encuentre
rospack find imu_satellital_calibration
# Listar nodos disponibles
rospack list-names | grep imu_satellital
# Verificar dependencias
rosdep check imu_satellital_calibrationEl proceso completo se ejecuta con un solo comando:
roslaunch imu_satellital_calibration launch_imu_calibration.launchEste comando ejecutará automáticamente las 5 fases:
- ⏳ Validación RTK (hasta 5 minutos)
- 📍 Datum P1 (2 minutos de recolección)
- 🚗 Trayectoria (30 metros en línea recta)
- 📍 Datum P2 (2 minutos de recolección)
- 🧭 Cálculo de ángulo + Republicador IMU
Tiempo total estimado: ~10-15 minutos
roslaunch imu_satellital_calibration launch_imu_calibration.launch \
nmea_topic:=/ublox/gngga \
gps_topic:=/ublox/fix \
imu_topic:=/bno080/imu \
travel_distance:=40.0 \
v_max:=1.0 \
collection_time:=180.0 \
require_rtk:=true \
rtk_quality:=4┌─────────────────────────────────────────────────────────────────┐
│ COORDINADOR PRINCIPAL │
│ (calibration_coordinator.py) │
└────────────────────────┬────────────────────────────────────────┘
│
┌────────────────┼────────────────┐
│ │ │
▼ ▼ ▼
┌───────────────┐ ┌──────────────┐ ┌─────────────────┐
│ DATUM P1 │ │ TRAYECTORIA │ │ DATUM P2 │
│ Collector │ │ Controlada │ │ Collector │
└───────┬───────┘ └──────┬───────┘ └────────┬────────┘
│ │ │
│ datum_p1.yaml │ │ datum_p2.yaml
│ │ │
└────────────────┼───────────────────┘
│
▼
┌─────────────────────┐
│ DEGREE COLLECTOR │
│ Cálculo de Ángulo │
└──────────┬──────────┘
│
│ yaw_offset.yaml
▼
┌─────────────────────┐
│ IMU REPUBLISHER │
│ Orientación Absoluta│
└──────────┬──────────┘
│
▼
/imu/data_absolute
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
nmea_topic |
string | /gngga |
Tópico NMEA con mensajes GGA para RTK |
gps_topic |
string | /fix |
Tópico GPS NavSatFix |
imu_topic |
string | /imu/data |
Tópico IMU de entrada |
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
require_rtk |
bool | true |
Requiere RTK FIX antes de iniciar |
rtk_quality |
int | 4 |
Quality mínimo (4=FIX, 5=FLOAT) |
rtk_samples |
int | 10 |
Muestras consecutivas para validar |
rtk_timeout |
float | 300.0 |
Timeout en segundos (5 min) |
| Condición | Precisión Lateral | Precisión Angular | Calidad |
|---|---|---|---|
| RTK FIX (Quality 4) | ±2-5 cm | ±0.1° | ⭐⭐⭐ Excelente |
| RTK FLOAT (Quality 5) | ±10-30 cm | ±0.3° | ⭐⭐ Buena |
| DGPS (Quality 2) | ±1-5 m | ±2° | ⭐ Aceptable |
Soluciones:
- Verificar señal GPS:
rostopic echo /gngga - Verificar correcciones RTK (estación base/NTRIP)
- Mejorar vista al cielo (>8 satélites)
- Aumentar timeout:
rtk_timeout:=600.0
Soluciones:
- Ajustar ganancias PID:
kp:=1.0 kd:=1.0 - Reducir velocidad:
v_max:=0.5 - Verificar IMU:
rostopic echo /imu/data/angular_velocity
¡Las contribuciones son bienvenidas! Por favor:
- Fork del repositorio
- Crear rama:
git checkout -b feature/nueva-funcionalidad - Commit:
git commit -m "Descripción clara" - Push:
git push origin feature/nueva-funcionalidad - Crear Pull Request
MIT License - Ver LICENSE para más detalles.
Pablo Vallejos
Manuel Molina
⭐ Si este proyecto te resultó útil, considera darle una estrella en GitHub ⭐
Hecho con ❤️ por Pablo Vallejos y Manuel Molina