Componente · Sensore

Telecamera Raspberry Pi

La telecamera per Raspberry Pi con nastro CSI anziché USB: canale dati dedicato, autofocus e il sensore usato da gran parte del codice di visione robotica.

Che cos’è

Una piccola scheda sensore connessa tramite un nastro piatto alla porta CSI del Raspberry Pi, un’interfaccia dedicata alle telecamere anziché USB. Questa distinzione è l’unico motivo della sua esistenza. Il Pi di un robot di solito trasporta già Wi-Fi, un collegamento seriale a un controllore dei motori ed eventualmente un dispositivo di archiviazione sul bus USB; è proprio quando una telecamera spinge 1080p attraverso lo stesso bus che il sistema smette di funzionare.

Per un robot la telecamera è il sensore che cambia ciò che è possibile. Ogni altro sensore presente in questo sito restituisce un numero: una distanza, un angolo, una riflettanza. Una telecamera restituisce una scena ed è questo che permette a un robot di riconoscere che cosa sia un oggetto, anziché soltanto che un oggetto è presente.

Schema etichettato di un Raspberry Pi Camera Module: una piccola PCB quadrata con un barile nero dell'obiettivo montato centralmente sopra il sensore di immagine, un nastro flessibile piatto che esce dal bordo inferiore verso il connettore CSI del Pi, fori di montaggio agli angoli e richiami per l'obiettivo, il nastro CSI-2 e i contatti del sensore sul lato posteriore.
La scheda della telecamera è costituita soprattutto da obiettivo e sensore: i dati dell'immagine escono tramite il nastro CSI-2 sul proprio canale e non toccano mai il bus USB utilizzato dal resto del robot. Scarica SVG

Come funziona

La luce colpisce il sensore, che trasmette righe grezze tramite MIPI CSI-2, un collegamento seriale veloce a breve distanza, alla catena di elaborazione delle immagini del Pi. Il Pi trasforma queste righe grezze in un’immagine utilizzabile: demosaizzazione, bilanciamento del bianco, esposizione e correzione dell’illuminazione dell’obiettivo. Sulla versione attuale di Raspberry Pi OS è libcamera a gestirlo, con rpicam-apps dalla riga di comando e Picamera2 in Python.

Due conseguenze sono importanti per i robot:

La catena di elaborazione richiede tempo. Un fotogramma non è disponibile nell’istante in cui viene esposto. Quando il codice lo vede, sono trascorsi decine di millisecondi e un robot in movimento si è già spostato. Ogni anello di controllo chiuso sulla visione deve essere progettato tenendo conto di questo ritardo.

L’esposizione è automatica, a meno che tu non la controlli. L’esposizione automatica può cambiare la luminosità della scena tra un fotogramma e l’altro: va bene per le fotografie ed è dannosa per un algoritmo di visione che usa soglie di luminosità. Blocca esposizione e guadagno una volta stabilizzate le condizioni di illuminazione.

Quando usarla

Scegli una telecamera quando il robot deve rispondere a una domanda a cui un sensore scalare non può rispondere:

  • Marcatori fiduciali — i tag ArUco forniscono un’intera posizione 3D da un singolo fotogramma, il modo più economico per ottenere una localizzazione reale del robot.
  • Inseguimento di linee nel mondo reale — una telecamera vede la linea a metri di distanza, mentre una schiera di sensori di riflettanza vede sol ciò che si trova direttamente sotto di sé.
  • Riconoscimento di oggetti — distinguere una sedia da una parete, anziché leggere gli stessi 40 cm da entrambe.
  • SLAM visivo — costruire una mappa soltanto dalle immagini.

Non aggiungerne una per evitare ostacoli. Un VL53L0X risponde a «quanto dista?» in 20 ms con tre righe di codice; una telecamera lo fa peggio, più lentamente e con cento volte più sforzo.

