О среде 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 |


