Componente · Sensor

Câmera Raspberry Pi

A câmera Raspberry Pi usa a fita CSI, em vez do USB, com canal de dados dedicado, autofoco e o sensor que a visão robótica pressupõe.

O que é

Uma pequena placa sensora em um cabo flex plano que se conecta à porta CSI do Raspberry Pi—uma interface de câmera dedicada, não USB. Essa distinção explica por que ela existe. O Pi de um robô normalmente já utiliza Wi-Fi, uma ligação serial com um controlador de motor e, possivelmente, armazenamento no barramento USB; uma câmera que envia 1080p pelo mesmo barramento é o ponto em que tudo para de funcionar.

Para um robô, a câmera é o sensor que muda o que é possível. Todos os outros sensores deste site informam um único valor—uma distância, um ângulo, uma refletância. Uma câmera informa uma cena, e é isso que permite ao robô reconhecer o que algo é, e não apenas que algo está ali.

Diagrama rotulado de um Raspberry Pi Camera Module: uma pequena PCB quadrada com o corpo preto de uma lente montado ao centro sobre o sensor de imagem, um cabo flex plano saindo da borda inferior em direção ao conector CSI do Pi, furos de fixação nos cantos e chamadas para a lente, a fita CSI-2 e os contatos do sensor na parte posterior.
A placa da câmera é composta principalmente por lente e sensor: os dados de imagem saem pela fita CSI-2 em seu próprio canal e nunca chegam ao barramento USB usado pelo restante do robô. Baixar SVG

Como funciona

A luz atinge o sensor, que transmite linhas brutas por MIPI CSI-2—uma ligação serial rápida e de curto alcance—para o pipeline de imagens do Pi. O Pi transforma essas linhas brutas em uma imagem utilizável: reconstrução de cor, balanço de branco, exposição e correção do sombreamento da lente. No Raspberry Pi OS atual, isso é processado pelo libcamera, com rpicam-apps na linha de comando e Picamera2 em Python.

Duas consequências importam para robôs:

O pipeline consome tempo. Um quadro não fica disponível no instante em que a exposição termina. Quando seu código o vê, dezenas de milissegundos já passaram e o robô já se deslocou. Qualquer malha de controle fechada sobre a visão precisa ser projetada considerando esse atraso.

A exposição é automática, a menos que você a desative. A autoexposição altera sem avisar o brilho da cena entre quadros, o que é bom para fotografias e prejudicial a um algoritmo de visão que usa limiares de brilho. Fixe a exposição e o ganho depois que a iluminação estabilizar.

Quando usar

Use uma câmera quando o robô precisar responder a uma pergunta que um sensor de valor único não pode:

  • Marcadores fiducials — marcas ArUco fornecem uma pose 3D completa a partir de um único quadro, a maneira mais barata de obter uma posição real do robô.
  • Seguimento de linha no mundo real — a câmera vê a linha metros à frente, enquanto uma matriz de refletância vê somente o que está diretamente abaixo dela.
  • Reconhecimento de objetos — distinguir uma cadeira de uma parede, em vez de obter a mesma leitura de 40 cm das duas.
  • SLAM visual — construir um mapa apenas com imagens.

Não acrescente uma câmera para desviar de obstáculos. Um VL53L0X responde “quanto longe?” em 20 ms com três linhas de código; uma câmera responde de forma pior, mais devagar e com cem vezes mais esforço.

Conexões e armadilhas

  • A fita tem orientação. Os contatos prateados devem ficar voltados para os contatos do conector—em um Pi, a aba azul fica voltada para o lado USB/Ethernet. Com a fita invertida, a câmera simplesmente não é detectada e nada é danificado.
  • Levante primeiro a trava do conector. Puxe o colar plástico para cima com cuidado, encaixe a fita totalmente reta e pressione o colar de volta. Uma fita inserida levemente torta faz a câmera ser detectada de forma intermitente, como se estivesse com defeito.
  • O Pi 5 e o Zero precisam do cabo de 22 pinos. É a mesma câmera, com conector mais estreito. Verifique antes de pedir.
  • Mantenha a fita longe da ligação dos motores. É uma ligação serial de alta velocidade sem blindagem que passa ao lado do que quer que você tenha espremido no chassi; o ruído dos motores acoplado a ela aparece como quadros corrompidos.
  • Preveja a potência. Considere cerca de 250 mA além do consumo do próprio Pi, fornecidos pela mesma fonte que sofre queda de tensão e corrompe o cartão SD se for subdimensionada.
  • O foco é uma configuração, não apenas um ajuste. No Module 3, o autofoco procura uma posição se a cena tiver pouco contraste. Para um robô que sempre observa aproximadamente a mesma distância, defina uma posição de foco fixa e impeça a busca no meio de uma manobra.

Escolhendo um módulo

