Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии 


Описание среды моделирования Webots




Webots – это программа для моделирования мобильных роботов [9]. Она позволяет пользователю создавать виртуальные сцены, обладающие такими физическими свойствами как масса, сила трения и др. Пользователь может создавать статические объекты или активные объекты, т.е. роботов. Роботы могут по-разному перемещаться: роботы на колесах, роботы на ногах, летающие роботы. Кроме того, роботы могут быть оснащены различными устройствами, например: инфракрасный датчик, колеса, камера, датчик касания, манипулятор и др. Пользователь может программировать каждого робота индивидуально, что бы добиться необходимого поведения робота.

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

Программу можно использовать для исследовательских или учебных задач, связанных с мобильными роботами:

• Создание прототипов мобильных роботов

• Исследование поведения группы роботов

• Исследование адаптивного поведения

• Использование в учебных целях

 

Рисунок3.3- Среда моделирования Webots

1- Дерево сцены;

2- Сцена моделирования;

3- Управляющая программа;

4- Консоль.

 

Мир в Webots – это виртуальная окружающая среда, в которой можно создавать объекты и роботов. Окружающая среда сохраняется в файле с расширением .wbt, содержащем описание для всех объектов: положение, геометрия объекта, внешний вид (например, цвет объекта), физические свойства, тип объекта и др. Окружающая среда – это иерархическая структура, в которой каждый объект может содержать другие объекты (как в языке VRML). Например, робот может содержать два колеса, датчики, измеряющие расстояние, и систему слежения, которая в свою очередь сама содержит камеру, поэтому благодаря системе слежения можно перемещать камеру относительно робота. Однако файл окружающей среды не содержит всей необходимой информации для моделирования. В этом файле для каждого робота указан контроллер в виде ссылки (имя файла) на запускаемый двоичный файл.

Контроллер – это программа для управления роботом, описанным в файле окружающей среды. Эти программы сохраняются в поддиректориях директории «controllers». Контроллеры могут быть написаны на C/C++ или

на Java.

Спидометр, расположенный справа в статусной строке (рисунок3.4), показывает скорость моделирования. Эта скорость указывается в сравнении с реальным временем. Например, если скорость равна 2, то это означает, что процесс моделируется в два раза быстрее, чем будет работать реальный робот.

Рисунок3.4- Спидометр

 

Окно дерева сцены (рисунок 3.5) может быть открыто с помощью пункта меню Edit→SceneTree.. или двойным щелчком в основном окне.

Дерево сцены содержит всю информацию, необходимую для графического описания и моделирования мира. Мир в Webots – это один или несколько роботов и их окружающая среда.

Дерево структурировано как VRML файл. Оно состоит из списка узлов, каждый из которых содержит поля. Поля могут содержать значения (строковые или числовые) или узлы.

Некоторые узлы в Webots – это стандартные узлы VRML, а некоторые специфичны для программы.

 

Рисунок 3.5- Окно дерева сцены

 

Программой поддерживаются (частично или полностью) узлы языка VRML 2.0.

Узлы, поддерживаемые программой Webots:

-Appearance

-Background

-Box

-Color

-Cone

-Coordinate

-Cylinder

-DirectionalLight

-ElevationGrid

-Fog

-Group

-ImageTexture

-IndexedFaceSet

-IndexedLineSet

-Material

-PointLight

-Shape

-Sphere

-Switch

-TextureCoordinate

-TextureTransform

-Transform

-Viewpoint

-WorldInfo

Программа поддерживает специфические узлы, которые, как правило, являются не просто примитивами, а уже законченными объектами, например: DifferentialWheels, DistanceSensor, Camera и др.

Язык VRML использует иерархическую структуру для узлов. Например, узел Transform наследует свойства от узла Group, поэтому он содержит поле Children для объединения объектов в группу. Но этот узел имеет еще три дополнительных поля: translation, rotation и scale для установки соответственно положения объекта, его направления и масштаба.

