A48. Самособирающийся робот

https://youtu.be/oNNB7jf9LhY

РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

По стандарту РД 50-34.698-90

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

Область применения: высшие технические учебные заведения, выпускающие бакалавров, специалистов, магистров по специальностям, в образовательные программы которых входят дисциплины по имитационному моделированию и программированию.

Описание возможностей: программа позволяет задавать количество компонентов-«кубиков» от 1 до 12, из которых в дальнейшем во время её работы происходит сборка робота. В меню программы предусмотрен выбор фигуры, в которую будут складываться структурные элементы. Из 3 вида: квадрат, буква «А», перевернутая буква «Ч». После выбора фигуры и нажатию кнопки «собрать» робот начинается собираться в выбранную фигуру. Все компоненты двигаются по рабочей области программы один за другим, начиная с ближнего элемента заканчивая дальним. После того, как фигура собрана из имеющихся «кубиков» появляется разобрать фигуру и заново её собрать. После нажатия на кнопку «Разобрать» все «кубики» заново расставляются по рабочей области в случайном порядке.

Уровень подготовки пользователя: достаточно начального уровня, т.к. интерфейс программы очень прост и включает в себя поле для ввода количества «кубиков», и меню с кнопками.

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

Назначение и условия применения: программа предназначена для демонстрации возможностей среды имитационного моделирования Anylogic, и агентного подхода в разработке программ, заложенного в ней. Для запуска созданной модели потребуется наличие установленной на ПК программы Anylogic, имееющей версию не ниже 7.1.2.

Виды деятельности и функции, для автоматизации которых предназначена программа:п рограмма предназначена только для демонстрационных функций

Условия, при которых обеспечивается применение программы: наличие установленной на ПК программы Anylogic, имеющей версию не ниже 7.1.2.

Подготовка к работе:
запустить программу Anylogic, зайти в верхнее меню и выбрать пункт «открыть». Появится диалог выбора запускаемой модели с расширение .apl. Выбираем файл robot.alp. Затем для запуска этой программы нажимаем в верхнем меню пункт «Запустить»(Рис.1,2)


Создана вырезка экрана: 29.04.2015; 11:40

Рис.1 Верхнее меню Anylogic 7/1/2


Рис.2 Диалоговое окно выбора файла в Anylogic 7/1/2

Состав и содержание дистрибутивного носителя данных: рабочий файл программы robot.alp

Порядок загрузки данных и программ: запустить программу Anylogic, зайти в верхнее меню и выбрать пункт «открыть». Появится диалог выбора запускаемой модели с расширение .apl. Выбираем файл robot.alp. Затем для запуска этой программы нажимаем в верхнем меню пункт «Запустить». Затем появится первое окно для запуска эксперимента модели. (рис.3)


Рис.3 Окно запуска эксперимента

Перед тем как нажать на кнопку «Запустить» потребуется задать количество элементов роботов, из которых будут собираться фигуры. Это значение можно оставить равным 8 или задать произвольное в интервале от 0 до 8. Далее необходимо выбрать фигуру, в которую будут собираться блоки c помощью меню. Сбор фигуры производится по нажатию на кнопку «Собрать», разбор – через кнопку «Разобрать». Рабочие области фигур в программе представлены на рисунках 4-6.


Рис.4 Рабочая область для фигуры «квадрат»


Рис.5 Рабочая область для фигуры «буква А»


Рис.6 Рабочая область для фигуры «перевернутая буква «Ч»»

Проверка работоспособности: для проверки работоспособности программы были проведены 12 её запусков. Перед каждым запуском устанавливалось новое значение числа блоков роботов от 1 до 12. При выполнение программы производился сбор всех фигур в каждой интерации. Проверялась корректность функции «Разобрать» после каждой сборки. Программа успешно прошла проверку работоспособности.

Описание операций: программ позволяет задавать число блоков робота, производить выбор фигуры, собирать блоки в выбранную фигуру, разбирать фигуру.

