Система моделирования роботов Player/Stage (Часть 1)

На протяжении долгого времени в своих проектах на начальных этапах разработки мы используем систему моделирования Player/Stage. Она позволяет нам моделировать логику движения и действий роботов уже на тех стадиях проекта, когда реальное железо робота существует только в виде чертежей. Эта система представляет программисту массу возможностей: моделирование кинематики физических устройств, моделирование работы различных сенсоров (дальномеры, лидары, датчики цвета, видеокамеры). Теоретически, интерфейсы системы могут быть использованы для работы и с реальным железом. В этой статье мы кратко познакомимся с этой системой и рассмотрим несколько демонстрационных проектов.

 

Установка Player/Stage

Формально, Player и Stage представляют собой два различных проекта, которые разрабатываются параллельно. Player - представляет собой сервер, к которому подключаются, с одной стороны, устройства робота, с другой, клиенты, желающие получить доступ к этим устройствам. Устройства могут быть как реальными, так и эмулированными в системе Stage. Протокол общения между сервером и клиентом определяется используемым драйвером. В данной статье мы будем работать только с эмулированными в Stage устройствами, поэтому тему написания драйверов затрагивать не будем.

Оба эти проекта развиваются достаточно быстро, поэтому устанавливать пакеты stable версий из системных репозитариев нет смысла. Более того, не все стабильные версии Player/Stage совместимы между собой. Поэтому мы будем ставить их devel-версии прямо из репозитариев разработчиков.

Процесс установки будет показан на примере операционной системы Kubuntu 11.10 x86_64. Установка будет производиться во внешний корень без получения прав суперпользователя (установка для разработчиков).

  1. Для начала устанавливаем зависимости для сборки libplayer:
    sudo apt-get build-dep libplayer
    sudo apt-get install libgtk2.0-0 libgtk2.0-dev
  2. Зависимости для сборки libstage
    sudo apt-get install libjpeg62-dev libfltk1.1-dev libltdl-dev fontconfig
    sudo apt-get install libxinerama-dev libxft-dev libglu1-mesa-dev
  3. Устанавливаем cmake, subversion и git:
    sudo apt-get install cmake
    sudo apt-get install subversion
    sudo apt-get install git gitk git-gui
  4. Создаем папку, куда будем ставить библиотеки:
    mkdir ~/install-root
  5. Прописываем пути к этой папке. Для этого открываем файл ~/.bashrc и добавляем в него следующие строчки (для 32-битных систем числа 64, конечно, быть не должно):
    export LD_LIBRARY_PATH+=:~/install-root/lib64/
    export PKG_CONFIG_PATH+=:~/install-root/lib64/pkgconfig/
    export PATH+=:~/install-root/bin/
  6. Закрываем терминал и открываем его снова, чтобы изменения применились
  7. Собираем библиотеку Player:
    mkdir ~/build
    cd ~/build
    
    svn co https://playerstage.svn.sourceforge.net/svnroot/playerstage/code/player/trunk player
    cd player
    mkdir build
    cd build
    cmake -DCMAKE_INSTALL_PREFIX=~/install-root/ ../
    make install
  8. Собираем библиотеку Stage
    cd ~/build
    git clone https://github.com/rtv/Stage.git
    cd Stage
    mkdir build
    cd build
    cmake -DCMAKE_INSTALL_PREFIX=~/install-root/ ../
    make install

Итак, Player и Stage установлены. Мы можем проверить работу системы и запустить несколько тестовых миров, которые лежат в папке ./share/stage/worlds/

cd ~/install-root/share/stage/worlds
stage simple.world
stage fasr.world

Базовые сведения для работы в Player/Stage

Типы файлов в Player/Stage

В Player / Stage имеется три типа файлов, о которых необходимо знать:

  • .world - файл мира
  • .cfg - файл конфигурации
  • .inc - подключаемый файл

Файл мира определяет, что должно быть включено в сцену (мир). В этом файле описывается робот, объекты, находящиеся на сцене и расстановка их на сцене. Подключаемый файл имеет тот же формат, что и файл мира, и служит для совместного использования стандартных элементов в различных проектах.

Файл конфигурации описывает поведение робота, его интерфейсы и драйверы. Этот файл используется системой Player.

Интерфейсы, драйверы, устройства.

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

Интерфейс - набор правил, определяющих то, как драйвер и система Player взаимодействуют между собой. Эти правила определяют типы данных, последовательность из передачи и т.д.

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

Дополнительная информация

Дополнительную информацию об устройстве Player/Stage можно получить из официальных справочных руководств:

http://playerstage.sourceforge.net/index.php?src=doc

Создание собственного мира

Для начала, создадим файл нашего нового мира:

mkdir ~/worlds
kate ~/worlds/crazy.world

Такой файл обычно представляет собой набор моделей, которые описывают все аспекты эмуляции, таких как: роботы, окружение (стены, препятствия), подвижные объекты. Синтаксис определения модели в мире выглядит следующим образом:

define model_name model
(

# parameters
)

Такая конструкция сообщает Stage, что мы определяем модель с именем model_name и что весь текст между скобками относится к этой модели.

Рассмотрим модель floorplan из файла map.inc (описывает “карту” мира, т.е. стены и препятствия):

define floorplan model
(
 # sombre, sensible, artistic
 color "gray30"

 # most maps will need a bounding box
 boundary 1

 gui_nose 0
 gui_grid 0
 gui_move 0
 gui_outline 0
 gripper_return 0
 fiducial_return 0
 ranger_return 0.5

 obstacle_return 0
)