Módulo Sensor Resolução Foco Destaque para um robô
Module 2 IMX219 8 MP Fixo (ajuste manual) Barato, previsível e sem busca de autofoco
Module 3 IMX708 11,9 MP Autofoco Melhor escolha geral; fixe o foco para robótica
Module 3 Wide IMX708 11,9 MP Autofoco Campo de visão de 102°—muito melhor para navegação
HQ Camera IMX477 12,3 MP Lentes com encaixe C/CS Quando você precisa de uma lente específica ou longo alcance
Global Shutter IMX296 1,6 MP Encaixe C/CS O mais importante para um robô em movimento

O módulo com obturador global merece uma explicação mais detalhada, porque o obturador rolante é o problema mais subestimado da visão robótica.

Um sensor com obturador rolante expõe as linhas uma após a outra, em vez de todas de uma vez; portanto, a parte superior de um quadro é capturada alguns milissegundos antes da parte inferior. Em uma câmera parada, isso é invisível. Em um robô girando a 90°/s, o topo e a base do quadro foram capturados de ângulos diferentes, e linhas verticais retas saem inclinadas.

Em um pipeline de pose por marcador, isso não é cosmético. Os cantos de uma marca ArUco são usados para calcular sua pose; se foram capturados em quatro orientações ligeiramente diferentes do robô, a pose calculada fica errada de uma forma que nenhuma calibração corrige. Se o robô faz visão enquanto se move, um sensor com obturador global é a solução, e vale a pena aceitar a resolução menor.

Configurando para que as imagens sejam utilizáveis

Autoexposição, ganho e balanço de branco são excelentes para fotografia e prejudicam ativamente um algoritmo de visão. Eles alteram entre quadros os valores de que seus limiares dependem, por motivos sem relação com a cena.

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

O valor de LensPosition está em dioptrias—o inverso da distância de foco em metros. Um robô que observa objetos a cerca de 50 cm quer 2.0; a um metro, 1.0; no infinito, 0.0. Definir o valor explicitamente impede que o autofoco procure uma posição no meio de uma manobra, o que, em um robô em movimento, produz um ou dois segundos de quadros desfocados exatamente no momento errado.

Resolução, taxa de quadros e latência

A resolução é a configuração que as pessoas deixam alta demais, e ela custa mais do que esperam.

Resolução Pixels Custo relativo de processamento Adequada para
320×240 77 mil 1× Seguimento de linha, rastreamento de blobs
640×480 307 mil 4× Marcadores ArUco, a maior parte da visão robótica
1280×720 922 mil 12× Marcadores pequenos ou distantes
1920×1080 2,07 M 27× Gravação, raramente controle em tempo real

Um Pi 4 fazendo detecção ArUco a 640×480 mantém 30 fps confortavelmente. Em 1920×1080, o mesmo pipeline cai para poucos quadros por segundo, e cada quadro está desatualizado quando termina de ser processado. Use a menor resolução que ainda permita distinguir o elemento que importa e lembre-se de que a distância de detecção é proporcional à resolução—se um marcador não for detectado longe o bastante, aumentar a resolução realmente ajuda, com esse custo.

O orçamento de latência

É isso que torna difícil o controle baseado em visão, e vale escrever explicitamente:

Etapa Típico
Exposição 10–30 ms
Leitura do sensor e transferência CSI 5–15 ms
Pipeline do ISP (reconstrução de cor, balanço de branco) 5–10 ms
Seu processamento 10–50 ms
Total, da imagem à decisão 30–105 ms

Um robô que se move a 0,3 m/s percorre 1–3 cm durante essa janela; girando a 90°/s, ele gira 3–9°. Toda malha de controle fechada sobre a visão está agindo sobre onde o robô estava, e, se você a ajustar como se a medição fosse atual, oscilará.

As respostas práticas são as mesmas usadas em qualquer outra situação: executar a malha de visão mais lentamente que a malha de controle e usá-la para corrigir uma estimativa de posição que evolui mais rapidamente, ou prever o estado futuro pelo tempo de latência conhecido antes de usar a medição. É exatamente a estrutura que o seguimento de trajetória usa para o GPS, e pelo mesmo motivo.

Montando em um robô

Rigidamente. A calibração da câmera produz parâmetros intrínsecos—distância focal, ponto principal e distorção—que são propriedades daquela câmera naquele suporte. Um suporte que flexiona à medida que o robô acelera invalida continuamente a calibração, e as estimativas de pose derivam sem nenhum motivo visível.

Longe da ligação dos motores. A fita CSI é uma ligação diferencial de alta velocidade sem blindagem. Passá-la ao lado dos fios dos motores acopla ruído de comutação, que aparece como quadros corrompidos ou uma câmera que desaparece intermitentemente.

Com alívio de tensão na fita. O conector do cabo plano não foi projetado para flexões repetidas, e um robô vibra o tempo todo. Prenda a fita com fita adesiva perto das duas extremidades para que a vibração não solte o conector.

Inclinada levemente para baixo em um robô terrestre. Uma câmera apontada para o horizonte gasta a maior parte de seus pixels com o teto. Uma inclinação de dez a vinte graus para baixo coloca a parte útil da cena—o piso à frente e tudo o que está sobre ele—no centro do quadro.

Solução de problemas

