Хотите изучить робота, но у вас нет возможности его купить? А может, вы просто не знаете с чего начать? Тогда симулятор роботов Webots вам отлично подойдет! Научитесь легко управлять роботами в любых средах и создавать своих собственных роботов. Больше всего вам понравится то, что Webots — это бесплатный симулятор с открытым исходным кодом. Мы познакомимся с Webots и напишем программу для робота E-puck (Е-шайба), приводящую его в движение.
В рамках научного исследования меня попросили помочь разработать алгоритмы обхода препятствий в нишинговом методе оптимизации роя частиц (PSO) для роботизированной многоцелевой поисковой системы. С этого и началось моё знакомство с Webots. Роботов помещают в зону поиска и они перемещаются, выслеживая цели. Благодаря нишинговому алгоритму PSO роботы делятся друг с другом информацией о том, где лучше встать относительно возможного расположения цели, и таким образом им удаётся находить самые оптимальные допустимые позиции. В симуляции участвовало 40 роботов и 4 цели.
По моему опыту Webots прост в освоении и применении, он полностью оснащён инструментами и реалистичен. Наконец, не нужно тратить деньги на покупку настоящих роботов ????. И совсем скоро вас ждет знакомство с проектом.
Официальный сайт: https://cyberbotics.com
Webots — это симулятор роботов с открытым исходным кодом, который предоставляет полноценную среду разработки для моделирования, программирования и симуляции роботов. Тысячи учреждений по всему миру используют его для научных исследований и обучения. Webots был разработан совместно со Швейцарским федеральным технологическим институтом в Лозанне, тщательно протестирован, сопровожден грамотной документацией и постоянно обслуживается, начиная с 1998 года. Это самый эффективный способ быстро достичь профессиональных результатов. [Источник]
Многие проекты мобильной роботехники на протяжении долгих лет опираются на Webots в следующих областях:
Симуляция Webots состоит из следующих компонентов:
Webots располагает большим разнообразием готовых роботов, среди которых:
Вы можете написать программу для контроллера робота в Webots на C++, Java, Python или MATLAB. Выбирайте свой любимый язык программирования.
Графический интерфейс пользователя состоит из 4 основных окон:
Webots предоставляет превосходное, понятное руководство и обучающую программу.
Официальный сайт: https://e-puck.org
Википедия: https://ru.qwe.wiki/wiki/E-puck_mobile_robot
E-puck — это небольшой и простой в эксплуатации мобильный робот, разработанный GCtronic и EPFL, который широко используется в научных и образовательных целях. [Источник]
С 2005 года около 3000 моделей данного робота успешно применяются в образовании и исследованиях. С января 2018 года стала доступна 2 версия E-puck. [Источник]
E-puck относится к неголономным колесным роботам, которые зависят от вектора своего движения и не могут свободно перемещаться в любых направлениях без разворота. В отличие от них голономные способны двигаться в разных направлениях, не разворачиваясь.
Предлагаю вашему вниманию простое руководство по созданию среды, добавлению препятствий и робота E-puck, а также программу, направляющую движение робота вперед. Установите Webots на ваш компьютер согласно инструкции. В данном проекте использована версия Webots 2019b.
Wizards
(Мастера), а затем в подменю — New Project Directory
(Директория нового проекта).Next
.Next
.main.wbt
) и отметьте необходимые компоненты (я выбрал Center view point
(Центральная точка обзора), Add a textured background
(Добавить текстурированный фон), Add a directional light
(Добавить направленный свет) и Add a rectangle arena
(Добавить прямоугольную арену). После этого нажмите Next
и Finish
.Выберите последний узел RectangleArena
из отображаемого дерева сцены и нажмите кнопку Add
, то есть знак плюс в его верхней части. В диалоговом окне выберите PROTO nodes (Webots) / robots / gctronic / e-puck / E-puck (Robot)
, затем снова — Add
. Робот должен появиться в центре арены. Сохраните симуляцию.
Для четкого обзора нам нужен вид арены сверху. Вы можете вращать ее по осям X, Y и Z, удерживая левую/правую кнопку мыши и перемещая курсор. Есть возможность увеличивать и уменьшать масштаб, прокручивая колесико мыши вверх или вниз.
Ниже следует описание настроек, позволяющих обозревать арену сверху. Дважды нажмите на узел дерева сцены Viewpoint
— то еть на точку обзора, открыв тем самым данный узел и отобразив его поля. Выберите поле orientation
— ориентация и установите значение angle
, то есть угол, в 1,58. После чего перейдите к полю position
— позиция и укажите значения: x (-0.034), y (2.2365), z (-0.023)
.
В результате среда будет выглядеть следующим образом:
Добавление препятствий в данном сценарии не обязательно. Я же воспользовался этой возможностью для придания симуляции более реалистичного вида и просто ради интереса ????.
E-puck
из отображаемого дерева сцены. Нажмите кнопку Add
(знак плюс) в его верхней части. В диалоговом окне выберите PROTO nodes (Webots) / objects / factory / containers / WoodenBox (solid)
, затем нажмите Add
и после этого два раза на узел дерева сцены WoodenBox
(деревянный ящик). Так вы откроете узел и отобразите его поля. Выберите поле size
(размер), установив его значения: x (-0.2), y (0.1) и z (-0.1), и поле translation
(сдвиг) со значениями: x (0), y (0.05) и z (-0.2).E-puck
из отображаемого дерева сцены. Нажмите кнопку Add
(знак плюс) в его верхней части. В диалоговом окне выберите PROTO nodes (Webots) / objects / obstacles / OilBarrel (Solid)
и нажмите Add
, а затем два раза на узел дерева сцены OilBarrel
(бочка нефти). Вслед за этим открывается узел и отображаются его поля. Выберите поле radius
(радиус), установив его значение -0.05, затем поле height
(высота) со значением 0.1 и, наконец, поле translation
(сдвиг) со значениями: x (0.2), y (0.05), z (-0.2)
.Вид среды с препятствиями:
Wizards
, затем в подменю — New Robot Controller
(новый контроллер робота).Next
.Next
.e-puck-move_forward
. Затем — Next
.Finish
.Исходный код контроллера:
Контроллер вы можете редактировать из встроенного в Webots текстового редактора или в другой предпочитаемой IDE. Директория контроллера, содержащая программу, находится в [your project directory]/controllers
([директория вашего проекта]/контроллеры).
Ниже представлен исходный код e-puck-move_forward
, с которым вы также можете ознакомиться в моем репозитории на GitHub. Скопируйте этот код в свою программу для контроллера:
/*
* Авторское право 2019 принадлежит Albert Alfrianta
*
* Лицензировано согласно Лицензии Apache, Версия 2.0 ("Лицензия");
* Этот файл может быть использован только в соответствии с Лицензией.
* Копию Лицензии можно найти по адресу:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* За исключением случаев, регламентированных существующим законодательством или не оговоренных в письменном соглашении, программное обеспечение,
* распространяемое на условиях данной Лицензии, предоставляется "КАК ЕСТЬ",
* и любые явные или неявные ГАРАНТИИ ОТВЕРГАЮТСЯ.
* Информацию об основных правах и ограничениях, применяемых к определенному языку согласно Лицензии, вы можете найти в данной Лицензии.
*
*
* Создана: 2019-09-16, Bogor, Indonesia
*
* Контакты: [email protected] or https://www.linkedin.com/in/albert-alfrianta/
*
* Описание:
* Простая программа робота E-puck, предназначенная для перемещения робота вперед.
* Написана на языке программирования C
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <webots/device.h>
#include <webots/distance_sensor.h>
#include <webots/led.h>
#include <webots/motor.h>
#include <webots/nodes.h>
#include <webots/robot.h>
int time_step;
/* Моторное устройство*/
static WbDeviceTag left_motor, right_motor;
/* Угловая скорость E-puck в рад/с */
#определение MAX_SPEED 6.28
/* функция для получения шага времени симулятора */
static int get_time_step() {
static int time_step = -1;
if (time_step == -1)
time_step = (int)wb_robot_get_basic_time_step();
return time_step;
}
/* функция, устанавливающая скорость мотора для движения вперед */
static void move_forward() {
wb_motor_set_velocity(left_motor, MAX_SPEED);
wb_motor_set_velocity(right_motor, MAX_SPEED);
}
/* функция для ввода данных робота */
static void init_robot() {
// получает шаг времени симулятора
time_step = get_time_step();
// добавляет обработчик действий моторов и устанавливает целевую позицию как бесконечность (контроль скорости)
left_motor = wb_robot_get_device("left wheel motor");
right_motor = wb_robot_get_device("right wheel motor");
wb_motor_set_position(left_motor, INFINITY);
wb_motor_set_position(right_motor, INFINITY);
wb_motor_set_velocity(left_motor, 0.0);
wb_motor_set_velocity(right_motor, 0.0);
}
/* главная функция */
int main(int argc, char **argv) {
/* необходима для ввода данных webots */
wb_robot_init();
init_robot();
/* главный цикл
* выполняет шаги симуляции в миллисекундах TIME_STEP
* и выходит из цикла по завершении симуляции
*/
while (wb_robot_step(time_step) != -1) {
/*
* перемещает робота вперед
* */
move_forward();
};
/* Здесь введите код очистки */
/* Это необходимо для очистки ресурсов Webots */
wb_robot_cleanup();
return EXIT_SUCCESS;
}
После этого нажмите Build
(сборка) сначала в меню, а затем в подменю. Перед сборкой убедитесь, что программа контроллера открыта в текстовом редакторе Webots.
Обратим внимание на важные особенности программы:
wb_robot_get_basic_time_step()
Webots использует шаг времени симулятора. Базовый шаг — это единица инкрементно увеличиваемого времени, используемая симулятором для отсчёта виртуального времени и выполнения симуляции физики.wb_robot_step(time_step)
— команда выполняет шаги симуляции и нужна для осуществления шага времени контроллером. Шаг времени контроллера — это инкрементно увеличиваемая единица времени в процессе выполнения контроллером каждой итерации контрольного цикла. Вызов этой команды требуется для синхронизации программы и состояния симулятора. Если симуляция остановится, она вернёт -1
. Если же мы не вызовем эту команду, то робот будет бездействовать. Например, wb_motor_set_velocity(left_motor, MAX_SPEED)
только устанавливает значение скорости мотора. Поэтому нам нужно вызвать и начать циклически выполнять команду wb_robot_step(time_step)
, чтобы привести робота в движение. Последовательность выполнения программы:while
.Примечание: в этой программе мы выполняем цикл while
бесконечно, поэтому никогда не достигнем этапа wb_robot_cleanup
.
Дважды нажмите узел E-puck
из отображаемого дерева сцены. Открывается узел и отображаются его поля. Выберите поле Controller
(контроллер), нажмите Select
(Выбрать) и укажите имя контроллера (имя моего контроллера —e-puck-move_forward
).
Для запуска или выключения симуляции в реальном времени нажмите кнопку Play над 3D окном. Итоговая симуляция:
Не забудьте сохранить ваш мир: нажмите кнопку сохранения или File -> Save World
в меню.
Когда вы вносите изменения в мир Webots с намерением его сохранить, то сначала необходимо приостановить симуляцию и вернуть ее в исходное состояние, т.е. счетчик виртуального времени на главной панели инструментов должен показывать 0:00:00:000. В противном случае при каждом сохранении положение каждого 3D объекта может накапливать ошибки. Вследствие этого, модификация мира должна осуществляться в следующем порядке: пауза, возврат в исходное состояние, модификация и сохранение симуляции.
Вы можете просто загрузить данный проект из моего репозитория на GitHub и запустить его в своих Webots. Благодарю за внимание!
Перевод статьи Albert Alfrianta: How to Create and Play a Simple Robot Program via Webots Robot Simulator
Комментарии