Очевидно, что мы создаем модель под именем floorplan, которая имеет следующие параметры:

color
цвет, которым будет отрисована модель при эмуляции
boundary: [0,1]
имеется ли ограничивающий прямоугольник. В данном случае, присутствие ограничение не даст роботу уехать за границы карты
gui_nose: [0,1]
отрисовывает линию вдоль направление оси Ox для отслеживания ориентации
gui_grid: [0,1]
координатная сетка
gui_move: [0,1]
возможно ли переносить объект мышью
gui_outline: [0,1]
отрисовывать ли границы объекта
gripper_return, fiducial_return, ranger_return
возможность обнаружения объекта различными сенсорами.

Итак, добавим следующий код в файл нашего мира:

include "../install-root/share/stage/worlds/map.inc"

floorplan
(
bitmap "../install-root/share/stage/worlds/bitmaps/simple_rooms.png"
size [12 5 1]
)

Мы определили модель floorplan и изменили два ее параметра (общие для всех моделей Stage):

bitmap
изображение, определяющее форму объекта. Черные пикселы говорят о наличие объекта в этой точке пространства, все остальные - об его отсутствии
size
размеры модели: [ширина длина высота]. Все линейные размеры в Player / Stage измеряются в метрах.

Теперь нам необходимо добавить настройки для окна симуляции:

# configure the GUI window
window
(
size [700.000 700.000]
scale 50
)

size: размеры окна в пикселах
scale: масштаб изображения: window_size / floorplan_size

Виртуальный мир создан, проверим его, запустив Stage.

stage crazy.world

Созданный мир

Создание робота

Роботы в Player / Stage представлены точно такими же моделями, которые мы использовали в предыдущем разделе. Роботы могут иметь различные типы сенсоров, которые могут детектировать другие модели на сцене. Детектируемость модели каким-либо типом сенсоров определяется параметрами, с которыми мы уже встречались в прошлом разделе. Система имеет множество встроенных типов сенсоров:

  • camera - видеокамеры
  • blobfinder - сенсоры, основанные на распознавании цвета
  • fiducial - детектируют предопределенные метки на поле
  • ranger - дальномеры
  • position - системы одометрии

Добавим описание геометрии нашего робота в отдельный файл ~/worlds/crazybob.inc:

define crazybob position
(
 size [0.306 0.25 0.25]

 # centre of rotation
 origin [0.06 0 0 0]

 # the shape of the robot
 block
 (
   points 6
   point[5] [0 0]
   point[4] [0 1]
   point[3] [0.75 1]
   point[2] [1 0.75]
   point[1] [1 0.25]
   point[0] [0.75 0]
   z [0 1]
 )

 block
 (
   points 4
   point[3] [1 0.75]
   point[2] [1.25 0.75]
   point[1] [1.25 0.625]
   point[0] [1 0.625]
   z [0 0.5]
 )
 block
 (
   points 4
   point[3] [1 0.375]
   point[2] [1.25 0.375]
   point[1] [1.25 0.25]
   point[0] [1 0.25]
   z [0 0.5]
 )

 # positonal things
 drive "diff"
)
origin
по умолчанию центр робота выбирается в точке геометрического центра прямоугольника определенного параметром size, чтобы переопределить его вручную используют этот параметр
drive
система передвижения робота

Теперь добавим робота в файл мира и подключим к нему лазерный дальномер Sick:

include "crazybob.inc"
include "../install-root/share/stage/worlds/sick.inc"

crazybob
(
 name "bob1"
 pose [-5 -1.8 0 0]
 color "green"

 sicklaser( pose [ 0.25 0 0 0 ] )
)

Полученный мир можно проверить в системе Stage.

Новый мир с роботом

Добавление управляющего алгоритма

Для того, чтобы наш робот начал двигаться на сцене, добавим тестовый алгоритм управления. Для этого изменим описание робота следующим образом:

crazybob
(
 name "bob1"
 pose [-5 -1.8 0 0]
 color "green"

 ranger()
 sicklaser( pose [ 0.25 0 0 0 ] )

 # control algorithm
 ctrl "wander"

 # report error-free position in world coordinates
 localization "gps"
 localization_origin [ 0.25 0 0 0 ]
)

Здесь мы добавили еще один дальномер ranger, чтобы установить индекс дальномера Sick в правильное значение, добавили алгоритм обхота обхода карты wander и установили точную систему локализации. Можно запускать.

Просмотр отладочной информации

В меню View имеется возможность управлять режимами отображения информации на экране. Так, можно включить отрисовку лучей дальномеров (Data) и траектории движения робота (Footprints).

Движение робота в системе Stage

Добавление интерфейса для робота в Player

Для управления устройствами через библиотеку Player нам необходимо привязать их к соответствующим драйверам. В нашем случае все устройства будут привязаны к драйверу stage.

Создадим конфигурационный файл crazy.cfg и добавим следующие описания интерфейсов:

# load the Stage plugin simulation driver
driver
(               
 name "stage"
 provides [ "simulation:0" ]
 plugin "stageplugin"

 # load the named file into the simulator
 worldfile "crazy.world"      
)

# Create a Stage driver and attach position2d and laser interfaces
# to the model "bob1"
driver
(
 name "stage"
 provides [ "position2d:0" "ranger:1" ]
 model "bob1"
)

Здесь мы описываем драйвер для самой системы симуляции и для нашего робота. Робот будет предоставлять внешним пользователям два интерфейса: одометрию и лазерный дальномер. Мы воспользуемся ими в следующей статье.

Leave a Reply

You must be logged in to post a comment.