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