О среде Simbad

Simbad (http://simbad. ) - это несложный симулятор мобильных роботов. Он целиком написан на Java, и с этим связано его главное преимущество: кроссплатформенность. Недостатком Simbad является отсутствие серьёзного моделирования динамики, а также тот факт, что в настоящее время (лето 2011 года) проект практически не развивается.

Установка

Сам Simbad установки не требует, но для его работы нужно скачать и установить некоторые Java-библиотеки. Устанавливать всё нужно в следующей последовательности:

1.  JRE (Java Runtime Environment) (нужно для запуска)

2.  JDK (Java Development Kit) (с сайта ) (нужно для компиляции)

3.  Java3D (http:///products/java-media/3D/download. html)

Java3D официально пока не поддерживается в 64-битной версии Windows (но поддерживается в 64-битной версии Linux). Для работы Java3D необходим OpenGL версии не менее 1.2. Если его нет, требуется обновить драйвера видеокарты.

Если компилятор выдаёт ошибку об отсутствии пакетов, связанных с графикой (не понимает выражений Point3d, Vector3d и подобных), то необходимо переустановить Java3d.

Запуск

Просто запускается файл simbad-1.4.jar. Можно посмотреть примеры. Наибольший интерес представляют LightSearchDemo (использование датчиков освещённости), AvoidersDemo (использование датчиков препятствий), PickCherriesDemo (взаимодействие с объектами), PushBallsDemo (простая физика).

Компиляция и запуск из командной строки

Если нужно написать программу для Simbad, требуется компилятор Java (есть в JDK).

НЕ нашли? Не то? Что вы ищете?

Хороший пример типичной программы для Simbad есть на официальном сайте (http://simbad. /example1.php).

Собрать программу можно прямо из командной строки (cmd) Windows или из оболочки Linux. Если сборка производится под Windows, вначале нужно прописать в системной переменной path строку: C:\Program Files\Java\jdk1.6.0_23\bin, чтобы система знала, где искать компилятор Java.

Для компиляции и запуска собственной программы нужно зайти в папку, где лежат её исходные файлы. java.

Команды для компиляции:

javac - classpath ".\..\simbad-1.4.jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\vecmath. jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\j3dcore. jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\j3dutils. jar" MyProg. java MyEnv. java MyRobot. java

Запуск:

java - classpath ".;.\..\simbad-1.4.jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\vecmath. jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\j3dcore. jar;C:\Program Files\Java\Java3D\1.5.1\lib\ext\j3dutils. jar" MyProg

Примечание: В ключе classpath перечисляются внешние библиотеки. Важно, что при запуске в - classpath стоит точка (она означает текущий каталог). Она нужна, чтобы среда Java знала, из какого каталога брать файлы.

Устройство программы.

Простая программа на Simbad состоит из трёх классов:

ñ  MyProg - здесь находится только функция Main.

ñ  MyRobot - описание робота и его поведение. Включает в себя конструктор робота и функции InitBehavior и performBehavior, определяющие поведение робота.

ñ  MyEnv - описание окружающей среды. Обычно состоит только из конструктора, в котором задаются параметры и объекты среды, а также добавляется робот.

Создание проекта Simbad в NetBeans

Можно работать в удобной среде разработки NetBeans. Она кроссплатформенная, свободная, имеет красивый интерфейс. Для установки требует JDK. Чтобы написать программу для Simbad, нужно сделать следующее:

Создать проект Java (выбрать тип "Приложение Java"). Желательно убрать крестик в "Создать главный класс", так как пакет, содержащий Main, называется по-другому, и из-за этого придётся потом менять настройки проекта и указывать главный класс вручную. Создать классы MyProg, MyRobot, MyEnv и добавить их в проект. Что должно быть в этих файлах — примеры есть на сайте Simbad. Слева дерево проекта. Правый клик на "Библиотеки" - "Добавить архив JAR или папку". Выбрать файл simbad-1.4.jar.

Задачи в симуляторе Simbad

Далее приведены формулировки задач и некоторые указания к их выполнению. Исходные тексты задач все имеются в папках, пронумерованных соответственно.

Задача 1. Робот, следующий на свет.

Постановка задачи.

Робот, следующий на свет (photovore), или, как вариант, следующий по линии (line tracer) - это своего рода "Hello World" в робототехнике. На Западе такие «машинки» называют ещё Breitenberg Vehicles. При простоте алгоритма, они показывают достаточно интересное, зависящее от перемен в окружающей среде поведение.

Устройство программы робота

Обычно вся программа робота выглядит следующим образом. При старте робота, запускается некоторая функция инициализации систем робота. В Simbad эти действия происходят в конструкторе робота и функции initBehavior. Потом программа входит в бесконечный цикл и сама из него никогда не выходит. Работа этого цикла завершается только при отключении питания робота или, в случае с симулятором, принудительном завершении его программы. В Simbad такой цикл называется performBehavior. Устроен он так:

Бесконечный цикл {

Опрос датчиков();

Выбор действия();

Действие();

}

Как правило, кроме основного цикла других циклов во всей программе нет. Такая модель ещё называется на Западе Sense-Think-Act. Вначале робот «чувствует», то есть воспринимает окружающую среду. Затем «думает», то есть анализирует данные и принимает решение о том, что делать дальше. И наконец «действует», то есть посылает сигналы на свои моторы.

Смена кинематической модели

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

Поэтому в программе лучше сразу сменить модель на дифференциальную.

Для начала нужно завести переменную класса «Робот»:

L=10.0 //ширина колесной базы

Объявляется кинематическая модель — тоже как переменная класса «Робот»:

DifferentialKinematic kinematic;

Она инициализируется в конструкторе класса “Робот” с параметром L:

kinematic = new DifferentialKinematic(L);

Там же даётся команда:

setKinematicModel(kinematic);

Теперь скорость задается так:

kinematic. setWheelsVelocity(left, right);

где left, right – скорости на моторах в м/с.

Отрицательное число означает вращение мотора назад.

Работа с источниками света

На сцене располагается 2 источника освещения - две лампы (можно повращать камерой и увидеть их). Источники света в Simbad реализованы не очень удачно. Их нельзя конструировать, можно только менять их параметры в конструкторе среды:

light1IsOn = true;

light1SetPosition(3,1,-3);

light1Color = white;

Аналогично и со вторым источником цвета, только тогда переменные будут вида light2IsOn.

Их лучше переместить так, чтобы было видно; можно поменять цвет лампы.

Работа с датчиками освещённости

К роботу нужно добавить 2 датчика освещённости. Они будут выглядеть как желтые точки слева и справа от робота. Датчики объявляются как переменные класса «Робот»:

LightSensor sensorLeft;

LightSensor sensorRight;

Они инициализируются в конструкторе класса «Робот»:

sensorLeft = RobotFactory. addLightSensorLeft(this);

sensorRight = RobotFactory. addLightSensorRight(this);

Чтобы считать показания датчика света:

float llum = sensorLeft. getAverageLuminance();

float rlum = sensorRight. getAverageLuminance();

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

Задача 2. Робот, приезжающий в заданную точку

Постановка задачи

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

В Simbad есть функция getCoords, дающая глобальные координаты робота. Если робот уже знает свои координаты, то ему остается высчитать свой угол поворота относительно заданной точки, повернуться так, чтобы стоять к ней «лицом», и затем просто приехать в неё по прямой.

Устройство пространства и времени в симуляторе

Необходимо обратить внимание на то, что по умолчанию X и Z — это ширина и длина, а Y — это высота. Время в симуляторе устроено следующим образом: каждые 0.05 секунд (50 миллисекунд) происходит шаг симуляции, в ходе которого робот выполняет то, что задано в функции performBehavior. Это время тоже можно менять по своему усмотрению, но для простых задач вполне хватит и такого.

Алгоритм

1.  Завести переменную для текущего угла

2.  Каждый шаг симуляции:

1.  Измерить текущий угол робота: вычислить угловую скорость робота и прибавить к текущему углу шаг времени, умноженный на угловую скорость.

2.  Если робот уже развёрнут по направлению к цели - дать роботу команду ехать вперёд

3.  Иначе:

1.  Найти угол между текущим направлением робота и направлением на заданную точку

2.  Повернуть робота так, чтобы разница между ними стала почти равна нулю. Возможны ситуации, когда робот проскакивает направление: из-за временного шага в 200 миллисекунд на достаточно большой скорости он почти всегда проворачивается мимо. Поэтому необходимо ввести epsilon.

4.  Если робот уже находится на расстоянии delta от заданной точки - остановиться

Дополнительная задача — следование по маршруту из списка точек (ArrayList). Это пригодится в следующей задаче.

Задача 3. Нахождение пути робота на заданной карте методом Дейкстры

Постановка задачи

У робота имеется карта помещения. Заранее неизвестны старт и финиш. На входе робот получает точку, в которую должен попасть. Свои координаты он по-прежнему знает.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5