Всем привет, меня зовут Всеволод Орлов, я руководитель службы восприятия в направлении Автономного Транспорта Яндекса. Я и моя служба занимается описанием окружающего наш автомобиль мира. Сегодня я хочу рассказать про то, как мы учились определять степень загрязнения лидара — лазерного сенсора, установленного на нашем автономном транспорте. Тема, актуальная всегда, но особенно в российских погодных реалиях осени, зимы и весны. Расскажу, почему даже малейшее загрязнение лидара — проблема, почему эту проблему не так просто решить и какие есть подходы к этому решению, а в конце поделюсь нашими результатами. 


Лидар: что это и зачем он нужен

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

Цилиндрический лидар на крыле автономного автомобиля
Цилиндрический лидар на крыле автономного автомобиля
Нецилиндрический лидар на крыше
Нецилиндрический лидар на крыше

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

Лидарное облако
Лидарное облако

Лидар — очень важный сенсор в конструкции автономного транспорта по двум причинам: 

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

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

Почему лидару важно оставаться чистым

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

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

Примеры загрязнений лидара
Примеры загрязнений лидара

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

При этом загрязнения серьёзно ухудшают качество его работы.

Как загрязнение лидара мешает ему видеть мир: левая половина лидара чистая, а правая — грязная
Как загрязнение лидара мешает ему видеть мир: левая половина лидара чистая, а правая — грязная

На примере выше показана картинка с фронтальной камеры и проекции лидарных точек, которые раскрашены по расстоянию. Красная — близко, зелёная — далеко. Справа, в загрязнённой части лидара, видно только ближайшую дорогу, а дальняя (20–30 м) — пропадает. Не видны деревья и стена, но самая большая проблема — стало хуже покрытие машин лидарными точками. Два чёрных автомобиля, которые здесь видны, покрыты точками менее чем наполовину. Качество решения задачи детекции на таких данных будет деградировать.

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

Почему сложно распознать загрязнения лидара

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

Пример типичного загрязнения камеры — капля воды
Пример типичного загрязнения камеры — капля воды

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

Модельный пример отраженного сигнала
Модельный пример отраженного сигнала

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

Лидар «посмотрит» на нулевой пик или на первый (в зависимости от настроек), найдёт другой пик и разницу по времени между ними. Умножив эту разницу на скорость света и разделив пополам, вычислит расстояние до объекта.

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

Отличие возвращённого сигнала при его отправке в небо и загрязнённом лидаре
Отличие возвращённого сигнала при его отправке в небо и загрязнённом лидаре

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

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

Первый подход: эвристический

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

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

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

На видео ниже — картина интенсивности отражения от поверхности лидара. На ней видно происходящее вокруг автомобиля: стационарные жёлтые точки (капли) и вытянутые полоски (падающий снег)

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

Второй подход: сбор данных для ML-методов

Итак, мы решили собирать разметку — но как? Мы не можем просто показать лидарное облако асессорам и сказать: «Найди в нём место, где точки должны быть, но их нет». Здесь нужно понимание границ объектов, сцены. Мы пробовали отдавать в разметку проекцию лидарных точек на изображение и просить найти объект, который плохо покрыт точками. 

С этим заданием мы сделали три или четыре итерации и столкнулись с проблемами.

Первая проблема — слепая зона, которую асессоры радостно отмечали как грязь. Но по факту лидар просто и не должен там видеть. Например, на картинке ниже область рядом со столбом справа пустая не потому, что нет лидарных точек, а потому что эта область для лидара закрыта столбом (слепая зона от столба).

Проблема: слепая зона лидара, вызванная расхождением в позиции съёмки камеры и лидара.
Проблема: слепая зона лидара, вызванная расхождением в позиции съёмки камеры и лидара.

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

Проблема: стёкла
Проблема: стёкла

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

Проблема: быстро движущиеся объекты
Проблема: быстро движущиеся объекты

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

Проблема: деревья. Лидар чистый, но фрагменты кроны и более дальние деревья не покрыты лидарными точками
Проблема: деревья. Лидар чистый, но фрагменты кроны и более дальние деревья не покрыты лидарными точками

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

Проблема: большой угол падения
Проблема: большой угол падения

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

Проблема: большой угол падения — видно, что с какого-то момента мы перестаём видеть дорогу и отбойник (лидар при этом чистый)
Проблема: большой угол падения — видно, что с какого‑то момента мы перестаём видеть дорогу и отбойник (лидар при этом чистый)

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

