Эта статья открывает серию уроков, в которых мы попробуем разобраться с использованием возможностей современных физических симуляторов и программных платформ для облегчения разработки и отладки ПО при создании сложных робототехнических систем.
В качестве симулятора мы возьмем пакет Gazebo 3D, а человекоподобный DARwIn-OP, которого мы заставим играть в футбол, будет использован в качестве универсальной робототехнической платформы.

DARwIn-OP в симуляторе Gazebo
Для изучения уроков, использования примеров кода, а также написания собственных алгоритмов вам не потребуется приобретение дорогостоящего оборудования или ПО. Все программное обеспечение бесплатно, а отладка и демонстрация алгоритмов будет проводится в симуляторе. Законченный проект будет портирован на реального робота для демонстрации результатов.
Gazebo 3D, разрабатываемый некоммерческой организацией OSRF (Open Source Robotics Foundation), имеет ряд преимуществ по сравнению с другими робототехническими симуляторами. Во-первых, он бесплатный и имеет открытый код. Во-вторых, он очень популярен среди мирового робототехнического сообщества и является официальным симулятором соревнований DARPA. В-третьих, Gazebo отлично интегрируется с программной платформой ROS (Robot Operating System), а значит разработанную вами программу управления виртуальным роботом в Gazebo и ROS будет относительно несложно перенести на реального робота.

Робот PR2 в симуляторе Gazebo
В этом уроке мы изучим, как установить последнюю версию Gazebo, подключить ее к программной платформе ROS, загрузить физическую модель робота DARwin и заставить ее ходить. В конце мы настроим простую систему телеуправления движением робота с клавиатуры. Параллельно будем осваивать ифраструктуру ROS.
Первым и самым трудоемким шагом является установка ROS и Gazebo. Для установки ROS нам понадобится ПК с Linux (например Ubuntu 15.04). Если вы пользователь Windows или Mac OS, то можно воспользоваться виртуальной машиной, например Virtual Box c установкой Linux Ubuntu. Сразу хочется отметить, что мне не удалось настроить нормальную поддержку 3D под виртуальной машиной, Gazebo либо вылетал, либо работал с тормозами. Поэтому в качестве тренировки, можно воспользоваться виртуальной машиной, но для реальной разработки целесообразно все-таки использовать Linux.
ROS можно установить двумя способами. Первый способ относительно простой — это установка уже готовых Debian пакетов. Данный способ подходит в том случае, если у вас установлен Ubuntu Saucy (13.10) или Trusty (14.04), или, например, Debian Wheezy. Второй способ более сложный и запутанный — это установка из исходников. С помощью него можно произвести установку ROS в более свежих версиях Ubuntu или других дистрибутивов Linux.
Пример установки приведенный ниже осуществлялся в Linux Ubuntu 15.04.
Итак, приступим!
Откройте bash terminal через меню программ или нажав комбинацию клавиш ctrl+alt+t. Сначала необходимо установить утилиты для самозагрузки и инициализации ROS. Если вы используете Ubuntu или Debian это можно сделать добавив в репозиторий ссылку на packages.ros.org.
Инициализируем rosdep. Rosdep — инструмент командной строки для установки системных зависимостей ROS.
Теперь приступим к сборке пакетов ROS с помощью утилиты catkin. Catkin — это набор макросов для сборки и управления инфраструктурой ROS.
Создадим каталог для установки ROS и загрузим ключевые пакеты.
Команда rosinstall_generator создает список пакетов необходимых для установки ROS, в качестве параметров может быть указана минимальная установка ros_comm, базовая desktop или полная desktop_full. Установка desktop_full включает версию Gazebo 2.0. Эта версия уже устарела, текущей является версия 5.x. Поэтому мы выберем конфигурацию desktop, а Gazebo установим отдельно.
После того как список пакетов для установки сгенерирован в файл indigo-desktop-wet.rosinstall, воспользуемся утилитой wstool для инициализации рабочей области и загрузки пакетов.