Cablaggio e aspetti critici

  • Il nastro ha un orientamento. I contatti argentati devono essere rivolti verso i contatti del connettore della scheda — su un Pi significa che la linguetta blu di supporto è rivolta verso il lato USB/Ethernet. Inserito al contrario, la telecamera semplicemente non viene rilevata e non viene danneggiato nulla.
  • Solleva prima il fermo del connettore. Tira delicatamente il collare di plastica verso l’alto, inserisci il nastro completamente e in modo squadrato, poi abbassa di nuovo il collare. Un nastro inserito leggermente in diagonale viene enumerato in modo intermittente, apparentemente come se la telecamera fosse difettosa.
  • Pi 5 e Zero richiedono il cavo a 22 pin. Stessa telecamera, connettore più stretto. Verifica prima di ordinare.
  • Tenere il nastro lontano dai cablaggi dei motori. È un collegamento ad alta velocità non schermato che passa accanto a qualsiasi altra cosa tu abbia stipato nel telaio; i disturbi dei motori che si accoppiano al nastro si manifestano come fotogrammi corrotti.
  • Prevedi il fabbisogno di alimentazione. Circa 250 mA oltre al consumo proprio del Pi, dalla stessa alimentazione che, se sottovalutata, causa cali di tensione e corrompe la scheda SD.
  • La messa a fuoco è un’impostazione, non soltanto un anello. Su Module 3 l’autofocus oscilla se la scena ha poco contrasto. Per un robot che osserva sempre alla stessa distanza circa, imposta una posizione di messa a fuoco fissa affinché non oscilli a metà manovra.

Scelta del modulo

Modulo Sensore Risoluzione Fuoco Caratteristiche notevoli per un robot
Module 2 IMX219 8 MP Fisso (regolabile manualmente) Economico e prevedibile, nessuna oscillazione dell’autofocus
Module 3 IMX708 11.9 MP Autofocus Scelta generale migliore; blocca il fuoco per la robotica
Module 3 Wide IMX708 11.9 MP Autofocus Campo visivo di 102° — molto migliore per la navigazione
HQ Camera IMX477 12.3 MP Obiettivi con attacco C/CS Quando serve un obiettivo specifico o una portata elevata
Global Shutter IMX296 1.6 MP Attacco C/CS Il più importante per un robot in movimento

Il modulo Global Shutter merita una spiegazione vera e propria, perché lo rolling shutter è il problema più sottovalutato nella visione robotica.

Un sensore a rolling shutter espone una riga dopo l’altra anziché tutte contemporaneamente, quindi la parte superiore di un fotogramma viene catturata qualche millisecondo prima di quella inferiore. Su una telecamera ferma questo non è visibile. Su un robot che gira a 90°/s, la parte superiore e quella inferiore del fotogramma provengono da angolazioni diverse e le linee verticali rette risultano inclinate.

Per una catena di elaborazione per la stima della posizione di un marcatore non è un problema estetico. Gli angoli di un tag ArUco vengono usati per calcolarne la posizione e, se sono stati catturati con quattro orientamenti del robot leggermente diversi, la posizione calcolata è errata in un modo che nessuna calibrazione può correggere. Se il robot esegue la visione mentre si muove, un sensore Global Shutter è la soluzione e vale la pena rinunciare alla risoluzione maggiore.

Configurazione per ottenere immagini utilizzabili

Esposizione, guadagno e bilanciamento del bianco automatici sono eccellenti per la fotografia e dannosi per un algoritmo di visione. Cambiano tra un fotogramma e l’altro i valori da cui dipendono le soglie, per ragioni non collegate alla scena.

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

Il valore di LensPosition è espresso in diottrie, cioè l’inverso della distanza di messa a fuoco in metri. Un robot che osserva oggetti a circa 50 cm di distanza vuole 2.0; a un metro vuole 1.0; all’infinito vuole 0.0. L’impostazione esplicita evita che l’autofocus oscilli a metà manovra, cosa che su un robot in movimento produce uno o due secondi di fotogrammi sfocati proprio nel momento sbagliato.

Risoluzione, frequenza dei fotogrammi e latenza

La risoluzione è l’impostazione che le persone lasciano troppo alta e che costa più di quanto ci si aspetti.

Risoluzione Pixel Costo di elaborazione relativo Adatta a
320×240 77 k 1× Inseguimento di linee, inseguimento dei blob
640×480 307 k 4× Marcatori ArUco, gran parte della visione robotica
1280×720 922 k 12× Marcatori piccoli o distanti
1920×1080 2.07 M 27× Registrazione, raramente controllo in tempo reale