Описание всех выполняемых функций, задач, комплексов задач, процедур:

Программа позволяет установить число блоков робота

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


Рис.7 Выбор фигуры робота

Программ позволяет собрать фигуру «квадрат», «буква А», «перевернутая буква «Ч»» (рис.8-10)


Рис.8 Собранный «квадрат»


Рис.9 Собранная «буква «А»»


Рис.10 Собранная «перевернутая буква «Ч»»

Вернуться в меню для выбора фигуры можно в любой момент (за исключением, когда фигура собирается), нажав на кнопку «МЕНЮ» в рабочей области фигуры в программе.

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

Чтобы заново собрать фигуры достаточно нажать на кнопку «Разобрать». Все «кубики» разместятся в случайном порядке и будут готовы для новой сборки. Во время сборки недоступны для нажатия кнопки «Меню», «Разобрать»

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

Аварийные ситуации (действия в случае длительных отказов технических средств, обнаружении несанкционированного вмешательства в данные, действия по восстановлению программ или данных, и т.п. ): перезагрузить ПК, перезапустить Anylogic, восстановить рабочий файл программы robot.alp из резервного архива.

Рекомендации по освоению: программа проста для освоения и не требует изучения документации для её использования. Для изучения кода программы, её структурной организации, принципов и подхода, применявшихся в её разработке, потребуется руководство программисту, которое прилагается к данному документу. Так же будет не лишним ознакомление со средой имитационного моделирования Anylogic на других учебных примерах, через учебники и открытые в глобальной сети источники информации.

РУКОВОДСТВО ПРОГРАММИСТА

Тип агента «Деталь»

Структурная организация программы включает в себя два класса(типа агентов) Main,Деталь и один эксперимент Simulation:Main.( Рис.1)

Рис.1 Структурная организация программы

Экземпляр класса «Main» является основным объектом, в который заложена вся логика запущенной программы. Объекты класса «Деталь» являются компонентами, из которых собирается само организующийся робот в различные фигуры. Данный класс включает в себя параметры и переменные, а так же анимацию компонента робота — желтый круг(Рис.2)

Рис.2 Параметры, переменные, анимация класса «Деталь»

Табл.1 Параметры и переменные класса «Деталь»

Название

Тип данных

Назначение

номер

Целочисленный int

Параметр содержит порядковый номер детали внутри популяции агентов детали[]

область

ViewArea

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

установлена

Логический boolean

Параметр принимает значение «истина»,если деталь была размещена на фигуре

x

Вещественный double

Параметр содержит координату X детали на презентации программы

y

Вещественный double

Параметр содержит координату Y детали на презентации программы

uzel

PointNode

Переменная содержит название узла внутри фигуры, куда следует встать детали

Под роботом в программе понимается совокупность всех компонентов –«кубиков», которые могут двигаться, обмениваться сообщениями, занимать определённые места в фигурах-сборках. Обмениваются сообщениями компоненты-«кубики» с помощью элемента «connections»внутри класса «Деталь».(Рис.3) Он необходим для того, чтобы с помощью сообщений детали могли определять между собой самую ближайшую к очередной точке фигуры, которую требуется занять. Код программы, вычисляющий самую близкую деталь, находящейся рядом с фигурой, записан в свойстве «Действие при получении сообщения» элемента «connections» ( Табл.2) Обмениваются детали сообщениями с помощью функции send(<cсообщение>,<адресат>). Тип сообщений, отправляемых деталями друг другу, — одномерный массив, элементы которого принимают вещественные значения типа double.

Рис.3 Элемент «connections»внутри класса «Деталь»

Таблица 2. Свойство «Действие при получении сообщения» элемента «connections»

PointNode i=(PointNode)main.figura.get(main.current); //вычислить ссылку на текущий узел фигуры

