Моделирование роботов с использованием player/stage.

Перед разработчиками роботов и не только встает задача моделировать алгоритмы движения, взаимодействия робота с окружающим миром. Если вам необходимо протестировать как ваш робот будет ориентироваться в определенной местности с использованием камеры, инфракрасного дальномера и других сенсоров, как работает ваш алгоритм объезда препятствий, то эмулятор player/stage — это как раз то, что вам нужно.

Получить исходные тексты библиотек и эмулятора можно на сайте проекта http://playerstage.sourceforge.net там же есть инструкция по установке. Среда ориентирована на *NIX системы, хотя в системе сборки и есть строки отвечающие за сборку под NT, но инструкции как это сделать я не нашел — и вам не рекомендую пытаться это установить в Windows. Сперва необходимо установить player стабильной версии (3.02 — последняя версия на момент написания), после установить эмулятор stage. Система эмуляции Stage — это сервер, который ожидает запросов от клиентов и изменяет положение и состояние объектов, которые загружены в данной эмуляции. Проект player содержит клиентские библиотеки для работы с сервером Stage на трех языках: C, C++, Python. Также существуют неофициальные клиенты на других языках, например Java. Клиент-серверный подход позволяет вам легко используя библиотеки для взаимодействия моделировать вашего робота совершенно не занимаясь написанием эмулятора и тратя минимум усилий на создание и описание объектов, которые в нем находятся. Stage — это двухмерный эмулятор. Для моделирования в 3D авторы этого же проекта создали среду Gazebo.

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

1) Описание настроек запускаемого редактора, таких как масштаб камеры, размер поля, сетка, следы от движущихся объектов и т. д. ...
2) описание объектов, их свойств и положения на карте.

Начнем с первого пункта. Текст описывающий конфигурацию выглядит так:

# configure the GUI window  # так ставятся комментарии
window  # этим ключевым словом описывается окно
(
size [ 700.000 700.000 ]  # размер поля
 
    # camera options  # настройки камеры
    center [ 0 0 ]
    rotate [ 0 0 ]
    scale 50
 
    # GUI options  # вспомогательные настройки: сетка, часы итд
    show_data 1
    show_flags 1
    show_blocks 1
    show_clock 1
    show_footprints 0
    show_grid 1
    show_trailarrows 0
    show_trailrise 0
    show_trailfast 0
    show_occupancy 0
    show_tree 0
    pcam_on 0
    screenshots 0
)

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

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

define robot position  # директивой define мы объявляем объект robot производный от 
# position базового объекта предназначенного для моделировани движущихся моделей
(
    # actual size # описываем актуальный размер
    size [ 0.5 0.5 0.5 ]
    # centre of rotation offset
    origin [ 0 0 0 90 ]
 
    # positonal things
    drive "diff"
 
    # the shape of the robot # форму робота
    block
    (
        points 6
        point[5] [ -4  0 ]
        point[4] [ -4  -2.8 ]
        point[3] [ -2  -4 ]
        point[2] [ 2   -4 ]
        point[1] [ 4  -2.8 ]
        point[0] [ 4  0 ]
 
        z [ 0  1 ]
 
	color "orange"
    )
    block
    (
        points 4
        point[3] [ -1  0 ]
        point[2] [ -1 -1 ]
        point[1] [  1 -1 ]
        point[0] [  1  0 ]
 
        z [ 1  1.2 ]
 
	color "yellow"
    )
    block
    (
        points 4
        point[3] [ -4 -0.6 ]
        point[2] [ -5 -0.6 ]
        point[1] [  -5 -2.2 ]
        point[0] [  -4 -2.2 ]
 
        z [ 0  0.5 ]
 
	color "blue"
    )
    block
    (
        points 4
        point[3] [ 4 -0.6 ]
        point[2] [ 5 -0.6 ]
        point[1] [  5 -2.2 ]
        point[0] [  4 -2.2 ]
 
        z [ 0  0.5 ]
 
	color "blue"
    )
 
    mass 5 # массу
    gui_move 0 # возможность перемещать объект с помощью мыши
)
 
# add robot object # далее объявленный объект нужно создать, чем-то похоже на С++
robot # добавить на карту объект типа робот
(
    name "actor" # имя объекта актер — имена должны быть уникальны
    pose [ 0 0 0 0 ] # начальная позиция с учетом поворота
    gui_move 1 # объект можно перетаскивать с помощью мышки - мы переопределили это свойство !!!
)

