Статья

Как робот-пылесос видит квартиру: лидар, SLAM и почему он застревает под диваном

Как робот-пылесос видит квартиру: лидар, SLAM и почему он застревает под диваном

Все про ИИ и РоботовВсе про ИИ и Роботов·2 ч назад·
0
··1·
Если коротко: робот-пылесос с лидаром видит квартиру как тонкий горизонтальный срез — крутящийся лазер сотни раз за оборот меряет расстояние до стен и мебели. Из этих замеров и показаний колёс робот одновременно рисует карту и вычисляет, где на ней находится. Это и есть SLAM. Застревает он не от глупости, а потому что у каждого датчика есть слепые зоны: лидар не видит того, что выше или ниже его плоскости, нижние датчики путают чёрный ковёр с обрывом, а зеркало для лазера выглядит как дверь в соседнюю комнату.
Это канал «Всё про ИИ и Роботов». Обычно мы разбираем нейросети и гуманоидов, а сегодня — самого массового домашнего робота. Здесь не будет рейтинга моделей и советов, что купить: про выбор у нас есть отдельный гайд. Здесь — как эта шайба на колёсах понимает, где она, и почему понимание иногда заканчивается под диваном.

Задача курицы и яйца: что такое SLAM

Представьте, что вас с завязанными глазами привели в незнакомую квартиру и дали рулетку. Чтобы нарисовать план, нужно знать, где вы стоите в момент каждого замера. А чтобы понять, где вы стоите, нужен план. Каждая задача требует ответа на другую — классический замкнутый круг.
Робототехники называют это одновременной локализацией и картографированием — по-английски Simultaneous Localization and Mapping, SLAM. В обзоре, который стал для области учебником, формулировка ровно такая: SLAM — это одновременное построение модели окружения (карты) и оценка положения робота, который в нём движется. Авторы, Кадена и соавторы, в 2016 году подводили итог тридцати лет исследований — задача, которую сегодня решает пылесос за несколько десятков тысяч рублей, когда-то была передним краем науки.
Выход из круга — не решать задачи по очереди, а решать обе сразу и с допуском на ошибку. Робот всегда держит в голове не точку «я здесь», а облако вероятностей «я, скорее всего, где-то здесь». Карта — тоже не истина, а лучшая на данный момент гипотеза. Каждый новый замер немного уточняет и то, и другое.

Цикл, который повторяется много раз в секунду

Упрощённо работа SLAM выглядит так. Сначала робот предсказывает: колёса провернулись на столько-то оборотов, гироскоп показал поворот на столько-то градусов — значит, я сдвинулся примерно сюда. Потом измеряет: лидар или камера сообщают, что видно вокруг. Затем сравнивает: если стена на замере оказалась на пару сантиметров ближе, чем ожидалось по карте, значит, где-то ошибка — либо в оценке собственного положения, либо в карте. И наконец исправляет обе оценки так, чтобы они лучше согласовались друг с другом.
Почему нельзя обойтись одними колёсами? Потому что ошибка счёта колёс накапливается. На ковре колесо проскальзывает, на пороге подпрыгивает, гироскоп понемногу «уплывает». Через пару комнат робот, считающий только обороты, уверен, что стоит посреди коридора, а на самом деле упирается в шкаф. Внешний датчик — лазер или камера — нужен, чтобы регулярно «привязываться» к реальным стенам и обнулять набежавшую ошибку.
Самый эффектный момент SLAM называется замыканием петли. Робот объехал квартиру по кругу и вернулся туда, откуда начал. Если он узнал это место, то понимает: весь накопленный по дороге дрейф можно раскидать по маршруту и выпрямить карту целиком. Отсюда знакомая картина в приложении: в начале первой уборки стены на карте немного кривые, а потом вдруг «встают на место».
Цикл SLAM: колёса и гироскоп дают прогноз, лидар — замер, а расхождение между ними исправляет одновременно карту и положение робота

