В настоящее время существует множество видов навигации автономных беспилотных аппаратов и роботов.  В целом их можно разделить на навигацию внутри помещений – indoor, и вне помещений – outdoor.     В свою очередь, навигация внутри помещений также направлена на решение множества задач. Как правило, это мобильные роботы, предназначенные для перемещения грузов на складе, роботы пылесосы, роботы для мерчандайзинга, интерактивного общения с клиентами, официанты и т.д. Когда мы переходим к навигации внутри помещений, то сразу теряем все преимущества спутниковой навигации, потому что спутниковый сигнал, как правило, не достигает устройств сквозь бетонные и металлические конструкции. С другой стороны, благодаря тому что пространство внутри зданий зачастую ограниченно относительно небольшими площадями, можно воспользоваться такими средствами навигации, как триангуляция, навигация по различным меткам (QR коды с указанием последующих команд для робота, сигнальные линии по ходу движения, метки на стенах для коррекции местоположения), SLAM навигация, а также комбинации вышеперечисленных методов.     Представленные методы навигации кардинально отличаются по применяемым технологиям и имеют свои преимущества и недостатки. В данной статье будет рассмотрен только метод SLAM навигации, который является наиболее перспективным из перечисленных для работы в неисследованном пространстве. Данный метод интересен тем, что может использоваться в неподготовленном и неизвестном роботу помещении для создания карты и последующего её использования. Стоит учитывать, что для работы SLAM требуются различные источники данных, в том числе, одометрия. SLAM от англ. расшифровывается как Одновременная Локализация и Картографирование (Simultaneous Localization and Mapping). Данный метод навигации используется для определения местоположения и ориентации автономных роботов на заранее неизвестной им местности, а также, для обновления или дополнения уже известных карт окружающего пространства.     В целом, принцип работы SLAM происходит следующим образом. Роботу необходимо в каждый момент времени знать свое местоположение, а также, постепенно сканировать окружающее пространство при помощи сенсоров, составляя, таким образом, карту местности. Карта строится постепенно, по мере исследования роботом новых областей. Основным источником информации о местоположении робота является одометрия, полученная тем или иным образом (колеса, компьютерное зрение, IMU или их комбинация). Однако, по мере выстраивания карты, робот начинает сверяться с картой. Например, если робот проезжает по той области помещения, которую он уже отсканировал, происходит сверка по определенным паттернам. В результате, если аппарат понимает, что текущие показания одометрии не соответствуют показаниям карты, происходит корректировка одометрии.     С математической точки зрения, SLAM пытается оценить карту и весь путь, пройденный роботом. Таким образом, поза робота рассчитывается только в конце траектории, проделанной роботом. Вероятностное определение подхода полного SLAM может быть дано следующим образом [1]: где u представляет собой управление роботом в момент времени t где z представляет собой информацию об окружающей среде, обозреваемой роботом в момент времени t где m представляет собой построенную карту, а x – полученное местоположение робота в момент времени t. Таким образом, для расчета траектории робота, можно все представить в таком виде (рисунок 1): При использовании SLAM отображение карты может быть как в 2D, так и в 3D. Отображение геометрии местности в 3D является более сложным и, как правило, требует больше памяти. Однако, это не всегда позволяет обеспечить качественное понимание окружающей среды, поэтому двухмерного отображения достаточно для большинства задач. Помимо этого, методы SLAM можно разделить по используемым подходам SLAM для представления карт. Например, SLAM, основанные на сетке точек (grid-based), на основе распознавания уникальных объектов (feature-based) и на основе графиков (graph-based) для более разреженных изображений, топологические (topological) для распознавания типов местоположений и семантические (semantic) для более высокого уровня понимания окружающей среды [1]. 1.1 Feature-based SLAM Feature-based SLAM используют легко идентифицируемые элементы в среде и создают внутреннее представление о пространстве с учетом местоположения этих ориентиров. Исторически самый ранний и наиболее влиятельный SLAM алгоритм основан на расширенном фильтре Калмана (EKF – Extended Kalman Filter). 1.2 Graph-based SLAM     SLAM на основе графов или сетей также пытается создать карту с помощью графа, узлы которого соответствуют позициям робота в разные моменты времени, а ребра представляют собой пространственные ограничения, связывающие позы робота вместе. Ограничения состоят в распределении вероятностей относительного преобразования между позами. Используя граф, построенный на основе измерений датчиков, система определяет наиболее вероятную конфигурацию поз с учетом ребер графа. Одним из наиболее популярных подходов к SLAM на основе графов является метод отображения в реальном времени (VSLAM Rtabmap), основанный на инкрементном детекторе замыкания цикла на основе визуальных образов [1]. 1.3 Grid-based SLAM     Теоретически наиболее простым методом является подход на основе сетки. При таком подходе среда разбивается на сетку точек определенного размера. Каждая точка может быть занята препятствием, не занята или не исследована. Например, ячейка со значением 1 будет считаться занятой, а другая со значением 0 будет полностью свободной [1]. Также значение точки может варьироваться от 0 до 1 при помощи промежуточных значений. 1.4 Topological SLAM     Топологическое представление проблемы SLAM направлено на создание графо-подобного описания окружающей среды, а не точной метрической карты. В топологическом описании узлы могут соответствовать значимым местам, которые легко различить. Основополагающей идеей этого подхода было то, что люди и животные не создают точных карт окружающей среды, в которой они находятся. Как правило, эти методы подходят для навигации в простых средах и применять их в более сложных и больших средах затруднительно [1]. 1.5 SemanticSLAM     Представление карт также может быть выполнено в виде моделей семантических карт. В отличие от топологических подходов, где отображение фильтрует метрическую информацию и использует только распознавание мест для различения местоположения, семантическое сопоставление связывает семантические концепции с объектами в окружающей среде. Семантическое отображение все еще находится на ранних стадиях разработки и, в зависимости от уровня необходимых семантических возможностей, оно может быть очень сложным для реализации. Несмотря на это, согласно Carlos Miguel [1] было проведено множество исследований по семантическому отображению и семантическому SLAM [7, 9]. 1.6 Современные методы SLAM     В настоящее время SLAM навигация получила распространение на Robotic Operating System (ROS) в качестве пакетов, зачастую находящихся в открытом доступе, например: GMapping [2], Cartographer [3], Rtabmap [4, 9]. Данные пакеты были выбраны для исследования поскольку являются достаточно широко известными и популярными для работы с ROS. Таким образом, имеется большое количество информации касательно настройки и использования данных SLAM, а также поддержка со стороны разработчиков.     Gmapping создает карту благодаря данным с лидара. Как правило, используется 2D лидар, способный сканировать окружающее пространство на 360 градусов вокруг. Далее, происходит сопоставление готовой карты и данных с лидара, в результате чего оценивается и корректируется местоположение робота. Стоит также сказать об адаптивном алгоритме локализации Монте-Карло (Adaptive Monte Carlo Localization – AMCL). Это алгоритм для локализации, использующийся как фильтр частиц для отслеживания позиции робота на карте [5]. Основной его принцип работы заключается в том, что алгоритм предполагает множество позиций, где может находиться робот, даже если задана начальная позиция. По мере движения робота, алгоритм сопоставляет «очертания карты» и данные с лидара. Таким образом, постепенно, множество предполагаемых позиций робота сходится к локальной точке, считающейся истинным местоположением робота в пространстве.     Google Cartographer схож с GMapping в том, что может строить карту по 2D лидару и данных с одометрии. Однако, в отличие от Gmapping, он обладает намного более богатым функционалом. Например, Cartographer имеет более сложную градацию точек, из которых состоят карты – cells. По мере исследования одного и того же участка местности, Cartographer плавно меняет параметр точек карты с «неизвестно» на «исследовано» с флагом «свободно» либо «препятствие» [3]. В результате, Cartographer имеет меньшую вероятность пропустить какие-либо объекты на карте. Это особенно заметно во время резких поворотов из-за угла, когда робот может сканировать определенный участок местности только короткий промежуток времени. Оператор (алгоритм автоматического картографирования) будет вынужден вернуться к этому участку ещё раз, как правило с другого ракурса и закончить исследование той области, где исследование завершено не полностью. Основная особенность данного метода заключается в том, что он состоит из локального SLAM и глобального SLAM. Локальный SLAM создает отдельные небольшие части карты. Затем, глобальный SLAM алгоритм ищет совпадения между частями карт, а также между данными сенсоров и всеми картами, созданными при помощи локального SLAM в параллельных процессах. В результате, глобальный SLAM формирует единую карту окружающего пространства [3, 6]. Помимо этого, Cartographer умеет работать с 3D картами [3, 6]. Это несомненный плюс для летательных аппаратов, а также для мобильных роботов с большими габаритами. С другой стороны, это потребует большей вычислительной мощности.     Также, в отличие от более простого GMapping, Cartographer может работать с несколькими лидарами одновременно (к примеру, на разной высоте для создания 3D карты), а также с RGBD и стерео-камерами, благодаря которым возможно получить гораздо больше информации об окружающем пространстве.     В целом, Cartographer – это гибкий в настройке SLAM. Он более требовательный к ресурсам, чем GMapping, но позволяет получить более качественный результат.     Rtabmap – это метод SLAM, основанный на поиске и сопоставлении соответствий визуальных данных сенсоров с использованием механизма памяти, где хранится база данных визуальных образов в соответствии с данными о местоположении робота [4, 7, 8, 9].     Механизм визуальной навигации работает следующим образом. Rtabmap обрабатывает каждое новое входящее 2D изображение, выделяя в нем основные особенности, которые могут быть использованы для сравнения данного изображения с прочими. Каждому такому изображению сопоставляются данные о местоположении и ориентации робота в пространстве в момент получения изображения. Таким образом составляется база данных визуальных образов и координат, в которых они были получены. Одновременно с этим, каждое новое полученное изображение сравнивается с уже имеющимися в базе изображениями по ряду признаков. Если же коэффициент соответствия достаточно высокий, алгоритм считает, что робот в настоящий момент находится в уже ранее исследованном месте и, если это необходимо, корректирует одометрию. Стоит отметить, что такой подход сильно зависит от качества получаемых изображений, а также от участка местности, где происходит картографирование. Например, Rtabmap будет плохо работать в симуляции, где все стены и объекты одинаковые, либо в реальном помещении, если кроме стен в нем практически ничего не присутствует – многие изображения идентичны. Rtabmap имеет множество настроек, что делает его довольно гибким. К примеру, можно настроить количество паттернов, вычленяемых из изображения, а также задать – сколько из них должны совпадать для того, чтобы считать изображение соответствующим уже имеющемуся в базе и т. д. Более подробно особенности Rtabmap будут описаны в следующем разделе.     Параллельно с этим, строится 2D карта пространства, в котором передвигается робот. Rtabmap может работать с широким набором сенсоров и их комбинацией: лидары, RGBD камеры, стерео-камеры, одометрия, IMU. В качестве источника данных для карты могут выступать как лидар, так и RGBD камеры или стерео-камеры. Однако необходимо выбрать один единственный тип используемых сенсоров. В то время как лидар изначально сканирует 2D плоскость, данные о препятствиях от RGBD камер и стерео-камер проецируются на 2D карту при помощи внутренних инструментов Rtabmap. В результате, на карту наносятся все препятствия, и «свободные» области, которые робот исследовал при помощи сенсоров.     По мере исследования аппаратом местности, база визуальных образов становится больше. Таким образом, со временем Rtabmap начинает реализовывать свой функционал локализации. Когда робот возвращается в ранее исследованное место, алгоритм позволяет сопоставить текущие значения одометрии и значения, записанные ранее в память с привязкой к изображению. Это позволяет уменьшить накапливающуюся ошибку одометрии и, что не менее важно, скорректировать 2D карту местности. Rtabmap может немного перестроить уже созданную часть карты, если понимает, что эта часть была сохранена с ошибкой в одометрии. Таким образом, алгоритм убирает накопленную ошибку, а карта становится более точная. Данный процесс можно заметить невооруженным глазом, когда робот сначала исследует определенную часть карты с одной стороны, а затем заканчивает исследование этого же участка карты с противоположной стороны. В результате, места «склеек» корректируются и карта становится завершенной.     Как уже было сказано, помимо данных о препятствиях в окружающем робота пространстве, для работоспособности SLAM требуются данные о местоположении робота – одометрия. Здесь также предоставляется выбор – это может быть встроенная в Rtabmap визуальная одометрия, либо любой внешний источник данных (одометрия с колес, источник внешней визуальной одометрии, IMU, либо их комбинация). Точность одометрии, безусловно, является очень важным параметром, поскольку, чем быстрее данные будут накапливать постоянную ошибку, тем меньше вероятность, что SLAM будет адекватно эту самую ошибку нивелировать. Представленные выше методы SLAM имеют свои преимущества и недостатки. Однако, для решения проблемы навигации мобильного робота внутри помещения требуется выбрать только один. Основными требования являются точность позиционирования работа до 5 см в помещении, площадью более 100 м2. Для небольшого помещения вполне достаточно стандартного GMapping. Данный алгоритм хорошо справляется с локализацией по данным лидара. К сожалению, в процессе тестирований в симуляции выяснилось, что при исследовании аппаратом достаточно большого помещения (использовалась симуляция помещения 30х20 м), периодически алгоритм не справляется со «склейкой» некоторых частей 2D карты, в результате чего, различные участки карты попросту накладываются друг на друга и дальнейшая работа с ней невозможна.   Единственная выявленная закономерность заключается в том, что составление карты нарушается после исследования определенной площади. Дальнейшие тесты было решено не проводить и перейти к более функциональным и гибким методам SLAM.     Google Cartographer обладает большей гибкостью в плане настроек и выбора сенсоров. Возможность использования не только лидаров, но также камер глубины позволяет получить большее количество информации. Также, Cartographer позволяет без проблем составлять карты больших по площади помещений.     В отличие от GMapping и Cartographer, Rtabmap SLAM строит не только 2D карту, но и создает базу данных визуальных образов. Таким образом, Rtabmap ищет глобальные совпадения по визуальным образам, в то время как составленная карта помещения может использоваться лидаром для локальной корректировки местоположения робота в пространстве. В целом было решено выделить две конфигурации настроек Rtabmap. Первая позволяет строить карту по данным лидара, в то время как вторая строит карту по данным с RGBD камеры. Глобальный механизм навигации в обоих случаях производится по визуальным образам, согласно основному принципу работы данного SLAM.     Соответственно, также выбраны две конфигурации Cartographer – с использованием лидара и RGBD камеры. Поскольку Cartographer также позволяет использовать различные сенсоры, его можно сравнить с Rtabmap в разных конфигурациях.     Метод построения карты с лидара позволяет, как правило, построить более наглядную схему помещения, на которой будут видны все стены, объемная мебель, перегородки и прочие объекты. На такой карте проще ориентироваться, если, например, требуется построить маршрут для робота, либо понять, где в настоящее время он находится. Однако, у карт, построенных подобным образом имеется существенный недостаток – лидар сканирует только одну 2D плоскость, расположенную на каком-либо зафиксированном уровне (имеется в виду стандартный 2D лидар, т. к. существуют лидары, сканирующие 3D пространство, однако их стоимость в разы больше, чем стоимость не только 2D лидаров, но также RGBD и стерео-камер).     Во время процесса картографирования потенциальные препятствия находятся на разных уровнях по вертикальной оси. В случае, когда мобильный робот имеет низкий профиль (робот пылесос), это не так сильно влияет на эффективность картографирования, поскольку большинство препятствий, находящихся в пределах высоты робота все же будут распознаны лидаром. Более того, в некоторых случаях это будет преимуществом – например, робот низкого профиля может проехать под столом, стулом и прочими предметами мебели, у которых объем занимаемого пространства меняется в зависимости от высоты. Из-за того, что лидар сканирует непосредственно определенную плоскость пространства, он сможет зафиксировать только те части препятствий, которые находятся на одной с ним высоте. В результате, низкопрофильный робот будет обращать внимание только на те объекты (части объектов) на его пути, с которыми он потенциально может столкнуться.     Если же робот имеет крупные габариты, особенно в высоту, данный способ картографирования не сможет определить все объекты, представляющие опасность. Данную проблему можно решить несколькими способами. Во-первых, можно использовать несколько лидаров на разных уровнях высоты. Однако, невозможно заранее предположить, на каких именно высотах могут располагаться препятствия. Во-вторых, можно строить карту при помощи одного лидара, а в дополнение использовать камеру глубины, которая будет фиксировать препятствия, но не будет наносить их на карту (Rtabmap не позволяет строить карту с использованием данных и с лидара и с камер глубины одновременно, если только не конвертировать всё в формат данных лидара). Данные о препятствиях будут использоваться только для локальной временной карты в стеке навигации ROS. Таким образом, робот будет создавать легко читаемую карту и, в то же время, будет способен определить все препятствия, которые ему необходимо избегать в процессе передвижения.     Несмотря на то, что на карте, построенной по лидару находятся не все препятствия, создание такой карты имеет и положительные стороны для навигации. Rtabmap может использовать лидар не только для определения препятствий, но также сопоставлять карту и данные лидара в текущий момент при помощи функции ICP (Iterative Closest Point). Если же положение робота по данным лидара не соответствует карте, алгоритм корректирует текущие координаты робота. По причине того, что карта по данным лидара имеет на порядок меньше шумов, её использование совместно с функцией ICP даст более качественный результат, нежели использование ICP на карте, построенной по камере глубины. Данный функционал полезен в случае, если одометрия накопила ошибку, либо когда робот движется по определенному участку в направлении противоположном тому, в котором этот участок был изначально исследован. Поскольку глобальная навигация Rtabmap происходит по визуальным образам, то, во время исследования, робот видит изображения как правило перед собой. Тогда как при движении в противоположном направлении, он не сможет находить визуальные образы, соответствующие тем, которые он сохранил. Конечно, это можно нивелировать путем исследования одних и тех же участков помещения дважды – двигаясь по ним в противоположных направлениях, однако это увеличивает время, затрачиваемое на картографирование.     Метод построения карты с использованием камер глубины изначально способен сканировать объемное пространство. В таком случае алгоритм будет наносить на карту проекции всех объектов, которые он сканирует в процессе движения робота. В результате, полученная карта будет менее наглядная, но более полноценная и безопасная для передвижений робота. Более того, планировщик пути робота будет строить свой маршрут сразу учитывая все объекты; в то время как при использовании карты, построенной по лидару, робот сначала подъедет к незафиксированному этим самым лидаром препятствию, затем распознает его при помощи камеры и, только после этого, перестроит свой маршрут.     Обе представленные конфигурации Rtabmap способны справиться с задачей навигации крупногабаритного робота внутри помещения. Таким образом, принято решение протестировать оба варианта и оценить полученные результаты. Также решено проверить эффективность работы этих сенсоров с Cartographer. В итоге, нами были рассмотрены такие современные SLAM алгоритмы как Gmapping, Rtabmap и Google Cartographer. Каждый из них имеет свои особенности, которые будут являться преимуществами для одного робота и недостатками для другого. Например Gmapping – это базовый SLAM, не требующий высокой вычислительной мощности. Как следствие, его можно использовать для небольших простых роботов с необходимостью картографирования и локализации при помощи 2D лидара. В то же время, Cartographer и Rtabmap являются уже более ресурсоемкими пакетами и требуют соответствующей вычислительной мощности, в также наличие определенных сенсоров (камера для Rtabmap). Однако, возможности данных алгоритмов на порядок выше – качество картографирования на сложной местности превосходит простой Gmapping.  В следующей части статьи будет представлено тестирование SLAM алгоритмов непосредственно на практике. Pedrosa, E., L. Reis, C. M. D. Silva and H. S. Ferreira. Autonomous Navigation with Simultaneous Localization and Mapping in/outdoor. 2020. Gmapping [Электронный ресурс] URL: http://wiki.ros.org/gmapping, свободный ресурс – Загл. с экрана. Язык англ. Дата обращения: 14.08.2020 г. Google Cartographer ROS [Электронный ресурс] URL: https://google-cartographer-ros.readthedocs.io/en/latest/#, свободный ресурс – Загл. с экрана. Язык англ. Дата обращения: 04.11.2020 г. RTAB-Map, Real-Time Appearance-Based Mapping [Электронный ресурс] URL: http://introlab.github.io/rtabmap/, свободный ресурс – Загл. с экрана. Язык англ. Дата обращения: 22.06.2020 г. Adaptive Monte Carlo localization [Электронный ресурс] URL: http://wiki.ros.org/amcl, свободный ресурс – Загл. с экрана. Язык англ. Дата обращения: 03.08.2020 г. Building Maps Using Google Cartographer and the OS1 Lidar Sensor [Электронный ресурс] URL: https://ouster.com/blog/building-maps-using-google-cartographer-and-the-os1-lidar-sensor/, свободный ресурс – Загл. с экрана. Язык англ. Дата обращения: 25.02.2021 г. Labbé, M, Michaud, F. RTAB‐Map as an open‐source lidar and visual simultaneous localization and mapping library for large‐scale and long‐term online operation. J Field Robotics. 2019; 35: 416– 446. Silva, B.M.F.D.; Xavier, R.S.; Gonçalves, L.M.G. Mapping and Navigation for Indoor Robots under ROS: An Experimental Analysis. Preprints 2019. Mathieu Labbé and François Michaud. Online Global Loop Closure Detection for LargeScale Multi-Session Graph-Based SLAM. 2014 IEEE/RSJ International Conference on Intelligent Robots and Systems, pages 2661–2666, 2014.