Componente · Sensor

Raspberry Pi Camera Module

Cámaras con conector plano CSI para Raspberry Pi: baja latencia, cero consumo de USB y acceso directo por hardware con libcamera y OpenCV.

Qué es

Una placa de sensor pequeña sobre un cable plano que se conecta al puerto CSI de la Raspberry Pi: una interfaz de cámara dedicada, no USB. Esa distinción es toda la razón de su existencia. El Pi de un robot ya suele estar cargando con Wi-Fi, un enlace serie hacia un controlador de motores y posiblemente almacenamiento en su bus USB; una cámara empujando 1080p por ese mismo bus es donde deja de funcionar.

Para un robot, la cámara es el sensor que cambia lo que es posible. Todos los demás sensores de este sitio informan de un número: una distancia, un ángulo, una reflectancia. Una cámara informa de una escena, y eso es lo que permite que un robot reconozca qué es algo, y no solo que algo está ahí.

Diagrama etiquetado de un módulo de cámara Raspberry Pi: un pequeño PCB cuadrado con un barril de lente negro montado en el centro sobre el sensor de imagen, un cable plano flexible saliendo del borde inferior hacia el conector CSI del Pi, agujeros de montaje en las esquinas, y llamadas para la lente, el cable CSI-2 y los contactos del sensor en la cara trasera.
La placa de cámara es sobre todo lente y sensor: los datos de imagen salen por el cable CSI-2 en su propio carril, sin tocar nunca el bus USB que el resto del robot está usando. Descargar SVG

Cómo funciona

La luz golpea el sensor, y el sensor transmite filas en crudo por MIPI CSI-2, un enlace serie rápido y de corto alcance, hacia la cadena de imagen del Pi. El Pi convierte esas filas en crudo en una imagen utilizable: demosaicing, balance de blancos, exposición, corrección del sombreado del objetivo. En el Raspberry Pi OS actual esto lo gestiona libcamera, con rpicam-apps en la línea de órdenes y Picamera2 en Python.

Dos consecuencias importan en robótica:

La cadena cuesta tiempo. Un frame no está disponible en el instante en que se expuso. Cuando tu código lo ve, han pasado decenas de milisegundos, y un robot en marcha se ha movido. Cualquier lazo de control cerrado sobre visión tiene que diseñarse teniendo en cuenta ese retardo.

La exposición es automática salvo que la pares. La autoexposición cambiará encantada el brillo de tu escena entre frames, lo cual está bien para fotografía y es hostil a un algoritmo de visión que umbraliza por brillo. Fija la exposición y la ganancia una vez que la iluminación se haya estabilizado.

Cuándo usarlo

Recurre a una cámara cuando el robot necesite responder a una pregunta que un sensor escalar no puede:

  • Marcadores fiduciales: las etiquetas ArUco dan una pose 3D completa a partir de un solo frame, que es la forma más barata de darle a un robot una posición real.
  • Seguimiento de línea en el mundo real: una cámara ve la línea a metros de distancia, donde una matriz de reflectancia solo ve lo que tiene directamente debajo.
  • Reconocimiento de objetos: distinguir una silla de una pared, en lugar de leer los mismos 40 cm de ambas.
  • SLAM visual: construir un mapa solo a partir de imágenes.

No añadas una para esquivar obstáculos. Un VL53L0X responde «¿a qué distancia?» en 20 ms con tres líneas de código; una cámara lo responde peor, más despacio y con cien veces más esfuerzo.

