Компонент · Датчик

Камера Raspberry Pi

Камера Raspberry Pi подключается ленточным CSI, а не USB. Выделенный канал, автофокус и датчик для машинного зрения роботов.

Что это такое

Небольшая плата датчика с плоским ленточным кабелем, подключаемая к порту CSI Raspberry Pi: выделенному интерфейсу камеры, а не USB. Именно это отличие и является причиной существования этой камеры. На Pi робота обычно уже работают Wi-Fi, последовательная связь с драйвером двигателей и, возможно, накопитель через USB; передача камерой 1080p по той же шине приводит к отказам всей системы.

Для робота камера — датчик, расширяющий возможности. Каждый другой датчик на сайте сообщает одно число: расстояние, угол или коэффициент отражения. Камера сообщает сцену, благодаря чему робот может распознать, что находится перед ним, а не только определить наличие объекта.

Подписанная схема модуля камеры Raspberry Pi: небольшая квадратная печатная плата (PCB) с чёрным объективом по центру над датчиком изображения, плоский шлейф выходит из нижнего края в разъём CSI платы Pi, по углам находятся крепёжные отверстия, а выноски указывают объектив, ленту CSI-2 и контакты датчика на обратной стороне.
Плата камеры в основном состоит из объектива и датчика: данные изображения передаются по ленте CSI-2 по выделенной шине и никогда не попадают на USB, который использует остальной робот. Скачать SVG

Как это работает

Свет попадает на датчик, который передаёт необработанные строки по MIPI CSI-2 — быстрой последовательной шине с коротким радиусом действия — в конвейер обработки изображений Pi. Pi преобразует их в пригодное изображение: выполняет демозаику, баланс белого, настройку экспозиции и коррекцию неравномерности освещения объектива. В современной Raspberry Pi OS этим занимается libcamera, командная строка предоставляется rpicam-apps, а Picamera2 работает в Python.

Для роботов важны два следствия.

Конвейер требует времени. Кадр становится доступен не в момент экспонирования. К моменту, когда код его увидит, пройдут десятки миллисекунд, а движущийся робот успеет переместиться. Любой контур регулирования по данным камеры следует проектировать с учётом этой задержки.

Экспозиция автоматическая, пока её не отключить. Автоэкспозиция может менять яркость сцены от кадра к кадру, что подходит для фотографии, но вредно для алгоритма зрения, использующего порог яркости. После стабилизации освещения зафиксируйте экспозицию и усиление.

Когда её следует использовать

Выбирайте камеру, когда роботу нужно ответить на вопрос, недоступный скалярному датчику:

  • реперные метки — метки ArUco дают полную 3D-позу из одного кадра, что является самым дешёвым способом получить реальные координаты робота;
  • следование по линии в реальном мире — камера видит линию на метры вперёд, тогда как массив датчиков отражения видит только непосредственно под собой;
  • распознавание объектов — отличить стул от стены, а не считать одинаковые 40 cm для обоих;
  • визуальная SLAM — построение карты только по изображениям.

Не добавляйте камеру для объезда препятствий. VL53L0X отвечает на вопрос «как далеко?» за 20 ms тремя строками кода; камера отвечает на него хуже, медленнее и в сто раз большими затратами усилий.

Подключение и важные нюансы

  • Лента имеет определённую ориентацию. Серебряные контакты должны совпадать с контактами разъёма платы: на Pi синяя подложка обращена к стороне USB/Ethernet. При неправильной установке камера просто не обнаружится, а повреждения не будет.
  • Сначала поднимите фиксатор разъёма. Мягко потяните пластиковый замок вверх, полностью вставьте ленту по прямой и опустите фиксатор. Лента, вставленная даже под небольшим углом, приводит к периодическому исчезновению устройства, что выглядит как неисправность камеры.
  • Pi 5 и Zero требуют 22-контактного кабеля. Камера та же, но разъём уже. Проверьте это перед заказом.
  • Держите ленту вдали от проводки двигателей. Это неэкранированная высокоскоростная связь рядом с другими деталями, заполнившими шасси; наведённый шум двигателей проявляется как повреждённые кадры.
  • Заложите запас питания. Примерно 250 mA сверх собственного потребления Pi от того же источника, который при нехватке мощности уходит в состояние просадки и повреждает SD-карту.
  • Фокус — настройка, а не только кольцо. На Module 3 автофокус будет искать фокус при низком контрасте сцены. Для робота, который всегда смотрит примерно на одинаковое расстояние, зафиксируйте положение и не позволяйте автофокусу работать во время манёвра.

Выбор модуля