Мы начали искать другой вариант разметки данных. И нашли!

Мы уже говорили о том, что автономный транспорт использует лидарные данные, чтобы локализоваться — «осознать», где он находится. Он это делает по достаточно большому предзаписанному облаку точек, которое поддерживается в актуальном состоянии. Можно считать его эталонной картой окружающей местности за вычетом движущихся объектов. 

Плотная лидарная карта местности
Плотная лидарная карта местности
То же место на панораме
То же место на панораме

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

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

Сравнение подходов 

Конечно же, в итоге мы сравнили подходы. 

У нас возникли сопоставимые трудности в части дополнительных требований к данным у обоих способов получения разметки. Авторазметка дала нам выигрыш в качестве работы и в плотности и количестве получаемой разметки. Алгоритмы, обученные на асессорских данных, иногда давали ложные срабатывания на чистом лидаре в переулках. Это мы связываем с тем, что не до конца получилось отучить асессоров ошибаться в разметке ситуаций, где лидар чистый, но почему‑то не видит часть поверхностей. У авторазметки таких проблем не было, поэтому по итогу мы остановились на ней и отказались от ручной разметки. 

Что касается алгоритма оценки, мы не строили чего‑то слишком сложного. Мы разбили поверхность лидара на виртуальные секторы и автоматически сгенерировали для каждого из них разметку на классы «чисто — грязно». Для решения обучили модель CatBoost на задачу классификации чистоты каждого сектора. Помимо этого, обучили U‑Net на задачу сегментации чистоты поверхности лидара. U‑Net хорошо сегментировал капли, но оказалось, что это нужно не так часто: у нас не настолько гранулярная система очистки, чтобы она могла убрать какую‑то конкретную каплю. В итоге мы остановились на задаче классификации чистоты сектора целиком, и сейчас на всех машинах и грузовиках у нас без особых нареканий работает алгоритм определения чистоты лидара на основе CatBoost. 


Сейчас начинается новый сезон слякоти, дождей, снегопадов и грязи, летящей из‑под колёс, а тема очистки лидара становится крайне актуальной. Нас ждут новые вводные и тесты системы, обязательно поделимся своим опытом. Stay tuned! 