После установки в каталоге src можно найти скачанные пакеты
Теперь переместимся в корневой каталог ros и выполним команду rosdep для установки системных зависимостей для скачанных пакетов.
После успешной установки всех зависимостей, наконец можно откомпилировать пакеты с помощью системы автоматизации сборки catkin. Это делается командой catkin_make_isolated или командой catkin_make. Сatkin_make_isolated следует использовать, если часть ваших пакетов использует CMake (другая популярная система автоматизации сборки), а часть catkin, если же все пакеты используют catkin, следует применять catkin_make. Базовый репозиторий имеет смешанный тип, поэтому используем команду catkin_make_isolated.
Для того, чтобы инфраструктура ROS заработала, необходимо настроить переменные окружения и прописать все необходимые пути. Для этого следует выполнить скрипт setup.bash.
Это команда настроит переменные окружения только для текущей bash консоли. Если Вы хотите добавить переменные окружения ROS в bash по умолчанию, то можно записать команду source в файл .bashrc. Этот файл исполняется при открытии новой bash консоли.
Поздравляю! На этому установка ROS окончена, давайте выполним несколько команд, чтобы проверить правильность работы.
Для того чтобы вывести список доступных команд для управления инфраструктурой ROS, наберите в консоли команду ros и нажмите клавишу Tab два раза. Так как все команды ROS начинаются с префикса ros, bash выдаст их названия как результат автодополнения.

Список команд ROS. Все команды начинаются с префикса ros
Давайте что-нибудь запустим, например простое телеуправление. Для начала нам нужен объект которым мы хотим управлять, пускай им будет черепаха из turtlesim. Итак, запускаем сервер turtlesim c помощью команды rosrun. Для этого открываем новую консоль и выполняем команду.
На экране появится окно с черепашкой. Теперь давайте запустим модуль телеуправления, для этого откройте новую консоль и выполните команду.
А теперь с помощью клавиш курсора попробуйте подвигать черепаху. Например, вот так.

Пример телеуправления черепахой
Итак, только что мы построили распределенную систему для телеуправления, где turtlesim и teleop являются независимыми процессами коммуницирующими через связующее программное обеспечение ros_comm. Процессы turtlesim и teleop могут находиться как на одном, так и на различных ПК, объединенных в сеть. Отобразить взаимосвязь этих процессов можно с помощью утилиты rqt_graph.

Утилита rqt_graph служит для отображения топологии распределенной системы управления роботом
В rqt_graph овалами обведены различные процессы (ноды) нашей системы управления, а прямоугольниками типы данных (топики) служащие для передачи информации между процессами. Стрелки показывают направление передачи данных. Таким образом, мы видим, что нод teleop публикует топик cmd_vel, содержащий заданную скорость робота, а turtlesim подписан на данный топик.
Заглянуть в содержимое топика можно с помощью команды rostopic. Параметр list выдаст все активные топики системы, а команда echo выведет на экран содержимое указанного топика. Чтобы отобразить содержимое cmd_vel, не забудьте порулить черепахой из соседней консоли, иначе данные не будут передаваться.

Содержимое /turtle1/cmd_vel — заданная линейная и угловая скорость черепахи
После успешной установки ROS приступим к установке симулятора Gazebo.
Gazebo мы не будем компилировать из исходников, а просто установим последнюю версию с помощью менеджера пакетов Ubuntu. Для этого мы подключим репозиторий с Gazebo, добавим ключ и произведем установку.
Теперь необходимо настроить конфигурацию rosdep так, чтобы система игнорировала зависимость пакетов от более старой версии Gazebo, являющейся частью ROS Indigo, а использовала бы последнюю версию, которую мы только что установили. Для этого мы перейдем в каталог конфигурационных файлов rosdep, создадим файл local.yaml, в котором укажем игнорировать пакет gazebo. Далее перейдем в каталог sources.list.d и добавим только что созданный скрипт в список 10-local.list. Далее выполним команду update для того, чтобы новая конфигурация вступила в действие.
На финальном этапе необходимо установить пакеты связующие симулятор Gazebo с инфраструктурой ROS, а также пакеты с описанием 3D модели и контроллеров робота DARwIn-OP. Для упрощения этого процесса мы подготовили небольшой скрипт, который произведет загрузку всех необходимых зависимостей.
Перейдем в рабочий каталог и загрузим скрипт из нашего репозитория на github.
Далее заходим в каталог ros_gazebo_darwin, как было описано ранее, инициализируем рабочую область catkin и загружаем пакеты перечисленные в файле indigo-gazebo-darwin.rosinstall.
Далее производим компиляцию и установку только что скачанных пакетов.
Теперь добавим переменные окружения и пути для нашей рабочей области. Для этого выполним следующие команды.
Отлично! Установка Gazebo и модели DARwIn-OP успешно завершена, давайте поскорее запустим результат.
Наконец, после долгих страданий, пришло время запустить симулятор с моделью робота. Для этого с помощью команды roslaunch выполним скрипт darwin_gazebo.launch.
Результатом выполнения скрипта должен стать запуск окна Gazebo и загрузка 3D модели робота с соответствующими виртуальными контроллерами и сенсорами. Для запуска симуляции необходимо нажать кнопку play, расположенную внизу окна на панели виртуального таймера.

