Navegación visual
Visión general
Sección titulada «Visión general»La navegación visual es la tecnología clave para que el drone se localice en entornos sin GPS. En este proyecto aprenderás a implementar la localización en interiores con los datos de flujo óptico de la cámara.
Lo que aprenderás
Sección titulada «Lo que aprenderás»- Bases de la visión por computadora
- Algoritmo de flujo óptico
- Odometría visual-inercial (VIO)
- Fusión de sensores
Materiales necesarios
Sección titulada «Materiales necesarios»| Artículo | Cantidad | Descripción |
|---|---|---|
| Drone ESP32-S3 | 1 | - |
| Módulo de cámara OV2640 | 1 | - |
| Sensor de flujo óptico PMW3901 | 1 | Opcional |
Paso 1: Cableado del hardware
Sección titulada «Paso 1: Cableado del hardware»- Cámara OV2640 → interfaz DVP del ESP32-S3
- PMW3901 (opcional) → interfaz SPI del ESP32-S3
Paso 2: Abrir el proyecto
Sección titulada «Paso 2: Abrir el proyecto»Descomprime optical_flow.zip y ábrelo con VS Code.
Paso 3: Implementar la función de cálculo de flujo óptico
Sección titulada «Paso 3: Implementar la función de cálculo de flujo óptico»Abre optical_flow.c e implementa el cálculo de flujo óptico:
void optical_flow_calculate(uint8_t* prev_frame, uint8_t* curr_frame, int width, int height, float* dx, float* dy) { // 1. Extraer puntos de característica (esquinas) FeaturePoint features[100]; int feature_count = extract_corners(prev_frame, width, height, features, 100);
// 2. Hacer seguimiento de los puntos de característica FeaturePoint tracked_features[100]; int tracked_count = track_features(prev_frame, curr_frame, width, height, features, feature_count, tracked_features);
// 3. Calcular el desplazamiento medio *dx = 0; *dy = 0; for (int i = 0; i < tracked_count; i++) { *dx += tracked_features[i].x - features[i].x; *dy += tracked_features[i].y - features[i].y; } if (tracked_count > 0) { *dx /= tracked_count; *dy /= tracked_count; }}Paso 4: Implementar la odometría visual-inercial (VIO)
Sección titulada «Paso 4: Implementar la odometría visual-inercial (VIO)»Abre vio.c e implementa la VIO:
void vio_update(float gx, float gy, float gz, float ax, float ay, float az, float dt, float flow_dx, float flow_dy) { // 1. Predecir la posición con los datos de la IMU predict_position(gx, gy, gz, ax, ay, az, dt);
// 2. Corregir la posición con los datos de flujo óptico correct_position(flow_dx, flow_dy, dt);
// 3. Sacar la posición fusionada update_estimated_position();}Paso 5: Probar
Sección titulada «Paso 5: Probar»- Vuela en interiores y observa si el drone mantiene la posición estable (sin GPS)
- Reto: dibuja una línea recta en el suelo y haz que el drone vuele a lo largo de ella
Solución de problemas
Sección titulada «Solución de problemas»El cálculo de flujo óptico es impreciso
Sección titulada «El cálculo de flujo óptico es impreciso»- Mejora las condiciones de iluminación
- Optimiza el algoritmo de extracción de puntos de característica
Deriva de posición
Sección titulada «Deriva de posición»- Ajusta los parámetros de la VIO
- Añade más fusión de sensores
Sensación de logro
Sección titulada «Sensación de logro»¡Enhorabuena! Has implementado un sistema de navegación visual, ¡la tecnología clave para que el drone se localice en entornos sin GPS!
Siguiente paso
Sección titulada «Siguiente paso»En el siguiente proyecto aprenderás a implementar la planificación autónoma de trayectorias del drone con el algoritmo A*.
Publicado por primera vez endrone.imagrove.com/es/advanced/visual-navigation/Al citar o reproducir, indica la fuente Imagrove y enlaza a esta página.
¿Dudas o problemas con este tutorial?
Inicia sesión con GitHub para comentar. Si un paso te falla, avísanos: lo verificamos y actualizamos el tutorial.
© 2026 ESP32 Drone. Todos los derechos reservados.