Модуль Датчик Разрешение Фокус Особенность для робота
Module 2 IMX219 8 MP Фиксированный (настраивается вручную) Дешёвый, предсказуемый, без поиска автофокуса
Module 3 IMX708 11.9 MP Автофокус Лучший универсальный вариант; для робототехники фиксируйте фокус
Module 3 Wide IMX708 11.9 MP Автофокус Поле зрения 102° — значительно лучше для навигации
HQ Camera IMX477 12.3 MP Объективы с креплением C/CS Нужен конкретный объектив или большая дальность
Global Shutter IMX296 1.6 MP Крепление C/CS Наиболее важный вариант для движущегося робота

Модуль с глобальным затвором заслуживает подробного объяснения, поскольку скользящий затвор — самая недооценённая проблема машинного зрения роботов.

Датчик со скользящим затвором экспонирует строки одну за другой, а не все одновременно, поэтому верх кадра снимается на несколько миллисекунд раньше низа. На неподвижной камере это незаметно. На роботе, поворачивающемся со скоростью 90°/s, верх и низ кадра сняты под разными углами, и прямые вертикальные линии выходят наклонёнными.

Для конвейера определения позы по метке это не косметический дефект. По углам метки ArUco решается задача определения позы, и если углы сняты при четырёх немного разных ориентациях робота, вычисленная поза неверна независимо от качества калибровки. Если робот использует зрение в движении, решением служит датчик с глобальным затвором, и снижение разрешения того стоит.

Настройка для пригодных изображений

Автоматические экспозиция, усиление и баланс белого отлично подходят для фотографии, но вредны для алгоритма зрения. Они меняют между кадрами значения, от которых зависят пороги, по причинам, не связанным со сценой.

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

Значение LensPosition задаётся в диоптриях — обратной величине фокусного расстояния в метрах. Для робота, рассматривающего объекты на расстоянии около 50 cm, нужно 2.0; для одного метра — 1.0; для бесконечности — 0.0. Явная установка исключает поиск автофокуса во время манёвра, который на движущемся роботе создаёт одну-две секунды размытых кадров в самый неподходящий момент.

Разрешение, частота кадров и задержка

Разрешение часто оставляют слишком высоким, и обходится это дороже ожидаемого.

Разрешение Пиксели Относительная стоимость обработки Подходит для
320×240 77 k 1× Следования по линии, отслеживания пятен
640×480 307 k 4× Меток ArUco, большинства задач зрения роботов
1280×720 922 k 12× Маленьких или далёких меток
1920×1080 2.07 M 27× Записи, редко для регулирования в реальном времени

Pi 4, выполняющий обнаружение ArUco при 640×480, обеспечивает комфортные 30 fps. При 1920×1080 тот же конвейер падает до нескольких кадров в секунду, и к моменту обработки каждый кадр устаревает. Используйте минимальное разрешение, на котором нужная деталь ещё различима, и помните, что дальность обнаружения растёт с разрешением: если метка не обнаруживается достаточно далеко, повышение разрешения действительно помогает, но с описанной ценой.

Бюджет задержки

Именно это делает управление по камере сложным, поэтому бюджет стоит записать явно:

Этап Типичное значение
Экспозиция 10–30 ms
Считывание датчика и передача по CSI 5–15 ms
Конвейер ISP (демозаика, баланс белого) 5–10 ms
Ваша обработка 10–50 ms
Всего, от изображения до решения 30–105 ms

Робот, движущийся со скоростью 0.3 m/s, за это время проходит 1–3 cm, а при повороте со скоростью 90°/s поворачивается на 3–9°. Любой контур регулирования по камере управляет положением, в котором робот был; настройка как для актуального измерения приведёт к колебаниям.

Практические ответы те же, что и в аналогичных ситуациях: запускайте контур зрения медленнее контура регулирования и используйте его для коррекции более быстрой оценки по одометрии либо прогнозируйте вперёд на известную задержку перед использованием измерения. Именно такую структуру строит маршрут следования по пути для GPS и по той же причине.

Установка на роботе

Жёстко. Калибровка камеры создаёт внутренние параметры — фокусное расстояние, главную точку и искажения, — являющиеся свойствами этой камеры в этом креплении. Кронштейн, изгибающийся при разгоне робота, постоянно делает калибровку недействительной, и оценка позы начинает уплывать без видимой причины.

В стороне от проводки двигателей. Лента CSI — неэкранированная высокоскоростная дифференциальная связь. Прокладка рядом с проводами двигателей создаёт наведённые коммутационные помехи, проявляющиеся повреждёнными кадрами или периодическим исчезновением камеры.

С разгрузкой ленты. Разъём плоского кабеля не рассчитан на многократное изгибание, а робот постоянно вибрирует. Закрепите ленту у обоих концов, чтобы вибрация не ослабляла разъём.

С небольшим наклоном вниз для наземного робота. Камера, направленная на горизонт, расходует большую часть пикселей на потолок. Наклон от десяти до двадцати градусов вниз помещает полезную часть сцены — пол впереди и объекты на нём — в центр кадра.

Диагностика