Sintoma Causa provável Solução
A câmera não é detectada Fita inserida ao contrário Contatos prateados voltados para os contatos da placa
É detectada intermitentemente Fita não totalmente encaixada ou reta Levante a trava, reencaixe por completo e pressione
No cameras available em um Pi 5 Largura errada do cabo O Pi 5 e o Zero exigem o cabo de 22 pinos
Quadros corrompidos ou cortados Ruído dos motores na fita Afaste-a dos fios dos motores e alivie a tensão
O brilho muda entre quadros Autoexposição ainda ativa Fixe a exposição e o ganho após um período de estabilização
A imagem fica desfocada no meio da manobra Busca do autofoco Defina AfMode: 0 e um LensPosition fixo
Linhas verticais inclinadas durante o giro Obturador rolante Diminua a velocidade do giro ou use um módulo com obturador global
A taxa de quadros despenca sob carga Resolução alta demais Reduza para 640×480; verifique a limitação térmica
As estimativas de pose derivam sem causa Flexão do suporte da câmera Monte-a rigidamente; calibre novamente
O Pi reinicia quando a câmera inicia A fonte não cobre os ~250 mA extras Use uma fonte melhor—isso corrompe cartões SD

Câmera ou sensor de distância?

Câmera VL53L0X / HC-SR04
Responde O que existe, onde está e sua orientação A distância até o objeto mais próximo
Latência 30–100 ms 20–60 ms, sem processamento
Código necessário Um pipeline de visão Três linhas
Computação Um processador da classe do Pi Qualquer microcontrolador
Falha quando Está escuro, há contraluz ou borrão de movimento Em superfícies específicas (veja cada página)
Custo US$ 25–50 mais um Pi US$ 2–5

A regra honesta é: não acrescente uma câmera para desviar de obstáculos. Um sensor de distância responde à pergunta mais rápido, com menor custo e maior confiabilidade, e cada hora gasta tentando fazer uma câmera fazer isso é uma hora que não foi gasta naquilo que somente uma câmera pode fazer.

Acrescente uma câmera quando precisar saber o que algo é ou onde você está—reconhecer um objeto, ler um marcador fiducial para obter uma pose absoluta ou seguir uma linha que o robô enxerga metros à frente, em vez de apenas abaixo de si. Essas são tarefas realmente impossíveis com um sensor de valor único e valem todo o pipeline.

Explore o grafo

Usado nestas montagens

Projetos, caminhos de aprendizagem e simuladores que incluem Câmera Raspberry Pi.

Perguntas

Perguntas frequentes sobre Câmera Raspberry Pi

Uma câmera do Pi é melhor que uma webcam USB para robótica?

Para um robô, normalmente sim, e o motivo é o conector, não a imagem. Uma câmera CSI tem um canal de dados próprio que entra diretamente no pipeline de imagens do Pi; portanto, não disputa largura de banda USB com um adaptador Wi-Fi ou uma ligação serial, e sua temporização de quadros é muito mais previsível. Uma webcam é a melhor opção somente quando você precisa de um cabo longo—as fitas CSI são curtas e frágeis—ou quer usar a mesma câmera, sem alterações, em um notebook.

Qual câmera do Raspberry Pi devo comprar para um robô?

Camera Module 3 para a maioria dos robôs—autofoco, opção grande angular e suporte atual de software. Escolha a versão grande angular (102°) se o robô precisar enxergar objetos próximos de si, o que quase sempre é necessário em navegação. Prefira Global Shutter se o robô se mover rapidamente enquanto observa, e HQ Camera se precisar de uma lente específica. Camera Module 2 continua boa e mais barata quando o foco fixo atende.

Por que a imagem da minha câmera fica inclinada quando o robô gira?

Obturador rolante. O sensor lê uma linha de cada vez, em vez de capturar o quadro inteiro de uma vez; portanto, qualquer coisa que se mova durante a leitura é registrada em um ponto ligeiramente diferente em cada linha—um giro deforma linhas retas. Isso importa porque a estimativa de pose pressupõe um único instante por quadro. Reduza a exposição, diminua a velocidade do robô durante a medição ou use Global Shutter, que captura todas as linhas de uma vez.

O Pi 5 usa o mesmo cabo de câmera?

Não, e isso engana quase todo mundo. O Pi 5 e os modelos Zero usam um conector mais estreito de 22 pinos, enquanto o Pi 4 e os anteriores usam o de 15 pinos que acompanha a maioria das câmeras. A câmera é a mesma; você precisa da fita correta ou de um adaptador. O Pi 5 também possui dois conectores de câmera e pode usar um par estéreo.

Ainda uso a biblioteca picamera?

Não—o módulo picamera original foi escrito para uma pilha de câmera que não existe mais no Raspberry Pi OS atual. Use Picamera2, baseada em libcamera, ou capture por OpenCV depois que a câmera aparecer como um dispositivo V4L2. A maioria dos tutoriais com alguns anos de idade foi escrita para a API obsoleta, que é o motivo usual para um trecho copiado falhar imediatamente em uma instalação nova.

Leitura complementar

Referências