Un Pi 4 che esegue il rilevamento ArUco a 640×480 gestisce comodamente 30 fps. A 1920×1080 la stessa catena di elaborazione scende a poche unità e, quando ogni fotogramma viene elaborato, è già obsoleto. Usa la risoluzione più piccola che consenta ancora di distinguere l’elemento che ti interessa e ricorda che la distanza di rilevamento scala con la risoluzione: se un marcatore non viene rilevato abbastanza lontano, aumentare la risoluzione aiuta davvero, con il relativo costo.

Il bilancio della latenza

È ciò che rende difficile il controllo basato sulla visione e vale la pena scriverlo esplicitamente:

Fase Valore tipico
Esposizione 10–30 ms
Lettura del sensore e trasferimento CSI 5–15 ms
Catena ISP (demosaizzazione, bilanciamento del bianco) 5–10 ms
La tua elaborazione 10–50 ms
Totale, dall’immagine alla decisione 30–105 ms

Un robot che si muove a 0.3 m/s percorre 1–3 cm in tale intervallo; se gira a 90°/s, ruota di 3–9°. Ogni anello di controllo chiuso sulla visione agisce sul luogo in cui il robot era e, se viene regolato come se la misura fosse attuale, oscillerà.

Le risposte pratiche sono le stesse adottate ovunque in questa situazione: esegui l’anello di visione più lentamente dell’anello di controllo e usalo per correggere una stima dead reckoning più rapida, oppure predici in avanti in base alla latenza nota prima di utilizzare la misura. Questa è esattamente la struttura che il percorso di inseguimento del tracciato costruisce per il GPS, e per la stessa ragione.

Montaggio su un robot

In modo rigido. La calibrazione della telecamera produce parametri intrinseci — lunghezza focale, punto principale, distorsione — che sono proprietà di quella telecamera in quel supporto. Una staffa che flette mentre il robot accelera invalida continuamente la calibrazione e le stime di posizione derivano senza alcun motivo visibile.

Lontano dai cablaggi dei motori. Il nastro CSI è un collegamento differenziale ad alta velocità non schermato. Il passarlo accanto ai fili dei motori trasferisce il rumore di commutazione, che si manifesta come fotogrammi corrotti o come una telecamera che scompare intermittentemente.

Con il nastro sottoposto a scarico delle trazioni. Il connettore del cavo piatto non è progettato per flessioni ripetute e un robot vibra costantemente. Fissa il nastro con nastro adesivo vicino a entrambe le estremità, in modo che le vibrazioni non allentino il connettore.

Inclinato leggermente verso il basso per un robot terrestre. Una telecamera puntata verso l’orizzonte dedica la maggior parte dei pixel al soffitto. Un’inclinazione di dieci-venti gradi verso il basso porta al centro del fotogramma la parte utile della scena: il pavimento davanti e tutto ciò che si trova su di esso.

Risoluzione dei problemi

Sintomo Causa probabile Soluzione
Telecamera non rilevata affatto Nastro inserito al contrario Contatti argentati verso i contatti della scheda
Rilevamento intermittente Nastro non inserito completamente o in modo squadrato Solleva il fermo, reinseriscilo completamente e abbassalo
No cameras available su un Pi 5 Larghezza errata del cavo Pi 5 e Zero richiedono il cavo a 22 pin
Fotogrammi corrotti o spezzati Rumore dei motori sul nastro Instradalo lontano dai fili dei motori; scaricalo dalle trazioni
La luminosità cambia tra i fotogrammi Esposizione automatica ancora attiva Blocca esposizione e guadagno dopo un breve periodo di stabilizzazione
L’immagine diventa sfocata a metà manovra Oscillazione dell’autofocus Imposta AfMode: 0 e un LensPosition fisso
Linee verticali inclinate durante la rotazione Rolling shutter Rallenta la rotazione oppure usa un modulo Global Shutter
La frequenza dei fotogrammi crolla sotto carico Risoluzione troppo alta Passa a 640×480; verifica la limitazione termica
Le stime di posizione derivano senza causa Il supporto della telecamera flette Monta in modo rigido; ricalibra
Pi si riavvia all’avvio della telecamera L’alimentatore non copre i circa 250 mA aggiuntivi Alimentatore migliore: una scarsa alimentazione corrompe le schede SD