Cableado y errores comunes

  • El cable tiene orientación. Los contactos plateados deben mirar a los contactos del conector de la placa: en un Pi, eso significa que la pestaña azul del reverso queda hacia el lado USB/Ethernet. Insertado al revés, la cámara sencillamente no se detecta, y no se daña nada.
  • Levanta primero el cierre del conector. Tira suavemente del collarín plástico, asienta el cable bien a escuadra y luego presiona el collarín hacia abajo. Un cable que entra con un ligero ángulo se enumera de forma intermitente, lo que parece una cámara defectuosa.
  • El Pi 5 y el Zero necesitan el cable de 22 pines. La misma cámara, conector más estrecho. Compruébalo antes de pedir.
  • Mantén el cable lejos del cableado de los motores. Es un enlace de alta velocidad sin blindaje que va junto a lo quequiera que hayas apretado en el chasis; el ruido de los motores acoplado a él se manifiesta como fotogramas corruptos.
  • Presupuesta la potencia. Unos 250 mA por encima del propio consumo del Pi, de la misma alimentación que se queda sin tensión y corrompe la tarjeta SD si economizas.
  • El enfoque es un ajuste, no solo un anillo. En el Module 3 el autofoco se dispara si la escena tiene poco contraste. Para un robot que siempre mira aproximadamente a la misma distancia, fija una posición de enfoque y evita que se dispare a mitad de una maniobra.

Cómo elegir un módulo

Módulo Sensor Resolución Enfoque Destacado en robótica
Module 2 IMX219 8 MP Fijo (ajustable a mano) Barato, predecible, sin disparos del autofoco
Module 3 IMX708 11.9 MP Autofoco La mejor elección general; fija el enfoque para robótica
Module 3 Wide IMX708 11.9 MP Autofoco Campo de visión de 102°: mucho mejor para navegación
HQ Camera IMX477 12.3 MP Objetivos con montura C/CS Cuando necesitas un objetivo concreto o largo alcance
Global Shutter IMX296 1.6 MP Montura C/CS El que más importa para un robot en movimiento

El módulo de obturador global merece una explicación en condiciones, porque el obturador rodante es el problema menos apreciado de la visión robótica.

Un sensor de obturador rodante expone las filas una tras otra en lugar de todas a la vez, así que la parte superior de un frame se captura unos milisegundos antes que la inferior. En una cámara inmóvil esto es invisible. En un robot girando a 90°/s, la parte superior y la inferior del frame se tomaron desde ángulos distintos, y las líneas verticales rectas salen inclinadas.

Para una cadena de pose por marcadores esto no es cosmético. Las esquinas de una etiqueta ArUco se usan para resolver su pose, y si las esquinas se capturaron desde cuatro orientaciones ligeramente distintas del robot, la pose calculada está mal de una forma que ninguna cantidad de calibración corrige. Si tu robot hace visión mientras se mueve, un sensor de obturador global es la solución, y merece la pena la resolución más baja.

Configurarlo para que las imágenes sean utilizables

La exposición, la ganancia y el balance de blancos automáticos son excelentes para fotografía y perjudiciales para un algoritmo de visión. Cambian entre frames los números de los que dependen tus umbrales, por motivos ajenos a la escena.

from picamera2 import Picamera2
import time

picam = Picamera2()

# Small frames. 640x480 is plenty for markers and lines, and the pipeline
# cost scales with pixel count.
config = picam.create_video_configuration(
    main={"size": (640, 480), "format": "RGB888"},
    controls={"FrameDurationLimits": (33333, 33333)},   # lock to 30 fps
)
picam.configure(config)
picam.start()

# Let auto-exposure settle on the real scene, then freeze it.
time.sleep(2)
metadata = picam.capture_metadata()
picam.set_controls({
    "AeEnable": False,
    "AwbEnable": False,
    "ExposureTime": metadata["ExposureTime"],
    "AnalogueGain": metadata["AnalogueGain"],
    "AfMode": 0,                 # manual focus
    "LensPosition": 2.0,         # dioptres: 1/distance_in_metres
})

while True:
    frame = picam.capture_array()
    # ... your processing here

El valor de LensPosition va en dioptrías, el recíproco de la distancia de enfoque en metros. Un robot que mira a cosas a unos 50 cm quiere 2.0; a un metro, 1.0; el infinito es 0.0. Fijarlo explícitamente evita que el autofoco se dispare a mitad de maniobra, lo que en un robot en movimiento produce uno o dos segundos de fotogramas borrosos justo en el momento equivocado.

Resolución, frecuencia de fotogramas y latencia

La resolución es el ajuste que la gente deja demasiado alto, y cuesta más de lo que espera.

Resolución Píxeles Coste relativo de procesamiento Adecuado para
320×240 77 k 1× Seguimiento de línea, seguimiento de manchas
640×480 307 k 4× Marcadores ArUco, la mayoría de visión robótica
1280×720 922 k 12× Marcadores pequeños o lejanos
1920×1080 2.07 M 27× Grabación, rara vez para control en tiempo real

Un Pi 4 haciendo detección de ArUco a 640×480 maneja unos cómodos 30 fps. A 1920×1080 la misma cadena cae a un solo dígito, y cada fotograma está obsoleto para cuando se procesa. Usa la menor resolución que todavía resuelva el rasgo que te importa, y recuerda que la distancia de detección escala con la resolución: si un marcador no se detecta bastante lejos, subir la resolución ayuda de verdad, con ese coste.

El presupuesto de latencia

Esto es lo que hace difícil el control basado en visión, y merece la pena escribirlo:

Etapa Típico
Exposición 10–30 ms
Lectura del sensor y transferencia CSI 5–15 ms
Cadena ISP (demosaicing, balance de blancos) 5–10 ms
Tu procesamiento 10–50 ms
Total, de la imagen a la decisión 30–105 ms

Un robot que se mueve a 0,3 m/s recorre 1–3 cm durante esa ventana; girando a 90°/s, gira 3–9°. Cualquier lazo de control cerrado sobre visión está actuando sobre donde estaba el robot, y si lo ajustas como si la medición fuera actual, oscila.

Las respuestas prácticas son las mismas que se usan en cualquier otro sitio en esta situación: ejecuta el lazo de visión más lento que el lazo de control y úsalo para corregir una estimación de navegación muerta más rápida, o predice hacia delante por la latencia conocida antes de usar la medición. Esta es exactamente la estructura que construye la vía de seguimiento de trayectorias para el GPS, y por el mismo motivo.

Montarla en un robot

Rígidamente. La calibración de la cámara produce parámetros intrínsecos —distancia focal, punto principal, distorsión— que son propiedades de esa cámara en ese soporte. Un soporte que flexa conforme el robot acelera invalida la calibración de forma continua, y las estimaciones de pose se desvían sin razón visible.

Lejos del cableado de los motores. El cable CSI es un enlace diferencial de alta velocidad sin blindaje. Pasarlo junto a los cables de motor acopla el ruido de conmutación, lo que aparece como fotogramas corruptos o como una cámara que desaparece de forma intermitente.

Con el cable aliviado de tensión. El conector del cable plano no está diseñado para flexiones repetidas, y un robot vibra constantemente. Fija el cable con cinta cerca de ambos extremos para que la vibración no trabalhie el conector hasta soltarlo.

Ligeramente inclinada hacia abajo en un robot terrestre. Una cámara apuntada al horizonte gasta la mayoría de sus píxeles en el techo. De diez a veinte grados hacia abajo pone en el centro del frame la parte útil de la escena: el suelo por delante y lo que haya sobre él.

Resolución de problemas

Síntoma Causa probable Solución
La cámara no se detecta Cable al revés Contactos plateados hacia los contactos de la placa
Se detecta de forma intermitente Cable mal asentado o torcido Levanta el cierre, reasienta del todo, presiona
No cameras available en un Pi 5 Anchura de cable equivocada El Pi 5 y el Zero necesitan el cable de 22 pines
Fotogramas corruptos o cortados Ruido de motores en el cable Pásalo lejos de los cables de motor; alívalo de tensión
El brillo cambia entre fotogramas La autoexposición sigue activa Fija exposición y ganancia tras un periodo de asentamiento
La imagen se suaviza a media maniobra El autofoco se dispara Pon AfMode: 0 y un LensPosition fijo
Líneas verticales inclinadas al girar Obturador rodante Reduce el giro, o usa un módulo de obturador global
La frecuencia de fotogramas se desploma bajo carga Resolución demasiado alta Baja a 640×480; comprueba si hay limitación térmica
Las estimaciones de pose se desvían sin causa El soporte de la cámara flexa Móntala rígidamente; recalibra
El Pi se reinicia al arrancar la cámara La alimentación no cubre los ~250 mA extra Mejor alimentación: esto corrompe las tarjetas SD

