В прошлой статье мы рассмотрели несколько современных алгоритмов SLAM для ROS. Во данной статье будет рассмотрено применение SLAM на практике. В качестве робота используется опытный образец мобильного робота мерчандайзера компании «R2 Robotics». Робот имеет базу с двумя ведущими колесами, расположенными на одной оси в центре, что позволяет совершать развороты на месте и способствует высокой манёвренности. Диаметр робота составляет ~60 см, а его высота 1.5 метра.     В качестве сенсоров на роботе используются: 2D лидар RPLidar A1, RGBD камера Intel RealSense D435i и трекинг Intel RealSense T265 камера для отслеживания одометрии. Лидар установлен в нижней части робота и сканирует только фронтальный сектор в 180 градусов, в то время как камера установлена на уровне 1.1 м и наклонена вниз на угол 40 град. Учитывая, что высота робота 150 см, камера позволяет распознать препятствия на высоте, недоступной лидару. Помещение для тестов показано на рисунке 9. Площадь в 70 м2 достаточна для простых тестов и перемещения робота по заданному оператором маршруту. Также, в помещении расположены несколько препятствий, сложные для распознавания при помощи лидара. 4.1 Rtabmap     В результате картографирования были получены две карты – построенная по лидару и по камере глубины (рисунок 10). Рисунок 10 – Rtabmap карта построенная по а) лидару b) RGBD камере  Как можно наблюдать из рисунка 10 – карта, построенная по лидару, содержит меньше шумов и более читабельна. Основные границы, такие как стены помещения и мебель имеют ярко выраженные очертания. На такой карте проще ориентироваться и, к примеру, составлять маршрут передвижения для робота, особенно если это помещение большой площади с множеством объектов. В противном случае, карта, построенная по RGBD камере, выглядит менее презентабельно. Наблюдается большое количество шумов, из-за чего граница помещения и некоторых объектов размытая. Однако, карта, созданная с использованием камеры, отображает большее количество объектов. На рисунке 11 выделены области, в которых расположены ключевые объекты, представляющие препятствия для робота. Синяя область обозначает два стола и кресла. Логично, что лидар распознал только ножки столов и нижние части кресел, в то время как камера глубины полностью показывает занимаемое объектами пространство, проецируя данные на 2D карту. Также, лидар полностью проигнорировал препятствия, обозначенные красными областями (высокий стул и стойка). Аналогично с зеленой областью – в ней расположены 7 стульев.     Как результат, робот будет планировать маршрут сквозь объекты, которое он не распознаёт или распознаёт частично. Соответственно, необходимо использовать камеру глубины как вспомогательное устройство и отправлять данные в стек навигации (рисунок 12). С другой стороны, объекты, расположенные на высоте лидара, отображаются корректно и с минимальным шумом. К примеру, желтые области на рисунке 11 обозначают два дивана и небольшой шкаф. На карте, построенный по камере, довольно сложно понять, где именно заканчиваются границы этих объектов, особенно если они расположены плотно друг к другу.     В качестве сравнительного теста робот ездил по одному и тому же участку помещения на обеих картах. Участок проезда был выбран таким образом, чтобы захватить препятствие, окруженное свободным пространством. Процесс движения и планируемая траектория, создаваемая планировщиком показаны на рисунках 13 и 14. В результате можно наблюдать, что при картографировании с камеры глубины робот изначально строит маршрут, огибая препятствие, отмеченное на карте (чёрный объект на рисунке 13). В это же время, при картографировании с лидара, робот не наносит препятствие на карту. Однако, если использовать данные с камеры для формирования obstacle_layer в стеке навигации, робот также распознает препятствие и сможет его объехать (препятствие отображается розовым цветом и в меньшем объеме на рисунке 14). Более того, изначальная карта будет выглядеть намного менее зашумленной. Единственным существенным недостатком будет то, что препятствия на obstacle_layer не будут сохранены и робот будет каждый раз сканировать их заново. Кроме того, зачастую препятствие будет отображаться не в полном объеме. Таким образом, при построении продолжительного маршрута, робот будет изначально строить кратчайший путь, который будет проходить «сквозь» подобные объекты и, в процессе движения, будет перестраивать свой маршрут при обнаружении препятствий снова и снова. К тому же имеется вероятность, что координаты цели, заданные оператором, могут совпасть с местоположением препятствия, что приведет к ошибкам в процессе работы. 4.2 Google Cartographer В процессе тестирования Google Cartographer было выбрано две конфигурации. В первой в качестве источника данных используется лидар RPLidar A1, в то время как во второй используется камера глубины Intel RealSense D435i.  Попытка построить карту при помощи камеры не была успешной. Робот сканировал небольшую часть карты при помощи локального SLAM, после чего переходил к сканированию другого участка. Однако, при склеивании данных частей, глобальный SLAM не смог справиться со своей задачей. Части карты накладывались друг на друга, кроме того, ориентация некоторых локальных карт также была не верной. Основной причиной такого результата можно назвать камеру глубины. В отличает от лидара, камера глубины способна хорошо сканировать пространство в пределах приблизительно 2-х метров. Собственно, картографирование в Rtabmap также проводилось с дальностью видимости камеры на 2 метра. Rtabmap – визуальный метод SLAM, так как глобальная навигация в первую очередь ориентируется на визуальные образы и не привязывается к контуру карты настолько сильно, а Cartographer – геометрический метод, использующий в первую очередь контур карты для ориентации. Однако, поскольку камера может дать информацию только на 2 метра, Cartographer сложнее составить крупные локальные карты. В то же время, если увеличить дальность видимости камеры, шумы будут настолько сильными, что данная информация будет полностью бесполезной для алгоритма. Возможно необходима более тщательная настройка Cartographer, к примеру, настроить коэффициенты данных одометрии, линейного и углового соответствия, что позволит оптимизировать глобальный SLAM. В то же время, заменив камеру глубины лидаром, удалось получить хороший результат. Как видно из рисунка 15, карта, построенная с использованием лидара и пакета Cartographer имеет такие же отличия, как и карты, построенные при помощи SLAM пакета Rtabmap. На рисунке 16 отчетливо видны слегка размытые серым цветом границы помещения. Это особенность работы Cartographer. В процессе сканирования Cartographer наносит препятствия на карту несколько раз, убеждаясь, что это действительно существующий объект, а не помехи или шум, который необходимо избегать. Таким образом, все объекты на карте постепенно меняют свой окрас от бледно-серого до черного оттенка. Чем темнее оттенок объекта на карте, тем больше Cartographer «уверен» в существовании данного объекта. Данная особенность позволяет довольно быстро убирать помехи с карты в процессе её сканирования. Более того, Cartographer практически не обращает внимания на быстродвижущиеся динамические объекты – например, людей. Он попросту не успевает нанести их на карту в виде препятствий, если человек постоянно перемещается. Участок карты, на котором обозначается человек (изначально бледно-серым оттенком), в следующий момент времени уже пуст и этот участок снова помечается как свободный от препятствий.     Однако, это не означает, что робот во время движения столкнется с человеком. Данные с датчиков по-прежнему поступают в navigation stack и наносятся на obstacle layer. Благодаря этому локальный и глобальный планировщики не дадут построить маршрут движения, который приведет к столкновению. В этом случае необходимо обратить внимание на скорость движения человека и скорость обработки данный в navigation stack, чтобы робот успевал обрабатывать поступающую информацию. В противном случае, если скорость движения человека будет слишком высока, столкновение может произойти.     Следующей особенностью Cartographer является разбиение процесса построение карты на глобальный SLAM и локальный SLAM. Благодаря этому, Cartographer способен сканировать карту даже при небольших отклонениях в одометрии, поскольку, при склеивании локальных частей карты, он ориентируется не только на одометрию, но и сами карты. Таким образом, Cartographer «подгоняет» кусочки карт друг под друга, чтобы сопоставить их как можно более точно. В особенности это заметно на примере стен. При резком развороте робота данные с лидара наносятся на карту с небольшой задержкой, но этого достаточно чтобы ровная стена отображалась в виде нескольких линий, которые пересекаются друг с другом под углом около 5-10 град. Однако, спустя определенное время (количество итераций до склеивания задается в параметрах Cartographer) происходит присоединение нового участка карты и, как правило, большая часть несоответствий уходит. Благодаря этой же особенности, Cartographer позволяет строить карты, состоящие из множества помещений. В сравнении в Rtabmap, Cartographer показывает себя в данном ключе с более выгодной стороны. При использовании Rtabmap во время перемещения робота из одного помещения в другое, либо по серии коридоров, местоположение робота довольно быстро терялось, и, несмотря на то что сама карта имела схожие очертания с реальным зданием, полноценное использование Rtabmap выглядит достаточно сложным (в тестах использовалась трекинг камера в качестве источника одометрии, что плохо сказывается на точности данных в условиях длинных коридоров и возле стен с однотонной поверхностью).     На рисунке 17 представлена карта 2-х помещений, созданных при помощи Cartographer. В начале было исследовано помещение 1, затем робот исследовал помещение 2, после чего снова вернулся в первое помещение, где были сделаны небольшие правки карты. Как можно заметить, левая часть помещения 2 исследована плохо, однако общая карта обоих помещений соответствует реальному зданию. Во время картографирования, промежуточная стена, разделяющая оба помещения была исследована с двух сторон. В случае использования Rtabmap есть большая вероятность получить на карте две стены, которые могут не соответствовать друг другу, однако Cartographer справился с поставленной задачей.     В результате сравнения режимов конфигурации и работы SLAM методов Rtabmap и Cartographer было выявлено, что выбор источника данных для построения карты помещения имеет значительное влияние. При картографировании по данным с 2D лидара, карта получается менее зашумленной и более читаемой для оператора. К тому же, при использовании данных с камеры в качестве дополнительного источника информации для стека навигации, не распознанные лидаром объекты попадут на obstacle_layer, и робот сможет их объехать при обнаружении.     С другой стороны, использование камеры глубины в качестве основного источника данных для картографирования также имеет преимущества. Во-первых, камера способна идентифицировать большее количество препятствий за счет того, что она сканирует 3D пространство. Таким образом, все препятствия (стулья, столы, стойки и пр.) будут нанесены на карту изначально в полном объеме занимаемого ими пространства и сохранены. Поскольку объекты будут нанесены на карту еще на этапе картографирования, это позволит роботу планировать оптимальную траекторию прямо с точки старта, а оператору будет проще планировать маршрут робота, так как он будет видеть все возможные препятствия на карте ещё в момент старта робота.     Стоит также обратить внимание на сенсоры, доступные для использования с каждым типом SLAM. Кроме того, различия есть и в формате выходных данных. Gmapping предоставляет лишь базовые возможности подключения – 2D лидар и одометрию, в то время как Cartographer и Rtabmap позволяют подключать широкий спектр различных датчиков для считывания окружающей информации. Кроме того, в отличие от Gmapping, данные методы позволяют создавать 3D карту местности.     Разные подходы в Rtabmap и Cartographer также привносят особенности в работу SLAM. Rtabmap лучше показывает себя на открытом пространстве, что предполагает использование визуальных образов. В качестве примера может быть огромный павильон, в котором лидар попросту не достанет до границ помещения, как и камера глубины. К тому же, шум у камеры довольно сильно возрастает с увеличением расстояния до объекта – например стены.     Cartographer показывает себя лучше в закрытых и запутанных пространствах, так как использование непосредственно самой карты (а не визуальных изображений) для локализации робота позволяет производить картографирование множества помещений. Кроме того, система разделения на локальный и глобальный 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.