Кликабельно ↑↑↑ Youtube
В первую очередь мы разделились на выполнение двух задач: сборка быстрого решения и настройка общих процессов (для прохождения квалификации) и более долгий и правильный подход для решения более общих задач.
Запустить симуляцию удалось сразу, проблем с этим не возникло. Далее необходимо было построить карту для ориентации робота в прострастве. Для экономного по ресурсам решения был выбран 2D SLAM. Для построения карты мы решили попробовать gmapping
. Почитав документацию gmapping
, был составлен простой launch-файл. А также установлен и настроен виртуальный лазер hokuyo_laser
. После построения карты выяснилось, что есть такая штука как бордюры, уровень которых не детектится лазером, а робот при ориентации по такой карте норовит врезаться в бордюр и застрять. Для решения этой проблемы мы решили дополнить датчики робота fake-laser'ом, работающим на облаке точек виртуальной RGBD-камеры. Данные из PointCloud
камеры в формат LaserScan
мы сконвертировали с помощью пакета pointcloud_to_laserscan
таким образом, чтобы данные выбирались на высоте бордюров. Для лучшего обзора пришлось переместить RGBD-сенсор в переднюю часть (так в кадр перестал попадать робот).
Получив данные с RGBD-камеры, мы предприняли попытку построить карту с учётом бордюров. Для построения карты топик kinect_scan
(виртуального лазера) и топик hokuyo_laser
были объединены в один топик scan
с помощью ira_laser_tools
.
Однако карта все равно строилась преймущественно с учётом данных лазерного дальномера, тк данные о бордюрах не фиксировались из-за:
- Ограниченного угла обзора лазера. Он смотрел только в одну сторону, перед роботом и слишком близко. В то время когда со спины и со сторон робота
hokuyo_laser
брал далеко и опять же не учитывал бордюров; - Частота fake-laser была мала.
Строить карту только на втором лазере нормально не получалось, тк он смотрит только в одну сторону, достаточно недалеко => частота обновления данных маленькая и получается много артефактов. Позже выяснилось, что даже если бы мы построили такую карту, то ориентация по ней с помощью 2D SLAM была бы практически невозможна (опять же из угла обзора лазера для бордюров).
Для управления роботом нужны:
- map_server
- amcl
- move_base
- local/global planner
Данная связка вместе с launch-файлами была представлена в пакете turtlebot_navigation
. При установке из исходников возникли проблемы с компилятором, при установке из deb-репозитория проблема с зависимостью ros-kinetic-realsense
(нашли заметку, сделали patch, установили).
Затем был переписан дефолтный launch-файл для запуска amcl
+ move_base
+ planner
. Выпилив оттуда запуск аппаратного лазера, и сделав remap /cmd_vel
на /mobile_base/commands/velocity
, мы смогли заставить робота ориентироваться в построенной карте.
Однако ввиду неправильной карты (не содержащей бордюров), робот не всегда мог доехать до конечной точки маршрута, т.к. застревал и почти не учитывал локальные препятствия.
Т.к. топик /scan
при столкновении с препядствием всё же говорил корректную информацию о нахождении бордюра, было принято решение повлиять на алгоритм построения маршрута робота.
Было решено с нуля настроить необходимые ноды из пакета navigation
для корректного перемещения робота в пространстве с учётом динамических препятствий (в том числе в виде бордюров).
Поиграв с настройками дефолтных плагинов для пакета navigation global_planner
и local_planner
и позапускав робота из разных точек карты, мы решили попробовать альтернативные варианты. Для global_planner
был выбран более гибкий global_planner/GlobalPlanner
, а для local_planner
- teb_local_planner/TebLocalPlannerROS
, который на ходу перестраивает локальное изменение маршрута. С помощью настройки данных плагинов удалось получить устойчивое решение для ориентации и навигации робота по виртуальному городу.
Склонируйте данный репозиторий. Выполните инструкции по настройке докера из исходного репозитория. Соберите и запустите докер контейнер для дальнейшего запуска симулятора и решения. Для этого из корневой директории этого репозитория выполните команды
./docker/simulator/build_docker.sh
./docker/simulator/run_docker.sh
В случае, если на вашем ПК используется видеокарта от nvidia, то обозначенные выше скрипты следует исполнить с параметром -n или --nvidia
Запустите симулятор в открывшейся консоли контейнера:
roslaunch tb_gazebo turtltown.launch
В отдельной командной строке выполните:
./docker/simulator/into_docker.sh
roslaunch solution_1 move_base.launch
Для навигации робота по карте (в том числе из точки старта в области S
в точку финиша в области F
), а также визуализации данных с робота, используйте программу rviz
. Для этого в отдельной командной строке выполните
./docker/simulator/into_docker.sh
rviz
Для быстрой настройки окружения загрузите настройки из файла /catkin_ws/src/solution_1/rviz/tb_config.rviz