Симулятор Gazebo с загруженной моделью робота DARwIn-OP. (Не забудьте нажать на кнопку play, помеченную красным)
Теперь откроем новую консоль и запустим программу управления движением робота. Она преобразует команды скорости из декартовых координат в движение сервомоторов, расположенных в ногах, торсе и руках робота.
Наконец, в третьей консоли запустим программу телеуправления. Ее задача считывать команды с клавиатуры, преобразовать их в заданную скорость и передавать программе управления движением.

Телеуправление роботом DARwIn-OP в симуляторе Gazebo
Те, кому интересно как выглядит структура нашей системы телеуправления, могут воспользоваться утилитой rqt_graph для графического отображения запущенных ROS процессов и каналов связи.
Как видите, по сравнению с примером turtlesim, данная система управления гораздо сложнее и имеет больше элементов. Такое количество элементов, обусловлено тем, что модель Darwin-OP имеет 24 виртуальных сервомотора, которыми управляют программы darwin_walker и walker, получая заданную скорость от программы darwin_teleop.

Устройство системы управления роботом DARwIn-OP в симуляторе Gazebo
Подведем итог. В данном уроке мы изучили процесс установки и компиляции ROS Indigo из исходного кода. Сделали мы это с образовательной целью, чтобы немного разобраться с устройством системы ROS и ее команд, а также для того, чтобы подключить последнюю версию симулятора Gazebo 3D. Далее мы загрузили модель человекоподобного робота DARwIn-OP, производимого компанией Robotis, и настроили простую систему управления. Благодаря возможностям ROS наша системы способна работать как на одном, так и на нескольких ПК, объединенных в сеть.
В следующем уроке мы продолжим знакомиться с возможностями ROS, попробуем добавить в виртуальный мир робота новые объекты, например, мяч и ворота. Мы напишем собственную программу по распознаванию мяча и управления движением в заданную точку и, конечно, произведем удар по воротам!
До встречи!
Источники:
www.ros.org
www.gazebosim.org
www.generationrobots.com/en/content/83-carry-out-simulations-and-make-your-darwin-op-walk-with-gazebo-and-ros
В качестве симулятора мы возьмем пакет Gazebo 3D, а человекоподобный DARwIn-OP, которого мы заставим играть в футбол, будет использован в качестве универсальной робототехнической платформы.

DARwIn-OP в симуляторе Gazebo
Для изучения уроков, использования примеров кода, а также написания собственных алгоритмов вам не потребуется приобретение дорогостоящего оборудования или ПО. Все программное обеспечение бесплатно, а отладка и демонстрация алгоритмов будет проводится в симуляторе. Законченный проект будет портирован на реального робота для демонстрации результатов.
Gazebo 3D, разрабатываемый некоммерческой организацией OSRF (Open Source Robotics Foundation), имеет ряд преимуществ по сравнению с другими робототехническими симуляторами. Во-первых, он бесплатный и имеет открытый код. Во-вторых, он очень популярен среди мирового робототехнического сообщества и является официальным симулятором соревнований DARPA. В-третьих, Gazebo отлично интегрируется с программной платформой ROS (Robot Operating System), а значит разработанную вами программу управления виртуальным роботом в Gazebo и ROS будет относительно несложно перенести на реального робота.