Telecamera o sensore di misurazione della distanza?

Telecamera VL53L0X / HC-SR04
Risponde Che cosa c’è, dove si trova e qual è il suo orientamento A che distanza si trova l’oggetto più vicino
Latenza 30–100 ms 20–60 ms, senza elaborazione
Codice richiesto Una catena di visione Tre righe
Calcolo Un processore di classe Pi Qualsiasi microcontrollore
Fallisce quando Buio, controluce, sfocatura da movimento Superfici specifiche (vedi le rispettive pagine)
Costo $25–50 più un Pi $2–5

La regola onesta è: non aggiungere una telecamera per evitare ostacoli. Un sensore di distanza risponde alla domanda più rapidamente, più economicamente e in modo più affidabile, e ogni ora spesa per farlo funzionare con una telecamera è un’ora non dedicata a ciò che solo una telecamera può fare.

Aggiungi una telecamera quando devi sapere che cosa è un oggetto o dove ti trovi: riconoscere un oggetto, leggere un marcatore fiduciale per ottenere una localizzazione assoluta oppure seguire una linea che il robot vede a metri di distanza anziché soltanto sotto di sé. Queste operazioni sono realmente impossibili con un sensore scalare e giustificano l’intera catena di elaborazione.

Esplora il grafo

Usato in queste costruzioni

Progetti, percorsi di apprendimento e simulatori che includono Telecamera Raspberry Pi.

Domande

FAQ su Telecamera Raspberry Pi

Una telecamera Pi è migliore di una webcam USB per la robotica?

Per un robot, di solito sì, e il motivo è il connettore anziché l'immagine. Una telecamera CSI dispone di un proprio canale dati che entra direttamente nella catena di elaborazione delle immagini del Pi, quindi non compete con un adattatore Wi-Fi o un collegamento seriale per la banda USB e i tempi di acquisizione dei fotogrammi sono molto più prevedibili. Una webcam è migliore soltanto quando serve un cavo lungo — i nastri CSI sono brevi e fragili — o quando si vuole usare la stessa telecamera senza modifiche su un portatile.

Quale telecamera Raspberry Pi devo comprare per un robot?

Camera Module 3 per la maggior parte dei robot; autofocus, un'opzione grandangolo e il supporto software attuale. Scegli la versione grandangolo (102°) se il robot deve vedere cose vicino a sé, cosa che per la navigazione è quasi sempre vera. Scegli invece la telecamera Global Shutter se il robot si muove rapidamente mentre osserva e la HQ Camera se serve un obiettivo specifico. Camera Module 2 è ancora valida e più economica se la messa a fuoco fissa è adatta.

Perché l'immagine della mia telecamera si inclina quando il robot gira?

A causa dello rolling shutter. Il sensore legge una riga per volta anziché catturare l'intero fotogramma in una sola volta, quindi tutto ciò che si muove durante la lettura viene registrato in una posizione leggermente diversa su ogni riga. Una rotazione trasforma le linee rette in linee oblique. È importante perché la stima della posizione presume un unico istante per fotogramma. Riduci l'esposizione, rallenta il robot durante la misurazione oppure usa la telecamera Global Shutter, che cattura ogni riga contemporaneamente.

Pi 5 usa lo stesso cavo per la telecamera?

No, ed è un errore che colpisce quasi tutti. Pi 5 e i modelli Zero usano un connettore più stretto a 22 pin, mentre Pi 4 e i precedenti usano quello a 15 pin fornito con la maggior parte delle telecamere. La telecamera è la stessa; serve il nastro giusto o un adattatore. Pi 5 dispone inoltre di due connettori per telecamere, perciò può gestire una coppia stereo.

Si usa ancora la libreria picamera?

No, il modulo picamera originale è stato scritto per uno stack di telecamere che non esiste più sulle versioni attuali di Raspberry Pi OS. Usa Picamera2, che si basa su libcamera, oppure acquisisci immagini tramite OpenCV dopo che la telecamera è comparsa come dispositivo V4L2. La maggior parte dei tutorial più vecchi di qualche anno è scritta per la API ormai obsoleta, che è il motivo abituale per cui uno snippet copiato fallisce subito dopo un'installazione pulita.

Per approfondire

Fonti