/*Проверяется два условия:

1.чтобы деталь была ещё не установлена на фигуре

2.чтобы расстояние от детали до текущего узла фигуры было меньше, чем

значение dist самой близкой ( на текущую интерацию)детали */

if ((!установлена)&&(msg[0] > Math.sqrt(Math.pow(this.getX()-i.getX(),2)+Math.pow(this.getY()-i.getY(),2))))

{


/*если условия соблюдаются, то в первый элемент массива внутри сообщения заносится

расстояние данной детали до текущего узла фигуры

*/

msg[0]=Math.sqrt(Math.pow(this.getX()-i.getX(),2)+Math.pow(this.getY()-i.getY(),2));


/*

во второй — номер данного узла

*/

msg[1]=номер;

}

/*далее проверяется данная деталь не последняя ли внутри популяции «детали»

если не последняя, то производится отправка сообщения следующей в популяции детали */

if (номер != main.детали.size()-1) send(msg,main.детали.get((int)номер+1));


// если последняя, то проверяется текущий узел не последний ли в фигуре


else
if (main.current != main.figura.size()-1) //если нет, то

{ double nomer=msg[1]; //присваиваем обявленной переменной номер ближайшей детали

main.детали.get((int)nomer).установлена=true; //переводим в значение «ИСТИНА» параметр детали с номером «nomer»

main.детали.get((int)nomer).uzel=i;//присваиваем переменной uzel этой детали значение i

main.растановка.add(main.детали.get((int)nomer)); //в коллекцию «растановка» добавляем ссылку на эту деталь

main.current++; //увеличиваем значение переменной на единицу

msg[0]=(double)22500;//ставим в элемент 0 массива в сообщении значение расстояния dist по умолчанию

msg[1]=(double)0;//ставим в элемент 1 массива в сообщении номер детали по умолчанию

send(msg,main.детали.get(0)); //снова отправляем сообщение первой детали внутри популяции детали (цикл поиска самой близкой детали для следующего узла фигуры повторяется)

}


else
if (main.current == main.figura.size()-1) //если да, то

{


double nomer=msg[1];//присваиваем обявленной переменной номер ближайшей детали

main.детали.get((int)nomer).установлена=true;//переводим в значение «ИСТИНА» параметр детали с номером «nomer»

main.детали.get((int)nomer).uzel=i;//присваиваем переменной uzel этой детали значение i

main.растановка.add(main.детали.get((int)nomer));//в коллекцию «растановка» добавляем ссылку на эту деталь

}

Ниже приведена блок-схема 1 к данному фрагменту кода

Блок-схема 1. Алгоритм поиска ближайших деталей ко всем вершинам фигуры

Тип агента «MAIN»

Экземпляр класса «Main» является основным объектом, в который заложена вся логика запущенной программы. При запуске программы срабатывает код в свойстве класса Main для присвоения всем деталей порядкового номера внутри своей популяции

int i=0;

for(Деталь v:детали){//просмотр очередной детали

v.номер=i;//присвоение номера

i++;

}

Класс «MAIN» включает в себя(рис.4):

  1. Переменные, параметры (рис.5)
  2. Коллекции (рис.5), содержат ссылки на детали и геометрические примитивы фигур
  3. Кнопки
  4. События (рис.5)
  5. функции (рис.5)
  6. области просмотра (разграниченные части пространства под каждую фигуру)
  7. сеть (система путей и точек, по которым перемещаются детали)
  8. геометрические римитивы (составные элементы общей фигуры, в который размещаются детали)
  9. популяцию агентов (содержит ссылки на все детали робота)

  1. Рис.4 Содержимое класса «Main»

Рис.5 Параметр, переменные, популяция, события, функции, коллекции класса «Main»

Табл.2 Параметр и переменные класса «Main»

Название

Тип данных

Назначение

N

Целочисленный int

Параметр содержит размер популяции агентов детали

Сurrent

Целочисленный int