Сохранив описание окна и робота в файл с именем скажем simple.world можно запустить эмулятор из командной строки набрав:

stage simple.world

Перед вами должен возникнуть мир с роботом, что-то вроде моего.

Камеру можно покрутив зажав клавишу Ctrl и левую книпку мыши. Скроллинг позволяет приближать и отдалять. Робота можно перетаскивать используя левую кнопкой мыши. Также в среде предусмотрено множество возможностей, подсветка траектории, наложение карты взаимодействия, замедления, ускорения и еще много интересного.

Описание объектов очень похоже на программирование в C++. Можно например описать объект робот и запихнуть его в отдельный файл, после содержимое файла можно добавить специальной командой. Предусмотрено расширение .inl для пользовательских моделей и описаний объектов. В файлах с этим расширением храниться большая часть моделей и примеров устанавливаемых с системой.

include "name.inc"

Не будем останавливаться на достигнутом. Чтобы теперь управлять нашим роботом из приложения, все что нам необходимо создать фалй с расширение .cfg. Описав в нем параметры и запустить. Содержимое файла может выглядеть так:

driver # здесь мы описываем какой мир необходимо выбрать для моделирования
(
    name "stage"
    provides [ "simulation:0" ]
    plugin "stageplugin"
    # load the named file into the simulator
    worldfile "simple.world"
)
 
driver # здесь мы описываем какой драйвер проекта необходимо подключить для моделирования нашего робота которого мы назвали актер
(
    name "stage"
    provides [ "6665:position2d:0" ]
    model "actor"
)

Сохраняем все это в simple.cfg и выполняем запуск из командной строки:

player simple.cfg

Теперь перейдем к описанию соединения с эмулятором на стороне клиента. Необходимо будет создать два объекта:

    PlayerCc::PlayerClient  // отвечает за соединение с конкретной моделью робота в эмуляторе
    PlayerCc::Position2dProxy // отвечает за возможность задавать нашему роботу скорость, получать данные

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

Я потратил немного времени и скомпоновал код таким образом, чтобы можно было создать объект типа VTestingRobotFacade и уже ему отдавать команды, такие как задать скорость, получить скорость. Также эмулятор запускается непосредственно из кода. Описание всего этого займет очень много места. Описывать всю последовательность действий и все косяки, возникшие при создании этого кода считаю не целесообразным здесь. Единственный момент, который хотелось бы прокомментировать касается считывание информации из эмулятора. Для того чтобы это произошло вам необходимо у созданного объекта PlayerCc::PlayerClient вызвать метод StartThread(), как показано ниже:

m_playerClient = new PlayerCc::PlayerClient(std::string(m_hostName.toAscii()), m_port);
m_playerClient->StartThread();

тут есть одна особенность ... если сделать вызов этого метода до создания других объектов PlayerCc::PlayerClient таких как PlayerCc::Position2dProxy обработчика положения с колес, то вы рискуете уснуть на вечно - в программе произойдет Deadlock и вы никогда не выйдете из старта обработчика клиента player, причем эта ситуация происходит не всегда.

Все что вам потребуется для запуска моего примера, установленный playe/stage на компьютере, система сборки cmake и установленные библиотеки Qt, так как запуск процесса и еще некоторые вещи в коде базируются на библиотеках Qt. Поэтому я покажу что у меня в конце вышло и приложу ссылку на архив с кодом.

Перед вами обновленный полигон на который наложена пользовательская карта.

Проект растет и развивается. Эту среду использовала немецкая команда Turag на соревнованиях Eurobot 2011. Сообществом созданы миры и различные объекты, изучив которые можно почерпнуть много информации для себя, не спишите писать свое - изучите то, что уже сделано.

Весь проект целиком. С объектами для управления и файлами миров и описания объектов одним архивом.
Либо код можно загрузить с github http://github.com/proydakov/stage-sample

В этой статье я кратко разобрал как:

1) описать мир для среды моделирования
2) описать робота
3) описал какие нужны объекты для подключения из C++ и предложил пример проекта

Такой огромный проект невозможно уложить в одной статье. Впереди нас ждет описание мира с множеством роботов, другие объекты, описание работы с дальномерами и взаимодействия роботов с миром Stage. Будьте с нами, впереди еще много статей о этой проекте и не только !!!

Leave a Reply

You must be logged in to post a comment.