Комментарии (15)


  1. Waltasar
    16.10.2025 07:50

    Я немного не в теме обучения и использования моделей. Но можно ли использовать свойство загрязнения оставаться почти неизменным во времени и пространстве?

    То есть при обучении использовать несколько последовательных кадров с небольшой разницей. И при анализе также учитывать данные за период.


    1. vorloff87 Автор
      16.10.2025 07:50

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

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


  1. sergehog
    16.10.2025 07:50

    Оверкилл какой-то. Если лучи в одном направлении никогда ничего не видят или видят граздо хуже соседних, то это уже достаточный признак загрязнения. Тупо собираем 2-х мерную гистограмму Depth значений и сверяем с эталонной. Вам бы только свой CatBoost везде пихать, без разбору ))


    1. Bhatype
      16.10.2025 07:50

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


      1. sergehog
        16.10.2025 07:50

        Немного перефразирую свой предыдущий коммент: не 2-х мерная гистограмма, а 2-х мерный массив гистограм (координаты массива - углы выходящих лучей). Если будут эталонные гистограммы для каждого "луча" (ака ячейки массива) то и сравнивать нужно будет не скалярные значения а целые гистограммы. Соответственно для лучей, направленных вверх, эталонные гистограммы тоже будут biased towards infinity. Причем, никто не запрещает использовать Machine Learning, классификатор на гистограммах можно замутить или еще что. CatBoost им в помощь.


      1. sergehog
        16.10.2025 07:50

        Опять же, для сбора training data можно тупо пачкать лидар в заранее известных местах. Или даже так: набрать данных на полностью чистом лидаре, а потом на полностью испачканном ))


        1. vorloff87 Автор
          16.10.2025 07:50

          Мы проводим полигонное тестирование системы мониторинга загрязнения, но не используем эти данные для обучения. Есть проблема с тем, что мы должны иметь реальное распределение загрязнения, а не то, которое мы получили в комнатных условиях. Без натурных данных любые синтетические данные - это риск сдвига распределения.


          1. sergehog
            16.10.2025 07:50

            разумная достаточность вышла из чата


    1. vorloff87 Автор
      16.10.2025 07:50

      Если лучи в одном направлении никогда ничего не видят или видят граздо хуже соседних, то это уже достаточный признак загрязнения

      Я согласен с тем, что это сильный признак, но не достаточный.

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

      Тупо собираем 2-х мерную гистограмму Depth значений и сверяем с эталонной

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


  1. andrey_gavrilov
    16.10.2025 07:50

    Что дальше? Рассказы типа "1001 способ подковать лошадь если потеря подковы застала ваш дилижанс между двумя почтовыми станциями?".

    Яндекс, может, простите мне за прямоту речи, вы перестанете позориться, упорствуя в уже заведомо проигрышном решении "автопилот на лидарах", и перейдёте наконец к решению на одних только камерах? Бросите наконец этот чемодан без ручки с ненужным вам хламом? Да конечно понимаю: жалко, трудно, страшно, будущее пугает.

    Но от того что вы гордо скачете на своём жеребце в сторону противоположную необходимой, и даже бравурные статейки подписывайтесь об этой скачке, вы к цели не приближаетесь, вы удаляете от неё! WTF, Яндекс? Вам, что называется, добежать или согреться нужно?

    Я что-то помню разговор с вашими спикерами о ваших успехах в этих ваших скачках не соврать бы сколько, лет пять что ли назад? Больше? Меньше? И тогда было видно и понятно, что все они понимают позорность этого пути, но (что-то неразборчиво-ругательское), какого лешего простите, мы до сих пор видим вот этот весь позор?


    1. TimsTims
      16.10.2025 07:50

      упорствуя в уже заведомо проигрышном решении "автопилот на лидарах", и перейдёте наконец

      Откуда вы точно знаете, что решение заведомо проигрышное? Какие-то другие конкуренты сделали его и проиграли? Или "раз человеки не пользуются лидарами и водят, то и роботы не должны" ?

      к решению на одних только камерах

      Вы (или кто-то) уже реализовал такое, рабочее решение? Кто может 100% сказать, что это есть и это работает и днём и ночью и в снег и в туман?


  1. Serega1512
    16.10.2025 07:50

    А нельзя загрязнения стекла оценивать видеокамерой, установленной за тем же стеклом с лидаром в одном корпусе ? Или использовать два лидара, или два лидара с совмешенными видеокамерами, сравнивая картины ?


    1. vorloff87 Автор
      16.10.2025 07:50

      А нельзя загрязнения стекла оценивать видеокамерой, установленной за тем же стеклом с лидаром в одном корпусе ?

      Есть ряд железных решений лидарных, которые буквально делают так, как вы описали. В одном корпусе имеются лазер, а также камера, но в серийных лидарах больших производителей, а также в нашем лидаре такое решение не было реализовано

      При этом серийный лидар с камерой под одним общим дополнительным стеклом - увеличением размера конструкции, но само по себе звучит очень разумно. Если установить их под лобовое стекло, то это прекрасно будет работать, но мы явно сократим область видимости лидара

      Или использовать два лидара, или два лидара с совмешенными видеокамерами, сравнивая картины ?

      В целом любое такое решение - это какой-то дополнительный сенсор, который смотрит на нас. Скорее всего сработает, но мы хотим минимизировать набор сенсоров.


  1. TimsTims
    16.10.2025 07:50

    Из возвращаемой лидаром информации нет возможности определить, едем мы в чистом поле или же у нас экстремально грязный лидар.

    А почему-бы например перед лидаром не поставить какое-нибудь искусственное препятствие (скажем тонкая палочка снизу / тонкая сверху). Тогда едя в чистом поле лидар всегда будет получать отражения от этих палок, а при загрязнении - они магически "пропадут". Либо чтобы такие палочки (щёточки?) появлялись/вылезали периодически, и допустим оборачивались вокруг всего сенсора лидара. Таким образом можно было бы провести дебаг-настройку лидара, и понять где у него загрязнение, ввести поправку на это.


    1. vorloff87 Автор
      16.10.2025 07:50

      Решение выглядит разумным. Я бы предположил, что у него будут такие слабые стороны:

      • это дополнительная механика, а значит дополнительная точка отказа

      • нужно будет выбирать между - частотой появления палочки против потери лидарного сектора, который эта палочка будет закрывать. Частота лидара 10Гц (100мс на кадр) - нужно в идеале доставать палочку и убирать обратно за 50-100мс. Если это делать 1 раз в секунду, то тогда из 10Гц лидара - я буду в конкретном секторе терять 10% данных, а, если доставать палочку реже, чем 1 раз в секунду, то есть риск долго ехать с грязным лидаром

      На самом деле решение выглядит хорошим для автоматизированного полигонного тестирования, где потеря информации не является критичной.