Личный опыт
Alexey Kotov
455

Как мы сделали навигацию для мобильных роботов

Всем привет! Мы в PureMind разрабатываем решения на основе алгоритмов машинного обучения и компьютерного зрения. Занимаемся этим с 2016 года. Лучше всего умеем делать такие решения на стыке с оборудованием, т.е. когда сложные алгоритмы вычислять очень надо, а большой сервер использовать невозможно (мобильные роботы, дроны, различные “умные”, носимые девайсы). Один из наших проектов - создание системы автономной навигации для мобильных роботов. Это такое ПО, которое позволяет роботам или другому оборудованию перемещаться самостоятельно. Как автономные машины, только скорости поменьше и условия другие.

В закладки

Идея

Все началось с задачи одного из наших клиентов. Они запускали производство поломоечных машин. Такие ездят по торговым центрам, стадионам, в метро. А за ними ходят операторы, чтобы направлять куда двигаться дальше. Пока она может перемещаться только с помощью человека, а нужно, чтобы человека не отвлекала, а ездила сама. Поскольку все эти пространства предназначены для людей и их оттуда не выгонишь, а весит такая машина немало - работать она должна безопасно.

Реализация

Изучив возможные подходы, выбор пал на использование камеры для ориентации робота в пространстве. Для вычисления алгоритмов навигации, распознавания и вычисления расстояний до объектов приняли решение использовать мобильный GPU вычислитель от NVIDIA. Хотя конечно можно и на базе других платформ.

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

Что уже готово

Что продукт уже умеет прямо сейчас:

  • строить карту помещения, понимать где робот на этой карте сейчас находится;
  • загружать заранее заготовленные карты, чтобы можно было легко перемещать робота из одного здания в другое и робот сразу мог в нем ориентироваться;
  • строить маршрут до нужной точки и перестраивать его, если появились препятствия на пути;
  • понимать по одной камере расстояния до объектов;
  • самостоятельно принимать решения о корректировке маршрута или ожидании.

Дополнительно есть интерфейс, который позволяет ставить роботу задачу, в какую точку он должен самостоятельно добраться.

Что дальше

Нам видится логичным превращать это все в коробочный продукт, который уже продавать разработчикам роботов. Вроде выглядит удобно - готовое решение, не нужно ничего разрабатывать самим, можно быстро запустить на своем роботе и быстро начать его продавать (а не тратить год-другой на разработку). Но пообщавшись с рынком выяснилось, что разработчиков мобильных роботов можно по пальцам пересчитать, да и продают они по десятку роботов в год. К тому же “железячные” проекты очень ресурсоемки и делаются с привлечением денег инвесторов, которые очень хотят всю интеллектуальную собственность иметь внутри проекта.

Хотелось бы услышать ваше мнение, стоит ли развивать это решение до уровня скачал-настроил-запустил? Будем рады вашим комментариям!

P.S. на самой поломоечной машине решение еще не запущено, ждем от заказчика оборудование.

P.P.S. Если интересны подробности - пишите в комментариях, отдельно расскажу почему выбрали тот или иной подход к решению каждой задачи и какие есть нюансы.

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Alexey Kotov", "author_type": "self", "tags": [], "comments": 7, "likes": 5, "favorites": 6, "is_advertisement": false, "subsite_label": "life", "id": 60754, "is_wide": false, "is_ugc": true, "date": "Mon, 11 Mar 2019 12:10:12 +0300", "is_special": false }
0
{ "id": 60754, "author_id": 267831, "diff_limit": 1000, "urls": {"diff":"\/comments\/60754\/get","add":"\/comments\/60754\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/60754"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199123, "last_count_and_date": null }
7 комментариев
Популярные
По порядку
Написать комментарий...
0

Я могу ошибаться, но я ожидал от мобильного решения большей мобильности. Яблокофон умеет также простраивать пространство вокруг себя, кроме ARkit существуют и другие движки (ARcore, Kudan..), хорошо работающие как с одной так и стерео-камерами. Написав свой Slam алгоритм можно ужать робота сначала до размеров raspberry, а затем еще раз в 10, разведя свою плату. Один из новых примеров - Oculus Quest, Hololens, MagicLeap - они также ориентируются в облаке меток, как новом так и запомненном, но при этом вычислительная часть занимает размеры напёрстка, включая простой 3.7В аккумулятор за 500р. Использование карт nvidia для этой цели не оправдывает себя, а также сильно ограничивает перспективы разработки.

Ответить
2

Павел, да, если запускать только SLAM - действительно этого будет достаточно. Нам же приходится помимо локализации решать одновременно еще огромное количество задач. Основные GPU ресурсы сжирают deep learning алгоритмы, которые обеспечивают измерение расстояний до объектов (это про безопасность, поскольку такие роботы могут весить более 100Кг и не смогут остановиться мгновенно) с одной камеры даже в статическом режиме. А также алгоритмы принятия решений, которые позволяют роботу принимать решение о корректировке маршрута или ожидании и т.п. Плюс ряд других задач. Но для ориентации в облаке точек вы правы - raspberry будет достаточно.

Ответить
0

Молодцы, что реализовали свой визуальный SLAM. Разумеется, интересны подробности :)
Думается, что как коробочное решение - могут быть трудности, так как для конечного робота данная система должна быть завязана на целевые задачи. Можно рассмотреть варианты лицензирования технологии, но как вы сами верно отметили пока с проектами мобильных роботов напряженка.

Ответить
0

Спасибо! Ищем параллельно и другие возможности применения, не только для роботов. Подробности тогда будем постепенно писать и добавлять)

Ответить
0

А есть почитать на русском, так сказать для чайников.

Ответить
0

Николай, постарались в видео как раз показать на простом примере как это работает. Расскажите про что рассказать подробнее - сделаю материал на эту тему.

Ответить
0

Идея хороша и реализация нетипична. Однако интересен финансовый аспект. К примеру, если глянем стоимость поломоечных машин разных производителей https://shop-avd.ru/polomoechnye-mashiny/ получим условный диапазон в 30к - 6кк руб. Насколько данная технология удорожит конечный продукт и будет ли это рентабельно?

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }