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.
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