Лидар: крутящаяся шайба, которая меряет треугольником

Круглая башенка на крышке — это лазерный дальномер на вращающейся платформе. Он стреляет невидимым инфракрасным лучом по кругу и для каждого направления узнаёт расстояние до ближайшего препятствия. За один оборот получается «веер» точек — контур комнаты на высоте башенки.
Интересно, как именно он меряет. Дорогие промышленные лидары засекают время, за которое свет долетает до цели и обратно. Для бытовой техники это долго было слишком дорого, и прорыв случился благодаря тригонометрии. В 2008 году инженеры Neato Robotics и SRI описали дальномер, где лазер и маленькая камера стоят рядом на небольшом расстоянии друг от друга. Камера смотрит на пятнышко лазера: чем дальше предмет, тем сильнее пятно смещается на снимке. Зная базу и угол, расстояние вычисляют как сторону треугольника. По их данным, такой датчик давал точность около 3 см на дистанции до 6 метров, 10 оборотов в секунду и разрешение в 1 градус по кругу при себестоимости меньше 30 долларов. Именно этот принцип сделал лидар доступным для пылесосов.
Заодно это объясняет, почему лидарный робот уверенно ездит в темноте: ему не нужен свет в комнате, он приносит свой.

Чего лидар не видит

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

Камера и колёса: другие способы видеть

Лидар — не единственный путь. Второй вариант — визуальный SLAM, или vSLAM: вместо лазера на роботе стоит обычная камера. Хороший пример — Roomba 980 2015 года. Как писал IEEE Spectrum, у неё на крышке камера смотрит вперёд и вверх примерно под 45 градусов, а программа ищет на снимках характерные узоры пикселей — чаще всего углы мебели. Робот запоминает, как выглядят эти «ориентиры», и узнаёт место, когда снова их видит. Глава iRobot Колин Энгл тогда рассказывал, что сама камера стоит 75 центов, а основную работу делают специализированные процессоры.
Камера дешевле лидара и не торчит над корпусом. Зато ей нужен свет и узнаваемая обстановка: в тёмной комнате или перед голой белой стеной зацепиться взгляду не за что. Поэтому и в Roomba 980 камера работала не одна — снизу добавили датчик для одометрии, то есть счёта собственного перемещения.
Третий, самый простой вариант — без внешнего «зрения» вообще: гироскоп плюс счёт оборотов колёс. Такой робот умеет ездить ровными параллельными полосами и примерно понимает, куда повернул, но без привязки к стенам его ошибка растёт с каждой минутой. Он хорошо справляется с одной комнатой и плохо — с целой квартирой.
Сейчас производители всё чаще совмещают подходы: лидар для карты, камеру — чтобы распознавать предметы на полу, и колёса с гироскопом — как основу всех расчётов. Суть от этого не меняется: SLAM — это способ свести показания разных несовершенных датчиков в одну картину, более надёжную, чем каждый из них по отдельности.

Почему он застревает под диваном

Теперь понятно, отчего диван — главный враг робота. Здесь сходятся сразу три слабости.
Первая — геометрия. Корпус пылесоса проходит под рамой, а башенка лидара — нет, или проходит впритык. Лазер смотрит горизонтально, и край рамы, оказавшийся чуть выше его плоскости, он просто не видит. Робот уверенно заезжает и упирается башенкой. Хуже, если рама продавливает его вниз: колёса теряют сцепление, робот буксует, не двигаясь, — и уже не может выехать. Производители это прекрасно знают. Roborock, например, в модели Saros 10 сделал убирающийся в корпус лидар и отдельный лазерный датчик, который смотрит вверх и измеряет высоту низких проёмов; высота робота при этом — 7,98 см. Весь этот механизм нужен ради одного: не застрять там, где раньше застревали.
Вторая — потеря ориентиров. Под диваном темно и тесно. Камере не за что зацепиться, а лидару видны только ножки да кусок стены за ними. В той же статье IEEE Spectrum отмечается, что Roomba то и дело оказывается под столами, диванами и кроватями, где отслеживать ориентиры сложнее, а если робот выберется в незнакомом месте, ему придётся строить новый кусок карты и как-то сшивать его со старым.
Третья — колёса врут. Пока робот буксует, колёса крутятся, а сам он стоит на месте. Одометрия честно сообщает: «проехал полметра». Если внешний датчик в этот момент тоже почти ничего не видит, оценка положения расползается. Вот почему после такого приключения робот иногда «теряется» и начинает заново искать, где он.