Робот PR2 в симуляторе Gazebo
В этом уроке мы изучим, как установить последнюю версию Gazebo, подключить ее к программной платформе ROS, загрузить физическую модель робота DARwin и заставить ее ходить. В конце мы настроим простую систему телеуправления движением робота с клавиатуры. Параллельно будем осваивать ифраструктуру ROS.
Установка ROS
Первым и самым трудоемким шагом является установка ROS и Gazebo. Для установки ROS нам понадобится ПК с Linux (например Ubuntu 15.04). Если вы пользователь Windows или Mac OS, то можно воспользоваться виртуальной машиной, например Virtual Box c установкой Linux Ubuntu. Сразу хочется отметить, что мне не удалось настроить нормальную поддержку 3D под виртуальной машиной, Gazebo либо вылетал, либо работал с тормозами. Поэтому в качестве тренировки, можно воспользоваться виртуальной машиной, но для реальной разработки целесообразно все-таки использовать Linux.
ROS можно установить двумя способами. Первый способ относительно простой — это установка уже готовых Debian пакетов. Данный способ подходит в том случае, если у вас установлен Ubuntu Saucy (13.10) или Trusty (14.04), или, например, Debian Wheezy. Второй способ более сложный и запутанный — это установка из исходников. С помощью него можно произвести установку ROS в более свежих версиях Ubuntu или других дистрибутивов Linux.
Пример установки приведенный ниже осуществлялся в Linux Ubuntu 15.04.
Итак, приступим!
Откройте bash terminal через меню программ или нажав комбинацию клавиш ctrl+alt+t. Сначала необходимо установить утилиты для самозагрузки и инициализации ROS. Если вы используете Ubuntu или Debian это можно сделать добавив в репозиторий ссылку на packages.ros.org.
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential
Замечание
То же самое можно сделать с помощью менеджера пакетов pip, но для пользователей Ubuntu первый вариант более предпочтителен.
$ sudo apt-get install python-pip
$ sudo pip install -U rosdep rosinstall_generator wstool rosinstall
Инициализируем rosdep. Rosdep — инструмент командной строки для установки системных зависимостей ROS.
$ sudo rosdep init
$ rosdep update
Теперь приступим к сборке пакетов ROS с помощью утилиты catkin. Catkin — это набор макросов для сборки и управления инфраструктурой ROS.
Создадим каталог для установки ROS и загрузим ключевые пакеты.
$ mkdir ~/workspace/ros -p
$ cd ~/workspace/ros
Команда rosinstall_generator создает список пакетов необходимых для установки ROS, в качестве параметров может быть указана минимальная установка ros_comm, базовая desktop или полная desktop_full. Установка desktop_full включает версию Gazebo 2.0. Эта версия уже устарела, текущей является версия 5.x. Поэтому мы выберем конфигурацию desktop, а Gazebo установим отдельно.
$ rosinstall_generator desktop --rosdistro indigo --deps --wet-only --tar > indigo-desktop-wet.rosinstall
После того как список пакетов для установки сгенерирован в файл indigo-desktop-wet.rosinstall, воспользуемся утилитой wstool для инициализации рабочей области и загрузки пакетов.
$ wstool init src indigo-desktop-wet.rosinstall
Замечание
Если по какой-то причине установка прервалась, возобновить процесс можно следующей командой.
$ wstool update -t src

