Мечтают ли роботы о свободных ядрах?

SpeedyBot стоит, но в коротком замере занято около 70% суммарного времени восьми CPU. Проверили потребителей и убрали работу, не влияющую на навигацию.
Я Лев Ларин, инженер Unibot. Мы подключаем робота-доставщика Alfa Robotics SpeedyBot к своей платформе UNIBOT Fleet, добавляя на борт собственный Edge. Это десятая часть серии: профиль CPU и проверка оптимизаций.
Начало серии · ← Часть 9: Джойстик отпустили. Робот не в курсе
Шкала и цена измерения
9 октября подробный сбор за примерно 45 с дал 39 интервалов и среднюю загрузку 69,45% на общей шкале восьми CPU. Здесь 100% означает занятость всех ядер. В шкале процессов одно ядро равно 100%: 111,83% процесса локализации соответствуют 13,98% всей машины.
Подробный сборщик сам занял 1,59 процентного пункта. Лёгкий повтор без обхода потоков за примерно 45 с дал 67,56%, включая 0,334 пункта сборщика. Это разные окна, а не выигрыш от оптимизации; дополнительную цену SSH не выделяли.
Потребители в лёгком замере:
Кто работает | Доля общего времени восьми CPU |
|---|---|
Локализация: где робот находится на карте | 14,63% |
RGB-D: цветное изображение и глубина | 9,77% |
PointPillars: распознавание по лидарным данным | 5,59% |
YOLO: распознавание по изображению | 4,88% |
Навигация и карты препятствий | 4,69% |
Объединение наблюдений и слежение за объектами | 2,95% |
Два штатных Java SDK | 2,93% |
Наш Edge и адаптеры к штатной системе | 2,90% |
Остальное, включая наблюдателя и прерывания | 19,23% |
Строки — части общей загрузки с округлением.

Локализация сопоставляет измерения с картой, RGB-D фильтрует глубину, модели распознают объекты, навигация обновляет препятствия. В CPU-профиле локализации преобладал поиск ближайших точек, у RGB-D — фильтрация глубины. Процесс video_stream обслуживал навигационную RGB-D-камеру, не четыре обзорные камеры из статьи про видео.
Что остаётся CPU при работающем ускорителе
YOLO исполняется на Rockchip NPU, PointPillars — на Hailo-8. CPU готовит входы и разбирает результаты.

У YOLO примерно три четверти пользовательских CPU-сэмплов процесса пришлись на математическую постобработку. Это доля процесса, не всей машины и не времени NPU. У PointPillars заметную часть занимали OpenCV-подготовка и преобразование лидарных данных. Загрузку Hailo в этом исследовании не измеряли; проценты CPU и ускорителей не складываются.
Отладочная картинка без подписчиков
Fusion получал RGB, преобразовывал и копировал его, рисовал рамки, затем проверял наличие зрителя. Без подписчиков работа всё равно выполнялась. Только RGB-вход давал около 7,65 МБ/с локальных данных.
Удалили ветку отладочного изображения и её подписку. На 300 одинаковых тестовых кадрах итоговые объекты совпали точно; проекция и синхронизация сохранились. Основная работа fusion продолжилась, поэтому всю загрузку процесса экономией не считаем.
Кеш клеток пользовательских зон
Слой зон повторно переводил неизменные многоугольники в клетки. На локальной карте 480×480 при обновлении 4 Гц двойной цикл мог проходить прямоугольник даже без зон.
Клетки кешируем до изменения зон или геометрии сетки. Первую версию с изменёнными областями обновления отвергли: она конфликтовала с заводским фильтром карты. Сохранили прежние границы и только кеш расчёта. Прошли 320 прямых сравнений клеток и 160 проверок полного конвейера слоёв, включая удаление зон и движение окна.
В парных неподвижных замерах move_base снизился с 4,884 до 4,133% общей шкалы: около 0,75 процентного пункта машины, или 15,4% прежней нагрузки процесса.
Запись позы и разбор логов
У временного снимка последней позы убрали принудительный fsync, сохранив закрытие файла, атомарную замену, права и проверку свежести. По 160 записям среднее время снизилось с 3,119 до 0,961 мс, p95 — с 5,426 до 1,444 мс. Правка относится к этому временному файлу, не к базе данных и важным событиям.
Читатель логов несколько раз скрывал секреты в одной записи. Обработку перенесли в одно место до обрезки и группировки. Публичный результат на сохранённых реальных пакетах совпал, медианное время изменилось так:
Пакет | До | После |
|---|---|---|
619 записей WARN | 245,494 мс | 124,101 мс |
206 записей ERROR | 238,531 мс | 118,746 мс |

Штатные сообщения SDK остались: ускорен наш разбор, а не устранены причины этих сообщений.
Частичный отбор ближайших 256 точек вместо полной сортировки устойчивого выигрыша на ARM не дал, на малом наборе стал медленнее. Замену убрали.
Общая загрузка после изменений
Последняя пара неподвижных замеров относится к записи позы и логам. Удаление картинки fusion и кеш зон были установлены раньше:
Общая загрузка восьми CPU | До, окно 60,90 с | После, окно 120,76 с |
|---|---|---|
Средняя занятость | 67,01465% | 67,18712% |

Общий CPU почти не изменился. В отдельной паре для слоя зон он тоже не снизился: 69,308 → 69,577%, хотя доля move_base уменьшилась. Окна разных этапов нельзя объединять в общий результат «70 → 67»: фоновая нагрузка менялась.
После установки результаты распознавания и препятствий продолжали поступать около 10 Гц. Проверка была неподвижной. Ватты, автономность и успешную поездку после этих правок здесь не измеряли.
Удалены лишнее изображение и повторные расчёты, ускорены отдельные операции. Основная CPU-нагрузка осталась у локализации, глубины и подготовки распознавания.
Все 10 историй SpeedyBot
Робот доставщик дороже автомобиля, мокрая трава и открытый JDWP
Мечтают ли роботы о свободных ядрах? — вы здесь.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.