Симптом Вероятная причина Исправление
Камера вообще не обнаружена Лента вставлена наоборот Серебряные контакты к контактам платы
Обнаружение нестабильно Лента вставлена не полностью или не прямо Поднять фиксатор, полностью вставить и опустить
No cameras available на Pi 5 Неверная ширина кабеля Pi 5 и Zero требуют 22-контактного кабеля
Кадры повреждены или разрываются Шум двигателей на ленте Проложить её в стороне от проводов двигателей и разгрузить
Между кадрами меняется яркость Автоэкспозиция не отключена Зафиксировать экспозицию и усиление после стабилизации
Во время манёвра изображение становится нерезким Работает поиск автофокуса Установить AfMode: 0 и фиксированный LensPosition
При повороте вертикальные линии наклоняются Скользящий затвор Замедлить поворот или использовать модуль с глобальным затвором
Под нагрузкой частота кадров падает Слишком высокое разрешение Перейти на 640×480 и проверить тепловой троттлинг
Оценка позы уплывает без причины Изгибается крепление камеры Установить жёстко и повторить калибровку
Pi перезагружается при запуске камеры Источник не покрывает дополнительные ~250 mA Использовать лучший источник — иначе повреждаются SD-карты

Камера или датчик расстояния?

Камера VL53L0X / HC-SR04
Отвечает Что находится, где и в какой ориентации Как далеко ближайший объект
Задержка 30–100 ms 20–60 ms без обработки
Требуется код Конвейер зрения Три строки
Вычисления Процессор уровня Pi Любой микроконтроллер
Отказывает В темноте, контровом свете, при размытии от движения На определённых поверхностях, см. соответствующие страницы
Стоимость $25–50 плюс Pi $2–5

Честное правило: не добавляйте камеру для объезда препятствий. Датчик расстояния отвечает на этот вопрос быстрее, дешевле и надёжнее, а каждый час, потраченный на создание с помощью камеры системы обхода препятствий, — это час, не потраченный на задачу, которую способна выполнить только камера.

Добавляйте камеру, когда нужно знать, что находится впереди или где вы находитесь: для распознавания объекта, считывания реперных меток и получения абсолютной позы либо следования по линии, которую робот видит за метры, а не только под собой. Для скалярного датчика это действительно невозможно, поэтому весь конвейер обработки оправдан.

Исследуйте граф

Используется в этих сборках

Проекты, учебные пути и симуляторы, в которых используется Камера Raspberry Pi.

Вопросы

Камера Raspberry Pi: частые вопросы

Лучше ли камера Pi, чем USB-веб-камера, для робототехники?

Для робота обычно да, и причина в разъёме, а не в качестве изображения. Камера CSI имеет выделенную шину данных прямо в конвейер обработки изображений Pi, поэтому не конкурирует за пропускную способность USB с Wi-Fi-адаптером или последовательным интерфейсом, а её временные параметры кадров гораздо предсказуемее. Веб-камера лучше только при необходимости длинного кабеля — ленты CSI короткие и хрупкие, — а также если камера должна без изменений работать на ноутбуке.

Какую камеру Raspberry Pi купить для робота?

Для большинства роботов — Camera Module 3: автофокус, широкоугольный вариант и актуальная программная поддержка. Выбирайте широкую версию 102°, если роботу нужно видеть близкие объекты, что почти всегда верно для навигации. Вместо неё берите камеру с глобальным затвором, если робот быстро движется во время съёмки, и камеру HQ, если нужен конкретный объектив. Camera Module 2 также подходит и дешевле, если фиксированного фокуса достаточно.

Почему изображение с камеры искажается при повороте робота?

Из-за скользящего затвора. Датчик считывает строки по очереди, а не захватывает весь кадр одновременно, поэтому движение во время считывания записывается в слегка разных позициях для каждой строки: при повороте прямые линии становятся наклонными. Это важно, поскольку оценка позы предполагает один момент времени для кадра. Сократите экспозицию, замедлите робот на время измерения или используйте камеру с глобальным затвором, которая захватывает все строки сразу.

Использует ли Pi 5 тот же кабель камеры?

Нет, и это почти всех сбивает с толку. Pi 5 и модели Zero используют более узкий 22-контактный разъём, а Pi 4 и более ранние — 15-контактный, который поставляется с большинством камер. Сама камера одинакова; нужна подходящая лента или переходник. У Pi 5 также два разъёма камеры, поэтому можно подключить стереопару.

Нужно ли по-прежнему использовать библиотеку picamera?

Нет — исходный модуль picamera был написан для стека камеры, которого больше нет в современной Raspberry Pi OS. Используйте Picamera2, построенную поверх libcamera, либо снимайте через OpenCV после появления камеры как устройства V4L2. Большинство руководств старше нескольких лет написаны для исчезнувшего API, и именно поэтому скопированный фрагмент обычно сразу не работает на свежей установке.

Дополнительные материалы

Источники