После установки в каталоге src можно найти скачанные пакеты
Теперь переместимся в корневой каталог ros и выполним команду rosdep для установки системных зависимостей для скачанных пакетов.
$ cd ~/workspace/ros
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y
После успешной установки всех зависимостей, наконец можно откомпилировать пакеты с помощью системы автоматизации сборки catkin. Это делается командой catkin_make_isolated или командой catkin_make. Сatkin_make_isolated следует использовать, если часть ваших пакетов использует CMake (другая популярная система автоматизации сборки), а часть catkin, если же все пакеты используют catkin, следует применять catkin_make. Базовый репозиторий имеет смешанный тип, поэтому используем команду catkin_make_isolated.
$ ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release
Для того, чтобы инфраструктура ROS заработала, необходимо настроить переменные окружения и прописать все необходимые пути. Для этого следует выполнить скрипт setup.bash.
$ source ~/workspace/ros/install_isolated/setup.bash
Это команда настроит переменные окружения только для текущей bash консоли. Если Вы хотите добавить переменные окружения ROS в bash по умолчанию, то можно записать команду source в файл .bashrc. Этот файл исполняется при открытии новой bash консоли.
$ echo "source ~/workspace/ros/install_isolated/setup.bash" > ~/.bashrc
Поздравляю! На этому установка ROS окончена, давайте выполним несколько команд, чтобы проверить правильность работы.
Для того чтобы вывести список доступных команд для управления инфраструктурой ROS, наберите в консоли команду ros и нажмите клавишу Tab два раза. Так как все команды ROS начинаются с префикса ros, bash выдаст их названия как результат автодополнения.

Список команд ROS. Все команды начинаются с префикса ros
Давайте что-нибудь запустим, например простое телеуправление. Для начала нам нужен объект которым мы хотим управлять, пускай им будет черепаха из turtlesim. Итак, запускаем сервер turtlesim c помощью команды rosrun. Для этого открываем новую консоль и выполняем команду.
$ rosrun turtlesim turtlesim_node
На экране появится окно с черепашкой. Теперь давайте запустим модуль телеуправления, для этого откройте новую консоль и выполните команду.
$ rosrun turtlesim turtle_teleop_key
А теперь с помощью клавиш курсора попробуйте подвигать черепаху. Например, вот так.

Пример телеуправления черепахой
Итак, только что мы построили распределенную систему для телеуправления, где turtlesim и teleop являются независимыми процессами коммуницирующими через связующее программное обеспечение ros_comm. Процессы turtlesim и teleop могут находиться как на одном, так и на различных ПК, объединенных в сеть. Отобразить взаимосвязь этих процессов можно с помощью утилиты rqt_graph.
$ rosrun rqt_graph rqt_graph

Утилита rqt_graph служит для отображения топологии распределенной системы управления роботом
В rqt_graph овалами обведены различные процессы (ноды) нашей системы управления, а прямоугольниками типы данных (топики) служащие для передачи информации между процессами. Стрелки показывают направление передачи данных. Таким образом, мы видим, что нод teleop публикует топик cmd_vel, содержащий заданную скорость робота, а turtlesim подписан на данный топик.
Заглянуть в содержимое топика можно с помощью команды rostopic. Параметр list выдаст все активные топики системы, а команда echo выведет на экран содержимое указанного топика. Чтобы отобразить содержимое cmd_vel, не забудьте порулить черепахой из соседней консоли, иначе данные не будут передаваться.
$ rostopic list
$ rostopic echo /turtle1/cmd_vel