Таким же образом Webots узел Solid (твердое тело) наследуется от VRML узла Transform. Остальные Webots узлы наследуются от узла Solid.

Столкновение в окружающей среде может быть распознано для двух Solid узлов, а из-за наследования получается, что столкновение может быть распознано для всех Webots узлов. Столкновением считается пересечение окаймляющих поверхностей (boundingobjects) тел. Окаймляющая поверхность, задаваемая в поле boundingObjectSolid узла, – это форма или несколько форм, ограничивающих объект. Если для объекта не установлено поле boundingObject, то для этого объекта не будет определяться столкновения с другими объектами. Окаймляющей поверхностью может



быть, например, параллелепипед или цилиндр.

Распознавание столкновений в основном осуществляется для робота и

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

Модель робота в Webots

В среде Webots была разработана модель транспортного робота, основанная на роботе Pioneer, которая представлена на рисунках3.6 и 3.7.

Рисунок 3.6- Модель робота в среде Webots с визуализацией направлений ик-датчиков

Рисунок 3.7- Модель робота в среде Webots с визуализацией направлений ик-датчиков

Из рисунков видно, что у робота имеется 16 инфракрасных датчиков, расположеных по периметру робота, что позволяет ему регистрировать препятствия вокруг себя.

Поведение робота описывается с помощью управляющей программы, которая называется контроллер.Контроллеры Webots могут быть написаны на C / C + +, Java, Python или MATLAB. Кроме того, синтаксические различия всех этих языков одной и той же низкоуровневой реализации. Пока последовательность вызовов функция/метод не меняется, каждый язык программирования даст те же результаты моделирования.

Webots C API (Application Programming Interface) обеспечивается регулярными файлами заголовков C. Эти файлы заголовков должны быть включены с помощью инструкций типа #include<webots/xyz.h> где XYZ представляет имя узла Webots в нижнем регистре. Как и в любой обычный код C можно также включать стандартные заголовки C, например, # Include<stdio.h>. Вызов функции инициализации wb_robot_init() необходим перед вызовом любой другой функции C API. Эта функция инициализирует связь между контроллером и Webots. Wb_robot_init() существует только в C API, он не имеет эквивалента в других поддерживаемых языках программирования.

Обычно самый высокий уровень кода управления находится внутри циклов for или while. В этом цикле есть вызов функции wb_robot_step() . Эта функция синхронизирует данные контроллера с симулятором. Функция wb_robot_step() должна присутствовать в каждом контроллере и она должна быть вызвана через регулярные промежутки времени, поэтому обычно устанавливается в основном цикле. Значение параметра в wb_robot_step() указывает продолжительность шагов управления в миллисекундах в модельном времени На самом деле шаг может потребовать 1 миллисекунду или одну минуту процессорного времени, в зависимости от сложности моделируемого мира. Обычно используется бесконечный цикл в коде контроллера. Результатом этого является то, что контроллер будет работать так долго, как выполняется симуляция.

Перед использованием устройства, необходимо получить соответствующий тег устройства(WbDeviceTag); это делается с помощью функции wb_robot_get_device(). WbDeviceTag используется для идентификации устройства в коде контроллера. После идентификатора пишется название устройства, указанного в описании робота (.wbt или .proto файл). Если робот не имеет устройства с указанным названием, эта функция возвращает ноль.

Каждый датчик должен быть включен, прежде чем он может быть использован. Если датчик не включен, возвращаемое значение не определено. Включение датчика достигается с помощью соответствующего разрешения функцией wb_*_enable(), где Звездочка (*) обозначает тип датчика. Каждая функция wb_*_enable() позволяет указать задержку обновления в миллисекундах. Задержка обновления указывает необходимый интервал между двумя обновлениями данных датчика.