Чёрный ковёр, зеркала и провода: как обмануть датчики

Чёрный ковёр, который «пропасть»

На днище почти любого робота есть датчики перепада высоты — защита от падения с лестницы. Устроены они просто: инфракрасный светодиод светит в пол, а приёмник ловит отражение. Есть отражение — под нами пол. Нет — под нами пустота, надо отъехать. А теперь положите на пол чёрный ковёр. Тёмный ворс поглощает инфракрасный свет почти так же хорошо, как видимый, и отражение не возвращается. Для датчика это выглядит в точности как ступенька вниз.
Это не догадка любителей, а официальная позиция производителя: в поддержке iRobot прямо сказано, что датчики перепада иногда принимают тёмные поверхности за обрыв, и робот отъезжает или крутится на месте вместо уборки. Отсюда «магия» с чёрными коврами, тёмными полосами на паласе и иногда даже с тёмной плиткой.

Зеркала и стекло

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

Провода, шнурки и бахрома

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

Миф: «ездит хаотично — значит глупый»

Многие уверены: если робот мечется по комнате, отскакивая от мебели, он просто примитивен. На деле это была сознательная стратегия. Ранние Roomba обходились без карты: ехали прямо до столкновения, поворачивали на угол с долей случайности и ехали дальше, а дополнительно умели ходить вдоль стен и кружить на месте. Математика здесь на стороне случайности: если двигаться достаточно долго, вероятность пропустить участок пола быстро падает.
IEEE Spectrum приводит формулировку самой iRobot: при таком псевдослучайном подходе Roomba в среднем проходит каждый участок пола трижды и в трёх разных направлениях, а это особенно полезно на ковре, где ворс нужно чесать с разных сторон. А Roomba 980 с картой по умолчанию проходит участок один раз — второй только по отдельной просьбе. Производители бюджетных моделей без навигации пишут о том же честно: робот рано или поздно покроет всю комнату, просто это займёт время.
Так что карта даёт не «ум», а эффективность. Настоящая слабость случайной стратегии — в другом: без карты робот не знает, где закончил. В том же материале Spectrum прямо сказано, что ранние Roomba из-за этого не могли убрать больше трёх комнат: вернуться на зарядку они умели, а продолжить с места остановки — нет. SLAM решил именно эту задачу: убрать полквартиры, подзарядиться и доделать вторую половину.

Что из этого следует для вашей квартиры

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

Коротко

— SLAM — это одновременное построение карты и определение своего места на ней; робот держит обе оценки с допуском на ошибку и постоянно их уточняет. — Бытовой лидар обычно меряет расстояние треугольником: лазер, камера и небольшая база между ними. Он видит один горизонтальный срез комнаты и не видит того, что выше или ниже. — Камера (vSLAM) дешевле и не торчит над корпусом, но зависит от света и узнаваемых ориентиров. Колёса и гироскоп — основа расчётов, но их ошибка копится. — Под диваном сходятся три беды: башенка упирается в раму, ориентиров не видно, а буксующие колёса сообщают неверное перемещение. — Чёрный ковёр для инфракрасного датчика выглядит как обрыв, зеркало — как проход, стекло — как пустота. — Хаотичная езда — не глупость, а рабочая стратегия с многократным покрытием. Карта даёт эффективность и умение продолжить уборку с места остановки.
1

Пока нет комментариев

Как робот-пылесос строит карту: лидар, SLAM и диван