Содержимое /turtle1/cmd_vel — заданная линейная и угловая скорость черепахи
После успешной установки ROS приступим к установке симулятора Gazebo.
Установка Gazebo
Gazebo мы не будем компилировать из исходников, а просто установим последнюю версию с помощью менеджера пакетов Ubuntu. Для этого мы подключим репозиторий с Gazebo, добавим ключ и произведем установку.
$ sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-latest.list'
$ wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install gazebo5 libgazebo-dev
Теперь необходимо настроить конфигурацию rosdep так, чтобы система игнорировала зависимость пакетов от более старой версии Gazebo, являющейся частью ROS Indigo, а использовала бы последнюю версию, которую мы только что установили. Для этого мы перейдем в каталог конфигурационных файлов rosdep, создадим файл local.yaml, в котором укажем игнорировать пакет gazebo. Далее перейдем в каталог sources.list.d и добавим только что созданный скрипт в список 10-local.list. Далее выполним команду update для того, чтобы новая конфигурация вступила в действие.
$ cd /etc/ros/rosdep
$ sudo bash -c 'echo "gazebo: { ubuntu: { vivid: [] } }" > local.yaml'
$ cd ./sources.list.d
$ sudo bash -c 'echo "yaml file:///etc/ros/rosdep/local.yaml" > 10-local.list'
$ rosdep update
На финальном этапе необходимо установить пакеты связующие симулятор Gazebo с инфраструктурой ROS, а также пакеты с описанием 3D модели и контроллеров робота DARwIn-OP. Для упрощения этого процесса мы подготовили небольшой скрипт, который произведет загрузку всех необходимых зависимостей.
Перейдем в рабочий каталог и загрузим скрипт из нашего репозитория на github.
$ cd ~/workspace
$ git clone https://github.com/robotgeeks/ros_gazebo_darwin.git
Далее заходим в каталог ros_gazebo_darwin, как было описано ранее, инициализируем рабочую область catkin и загружаем пакеты перечисленные в файле indigo-gazebo-darwin.rosinstall.
$ cd ~/workspace/ros_gazebo_darwin
$ wstool init src indigo-gazebo-darwin.rosinstall
Далее производим компиляцию и установку только что скачанных пакетов.
$ catkin_make install
Теперь добавим переменные окружения и пути для нашей рабочей области. Для этого выполним следующие команды.
$ source ~/workspace/ros_gazebo_darwin/install/setup.bash
$ echo "source ~/workspace/ros_gazebo_darwin/install/setup.bash" > ~/.bashrc
Отлично! Установка Gazebo и модели DARwIn-OP успешно завершена, давайте поскорее запустим результат.
Работа в симуляторе Gazebo
Наконец, после долгих страданий, пришло время запустить симулятор с моделью робота. Для этого с помощью команды roslaunch выполним скрипт darwin_gazebo.launch.
$ roslaunch darwin_gazebo darwin_gazebo.launch
Результатом выполнения скрипта должен стать запуск окна Gazebo и загрузка 3D модели робота с соответствующими виртуальными контроллерами и сенсорами. Для запуска симуляции необходимо нажать кнопку play, расположенную внизу окна на панели виртуального таймера.

Симулятор Gazebo с загруженной моделью робота DARwIn-OP. (Не забудьте нажать на кнопку play, помеченную красным)
Теперь откроем новую консоль и запустим программу управления движением робота. Она преобразует команды скорости из декартовых координат в движение сервомоторов, расположенных в ногах, торсе и руках робота.
$ roslaunch darwin_gazebo darwin_walker.launch
Наконец, в третьей консоли запустим программу телеуправления. Ее задача считывать команды с клавиатуры, преобразовать их в заданную скорость и передавать программе управления движением.
$ roslaunch darwin_control darwin_teleop.launch

Телеуправление роботом DARwIn-OP в симуляторе Gazebo
Те, кому интересно как выглядит структура нашей системы телеуправления, могут воспользоваться утилитой rqt_graph для графического отображения запущенных ROS процессов и каналов связи.
$ rosrun rqt_graph rqt_graph
Как видите, по сравнению с примером turtlesim, данная система управления гораздо сложнее и имеет больше элементов. Такое количество элементов, обусловлено тем, что модель Darwin-OP имеет 24 виртуальных сервомотора, которыми управляют программы darwin_walker и walker, получая заданную скорость от программы darwin_teleop.

Устройство системы управления роботом DARwIn-OP в симуляторе Gazebo
Подведем итог. В данном уроке мы изучили процесс установки и компиляции ROS Indigo из исходного кода. Сделали мы это с образовательной целью, чтобы немного разобраться с устройством системы ROS и ее команд, а также для того, чтобы подключить последнюю версию симулятора Gazebo 3D. Далее мы загрузили модель человекоподобного робота DARwIn-OP, производимого компанией Robotis, и настроили простую систему управления. Благодаря возможностям ROS наша системы способна работать как на одном, так и на нескольких ПК, объединенных в сеть.
В следующем уроке мы продолжим знакомиться с возможностями ROS, попробуем добавить в виртуальный мир робота новые объекты, например, мяч и ворота. Мы напишем собственную программу по распознаванию мяча и управления движением в заданную точку и, конечно, произведем удар по воротам!
До встречи!
Источники:
www.ros.org
www.gazebosim.org
www.generationrobots.com/en/content/83-carry-out-simulations-and-make-your-darwin-op-walk-with-gazebo-and-ros