Обычно, задержка обновления выбирается так, чтобы быть такой же, как шаг управления (TIME STEP) и, следовательно, датчик будет обновляться при каждом wb_robot_step(). Если, например, задержка обновления выбирается так, чтобы быть в два раза больше шага управления, то данные датчика будут обновляться каждые два wb_robot_step(): это может быть использовано для имитации медленного устройства. Следует отметить, что большая задержка обновления также может ускорить моделирование, особенно для ресурсоемких устройств, таких как камеры. Наоборот, было бы бессмысленно выбирать задержку обновления меньше, чем шаг управления, потому что не будет возможно для контроллера обрабатывать данные устройства на более высокой частоте, чем введенной в шаге управления. Можно отключить устройство в любое время с помощью соответствующих функций wb_*_disable(). Это может увеличить скорость моделирования. Значение датчика обновляется при вызове wb_robot_step(). Вызов wb_distance_sensor_get_value() возвращает последнее значение.

Так же, как датчики, каждый привод Webots должен быть определен WbDeviceTag возвращаемый функцией wb_robot_get_device(). Однако, в отличие от датчиков, исполнительные механизмы не должны быть прямо разрешены, они на самом деле не имеют функций wb_*_enable().

Чтобы управлять движением, как правило, полезно разложение движения на дискретные шаги, которые соответствуют шагу управления. Как и прежде, бесконечный цикл используется здесь: на каждой итерации новое положение цели вычисляется согласно уравнению синуса. Функция wb_servo_set_position() сохраняет новый запрос позиции для соответствующего серводвигателя. Wb_servo_set_position() сохраняет новую позицию, но не сразу приводит в действие двигатель. Эффективное приведение в действие начинается на следующей строке, при вызове wb_robot_step(). Функция wb_robot_step() посылает команду срабатывания на Servo но он не ждет Servo для завершения движения (то есть достижения заданного конечного положения), он просто имитирует движение электродвигателей указанное количество миллисекунд.

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

Wb_servo_set_position() определяет только нужное положение. Так же, как с реальными роботами, возможно (только в физическом моделировании), что Servo не в состоянии достичь этой позиции, потому что она заблокирована какими-либо препятствиями или потому, что крутящего момента двигателя (MaxForce) недостаточно, чтобы противостоять гравитации и т.д. Если нужно управлять движением нескольких сервоприводов одновременно, то необходимо указать нужное положение для каждого сервопривода отдельно, используя wb_servo_set_position(). Затем нужно вызвать wb_robot_step() один раз для приведения в действие всех сервоприводов одновременно.

ПримерпрограммывWebots:

#include <webots/robot.h>

#include <webots/servo.h>

#include <webots/camera.h>

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#define TIME_STEP 32

#define MAX_SPEED 10.0

#define CRUISING_SPEED 7.5

#define OBSTACLE_THRESHOLD 0.1

#define DECREASE_FACTOR 0.9

int main(intargc, char **argv)

{

wb_robot_init();

WbDeviceTagfront_left_wheel = wb_robot_get_device ("front_left_wheel");

WbDeviceTagfront_right_wheel = wb_robot_get_device ("front_right_wheel");

wb_servo_set_position (front_left_wheel, INFINITY);

wb_servo_set_position (front_right_wheel,INFINITY);

doublefront_left_speed = 0.0, front_right_speed = 0.0;

while (wb_robot_step (TIME_STEP) != -1) {

if (obstacle > OBSTACLE_THRESHOLD){

speed_factor = (1.0 - DECREASE_FACTOR * obstacle) * MAX_SPEED / obstacle;

front_left_speed = speed_factor * left_obstacle;

front_right_speed = speed_factor * right_obstacle;

} else {

front_left_speed = CRUISING_SPEED;

front_right_speed = CRUISING_SPEED;

}

wb_servo_set_velocity (front_left_wheel, front_left_speed);

wb_servo_set_velocity (front_right_wheel, front_right_speed);

}

return 0;

}





Рекомендуемые страницы:


Читайте также:



Последнее изменение этой страницы: 2016-04-10; Просмотров: 994; Нарушение авторского права страницы


lektsia.com 2007 - 2021 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.022 с.) Главная | Обратная связь