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


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

У нас нет единственного «глаза», который решает, ехать дальше или нет. Есть три независимых источника информации, и они работают параллельно.
Первый: детекция. Нейросеть по изображению с камеры детектирует известные классы объектов: людей, технику, автомобили. Дальше мы оцениваем, как это препятствие расположено относительно нашей траектории движения, и если видим опасное сближение, заранее останавливаемся или пропускаем движущийся объект. Лидар в этой связке уточняет 3D-положение объекта: по облаку точек мы понимаем расстояние точнее, чем по одной камере.

Второй: семантическая сегментация для неклассифицированных препятствий. Яма в асфальте, забор, куст, водоем: то, для чего у нас просто нет отдельного класса объекта. У нейросети есть отдельный сегментационный выход, который размечает кадр на проезжую и непроезжаемую зону. Этот слой мы проецируем на поверхность перед трактором и пересекаем с траекторией движения: если впереди «красная» зона, туда ехать нельзя, даже если мы понятия не имеем, что там за объект.
Третий: сырой лидарный point cloud как дополнительный барьер безопасности. Если что-то физически торчит в облаке точек, но нейросеть его не распознала и не сегментировала, мы всё равно остановимся. Это просто ещё один вход в систему принятия решения об остановке, независимый от первых двух.

Что происходит дальше: объехать, остановиться или ждать
Логика зависит от того, выполняем ли мы сейчас технологическую операцию или просто перемещаемся из точки А в точку Б.
Если мы в режиме перегона (например, едем между коровниками или просто в свободном движении в рамках размеченной зоны или полосы) и понимаем, что можем построить объезд препятствия в допустимых границах, мы объезжаем. Если объехать не получается, останавливаемся.
Если же мы находимся на задании и выполняем конкретную технологическую операцию, скажем, вспашку, правило другое: мы не можем самовольно отклониться от маршрута задания. В этом случае трактор останавливается и ждёт, пока препятствие не освободит путь. Логика простая: если перед нами что-то стоит во время выполнения задания, либо это должно уехать и пропустить нас, либо задание изначально было построено некорректно, с препятствием на маршруте, потому что все стационарные препятствия на поле у нас заранее нанесены на карту, и маршрут строится уже с их учётом. А то, чего на карте нет и что появилось динамически, мы объезжаем, если движемся не по заданию, и ждём, если по заданию.
Как боремся с грязной оптикой
Мы специально спроектировали серийную конфигурацию под реальные условия эксплуатации: скорости невысокие, это не трасса, где камеру закидывает грязью на ходу. В подавляющем большинстве случаев одной протирки за смену достаточно, и даже в довольно жёстких условиях не нужно что-то постоянно чистить руками.
При этом мы даём такую возможность опционально: в комплект поставки можно добавить систему обдува и обмыва сенсоров. Делаем это, в частности, под требования одного из заказчиков в газовой отрасли, где условия эксплуатации жёстче, но опция доступна для любой конфигурации.
На какой дистанции трактор остановится
Здесь нет одной фиксированной цифры: расстояние, на котором мы физически распознаём препятствие, всегда заметно больше, чем то, которое требуется для остановки. Мы можем увидеть автомобиль в 50 метрах впереди и понимать, что он вообще не мешает нашей траектории, тогда просто продолжаем движение.
Дистанция срабатывания настраиваема и зависит от скорости движения: есть минимальное расстояние, и есть запас, который растёт вместе со скоростью, чтобы всегда хватало времени на принятие решения и остановку, что-то вроде временного буфера, а не просто фиксированных метров. Чем быстрее едем, тем раньше начинаем тормозить.
Отдельно обрабатываются стеснённые ситуации, например, когда рядом стоит машина, но мы в принципе можем проехать мимо. Тогда трактор заранее сбрасывает скорость, аккуратно проезжает узкий участок и снова разгоняется, когда препятствие осталось позади. То же самое с человеком, который идёт рядом: мимо него мы едем медленно, чтобы он случайно не оказался под колёсами, и набираем скорость только после того, как разъехались.
Что видит и чем управляет оператор

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