Переменная содержит ссылку на текущий узел фигуры, для которого ведётся поиск самой близкой детали

fugura

ArrayList

Переменная содержит ссылку на фигуру, для узлов которой подбираются самые близкие детали

detalmoved

Целочисленный int

Переменная содержит порядковый номер детали внутри коллеции «расстановка», которая будет перемещена на фигуру

Табл.3. Коллекции

Название

Тип данных

Назначение

kvadrat

PointNode

Содержит основные узлы фигуры «КВАДРАТ»

kvadratADD

PointNode

Содержит дополнительные(невидимые) узлы фигуры «КВАДРАТ»

stulH

PointNode

Содержит основные узлы фигуры «Перевернутая буква «Ч»»

stulHADD

PointNode

Содержит дополнительные(невидимые) узлы фигуры «Перевернутая буква «Ч»»

bukvA

PointNode

Содержит основные узлы фигуры «буква «А»»

bukvADD

PointNode

Содержит дополнительные(невидимые) узлы фигуры «буква «А»»

растановка

ArrayList

Содержит ссылки на агентв из популяции «ДЕТАЛИ» в том порядке, в котором они будут заполнять выбранную фигуру

Табл.4 Функции и события

Название

Назначение

Код

movedetal

Передвигает деталь с исходного местоположения на заранее установленное для неё место

//перемещение детали с порядковым номером detalmoved в коллекции «растановка»

растановка.get(detalmoved).moveTo(растановка.get(detalmoved).uzel);

//возврат ссылки на передвинутую деталь

return растановка.get(detalmoved);

movefinishedH

Событие, происходящее после размещения детали в узле фигуры «перевернутая буква «Ч»» (Блок-схема 2)

detalmoved++;//порядковый номер увеличить на 1

//проверка условия: не закончились ли детали в коллекции растановка?

