8.2.3 Навигация по квадрату с помощью move_base

Теперь мы готовы перемещать нашего робота в квадрате, используя скорее move_base, чем простые сообщения Twist. Скрипт move_base_square.py в подкаталоге узлов выполняет эту работу. Сценарий просто циклически проходит через четыре целевые позы, по одной для каждого угла квадрата. Четыре целевых положения показаны стрелками на рисунке ниже:

Помните, что «поза» в ROS означает и позицию, и ориентацию.

Чтобы убедиться, что мы начинаем с чистого листа, завершите все файлы запуска, использованные в предыдущем разделе, введя Ctrl-C в соответствующих окнах терминала. Затем запустите поддельные узлы TurtleBot и move_base, как и раньше:

$ roslaunch rbx1_bringup fake_turtlebot.launch

И в другом терминале :

$ roslaunch rbx1_nav fake_move_base_blank_map.launch

Затем убедитесь, что у вас есть RViz с файлом конфигурации nav.rivz:

$ rosrun rviz rviz -d `rospack find rbx1_nav`/nav.rviz

Если у вас уже был запущен RViz, удалите все оставшиеся стрелки Odometry, нажав кнопку «Сброс».

Наконец, запустите скрипт move_base_square.py:

$ rosrun rbx1_nav move_base_square.py

По завершении сценариев RViz должен выглядеть следующим образом:

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

Давайте посмотрим на код.

Ссылка на источник: move_base_square.py

Давайте теперь рассмотрим ключевые строки сценария.

Здесь мы определяем ориентацию цели в четырех углах квадрата, сначала как углы Эйлера, которые легче визуализировать на карте, а затем преобразуем в кватернионы.

Далее мы создаем четыре позиции путевых точек объединив вращения с координатами четырех углов.

Хотя это не рассматривается в этом томе, установка маркеров визуализации в RViz довольно проста, и здесь можно найти ряд существующих учебных пособий. Скрипт помещает красный квадрат в каждый целевой угол, а функция self.init_markers (), определенная в конце скрипта, устанавливает формы, размеры и цвета маркера. Затем мы добавляем четыре маркера в список для последующего использования.

Здесь мы определяем SimpleActionClient, который будет отправлять цели на сервер действий move_base.

Прежде чем мы сможем начать отправку целей, нам нужно дождаться, пока сервер действий move_base станет доступным. Мы даем 60 секунд до истечения времени ожидания.

Затем мы входим в наш основной цикл, циклически проходя через каждую из четырех путевых точек. Сначала мы публикуем маркеры для обозначения четырех поз. (Это нужно делать в каждом цикле, чтобы они оставались видимыми на протяжении всего движения.) Затем мы инициализируем переменную цели как тип действия MoveBaseGoal. Затем мы устанавливаем цель frame_id для фрейма карты и метку времени для текущего времени. Наконец, мы устанавливаем целевую позицию для текущей путевой точки и отправляем цель на сервер действий move_base с помощью вспомогательной функции move (), которую мы опишем далее.

Вспомогательная функция move () принимает цель в качестве входных данных, отправляет ее на сервер MoveBaseAction, затем ждет в течение 60 секунд, пока робот не доберется до нее. Затем на экране отображается сообщение об успехе или сбое. Обратите внимание, насколько проще этот подход к кодированию, чем наш предыдущий сценарий nav_square.py, который использовал сообщения Twist напрямую. В частности, нам больше не нужно непосредственно отслеживать данные одометрии. Вместо этого сервер move_base action заботится о нем для нас.

Last updated

Was this helpful?