Тест латентности камер с помощью GPIO

Автор: Серженко Фёдор
Tags: Machine vision camera, USB3, Robotics, Low latency, Jetson, GPIO, G2G, GPU ISP

В приложениях робототехники даже небольшая задержка может стать серьёзной проблемой. Часто требуется иметь время отклика менее 50 миллисекунд, поэтому приходится оптимизировать работу Jetson и других компонент всей системы, а не фокусироваться исключительно на пропускной способности.

Тест G2G (glass-to-glass, "от экрана до экрана") широко используется для оценки времени задержки. Он измеряет время между двумя "экранами". В этом тесте мы обычно выводим на монитор таймер высокого разрешения, снимаем кадр с монитора, отправляем данные на компьютер для вычислений и снова выводим обработанное изображение на монитор. При остановке программы на мониторе видны два изображения - текущее время и время таймера в момент захвата кадра. Их разность и есть латентность системы. Этот метод включает в себя время экспозиции, передачу данных, кодирование, передачу по сети, декодирование и отображение на мониторе. Таким образом, бенчмаркинг должен изолировать каждый этап, чтобы выявить узкие место во всем конвейере.

 

тест латентности камер

 

Каковы наиболее важные ограничения для тестов с низкой задержкой?

Чтобы выявить основные ограничения на пути к минимальной задержке, мы провели следующий G2G-тест с использованием самого короткого конвейера:

  • Вывод таймера с высоким разрешением на монитор
  • Захват изображений с помощью камеры машинного зрения USB3
  • Передача изображения RAW с камеры на Jetson по USB3
  • Вывод необработанного изображения на монитор с помощью OpenGL

Для тестирования мы использовали Jetson Orin NX 16 ГБ с подключенной камерой XIMEA MC031CG-SY. Камера имеет интерфейс USB3 и мы установили частоту кадров 150 кадров в секунду, разрешение ROI 1920×1080 при 8 битах и время экспозиции 0.2 миллисекунды. Частота кадров на мониторе составляла всего 60 кадров в секунду, поскольку с помощью Jetson невозможно добиться более высокой частоты кадров.

Оказалось, что минимальная задержка для теста G2G составила 70 мс и более. Как видно из условий теста, передача данных происходит очень быстро. Графический процессор не выполняет обработку, частота кадров камеры высокая, а время экспозиции низкое. Неудовлетворительный результат теста G2G может быть вызван следующими причинами - это либо задержка в USB3, либо задержка в OpenGL.

Тест задержки GPIO без монитора и без OpenGL

Для измерения задержки попробуем обойтись без монитора и без вывода картинки через OpenGL. Это имеет смысл, поскольку для многих приложений робототехники монитор не требуется. Очень часто нужно лишь захватить изображение с помощью камеры, передать его на Jetson или другое оборудование, сделать расчёты или передать на обработку в приложение ИИ для принятия решения, и отправить команду исполнительному механизму.

Мы провели этот тест, используя GPIO от Jetson и светодиод. Мы можем программно включать и выключать светодиод с помощью GPIO и видеть, включен ли светодиод на полученном от камеры изображении. Мы использовали следующий сценарий:

  • Закрыли камеру пластиковым колпачком с небольшим отверстием и вставили в это отверстие светодиод
  • Светодиод подключили к Jetson Orin через универсальный вход/выход (GPIO)
  • Если светодиод выключен, камера будет регистрировать чёрные кадры из-за отсутствия освещения
  • Будем захватывать эти кадры и сохранять их последовательно
  • Теперь отправляем команду включения светодиода через GPIO из нашего программного обеспечения камеры
  • Теперь мы можем посчитать, сколько чёрных кадров будет снято после включения светодиода
  • Нам нужно найти номер белого кадра в сохранённой серии после включения светодиода
  • Разница во времени между последним чёрным кадром перед включением GPIO и первым белым кадром - это и есть задержка

Мы провели многочисленные тесты с использованием камеры XIMEA MC031CG-SY с интерфейсом USB3 на частоте кадров от 30 до 200 кадров в секунду. Во всех случаях интервал между последним чёрным кадром, после получения которого включали светодиод, и первым белым кадром, неизменно составлял один кадр. При разрешении 1920×1080 при 150 кадрах в секунду задержка составила менее 6,5 мс в случае отсутствия OpenGL. Стоит отметить, что конечный результат включает в себя задержку интерфейса USB3, поэтому отсюда следует, что задержка, связанная с USB3 не является узким местом, по крайней мере, для этой камеры XIMEA.