if (detalmoved < растановка.size()) {собрать2.action();//если нет, то вызываем обработчик кнопки «собрать2»}

else
if (detalmoved < детали.size()){ //если да, но детали не закончились в опуляции «детали»,то

double dist=22500;//ставим переменную dist в значение по умолчанию

double x=0;//координаты начальные

double y=0;

int j=0;

int i=detalmoved-7;//порядковый номер уменьшаем на 7

x=stulHADD.get(i).getX();//обращаемся к очередной детали и определяем её координаты

y=stulHADD.get(i).getY();

//обращаемся к каждой детали из популяции

//и ищем ту из них, которая ближе всего к фигуре «перевернутая буква «Ч»»

for (Деталь d:детали) //получаем ссылку на очередную деталь

{


//проверяем не размещена ли деталь и меньше ли, чем у остальных её расстояние до фигуры


if ((!d.установлена) && (dist > Math.sqrt(Math.pow(d.getX()-x,2)+Math.pow(d.getY()-y,2))))

{ //если меньше, то перезаписываем наименьшее расстояние dist на значение текущей детали

dist = Math.sqrt(Math.pow(d.getX()-x,2)+Math.pow(d.getY()-y,2));j=d.номер; }

}

//далее передвигаем самую близкую к фигуре «перевернутая буква «Ч»» деталь, и считаем её размещённой на фигуре

детали.get(j).moveTo(stulHADD.get(i));детали.get(j).установлена=true;movefinishedH.restart(детали.get(j).timeToArrival());

}

else { //если да, и детали везде закончились, то

detalmoved=0;button7.setEnabled(true);//порядковый номер обнуляем, а кнопки делаем доступными для нажатия

button8.setEnabled(true);

}

movefinished

Событие, происходящее после размещения детали в узле фигуры «квадрат» (Блок-схема 2)

По аналогии с movefinishedH, различие только в строчках, касающихся выбора фигуры

movefinishedA

Событие, происходящее после размещения детали в узле фигуры «буква «А»» (Блок-схема 2)

По аналогии с movefinishedH, различие только в строчках,касающихся выбора фигуры

Блок-схема 2. Алгоритм работы программы после размещения очередной детали на фигуре

Табл.5 Процедуры кнопок

Название

Назначение

Код

Выбрать фигуру «Квадрат»

Расставляет все детали по области просмотра в случайном порядке, подготавливает детали для размещения в «квадрат», инициализация обмена сообщений между деталями (Блок-схема 3)

int x=0;//установка начальных значений

int y=0;

int i=0;

// назначаем случайным образом координаты для всех агентов

for(Деталь v:детали){ //просмотр всех деталей

boolean variable=false; //организовывваем цикл

while (!variable){ //пока variable=false

x=(int)uniform(10,500);//присваиваем случаные значения из диапазона

y=(int)uniform(100,450);

//проверяем чтобы сформированные случайным образом координаты были уникальными

//не совпадали с координатами предыдущих деталей

//чтобы детали не заходили друг на друга

//и не выходили за пределы области просмотра

if (x < (210-i) && x > (210-i-20)) {variable=true;x=210-i-10;}

else
if (x > (423+i) && x < (423+i+20)) {variable=true;x=423+i+10;}

else
if (y > (220+i) && y < (220+i+20)) {variable=true;y=220+i+10;}

}

v.y=y+(int)viewArea2.getY();//корректируем координату y в соответствии с размещением области просмотра

v.x=x;//координата х крайней левой верхней точки у всех областей сопадает

v.jumpTo(v.x, v.y); //мгновенной перемещение детали в точку с вычисленными координатами

v.установлена=false;//фиксируем этот факт

i=i+20;//в след.интерации переменная меняется на новое значение шагом 20

}

viewArea2.navigateTo();//переходим в область просмотра для выбранной фигуры

button4.setEnabled(false);//делаем кнопку «разобрать недоступной»

собрать1.setEnabled(true);//а «собрать» — доступной

//инициализация общения агентов между собой

current=0;//перед общением выбираем в качестве текущего узла первый узел (для поиска самой близкой детали)

figura=kvadrat;//фигура «квдрат»

растановка.clear();//коллекцию чистим от всего

double [] dist=new
double [] {22500,0};//в передаваемом сообщении устанавливаем содержимое по умолчанию

send(dist,детали.get(0));//отправка сообщения первой детали

Выбрать фигуру «Буква А»

Расставляет все детали по области просмотра в случайном порядке, подготавливает детали для размещения в «Букву А», инициализация обмена сообщений между деталями(Блок-схема 3)

По аналогии с кнопкой «Выбрать фигуру «Квадрат»», различие только в строчках, касающихся выбора фигуры

Выбрать фигуру «Перевернутаябуква «Ч»»

Расставляет все детали по области просмотра в случайном порядке, подготавливает детали для размещения в «Перевернутую букву «Ч»», инициализация обмена сообщений между деталями(Блок-схема 3)

По аналогии с кнопкой «Выбрать фигуру «Квадрат»», различие только в строчках, касающихся выбора фигуры

Меню

Перемещение в начало меню

viewArea.navigateTo();

Собрать

Собирает фигуру «Буква «А»» из деталей. Для остальных фигур кнопки аналогичные

movefinishedA.restart(movedetal().timeToArrival()*0.7);//взвод таймера события «movefinishedA»

//на время равное 0.7 времени перемещения детали

self.setEnabled(false);//выключить кнопку «собрать»-себя

button2.setEnabled(false);//выключить кнопку»меню»

button.setEnabled(false);//выключить кнопку «Разобрать»

Разобрать

Вызывает код кнопки выбора фигуры

self.setEnabled(false); //себя блокирует

button5.action(); //вызывает код кнопки «Выбрать фигуру «Буква А»»

собрать.setEnabled(true);//делает доступной кнопку собрать

Блок-схема 3. Алгоритм работы программы по нажатию на кнопку выбора фигуры


 

guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x