¿Cámara o sensor de distancia?

Cámara VL53L0X / HC-SR04
Responde Qué hay, dónde y con qué orientación A qué distancia está lo más cercano
Latencia 30–100 ms 20–60 ms, sin procesamiento
Código necesario Una cadena de visión Tres líneas
Cómputo Un procesador de clase Pi Cualquier microcontrolador
Falla cuando Hay poca luz, contraluz, movimiento desenfocado Superficies concretas (mira cada página)
Coste 25–50 $ más un Pi 2–5 $

La regla honesta: no añadas una cámara para esquivar obstáculos. Un sensor de distancia responde esa pregunta más rápido, más barato y con más fiabilidad, y cada hora dedicada a hacer que una cámara la responda es una hora que no se dedica a lo único que solo una cámara puede hacer.

Añade una cámara cuando necesites saber qué es algo, o dónde estás: reconocer un objeto, leer un marcador fiducial para obtener una posición absoluta, o seguir una línea que el robot ve a metros de distancia en lugar de solo debajo de sí. Eso es realmente imposible con un sensor escalar, y vale por toda la cadena.

Explora el grafo

Se usa en estos montajes

Proyectos, rutas de aprendizaje y simuladores que incluyen Raspberry Pi Camera Module.

Preguntas

Preguntas frecuentes sobre Raspberry Pi Camera Module

¿Es mejor una cámara para Pi que una webcam USB para robótica?

Para un robot, normalmente sí, y la razón es el conector más que la imagen. Una cámara CSI tiene su propio carril de datos directo al pipeline de imagen de la Pi, así que no compite con un adaptador Wi-Fi o un enlace serie por el ancho de banda USB, y la temporización de sus fotogramas es mucho más predecible. Una webcam es mejor opción solo cuando necesitas un cable largo —los cables planos CSI son cortos y frágiles— o cuando quieres que la cámara funcione sin cambios en un portátil.

¿Qué cámara de Raspberry Pi debo comprar para un robot?

La Camera Module 3 para la mayoría de los robots: autofoco, opción gran angular y soporte de software actual. Elige la versión gran angular (102°) si el robot necesita ver cosas cercanas a él, lo que casi siempre ocurre en navegación. Elige en cambio la cámara Global Shutter si el robot se mueve rápido mientras mira, y la cámara HQ si necesitas un objetivo concreto. La Camera Module 2 sigue siendo válida, y más barata, si te basta con el enfoque fijo.

¿Por qué se deforma la imagen de mi cámara cuando el robot gira?

Por el obturador rodante (rolling shutter). El sensor lee una fila cada vez en lugar de capturar todo el fotograma de golpe, así que cualquier cosa que se mueva durante la lectura queda registrada en un lugar ligeramente distinto en cada fila: un giro convierte las líneas rectas en líneas inclinadas. Importa porque la estimación de pose supone un único instante por fotograma. Acorta la exposición, frena el robot mientras mides o usa la cámara Global Shutter, que captura todas las filas a la vez.

¿La Pi 5 usa el mismo cable de cámara?

No, y esto pilla a casi todo el mundo. La Pi 5 y los modelos Zero usan un conector más estrecho de 22 pines, mientras que la Pi 4 y las anteriores usan el de 15 pines que viene con la mayoría de las cámaras. La cámara es la misma; necesitas el cable plano adecuado o un adaptador. La Pi 5 tiene además dos conectores de cámara, así que puede manejar un par estéreo.

¿Sigo usando la biblioteca picamera?

No: el módulo original picamera se escribió para una pila de cámara que ya no existe en el Raspberry Pi OS actual. Usa Picamera2, que funciona sobre libcamera, o captura con OpenCV una vez que la cámara aparezca como dispositivo V4L2. La mayoría de los tutoriales de hace más de unos pocos años están escritos para la API muerta, que es la razón habitual de que un fragmento copiado falle al instante en una instalación nueva.

Lecturas adicionales

Referencias