Как робот-доставщик принял куст за пешехода и терял коробку из-за ошибок восприятия

"Гражданин куст, уступите дорогу": как нашли ошибки в восприятии робота-доставщика

"Проезд перекрыт, пожалуйста, уступите дорогу", - сообщает робот. Но на записи перед ним не человек, а куст. Разбираясь, откуда в системе появляется категория пешехода, команда обнаружила и другие проблемы: фильтр возвращал точки дорожного покрытия в список препятствий, а маска проезжей части, наоборот, удаляла настоящую коробку.

Я Лев Ларин, инженер Unibot. Мы подключаем робота-доставщика Alfa Robotics SpeedyBot к платформе UNIBOT Fleet, не заменяя его штатную навигацию. Это пятая часть серии о работе с роботом: подробный разбор ошибок восприятия и внесённых изменений опубликован в материале о [проверке системы обнаружения препятствий](https://habr.com/ru/articles/1098184/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1098184).

На бортовом компьютере RK3588 работают ROS1, лидар RoboSense Airy Lite и детектор PointPillars. Камерная модель запускается через RKNN, а её двумерные детекции сопоставляются с трёхмерными рамками лидара в `lidar_camera_fusion_node.py`. После объединения данные проходят трекер. При этом важно различать камеры: обзорные IP-камеры из другой части проекта нельзя автоматически считать источником кадров модели. В контрольной записи камерный тракт не выдал детекций, но лидар продолжил сообщать о пешеходах и велосипедистах. Выяснить по старым записям, какая именно камера породила каждую голосовую реплику, не удалось; однако цепочку передачи категорий проследить можно.

Когда объект остаётся, а класс меняется

Если лидар и трекер находят человекоподобный объект, но камера его не подтверждает, система теперь переводит рамку в уже существующий класс `Unknown`. Само препятствие при этом не исчезает: сохраняются его координаты, размеры, ориентация и другие геометрические параметры. На одинаковых записанных данных у рамок, оставленных в системе, не изменились количество, порядок и положение, а также габариты и confidence.

В трекере используются классы `car`, `pedestrian`, `cyclist`, `truck`, `forklift` и `Unknown` с номерами от 0 до 5. Камерный узел, в свою очередь, публикует текстовые названия `car`, `person` и `rider`. Порядок элементов в этих наборах не совпадает, поэтому сопоставлять категории только по порядковому номеру нельзя.

При объединении данных система сначала отбирает камерные рамки по классу и confidence, а затем ищет максимальный IoU - отношение площади пересечения рамок к площади их объединения. Если поменять порядок проверок и искать IoU до сопоставления классов, рамка автомобиля может ошибочно подтвердить пешехода или помешать выбрать подходящую рамку человека. Штатные пороги при этом не меняли.

После принятия решения `keep_object` категория нормализуется, но confidence сохраняется. Для `Unknown` трекер использует порог 0,2 - такой же, как для человекоподобных классов; для остальных объектов остаётся порог 0,6. При публикации берётся актуальная категория, чтобы ранее сохранённое состояние трека не возвращало объекту класс "пешеход".

Почему пропадала коробка

Отдельно проверили голосовое предупреждение "уступите дорогу". Теперь оно требует не просто наличия рамки человека впереди, а действительной блокировки пути и свежего подтверждения остановки по телеметрии шасси. Если кандидат ненадолго пропадает из поля зрения, пауза между голосовыми репликами сохраняется.

Вторая проблема обнаружилась в GroundFilter. Он выделяет плоскость поверхности методом PCL SAC segmentation/RANSAC, задавая её уравнением `a·x+b·y+c·z+d=0`. Точки, согласующиеся с найденной плоскостью, считаются землёй. Дополнительная ветка возвращала часть таких точек обратно в препятствия, чтобы не терять ступени. Однако вместе со ступенями в список препятствий попадало дорожное покрытие.

Простое удаление этой ветки тоже не помогло: после него исчезала контрольная коробка высотой 27 см. Выяснилось, что допуск поиска плоскости был равен 50 см, и коробка попадала в полосу, классифицируемую как земля. Поэтому одновременно установили предусмотренный кодом допуск 5 см и убрали возврат точек плоскости в препятствия. Это значение описывает расстояние до найденной плоскости, а не высоту препятствия относительно корпуса робота.

На наклонном участке нашлась ещё одна неточность: нижняя граница дальней области задавалась фиксированным значением Z и не учитывала уклон дорожки. Её привязали к высоте той же плоскости, которую уже нашёл SAC, - повторный поиск плоскости не выполняется. Отступ дальней ветки над поверхностью оставили прежним, 45 см; границы по XY и верхнее ограничение Z также не изменились. Если плоскость или набор её согласованных точек некорректны, система использует прежний crop. Ближняя область имеет границу 2,6 м при предварительном диапазоне 4,5 м, поэтому дальний отступ не применяется к коробкам вблизи робота.

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

Проверка проекции RGB-D-точек в изображение выявила рассогласование. Координаты рассчитывались по формулам `u=fx·X/Z+cx` и `v=fy·Y/Z+cy` после преобразования систем координат и компенсации движения. Однако исправление геометрической проекции само по себе коробку не вернуло: центральная часть объекта была размечена семантической моделью как дорога. Значит, здесь действовали две разные причины - ошибка проекции и ошибка маски.

В итоге этап, который удалял точки по маске, исключили из пространственного тракта: теперь он проходит как `Ground → Remember → classifier`. Камерные детекции при этом остаются в ветке определения категорий. Это принципиальное разделение: камера может помогать понять, что именно находится перед роботом, но маска проезжей части больше не должна стирать геометрию препятствия из пространственной обработки.

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

Распознавание объектов на дороге нейросетью - лишь часть задачи. Надёжная система обнаружения пешеходов для автомобилей и автономных роботов должна учитывать подтверждение от разных сенсоров, качество геометрии и поведение объекта во времени. Именно поэтому машинное зрение для автономного транспорта проверяют не только на размеченных изображениях, но и на записях реальных поездок и контролируемых испытаниях с физическими препятствиями.

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

Прокрутить вверх