Запуск задания происходит либо вручную оператором, либо по расписанию: например, в коровниках трактор просто регулярно, в заданное время, сам выезжает и отрабатывает маршрут без участия человека.
Как трактор держит связь
Здесь несколько вариантов, и выбор зависит от объекта. Где-то используем обычную сотовую связь. Где-то у заказчика уже развёрнут собственный Wi-Fi на территории. А в одном из проектов мы разворачивали собственную дальнобойную радиосвязь, которая покрывает дистанцию порядка пяти километров и достаточно быстро разворачивается на месте.
Если рядом с трактором нет ни одного из этих специальных каналов, остаётся связь непосредственно с ручным пультом: она добивает примерно на несколько километров. А пользовательский веб-интерфейс на трактор через собственную точку Wi-Fi доступен метров на двадцать, то есть буквально рядом с машиной.
Как трактор понимает, где он находится, без спутников
У нас есть заранее построенная лидарная карта местности, и два лидара на борту постоянно сопоставляют текущую картину с этой картой, определяя положение трактора с частотой обновления данных от лидаров. К этому решению подмешиваются данные инерциальной системы и колёсной одометрии, всё сводится в единый навигационный фильтр, который выдаёт итоговое решение о положении машины. Работает полностью автономно, без участия оператора.

Когда трактор периодически выезжает из помещения на улицу, например, между коровниками, предусмотрено автоматическое переключение на GPS для тех участков, которые мы не картировали лидаром. Здесь важна доступность RTK-коррекции: без достаточной точности GPS-решения и уверенности, что сигнал будет устойчиво доступен на объекте, такой переход не имеет смысла.
Точность позиционирования: сантиметровая. Точность выполнения операции на прямолинейных участках: от двух до пяти сантиметров.
Границы и зоны, куда нельзя заезжать
У трактора есть предварительно размеченная карта: где можно ездить, где нельзя, а также правила движения там, где они нужны (направление потока, правила проезда перекрёстков). Плюс поверх статичной карты всегда работает динамическое распознавание в связке с лидаром: если на привычно свободном месте вдруг оказалось препятствие, которого там никогда не было, мы его увидим и остановимся, даже если по карте там разрешено ехать.Сеть семантической сегментации drivable зон в связке с лидаром дает двойную надежность.
Также в основе ситуационной аналитики выступает встроенная нейросетевая подсистема, построенная на архитектуре трансформеров. В режиме реального времени она выполняет семантическую сегментацию видеопотока, пиксельно классифицируя сцену на проходимые (drivable) и непроходимые (nondrivable) зоны. Благодаря механизмам глобального внимания трансформерная модель улавливает тонкие контекстные взаимосвязи между объектами – она не просто выделяет границы дорог, а понимает структуру сцены. Сеть одинаково уверенно распознает динамические объекты: людей, другую технику, случайно оказавшиеся предметы, и учитывает их в семантической карте как временные ограничения. Это незаменимо при работе в коровниках и на подъездных путях, где пространство ограничено, а обстановка постоянно меняется. В итоге сеть корректно интерпретирует сложные неструктурированные участки, где статическая карта бессильна.

Это позволяет системе мгновенно адаптироваться к изменениям рельефа и при этом работать в связке с предварительной картой. Приоритет всегда остается за динамическим распознаванием, обеспечивающим безусловную безопасность движения.
Что если трактор сбился с маршрута
Здесь у нас пока нет полноценного решения. Если трактор по какой-то причине сместился с задания, базовый сценарий: остановиться и запросить у оператора дальнейшие инструкции. При этом есть встроенная функция возврата на заранее заданную «домашнюю» точку: если её выбрать, трактор сам построит траекторию и доедет до дома. А вот отдельного алгоритма «самоспасения», например, автоматической попытки сдать назад и восстановить исходный маршрут без участия человека, пока не существует. Это то, что нам ещё предстоит реализовать.
Коровник: как трактор распознаёт корм и подстраивает движение
Для коровника у нас заранее построена базовая траектория движения вдоль кормового стола. Но количество наваленного корма каждый раз разное, и трактор смещает линию своего движения так, чтобы ехать по краю кормовой массы, а не по номинальной линии: в реальных заездах это смещение может доходить примерно до 30 сантиметров. Распознаём мы это тоже отдельной нейросетью, которая дает семантическое представление где находится корм и в каких границах: чем корма больше, тем сильнее смещение, до определённого порога. Если корма перед трактором нет вообще, он просто едет по базовой номинальной линии без каких-либо смещений.
Само орудие, подталкиватель корма, устроено предельно просто: оно не имеет собственного привода и крутится за счёт трения о землю и корм при движении трактора. Это классическое инженерное решение, мы не первые, кто его применяет для этой задачи, но собственную реализацию спроектировали сами.
Подъём и опускание орудия тоже прописаны заранее в самом задании: например, в галерее, по которой коров прогоняют на дойку, орудие автоматически поднимается, потому что там животные испражняются, и незачем размазывать это по полу.