Фактическая задержка для этого эксперимента осталась неизвестной, мы определили лишь верхнюю границу. Мы также использовали меньшие разрешения, такие как 640×640, для достижения скорости 200 кадров в секунду, но задержка также составила всего один кадр. При этом, мы всегда проверяли, что потерь кадров не было.

Схема обработки изображений на Jetson Orin NX (CUDA)

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

  • Копирование RAW кадра в память Jetson
  • Применение уровней чёрного/белого и конвертация в 16 бит
  • Баланс белого
  • Демозаика
  • Гамма
  • Преобразование 16-битных данных в 8 бит
  • Копирование кадра в приложение ИИ на видеокарте (device-to-device)

Исходя из того, что мы работаем с 8-битными RAW изображениями Bayer с разрешением 1920×1080 и частотой 150 кадров в секунду на Jetson Orin NX 8GB, общая задержка для этого конвейера составляет до 13 мс. После включения светодиода следующий кадр становится черным, а следующий - белым. Таким образом, для получения и передачи необработанного кадра с сенсора на Jetson требуется до 6,5 мс, а время работы на GPU вышеуказанного конвейера составляет около 4-5 мс, так что мы можем увидеть результат через 13 мс. В этом случае общая загрузка графического процессора Orin NX составляет около 75%.

Мы провели аналогичный тест с 8-битными необработанными изображениями Bayer с разрешением 720×576 и частотой 200 кадров в секунду на Jetson Orin NX 8GB, и в этом случае общая задержка составила до 5 мс, включая время обработки на GPU. Это означает, что следующий кадр после включения светодиода будет белым. Общая загрузка графического процессора Orin NX составляет около 60%.

Как мы можем видеть, задержка находится в диапазоне 1-2 кадров при условии отказа от OpenGL, причём это оценка сверху.

Как можно настроить OpenGL для достижения меньшей задержки?

Поскольку мы определили, что интерфейс USB3 камеры XIMEA не оказывает существенного влияния на задержку, то можно сделать вывод, что основной проблемой при тестировании G2G является OpenGL. Ниже рассмотрим подробности работы OpenGL.

Это основные этапы обработки данных - от памяти графического процессора до монитора:

  • Передача команд от процессора к графическому процессору (~мкс–мс). Команды OpenGL помещаются в очередь в буфере команд драйвера. Драйвер выполняет очистку пула (пакета) команд (например, с помощью неявной очистки, glFlush или glFinish) перед началом фактической работы с графическим процессором. Задержка обычно составляет менее 1 мс, но может быть и больше, если драйвер выполняет пакетные команды.
  • Выполнение на графическом процессоре (~мкс–мс). Рендеринг на видеокарте включает обработку вершин, растеризацию, затенение фрагментов и т.д. Для простых сцен это занимает ~0,1–2 мс, в зависимости от графического процессора и рабочей нагрузки. Для сложных сцен или недорогих/встроенных графических процессоров (например, mobile или Jetson) это может занять 5-10 мс или больше.
  • Обмен кадрами в буфере и синхронизация по VSync (~мс). Большинство приложений использует двойную или тройную буферизацию с помощью VSync, чтобы избежать "подёргиваний" видео. При включенной VSync и буферизации, кадр может ожидать в очереди до следующего интервала вертикальной развёртки. При частоте 60 Гц один интервал обновления равен 16,67 миллисекунд (мс), поэтому в худшем случае дополнительная задержка составляет 33 мс (2 × 16,67 мс). Это часто является основной причиной задержки в типичных циклах рендеринга.
  • Задержка развёртки дисплея и панели (~1-10 мс). Как только передний буфер заменен, монитор начинает развёртку. Время отклика панели (от серого к серому) составляет 1-5 мс для современных игровых мониторов и более 10 мс для бюджетных или более старых ЖК-дисплеев. На некоторых мониторах также применяется постобработка, например, для уменьшения размытости при движении или цветокоррекции, что может увеличить задержку.

Таким образом, для достижения оптимальной производительности OpenGL при тестировании G2G нам требуется монитор с высокой частотой кадров, камера с высокой частотой кадров и интерфейсом с высокой пропускной способностью, малое время экспозиции сенсора, отключенный VSync, высокопроизводительный графический процессор и быстрая панель. Тест G2G вполне жизнеспособен, но нужно уделять дополнительное внимание реализации и использованию OpenGL.

Дополнительная информация:

Форма для отправки запроса

Эта форма сохраняет вашу должность и адрес электронной почты.