Что происходит, если во время работы с орудием появляется препятствие
Если трактор выполняет задание с опущенным орудием и перед ним возникает препятствие, он не пытается строить объезд, просто останавливается и ждёт, пока путь освободится. Логика та же, что и в поле: отклонение от маршрута во время выполнения операции означает прерывание самого задания, а мы исходим из того, что нам должны дать возможность проехать дальше. При этом орудие в этот момент остаётся в том же положении, в каком было: опущенным, если было опущено.
Другое дело: режим перегона, когда орудие поднято и трактор просто перемещается. Тогда предполагается, что можно строить полноценный объезд и манёвр в пределах разрешённой зоны.
Коровы у кормового стола
Здесь у нас нет никакой специальной логики распознавания именно коров как отдельного класса объектов. Как ни забавно, отдельного детектора «корова» в системе попросту нет. На практике коровы сами убирают голову от приближающегося трактора. Если корова упорно не убирает голову из-под трактора, мы останавливаемся. В большинстве случаев мы просто аккуратно проезжаем мимо с небольшим зазором.
Звук работающего трактора коров тоже не особо беспокоит: они довольно быстро привыкают к таким вещам. Звуковой сигнал в коровнике мы подаём в основном тогда, когда трактору нужно проехать в галерею, а путь занят проходящими коровами, и на практике это животных заметно не пугает.
Скорость движения в коровнике задана отдельно и ниже полевой: где-то в районе 4–5 км/ч. Единого жёсткого технического требования по скорости здесь нет, мы выбрали значение исходя из безопасности в достаточно тесном и людном (точнее, «коровном») пространстве.
Как разрабатывалось решение именно под коровник
Здесь мы старались придерживаться принципа унификации: базовая функциональность платформы (планирование движения, исполнение траектории, пользовательский интерфейс, распознавание препятствий) одна и та же вне зависимости от объекта, будь то коровник, коммунальная задача на газовом объекте или поле. Отличается по сути только источник навигационного решения: в замкнутых помещениях это лидарная карта, в поле, преимущественно, GPS.
Обучение модели и неожиданные трудности
Отдельного распознавания или классификации коров как объекта у нас, повторюсь, нет, так что этот пункт можно смело вычеркнуть из списка «сложностей с распознаванием коров». А вот что действительно потребовало дообучения, так это распознавание корма и специфических особенностей объекта именно для этой задачи: собирали данные и обучали модель под конкретную задачу оценки кормовой массы.

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

Самой неожиданной проблемой, которую нельзя было в полной мере предугадать на этапе проектирования, оказалась именно неравномерность корма. Изначально мы не планировали динамически подстраиваться под кормовую массу: предполагалось, что на практике корм распределен более-менее равномерно. В реальности его количество вдоль стола отличается очень сильно, и без динамической подстройки трактор просто не мог нормально выполнять свою функцию. Второй момент: коровы иногда сами заходят на кормовой стол и начинают там ходить, мешая движению трактора; отдельно в симуляторе такой сценарий заранее не прорабатывался, и пришлось разбираться с ним уже по факту.
Сколько времени заняла разработка
В целом проект занял около года. Часть этого времени ушла не столько на специфику коровника, сколько на общее «взросление» платформы: доработку аппаратной части и устранение общих детских болезней, характерных для любой новой техники на раннем этапе. Параллельно велась работа над лидарной навигацией как таковой. Сейчас, когда у нас уже есть отработанная технология лидарной навигации и надёжная аппаратная платформа, аналогичную задачу в новой предметной области, по нашей оценке, можно решить примерно за полгода.
Как обычно, если у вас остались вопросы по конкретным узлам: распознаванию, навигации или логике поведения на задании, пишите в комментариях, соберём материал для следующего разбора.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.