Перевод статьи Mania Beetz про фреймворк для обучения роботов в виртуальных средах
This commit is contained in:
parent
5c732dd19c
commit
a3c4250675
14 changed files with 958 additions and 8 deletions
|
@ -19,7 +19,7 @@ title: Словарь терминов и сокращений
|
||||||
|
|
||||||
**Владелец**. Пользователь, владеющий объектом. По умолчанию, автор нового объекта становится его владельцем. Он может продать или передать объект другому пользователю, установить плату за пользование объектом, выставить его на аукцион, прямой или обратный краудфандинг и т.п. Пользователь, повстречавший объект может направить добровольное финансовое вознаграждение его владельцу или автору.
|
**Владелец**. Пользователь, владеющий объектом. По умолчанию, автор нового объекта становится его владельцем. Он может продать или передать объект другому пользователю, установить плату за пользование объектом, выставить его на аукцион, прямой или обратный краудфандинг и т.п. Пользователь, повстречавший объект может направить добровольное финансовое вознаграждение его владельцу или автору.
|
||||||
|
|
||||||
**Воспроизводство**. Производство, развертывание и ввод в работу системных объектов. Может осуществляться в формах роста и размножения кластеров.
|
**Воспроизводство**. Производство, развертывание и ввод в работу системных объектов. Может осуществляться в формах роста и размножения клеток.
|
||||||
|
|
||||||
**Глобальный идентификатор планировщика** - Уникальный идентификатор, присваиваемый новому планировщику при его производстве.
|
**Глобальный идентификатор планировщика** - Уникальный идентификатор, присваиваемый новому планировщику при его производстве.
|
||||||
|
|
||||||
|
@ -43,12 +43,12 @@ title: Словарь терминов и сокращений
|
||||||
|
|
||||||
**Измерение** См. Изменение.
|
**Измерение** См. Изменение.
|
||||||
|
|
||||||
**Изменение**. Различают два вида действий: изменение и измерение. Действия изменения меняют что-либо в объекте (состав, форму, агрегатное состояние, положение...). Они могут сделать из одного объекта несколько (резка, сверление) или наоборот (сборка, сварка), захватить/отпустить объект, перевезти, принять или отдать его на терминале ввода-вывода внешнему миру или другому кластеру АПС, добыть из недр земли и т.п. Действия измерения служат для получения информации - о природе, свойствах и геометрии объекта, о его местонахождении, о факте его приема или передачи.
|
**Изменение**. Различают два вида действий: изменение и измерение. Действия изменения меняют что-либо в объекте (состав, форму, агрегатное состояние, положение...). Они могут сделать из одного объекта несколько (резка, сверление) или наоборот (сборка, сварка), захватить/отпустить объект, перевезти, принять или отдать его на терминале ввода-вывода внешнему миру или другой клетке АПС, добыть из недр земли и т.п. Действия измерения служат для получения информации - о природе, свойствах и геометрии объекта, о его местонахождении, о факте его приема или передачи.
|
||||||
|
|
||||||
**Инструмент**. Во время действия изменения над объектами, часть из них выступает в качестве изделий (то, где желательны изменения), другая часть - в качестве инструментов (в этом процессе им не желательно меняться). Например, при сверлении бруска мы хотим чтобы брусок изменился (появилось отверстие), а сверло должно затупиться как можно меньше. Таким образом, здесь брусок - изделие, а сверло - инструмент. Воздействие инструмента на изделие является полезным, а воздействие изделия на инструмент - паразитным.
|
**Инструмент**. Во время действия изменения над объектами, часть из них выступает в качестве изделий (то, где желательны изменения), другая часть - в качестве инструментов (в этом процессе им не желательно меняться). Например, при сверлении бруска мы хотим чтобы брусок изменился (появилось отверстие), а сверло должно затупиться как можно меньше. Таким образом, здесь брусок - изделие, а сверло - инструмент. Воздействие инструмента на изделие является полезным, а воздействие изделия на инструмент - паразитным.
|
||||||
Во время действия измерения все обстоит наоборот, мы хотим чтобы инструмент максимально изменил свое состояние (вольтметр показал напряжение), а изделие осталось неизменным (вольтметр не оказал влияния на процессы в диагностируемой схеме). Некоторые объекты используются в качестве инструмента редко (какой-нибудь сложный припой для спец. сплавов), некоторые - постоянно (контроллеры, манипуляторы). То что вчера было изделием сегодня может быть инструментом, и наоборот.
|
Во время действия измерения все обстоит наоборот, мы хотим чтобы инструмент максимально изменил свое состояние (вольтметр показал напряжение), а изделие осталось неизменным (вольтметр не оказал влияния на процессы в диагностируемой схеме). Некоторые объекты используются в качестве инструмента редко (какой-нибудь сложный припой для спец. сплавов), некоторые - постоянно (контроллеры, манипуляторы). То что вчера было изделием сегодня может быть инструментом, и наоборот.
|
||||||
|
|
||||||
**Кластер**. Структурная единица АПС, способная к автономной от других кластеров работе и самовоспроизводству. Каждый кластер работает под управлением собственного планировщика. Между кластерами возможен обмен объектами, энергией, информацией. Разбиение АПС на кластеры может проходить так чтобы минимизировать транспортные потоки между ними. Для этого каждый кластер может стремиться к автономности, к «умению всего». Однако в силу неоднородного распределения ископаемых, источников энергии и т.п. межкластерный обмен ресурсами неизбежен. Планирование состава и положения самих кластеров АПС и порядка их развертывания может осуществляться пользователями.
|
**Клетка**. Структурная единица АПС, способная к автономной от других клеток работе и самовоспроизводству. Каждая клетка работает под управлением собственного планировщика. Между клетками возможен обмен объектами, энергией, информацией. Разбиение АПС на клетки может проходить так чтобы минимизировать транспортные потоки между ними. Для этого каждая клетка может стремиться к автономности, к «умению всего». Однако в силу неоднородного распределения ископаемых, источников энергии и т.п. межклеточный обмен ресурсами неизбежен. Планирование состава и положения самих клеток АПС и порядка их развертывания может осуществляться пользователями.
|
||||||
|
|
||||||
**Конструкция объекта**. Совокупность информации об объекте, на основе которой может быть построена технология его изготовления. Конструкция включает в себя информацию о форме, расположении и материале частей объекта (CAD модель), а также совокупность тестов, которые должен проходить объект чтобы быть признан годным и исправным. Для удобства разработки технологии (как автоматического, так и ручного), конструкции следуе описывать не (как это принято сегодня) в виде единственного жесткого варианта, а указывать диапазоны характеристик материалов и важные и неважные участки CAD модели. "Неважный" участок объекта может быть выполнен по другому из технологичеких соображений. Для этого CAD модель может включать в себя пространственные слои, указывающие, например, зоны опционального заполнения материалом и прочую информацию, которая в традиционном производстве задана неявно (Не написано, почему эту деталь именно фрезеруют, но все помнят, что дед фрезеровал - и у него работало. А можно ли ее получить литьем - неизвестно.).
|
**Конструкция объекта**. Совокупность информации об объекте, на основе которой может быть построена технология его изготовления. Конструкция включает в себя информацию о форме, расположении и материале частей объекта (CAD модель), а также совокупность тестов, которые должен проходить объект чтобы быть признан годным и исправным. Для удобства разработки технологии (как автоматического, так и ручного), конструкции следуе описывать не (как это принято сегодня) в виде единственного жесткого варианта, а указывать диапазоны характеристик материалов и важные и неважные участки CAD модели. "Неважный" участок объекта может быть выполнен по другому из технологичеких соображений. Для этого CAD модель может включать в себя пространственные слои, указывающие, например, зоны опционального заполнения материалом и прочую информацию, которая в традиционном производстве задана неявно (Не написано, почему эту деталь именно фрезеруют, но все помнят, что дед фрезеровал - и у него работало. А можно ли ее получить литьем - неизвестно.).
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ title: Словарь терминов и сокращений
|
||||||
|
|
||||||
**Пилон**. Интерфейс механического и электрического соединения элементов АРМ (РС, РМ, АС) и надёжной их взаимной фиксации, не снимаемый, обязательный.
|
**Пилон**. Интерфейс механического и электрического соединения элементов АРМ (РС, РМ, АС) и надёжной их взаимной фиксации, не снимаемый, обязательный.
|
||||||
|
|
||||||
**Планировщик**. Устройство, управляющее кластером АПС путем планирования его операций во времени и пространстве. Это ящички с компьютерами (и жесткими дисками). Планировщик управляет большим количеством контроллеров (АРМ и ММ). У небольшой АПС может быть всего один планировщик. Большие АПС для уменьшения вычислительной сложности уместно разбивать на кластеры с отдельными планировщиками (объединенными в сеть и способными к кооперации при необходимости). Планировщики хранят у себя полный комплект конструкторской и технологической документации на всё (это как бы ДНК АПС) для быстрого к нему доступа, для автономного воспроизводства и на случай выхода некоторых из них из строя. Обычно АПС стремится к тому чтобы иметь несколько планировщиков и управляемых ими кластеров. При выходе из строя одного планировщика управление подведомственными ему контроллерами передается другим планировщикам. При производстве нового планировщика наоборот, ему выделяется кластер из хозяйства других планировщиков либо строится заново.
|
**Планировщик**. Устройство, управляющее клеток АПС путем планирования его операций во времени и пространстве. Это ящички с компьютерами (и жесткими дисками). Планировщик управляет большим количеством контроллеров (АРМ и ММ). У небольшой АПС может быть всего один планировщик. Большие АПС для уменьшения вычислительной сложности уместно разбивать на клетки с отдельными планировщиками (объединенными в сеть и способными к кооперации при необходимости). Планировщики хранят у себя полный комплект конструкторской и технологической документации на всё (это как бы ДНК АПС) для быстрого к нему доступа, для автономного воспроизводства и на случай выхода некоторых из них из строя. Обычно АПС стремится к тому чтобы иметь несколько планировщиков и управляемых ими клеток. При выходе из строя одного планировщика управление подведомственными ему контроллерами передается другим планировщикам. При производстве нового планировщика наоборот, ему выделяется клетка из хозяйства других планировщиков либо строится заново.
|
||||||
|
|
||||||
**Покупатель**. Пользователь, готовый приобрести некий объект (за деньги или бесплатно).
|
**Покупатель**. Пользователь, готовый приобрести некий объект (за деньги или бесплатно).
|
||||||
|
|
||||||
|
@ -86,13 +86,13 @@ title: Словарь терминов и сокращений
|
||||||
|
|
||||||
**Разработка технологии изготовления объекта**. Процесс создания технологии изготовления объекта на основе его конструкции и заданного технологического стиля.
|
**Разработка технологии изготовления объекта**. Процесс создания технологии изготовления объекта на основе его конструкции и заданного технологического стиля.
|
||||||
|
|
||||||
**Размножение**. Форма воспроизводства, при которой системные объекты, созданные кластером АПС (материнским) передаются в состав нового (дочернего) кластера. По мере наполнения системными объектами дочерний кластер переходит к самостоятельному росту.
|
**Размножение**. Форма воспроизводства, при которой системные объекты, созданные клеткой АПС (материнской) передаются в состав новой (дочерней) клетки. По мере наполнения системными объектами дочерняя клетка переходит к самостоятельному росту.
|
||||||
|
|
||||||
**Репликатор (ядро АПС)**. Минимальный набор системных объектов АПС, способный к самовоспроизводству. Практически ценный репликатор должен быть способен произвести не только себя, но и другие объекты.
|
**Репликатор (ядро АПС)**. Минимальный набор системных объектов АПС, способный к самовоспроизводству. Практически ценный репликатор должен быть способен произвести не только себя, но и другие объекты.
|
||||||
|
|
||||||
**Робот-манипулятор (РМ)**. Основной инструмент относительного позиционирования объектов при выполнении действий над ними (измерение и изменение одних объектов при помощи других, установка и извлечение из складских и транспортных ячеек, станков). Предполагается имеющим порядка 5-7 степеней свободы. Входит в состав АРМ или ММ и управляется его контроллером. Состоит из основания, звеньев и (?).
|
**Робот-манипулятор (РМ)**. Основной инструмент относительного позиционирования объектов при выполнении действий над ними (измерение и изменение одних объектов при помощи других, установка и извлечение из складских и транспортных ячеек, станков). Предполагается имеющим порядка 5-7 степеней свободы. Входит в состав АРМ или ММ и управляется его контроллером. Состоит из основания, звеньев и (?).
|
||||||
|
|
||||||
**Рост**. Форма воспроизводства, при которой системные объекты, созданные кластером АПС включаются в его же состав (взамен вышедших из строя, в качестве резервных и дублирующих) в целях поддержания и увеличения его производственных мощностей.
|
**Рост**. Форма воспроизводства, при которой системные объекты, созданные клеткой АПС включаются в его же состав (взамен вышедших из строя, в качестве резервных и дублирующих) в целях поддержания и увеличения его производственных мощностей.
|
||||||
|
|
||||||
**Системные объекты**. Объекты, из которых состоит или может быть собрана АПС - рабочие места, манипуляторы, складские ячейки и прочее.
|
**Системные объекты**. Объекты, из которых состоит или может быть собрана АПС - рабочие места, манипуляторы, складские ячейки и прочее.
|
||||||
|
|
||||||
|
|
BIN
docs/models/generation/Figure1.png
Normal file
BIN
docs/models/generation/Figure1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 118 KiB |
BIN
docs/models/generation/Figure2.png
Normal file
BIN
docs/models/generation/Figure2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 114 KiB |
263
docs/models/generation/generation.ipynb
Normal file
263
docs/models/generation/generation.ipynb
Normal file
|
@ -0,0 +1,263 @@
|
||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 5,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"%matplotlib tk\n",
|
||||||
|
"import time, math\n",
|
||||||
|
"from random import random\n",
|
||||||
|
"import numpy as np\n",
|
||||||
|
"from IPython import display\n",
|
||||||
|
"from PIL import Image\n",
|
||||||
|
"import matplotlib.pyplot as plt\n",
|
||||||
|
"import matplotlib.animation as animation\n",
|
||||||
|
"writer = animation.writers['ffmpeg'](fps=30, metadata=dict(artist='Me'), bitrate=1800)\n",
|
||||||
|
"\n",
|
||||||
|
"# Коды элементов\n",
|
||||||
|
"\n",
|
||||||
|
"BAD = 0\n",
|
||||||
|
"GOOD = 1\n",
|
||||||
|
"BASIC_FLOOR = 2\n",
|
||||||
|
"FENCE_PORT = 3\n",
|
||||||
|
"CORNER_PORT = 4\n",
|
||||||
|
"STORAGE_PORT = 5\n",
|
||||||
|
"GATE_LEAF_PORT = 6\n",
|
||||||
|
"GATE_PORT = 7\n",
|
||||||
|
"TRACK = 8\n",
|
||||||
|
"MACHINE_PORT = 9\n",
|
||||||
|
"WORK_PORT = 10\n",
|
||||||
|
"MM_PORT = 11\n",
|
||||||
|
"POWER_PORT = 12\n",
|
||||||
|
"UTIL_PORT = 13\n",
|
||||||
|
"PLANNER_PORT = 14\n",
|
||||||
|
"MINE_PORT = 15\n",
|
||||||
|
"\n",
|
||||||
|
"#Словарь, где хранятся ссылки на клетки по координатам\n",
|
||||||
|
"\n",
|
||||||
|
"cells={}\n",
|
||||||
|
"\n",
|
||||||
|
"class FloorElement():\n",
|
||||||
|
" def __init__(self,parent,x,y,element_type):\n",
|
||||||
|
" self.x=x\n",
|
||||||
|
" self.y=y\n",
|
||||||
|
" self.element_type=element_type\n",
|
||||||
|
" self.parent=parent\n",
|
||||||
|
" self.parent.floor[(self.x,self.y)]=self\n",
|
||||||
|
"\n",
|
||||||
|
"class Cell():\n",
|
||||||
|
" def __init__(self,x,y):\n",
|
||||||
|
" self.x=x\n",
|
||||||
|
" self.y=y\n",
|
||||||
|
" cells[(self.x,self.y)] = self\n",
|
||||||
|
" self.floor={}\n",
|
||||||
|
" self.content={}\n",
|
||||||
|
" self.generate()\n",
|
||||||
|
" def destroy(self):\n",
|
||||||
|
" del cells[(self.x,self.y)] \n",
|
||||||
|
" def generate(self):\n",
|
||||||
|
"\n",
|
||||||
|
" # Настройка параметров клетки\n",
|
||||||
|
" self.max_machine_size=20 # Максимальное число блоков в машине \n",
|
||||||
|
" self.work_machine_number_max=30 # Максимальное число рабочих машин\n",
|
||||||
|
" self.planners_max=3 # Максимальное число планировщиков\n",
|
||||||
|
" self.utils_max=3 # Максимальное число утилизаторов\n",
|
||||||
|
" self.powers_max=4 # Максимальное число электростанций\n",
|
||||||
|
" self.mines_max=4 # Максимальное число шахт\n",
|
||||||
|
" self.storage_number_max_without_mm=500 # Максимальная емкость склада\n",
|
||||||
|
" self.mm_max=50 # Максимальное число мобильных манипуляторов (ММ)\n",
|
||||||
|
" \n",
|
||||||
|
" self.work_machine_number_rep=12 # Число рабочих машин, достаточное для репликации\n",
|
||||||
|
" self.storage_number_rep_without_mm=200 # Емкость склада, достаточная для репликации\n",
|
||||||
|
" self.work_machine_number_grow=6 # Число рабочих машин, достаточное для автономного роста\n",
|
||||||
|
" self.storage_number_grow_without_mm=100 # Емкость склада, достаточная для автономного роста\n",
|
||||||
|
" self.storage_free=15 # Число складских ячеек в резерве\n",
|
||||||
|
" self.machine_free=2 # Число машиномест в резерве \n",
|
||||||
|
"\n",
|
||||||
|
" # Найти общее количество машин (включая служебные) и общую емкость склада (включая места для ММ)\n",
|
||||||
|
" \n",
|
||||||
|
" self.machine_number_max=self.work_machine_number_max+self.planners_max+self.utils_max+self.powers_max+self.mines_max\n",
|
||||||
|
" self.storage_number_max=self.mm_max+self.storage_number_max_without_mm\n",
|
||||||
|
"\n",
|
||||||
|
" # Подобрать прямоугольную форму машины, по возможности близкую к квадратной, содержащую количество\n",
|
||||||
|
" # блоков не меньше заданного и хорошо стыкуемую с соседями, дорожками и складской зоной\n",
|
||||||
|
" # Определить ширину и высоту машины, фактическое количество в ней блоков и занимаемую ей площадь\n",
|
||||||
|
" \n",
|
||||||
|
" self.machine_height=round(math.sqrt(self.max_machine_size),0)//3*3+1\n",
|
||||||
|
" self.machine_width=self.max_machine_size//self.machine_height\n",
|
||||||
|
" if self.machine_width*self.machine_height<self.max_machine_size:\n",
|
||||||
|
" self.machine_width=self.machine_width+1\n",
|
||||||
|
" self.fact_machine_size=self.machine_height*self.machine_width\n",
|
||||||
|
" self.fact_machine_area=(self.machine_height+5)*(self.machine_width+5)\n",
|
||||||
|
"\n",
|
||||||
|
" # Подобрать прямоугольную форму рабочей зоны, по возможности близкую к квадратной, содержащую \n",
|
||||||
|
" # количество машин не меньше заданного и хорошо стыкуемую с дорожками и складскими зонами\n",
|
||||||
|
" # Определить ширину и высоту рабочей зоны, фактическое количество машин и занимаемую ей площадь\n",
|
||||||
|
" \n",
|
||||||
|
" self.machine_coloumns=round(math.sqrt(self.machine_number_max),0)\n",
|
||||||
|
" self.machine_rows=self.machine_coloumns\n",
|
||||||
|
" if self.machine_coloumns*self.machine_rows<self.machine_number_max:\n",
|
||||||
|
" self.machine_rows+=1\n",
|
||||||
|
" if self.machine_width%2==0:\n",
|
||||||
|
" if self.machine_coloumns%2==1:\n",
|
||||||
|
" if self.machine_coloumns%2==1:\n",
|
||||||
|
" self.machine_coloumns+=1\n",
|
||||||
|
" else:\n",
|
||||||
|
" self.machine_coloumns,self.machine_rows=self.machine_rows,self.machine_coloumns\n",
|
||||||
|
" self.siderows=self.machine_rows*(1+(self.machine_height-1)/6)\n",
|
||||||
|
" if self.siderows!=int(self.siderows):\n",
|
||||||
|
" self.machine_rows+=1\n",
|
||||||
|
" self.siderows=self.machine_rows*(1+(self.machine_height-1)/6) \n",
|
||||||
|
" self.fact_machine_number=self.machine_coloumns*self.machine_rows\n",
|
||||||
|
"\n",
|
||||||
|
" # Рассчитать размер территории, занимаемой клеткой\n",
|
||||||
|
" \n",
|
||||||
|
" self.fact_machine_block_area=self.fact_machine_number*self.fact_machine_area\n",
|
||||||
|
" self.storage_desired_area=self.storage_number_max*5.5\n",
|
||||||
|
" self.total_desired_area=self.storage_desired_area+self.fact_machine_block_area\n",
|
||||||
|
" self.presize=(int(math.sqrt(self.total_desired_area)))\n",
|
||||||
|
" self.presize=(1+self.presize//6)*6\n",
|
||||||
|
" if (self.presize-(self.siderows*6))%12!=0:\n",
|
||||||
|
" self.presize+=6\n",
|
||||||
|
" self.realsize=self.presize+5\n",
|
||||||
|
"\n",
|
||||||
|
" # Создать территорию\n",
|
||||||
|
" \n",
|
||||||
|
" self.Terrain=np.ones((self.realsize,self.realsize))\n",
|
||||||
|
" #Terrain=np.sign(np.array(Image.open(\"intest.png\"))[:,:,0])\n",
|
||||||
|
"\n",
|
||||||
|
" # Создать карту, заполненную элементами пола\n",
|
||||||
|
" \n",
|
||||||
|
" self.Map=self.Terrain*BASIC_FLOOR\n",
|
||||||
|
"\n",
|
||||||
|
" # Создать забор\n",
|
||||||
|
" \n",
|
||||||
|
" self.Map[0]=self.Map[-1]=self.Map[:,0]=self.Map[:,-1]=FENCE_PORT\n",
|
||||||
|
"\n",
|
||||||
|
" # Создать углы\n",
|
||||||
|
" \n",
|
||||||
|
" self.Map[0,0]=self.Map[0,-1]=self.Map[-1,0]=self.Map[-1,-1]=CORNER_PORT\n",
|
||||||
|
"\n",
|
||||||
|
" # Создать трассу по периметру клетки\n",
|
||||||
|
" \n",
|
||||||
|
" self.Map[2:-2,2:-2]=TRACK\n",
|
||||||
|
" self.Map[3:-3,3:-3]=BASIC_FLOOR\n",
|
||||||
|
"\n",
|
||||||
|
" # Создать ворота, порты ворот, складские места\n",
|
||||||
|
" \n",
|
||||||
|
" for y in range(4,self.presize+2,6):\n",
|
||||||
|
" self.Map[y-2,2:-3]=TRACK\n",
|
||||||
|
" self.Map[y,0]=self.Map[y+2,0]=self.Map[y,-1]=self.Map[y+2,-1]=GATE_LEAF_PORT\n",
|
||||||
|
" self.Map[0,y]=self.Map[0,y+2]=self.Map[-1,y]=self.Map[-1,y+2]=GATE_LEAF_PORT\n",
|
||||||
|
" self.Map[y+1,0]=self.Map[y+1,-1]=self.Map[0,y+1]=self.Map[-1,y+1]=GATE_PORT\n",
|
||||||
|
" self.Map[y+1,1]=self.Map[y+1,-2]=self.Map[1,y+1]=self.Map[-2,y+1]=TRACK\n",
|
||||||
|
" for x in range(4,self.presize+2,2):\n",
|
||||||
|
" self.Map[y,x]=self.Map[y+2,x]=STORAGE_PORT\n",
|
||||||
|
" \n",
|
||||||
|
" # Создать машинную зону \n",
|
||||||
|
" \n",
|
||||||
|
" self.center=int(self.realsize/2)\n",
|
||||||
|
" self.mxstart=int(self.center-(self.machine_coloumns*(self.machine_width+5))/2)\n",
|
||||||
|
" self.mystart=int(self.center-(self.siderows*3))\n",
|
||||||
|
" self.mxstop=int(self.center+(self.machine_coloumns*(self.machine_width+5))/2)\n",
|
||||||
|
" if self.mxstart%2!=0:\n",
|
||||||
|
" self.mxstart-=1\n",
|
||||||
|
" self.mxstop-=1\n",
|
||||||
|
" self.mystop=int(self.center+(self.siderows*3))\n",
|
||||||
|
" \n",
|
||||||
|
" self.Map[self.mystart+1:self.mystop-1,self.mxstart:self.mxstop]=BASIC_FLOOR\n",
|
||||||
|
" self.Map[2:-2,self.mxstart]=self.Map[2:-2,self.mxstop]=TRACK\n",
|
||||||
|
"\n",
|
||||||
|
" special_machines_list=([PLANNER_PORT]*self.planners_max+[POWER_PORT]*self.powers_max+\n",
|
||||||
|
" [UTIL_PORT]*self.utils_max+[MINE_PORT]*self.mines_max)\n",
|
||||||
|
" \n",
|
||||||
|
" for y in range(self.mystart,self.mystop,int(self.machine_height)+5):\n",
|
||||||
|
" self.Map[y,self.mxstart:self.mxstop]=TRACK\n",
|
||||||
|
" for x in range(self.mxstart,self.mxstop,int(self.machine_width)+5):\n",
|
||||||
|
" kind=MACHINE_PORT\n",
|
||||||
|
" if len(special_machines_list)>0:\n",
|
||||||
|
" kind = special_machines_list.pop(0)\n",
|
||||||
|
" self.Map[3+y:3+y+int(self.machine_height),3+x:3+x+int(self.machine_width)]=kind\n",
|
||||||
|
" for sy in range(3+y,3+y+int(self.machine_height),2):\n",
|
||||||
|
" self.Map[sy,2+x]=WORK_PORT\n",
|
||||||
|
" for sx in range(4+x,3+x+int(self.machine_width),2):\n",
|
||||||
|
" self.Map[2+y,sx]=WORK_PORT\n",
|
||||||
|
" zystart=3+y\n",
|
||||||
|
" if self.Map[2+y,2+x+int(self.machine_width)]==WORK_PORT:\n",
|
||||||
|
" zystart+=1\n",
|
||||||
|
" for zy in range(zystart,3+y+int(self.machine_height),2):\n",
|
||||||
|
" self.Map[zy,3+x+int(self.machine_width)]=WORK_PORT\n",
|
||||||
|
" zxstart=3+x\n",
|
||||||
|
" if self.Map[2+y+int(self.machine_height),2+x]==WORK_PORT:\n",
|
||||||
|
" zxstart+=1\n",
|
||||||
|
" for zx in range(zxstart,3+x+int(self.machine_width),2):\n",
|
||||||
|
" self.Map[3+y+int(self.machine_height),zx]=WORK_PORT\n",
|
||||||
|
"\n",
|
||||||
|
" # Создать дополнительные вертикальные трассы возле машинной зоны \n",
|
||||||
|
" \n",
|
||||||
|
" for x in range(self.mxstart,self.mxstop,int(self.machine_width)+5):\n",
|
||||||
|
" if self.Map[4,x] == STORAGE_PORT:\n",
|
||||||
|
" self.Map[2:-3,x]=TRACK\n",
|
||||||
|
" else:\n",
|
||||||
|
" self.Map[self.mystart:self.mystop,x]=TRACK\n",
|
||||||
|
"\n",
|
||||||
|
" # Создать порты мобильных манипуляторов\n",
|
||||||
|
" \n",
|
||||||
|
" mm_counter=self.mm_max\n",
|
||||||
|
" for y in range(self.realsize):\n",
|
||||||
|
" for x in range(self.realsize):\n",
|
||||||
|
" if mm_counter>0:\n",
|
||||||
|
" if self.Map[y,x]==STORAGE_PORT:\n",
|
||||||
|
" self.Map[y,x]=MM_PORT\n",
|
||||||
|
" mm_counter-=1\n",
|
||||||
|
" if self.Map[y-2,x]==TRACK:\n",
|
||||||
|
" self.Map[y-1,x]=TRACK\n",
|
||||||
|
" elif self.Map[y+2,x]==TRACK:\n",
|
||||||
|
" self.Map[y+1,x]=TRACK\n",
|
||||||
|
"\n",
|
||||||
|
" # Зарегистрировать элементы карты\n",
|
||||||
|
" \n",
|
||||||
|
" for y in range(self.realsize):\n",
|
||||||
|
" for x in range(self.realsize):\n",
|
||||||
|
" if self.Map[y,x]>1: \n",
|
||||||
|
" FloorElement(self,x,y,self.Map[y,x])\n",
|
||||||
|
" \n",
|
||||||
|
"# Создать клетку \n",
|
||||||
|
" \n",
|
||||||
|
"c=Cell(20,20)\n",
|
||||||
|
"\n",
|
||||||
|
"# Показать клетку\n",
|
||||||
|
"\n",
|
||||||
|
"fig=plt.figure(figsize=(7, 5))\n",
|
||||||
|
"ax=fig.add_subplot(1, 1, 1)\n",
|
||||||
|
"im1=plt.imshow(c.Map, cmap=plt.get_cmap('bone'))\n",
|
||||||
|
"ax.set_title('Map MS:'+str(c.max_machine_size)+' MN:'+str(c.work_machine_number_max)+\n",
|
||||||
|
" ' SN:'+str(c.storage_number_max_without_mm)+' MM:'+str(c.mm_max)) \n",
|
||||||
|
"plt.show()"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.6.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 1
|
||||||
|
}
|
107
docs/models/generation/generation.md
Normal file
107
docs/models/generation/generation.md
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
---
|
||||||
|
id: generation
|
||||||
|
title: Генеративный дизайн машинной клетки
|
||||||
|
---
|
||||||
|
Клетка - стандартный фрагмент автоматической производственной системы (АПС), способный к автономной работе, развитию и репликации. Она состоит из оболочки, рабочей, складской и транспортной зон.
|
||||||
|
|
||||||
|
Идеальная карта клетки Map[] в нашей модели представляет собой квадратный массив чисел, указывающих, что именно и где должно в ней находиться. Таким образом, карта позволяет определить маршруты перемещения мобильных манипуляторов (ММ), места для складирования объектов, места для монтажа машин, места для обмена объектами с окружающей средой, порядок постройки и развития клетки. Сопоставление фактического состояния элемента территории с элементом карты позволяет выявлять ошибки и аварии.
|
||||||
|
|
||||||
|
Алгоритм генеративного дизайна позволяет автоматически спроектировать карту для любого набора заданных в начале программы параметров клетки, учитывая размер и количество машин, площади складов, порты для заряда мобильных манипуляторов и т.п.
|
||||||
|
|
||||||
|
(см. рабочий python-код в файле generation.ipynb - лучше открывать с помощью Jupyter Notebook)
|
||||||
|
|
||||||
|
## Описание элементов карты и их числовые коды:
|
||||||
|
|
||||||
|
* 0. **территория, непригодная к использованию** (пока не реализовано, предполагается что на сложной местности, содержащей непроходимые участки тоже можно построить клетку с ограниченным функционалом, огибающую эти участки)
|
||||||
|
* 1. **территория, пригодная к использованию** (на ней можно строить клетку путем установки готовых блоков с помощью ММ)
|
||||||
|
* 2. **элемент пола базовый** имеет ножки адаптивной высоты и зацепы для сборки в площадки произвольного размера и формы. ММ укладывают элементы пола прямо на территорию, пригодную к использованию, регулируют ножки по высоте и соединяют с соседними. Между элементами пола могут передаваться электричество и сигналы управления, а при необходимости - и другие коммуникации, не загромождая поверхность над ними и обеспечивая избыточную связность клетки (при повреждении или отсутствии значительного числа элементов пола все равно обеспечивается надежная передача энергии и сигналов управления). При застройке территории ММ может ездить по элементам пола и при этом устанавливать новый элемент пола рядом с собой. Затем продвигатсья дальше. Это позволяет при желании обходиться вообще без аккумуляторов в ММ, питая их все вреям через элементы пола, либо обходиться вообще без ММ, придав элементам пола возможность перемещения объектов.
|
||||||
|
* 3. **порт для монтажа прямого элемента забора** Забор отделяет клетку от внешней среды, ничего материального не впуская и не выпуская. Граничит с заборами других клеток и потому может участвовать в передаче данных между клетками. Устанавливается с помощью ММ на элемент пола, имеет два разъема на противоположных сторонах для соединения с себе подобными.
|
||||||
|
* 4. **порт для монтажа углового элемента забора**. Угловой элемент забора граничит сразу с несколькими углами заборов соседних клеток и может играть особую роль в коммуникации. Также может содержать маяки для навигации ММ. Устанавливается на элемент пола, имеет два разъема на смежных сторонах для соединения с элементами забора. Может быть при желании унифицирован с прямым элементом забора.
|
||||||
|
* 5. **складское место** - элемент пола, предназначенный для установки на него коробок с объектами. Может отличаться от базовых элементов пола, а может и не отличаться. Расстановка складских мест на карте производится так, чтобы коробки на них не мешали друг другу, и к каждому месту был обеспечен доступ ММ хотя бы с одной стороны.
|
||||||
|
* 6. **порт створки ворот** - элемент забора, способный частично открываться для передвижения ММ между клетками. При этом ММ (возможно, с грузом) проходит через специальный элемент - порт ворот, а сами ворота, находящиеся по бокам от него, приоткрываются. Ничего и никого другого ворота не пропускают. Таким образом, чтобы перейти из одной клетки в другую (например, вновь строящуюся) ММ сначала проходит "свои", потом "чужие" ворота.
|
||||||
|
* 7. **порт ворот** - элемент забора, спообный пропускать через себя коробки и ММ. Мы предполагаем что ММ может быть шире чем порт ворот (который сам должен быть перевозимым при помощи ММ), поэтому окружаем его с двух сторон воротами. Коробка же несколько уже чем порт ворот, поэтому может проходить через него в обоих направлениях, если он будет открыт. По умолчанию же порт ворот закрыт и открывается лишь когда ММ передает через него груз в соседнюю клетку. Вариант использования 1: ММ с грузом подъезжает вплотную к порту ворот своей клетки и сквозь него кладет коробку в порт ворот чужой клетки, откуда его забирает ММ той клетки. Вариант использования 2: ММ с грузом кладет коробку в порт ворот своей клетки, а ММ другой клетки забирает его оттуда.
|
||||||
|
* 8. **трасса** - базовый элемент пола, учитываемый при построении маршрутов и используемый для перемещения ММ во время работы клетки. Расстановка трасс на карте производится так чтобы обеспечить доступ ММ во все необходимые места и избегать заторов при работе многих ММ.
|
||||||
|
* 9. **машинный порт** - элемент пола на которых устанавливается машинный блок (автоматизированное рабочее место (АРМ), станок или любой другой компонент такого рода). Машинные порты собраны в группы, образующие места для монтажа машины.
|
||||||
|
* 10. **рабочий порт** - элемент пола, на который устанавливается коробка с объектом для его использования машиной, находящейся рядом. Машины изначально проектируются так чтобы брать и помещать объекты в коробки находящиеся здесь. Вокруг каждой машины создается как можно больше рабочих портов так чтобы они не мешали друг другу и могли независимо обслуживаться ММ.
|
||||||
|
* 11. **порт мобильного манипулятора** - элемент пола, предназначенный для заряда и парковки мобильного манипулятора
|
||||||
|
* 12. **порт электростанции** - машинный порт, зарезервированный для монтажа блоков специфических машин - электростанций
|
||||||
|
* 13. **порт утилизатора** - машинный порт, зарезервированный для монтажа блоков специфических машин - утилизаторов отходов и брака
|
||||||
|
* 14. **порт планировщика** - машинный порт, зарезервированный для монтажа блоков специфических машин - планировщиков
|
||||||
|
* 15. **порт шахты** - машинный порт, зарезервированный для монтажа блоков специфических машин - шахт, автоматически добывающих полезные ископаемые из недр земли. Может отличаться возможностью доступа через него вниз. При этом должна сохраняться возможность проезда по нему ММ.
|
||||||
|
|
||||||
|
Мобильный манипулятор может брать, перемещать и устанавливать любые из этих блоков, а также другие мобильные маниепуляторы и коробки. Обрабатываемые АПС бъекты могут находиться в боксах и путешествовать с ними, а в рабочих портах машин удаляться из коробок и помещаться в них. Также в рабочих портах могнут появляться (как результат работы машин) объекты, не помещающиеся в коробки: сами коробки, мобильные манипуляторы, все вышеперечисленные пронумерованные блоки.
|
||||||
|
|
||||||
|
## Алгоритм генеративного дизайна
|
||||||
|
|
||||||
|
В качестве исходных данных используются:
|
||||||
|
|
||||||
|
* максимальное число блоков в машине
|
||||||
|
* число рабочих машин в клетке (для роста, для репликации, максимальное)
|
||||||
|
* максимальное число планировщиков, утилизаторов, электростанций, шахт
|
||||||
|
* емкость склада (для роста, для репликации, максимальная)
|
||||||
|
* максимальное число мобильных манипуляторов
|
||||||
|
* число машиномест и складских мест оставляемое пустым для резерва
|
||||||
|
|
||||||
|
Далее выполняются следующие действия:
|
||||||
|
|
||||||
|
* Найти общее количество машин (включая служебные) и общую емкость склада (включая места для ММ)
|
||||||
|
* Подобрать прямоугольную форму машины, по возможности близкую к квадратной, содержащую количество блоков не меньше заданного и хорошо стыкуемую с соседями, дорожками и складской зоной. Определить ширину и высоту машины, фактическое количество в ней блоков и занимаемую ей площадь.
|
||||||
|
* Подобрать прямоугольную форму рабочей зоны, по возможности близкую к квадратной, содержащую количество машин не меньше заданного и хорошо стыкуемую с дорожками и складскими зонами. Определить ширину и высоту рабочей зоны, фактическое количество машин и занимаемую ей площадь.
|
||||||
|
* Рассчитать размер территории, занимаемой клеткой
|
||||||
|
* Создать карту как числовой массив (или импортировать из файла для учета непроходимых территорий)
|
||||||
|
* Заполнить ее базовыми элементами пола
|
||||||
|
* Указать порты для прямых и угловых элементов забора
|
||||||
|
* Задать трассу по периметру клетки
|
||||||
|
* Указать порты для монтажа ворот и створок ворот
|
||||||
|
* Раставить складские места
|
||||||
|
* Создать посередине клетки рабочую зону - машины, их рабочие порты, трассы между ними
|
||||||
|
* Создать дополнительные вертикальные трассы возле машинной зоны
|
||||||
|
* Создать порты мобильных манипуляторов
|
||||||
|
* Зарегистрировать элементы карты как экземпляры классов
|
||||||
|
|
||||||
|
Примеры работы алгоритма. Над картинками указаны задаваемые число блоков в машине, число машин, число складских мест и ММ.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Можно генерировать и очень большие клетки с сотнями тысяч и даже миллионами элементов. Инструменты видуализации matplotlib позволяют величивать фрагменты и "бродить" по клетке.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Порядок фактической постройки клетки
|
||||||
|
|
||||||
|
Когда у нас есть общая карта клетки, можно, сопоставляя реальность с этой картой осмысленно диагностировать, ремонтировать и воспроизводить клетки.
|
||||||
|
|
||||||
|
Начинаем с анализа территории. Если есть непроходимые, непригодные участки, смотрим, достаточный ли запас места чтобы их обойти (вычеркиваем машины и складские позиции на этих территориях и смотрим, достаточно ли места для работ I и II очереди) или бракуем весь квадрат и ничего там не строим.
|
||||||
|
|
||||||
|
Задача I очереди строительства - установить все необходимое для самостоятельного развития новой клетки.
|
||||||
|
|
||||||
|
* Все элементы пола. Строительство начинается с одной или нескольких из сторон. Первыми укладываются элементы пола, граничащие с воротами материнской клетки. После этого ММ огут заехать на них и установить смежные с ними элементы пола и так далее.
|
||||||
|
* Забор с угловыми элементами и воротами
|
||||||
|
* По одному экземпляру служебных машин: электростанция, планировщик, утилизатор, шахта
|
||||||
|
* Рабочие машины I очереди
|
||||||
|
* Коробки с объектами I очереди
|
||||||
|
|
||||||
|
После этого клетка может развиваться сама. Начинаются работы II очереди (самостоятельно или при помощи соседей). Их цель - обеспечить клетку всем необходимым для самостоятельной репликации.
|
||||||
|
|
||||||
|
* Рабочие машины II очереди
|
||||||
|
* Коробки с объектами II очереди
|
||||||
|
|
||||||
|
После этого клетка способна самостоятельно производить себе подобные. Дальнейшее ее поведение может определяться, например, следующим алгоритмом:
|
||||||
|
|
||||||
|
* Если рядом есть строящиеся клетки, помогаем им в работах I и II очереди (получаем доступ к плану производства и подписываемся на выполнение его части, производим и отправляем)
|
||||||
|
* Иначе, если рядом есть пустое место, создаем и строим там новую клетку (выпускаем стандартный план ее производства и выполняем его, сами или при помощи соседей).
|
||||||
|
* Иначе, если со стороны одного из соседей приходит высокий (выше заданного предела) уровень сигнала об активном строительстве новых клеток ("гормона роста"), производим и передаем все производимое туда. Так как строящиеся клетки могут быть не близко, в этих условиях производим и отправляем только наиболее стандартные и массовые компоненты вроде элементов пола и ММ.
|
||||||
|
* Иначе ведем работы III очереди - нарабатываем элементы пола, машины и коробки с объектами, оставляя свободным лишь установленное резервное количество мест складских и машинных.
|
||||||
|
|
||||||
|
## Задачи на будущее
|
||||||
|
|
||||||
|
* умная регистрация машинных блоков, машиномест со связанными портами и объектов
|
||||||
|
* перемещение ММ, перевозка коробок
|
||||||
|
* правила дорожного движения для ММ и тесты на случайные перемещения коробок толпой мм
|
||||||
|
* репликация как монтаж готовых элементов пола и блоков при помощи ММ
|
||||||
|
* демонтаж и замена случайно поврежденных блоков
|
||||||
|
* межклеточное взаимодействие
|
||||||
|
* соответсвие объектов коробкам
|
||||||
|
* подробное описание работы машин - что из чего они делают
|
||||||
|
* генерация технологических графов и их исполнение клеткой
|
||||||
|
* перейти от абстрактных к конкретным машинам и объектам
|
BIN
docs/models/growth/graph.png
Normal file
BIN
docs/models/growth/graph.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 104 KiB |
368
docs/models/growth/growth.ipynb
Normal file
368
docs/models/growth/growth.ipynb
Normal file
|
@ -0,0 +1,368 @@
|
||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 3,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"2 2\n",
|
||||||
|
"2 2\n"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "stderr",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Traceback (most recent call last):\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\cbook\\__init__.py\", line 388, in process\n",
|
||||||
|
" proxy(*args, **kwargs)\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\cbook\\__init__.py\", line 228, in __call__\n",
|
||||||
|
" return mtd(*args, **kwargs)\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\animation.py\", line 1308, in _handle_resize\n",
|
||||||
|
" self._init_draw()\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\animation.py\", line 1750, in _init_draw\n",
|
||||||
|
" self._draw_frame(next(self.new_frame_seq()))\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\animation.py\", line 1772, in _draw_frame\n",
|
||||||
|
" self._drawn_artists = self._func(framedata, *self._args)\n",
|
||||||
|
" File \"<ipython-input-3-63ec1324f14b>\", line 268, in updatefig\n",
|
||||||
|
" im1=plt.imshow(Zm, cmap=plt.get_cmap('magma').with_extremes(bad='#101020'))\n",
|
||||||
|
"AttributeError: 'ListedColormap' object has no attribute 'with_extremes'\n",
|
||||||
|
"Traceback (most recent call last):\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\cbook\\__init__.py\", line 388, in process\n",
|
||||||
|
" proxy(*args, **kwargs)\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\cbook\\__init__.py\", line 228, in __call__\n",
|
||||||
|
" return mtd(*args, **kwargs)\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\animation.py\", line 1308, in _handle_resize\n",
|
||||||
|
" self._init_draw()\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\animation.py\", line 1750, in _init_draw\n",
|
||||||
|
" self._draw_frame(next(self.new_frame_seq()))\n",
|
||||||
|
" File \"C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\animation.py\", line 1772, in _draw_frame\n",
|
||||||
|
" self._drawn_artists = self._func(framedata, *self._args)\n",
|
||||||
|
" File \"<ipython-input-3-63ec1324f14b>\", line 268, in updatefig\n",
|
||||||
|
" im1=plt.imshow(Zm, cmap=plt.get_cmap('magma').with_extremes(bad='#101020'))\n",
|
||||||
|
"AttributeError: 'ListedColormap' object has no attribute 'with_extremes'\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"%matplotlib tk\n",
|
||||||
|
"import time, math\n",
|
||||||
|
"from random import random\n",
|
||||||
|
"import numpy as np\n",
|
||||||
|
"from IPython import display\n",
|
||||||
|
"from IPython.display import clear_output\n",
|
||||||
|
"from PIL import Image\n",
|
||||||
|
"import matplotlib.pyplot as plt\n",
|
||||||
|
"import matplotlib.animation as animation\n",
|
||||||
|
"\n",
|
||||||
|
"# Генерация карт по картинке\n",
|
||||||
|
"\n",
|
||||||
|
"Terrain=np.sign(np.array(Image.open(\"test.png\"))[:,:,0])\n",
|
||||||
|
"ShowTerrain=Terrain*1.0\n",
|
||||||
|
"Flow=Store=TransportActivity=Conc=Terrain*0.0\n",
|
||||||
|
"Dir=Terrain*0\n",
|
||||||
|
"\n",
|
||||||
|
"# Генерация случайных препятствий\n",
|
||||||
|
"\n",
|
||||||
|
"#for i in range(100):\n",
|
||||||
|
"# Terrain[int(random()*Live.shape[0]-2),int(random()*Live.shape[1]-2)]=0\n",
|
||||||
|
"\n",
|
||||||
|
"# Настройка параметров клетки\n",
|
||||||
|
" \n",
|
||||||
|
"START_COMPLETENESS = 1\n",
|
||||||
|
"#GROW_COMPLETENESS = 7\n",
|
||||||
|
"REP_COMPLETENESS = 20\n",
|
||||||
|
"#MAX_COMPLETENESS = 100\n",
|
||||||
|
"\n",
|
||||||
|
"# Настройка параметров распространеняи сигнала об активном строительстве \n",
|
||||||
|
"\n",
|
||||||
|
"INCOMPLETENESS_SIGNAL_EMISSION_RATIO = 0.1\n",
|
||||||
|
"INCOMPLETENESS_SIGNAL_DIFFUSION_RATIO = 0.45\n",
|
||||||
|
"INCOMPLETENESS_SIGNAL_DECAY_RATIO = 0.9\n",
|
||||||
|
"INCOMPLETENESS_SIGNAL_THRESHOLD = 1\n",
|
||||||
|
"\n",
|
||||||
|
"# Настройка бобмбардировки \n",
|
||||||
|
" \n",
|
||||||
|
"BOMB_MIN=0\n",
|
||||||
|
"BOMB_START=60000\n",
|
||||||
|
"BOMB_MAX=1\n",
|
||||||
|
"BOMB_SIZE=2\n",
|
||||||
|
"b=BOMB_MIN\n",
|
||||||
|
"\n",
|
||||||
|
"# Выбор способа отображения цифровыми клавишами 0-5\n",
|
||||||
|
"\n",
|
||||||
|
"def on_press(event):\n",
|
||||||
|
" global DISPLAY\n",
|
||||||
|
" global ax\n",
|
||||||
|
" global plt\n",
|
||||||
|
" DISPLAY=int(event.key)\n",
|
||||||
|
" if DISPLAY==0:\n",
|
||||||
|
" ax.set_title('Terrain') \n",
|
||||||
|
" elif DISPLAY==1:\n",
|
||||||
|
" ax.set_title('Incompleteness Signal Concentration')\n",
|
||||||
|
" elif DISPLAY==2:\n",
|
||||||
|
" ax.set_title('Incompleteness Signal Direction')\n",
|
||||||
|
" elif DISPLAY==3:\n",
|
||||||
|
" ax.set_title('Transport Direction')\n",
|
||||||
|
" elif DISPLAY==4:\n",
|
||||||
|
" ax.set_title('Storage')\n",
|
||||||
|
" elif DISPLAY==5:\n",
|
||||||
|
" ax.set_title('Transport Activity')\n",
|
||||||
|
" plt.draw()\n",
|
||||||
|
"\n",
|
||||||
|
"# Настройка графического отображения\n",
|
||||||
|
"\n",
|
||||||
|
"fig=plt.figure()#(figsize=(7, 5))\n",
|
||||||
|
"ax=fig.add_subplot(1, 1, 1)\n",
|
||||||
|
"im1=plt.imshow(ShowTerrain, cmap=plt.get_cmap('bone'), animated=True)\n",
|
||||||
|
"fig.canvas.mpl_connect('key_press_event', on_press)\n",
|
||||||
|
"DISPLAY=0\n",
|
||||||
|
"ax.set_title('Terrain') \n",
|
||||||
|
"writer = animation.writers['ffmpeg'](fps=15, metadata=dict(artist='Me'), bitrate=1800)\n",
|
||||||
|
"framecounter=0\n",
|
||||||
|
"\n",
|
||||||
|
"# Словарь для хранения клеток по координатам\n",
|
||||||
|
"\n",
|
||||||
|
"cells={}\n",
|
||||||
|
" \n",
|
||||||
|
"class Cell():\n",
|
||||||
|
" def __init__(self,x,y):\n",
|
||||||
|
" self.x=x\n",
|
||||||
|
" self.y=y\n",
|
||||||
|
" self.productivity=1\n",
|
||||||
|
" self.transportivity=10\n",
|
||||||
|
" self.completeness=START_COMPLETENESS\n",
|
||||||
|
" self.conc=0\n",
|
||||||
|
" self.flow=0\n",
|
||||||
|
" self.storage=0\n",
|
||||||
|
" cells[(self.x,self.y)] = self\n",
|
||||||
|
" self.refresh()\n",
|
||||||
|
" def refresh(self):\n",
|
||||||
|
" if self.completeness<1:\n",
|
||||||
|
" self.destroy()\n",
|
||||||
|
" addconc=(REP_COMPLETENESS-self.completeness)*INCOMPLETENESS_SIGNAL_EMISSION_RATIO\n",
|
||||||
|
" if self.completeness>=REP_COMPLETENESS:\n",
|
||||||
|
" addconc=0\n",
|
||||||
|
" self.conc+=addconc\n",
|
||||||
|
" self.conc*=INCOMPLETENESS_SIGNAL_DECAY_RATIO\n",
|
||||||
|
" def destroy(self):\n",
|
||||||
|
" del cells[(self.x,self.y)]\n",
|
||||||
|
"\n",
|
||||||
|
"# Создаем первоначальную клетку\n",
|
||||||
|
" \n",
|
||||||
|
"a=Cell(20,20)\n",
|
||||||
|
"a.completeness=REP_COMPLETENESS\n",
|
||||||
|
"a.refresh()\n",
|
||||||
|
"\n",
|
||||||
|
"# Расчеты в каждом кадре\n",
|
||||||
|
"\n",
|
||||||
|
"def updatefig(*args):\n",
|
||||||
|
" global b,TransportActivity,ShowTerrain,Store,framecounter\n",
|
||||||
|
" \n",
|
||||||
|
" # Очистка карт для визуализации\n",
|
||||||
|
" \n",
|
||||||
|
" TransportActivity=Terrain*0.0\n",
|
||||||
|
" ShowTerrain=Terrain*1\n",
|
||||||
|
" Store=Terrain*0.0\n",
|
||||||
|
" Conc=Terrain*0.0\n",
|
||||||
|
" \n",
|
||||||
|
" clist=list(cells.values())\n",
|
||||||
|
" for c in clist: # Расчеты для каждой клетки\n",
|
||||||
|
" c.refresh()\n",
|
||||||
|
" \n",
|
||||||
|
" # Отображение различных параметров клетки \n",
|
||||||
|
" Store[c.x,c.y]=c.storage\n",
|
||||||
|
" ShowTerrain[c.x,c.y]=c.completeness\n",
|
||||||
|
" Conc[c.x,c.y]=c.conc\n",
|
||||||
|
" \n",
|
||||||
|
" if c.completeness>=REP_COMPLETENESS: # Если клетка зрелая, то:\n",
|
||||||
|
" c.storage+=c.productivity # Производство объектов на склад\n",
|
||||||
|
" \n",
|
||||||
|
" # Составляем список соседних участков с учетом границ карты\n",
|
||||||
|
" \n",
|
||||||
|
" neighbors=[]\n",
|
||||||
|
" if c.x>0:\n",
|
||||||
|
" neighbors.append((c.x-1,c.y))\n",
|
||||||
|
" if c.x<Terrain.shape[0]-1:\n",
|
||||||
|
" neighbors.append((c.x+1,c.y))\n",
|
||||||
|
" if c.y>0:\n",
|
||||||
|
" neighbors.append((c.x,c.y-1))\n",
|
||||||
|
" if c.y<Terrain.shape[1]-1:\n",
|
||||||
|
" neighbors.append((c.x,c.y+1)) \n",
|
||||||
|
"\n",
|
||||||
|
" candidatemax=0\n",
|
||||||
|
" concmax=0\n",
|
||||||
|
" fx=0\n",
|
||||||
|
" fy=0\n",
|
||||||
|
" cneed=None\n",
|
||||||
|
" \n",
|
||||||
|
" for (nx,ny) in neighbors: # Для каждого участка из списка соседей\n",
|
||||||
|
" if (nx,ny) in cells.keys(): # Если на нем есть клетка \n",
|
||||||
|
" \n",
|
||||||
|
" # Расчет градиента сигнала роста\n",
|
||||||
|
" \n",
|
||||||
|
" f=cells[(nx,ny)]\n",
|
||||||
|
" vconc=f.conc-c.conc\n",
|
||||||
|
" fx+=vconc*(nx-c.x)\n",
|
||||||
|
" fy+=vconc*(ny-c.y)\n",
|
||||||
|
" \n",
|
||||||
|
" # Выявление соседа с наибольшей концентрацией сигнала роста\n",
|
||||||
|
" \n",
|
||||||
|
" if f.conc>concmax:\n",
|
||||||
|
" cneed=f\n",
|
||||||
|
" needer=int((nx-c.x)+2*(ny-c.y)+3)\n",
|
||||||
|
" if needer==5:\n",
|
||||||
|
" needer=3\n",
|
||||||
|
" concmax=f.conc\n",
|
||||||
|
" \n",
|
||||||
|
" # Диффузия сигнала роста\n",
|
||||||
|
" \n",
|
||||||
|
" aconc=(c.conc+f.conc)/2\n",
|
||||||
|
" dconc=(aconc-c.conc)*INCOMPLETENESS_SIGNAL_DIFFUSION_RATIO \n",
|
||||||
|
" c.conc+=dconc\n",
|
||||||
|
" f.conc-=dconc\n",
|
||||||
|
"\n",
|
||||||
|
" # Выявление наиболее готовой недостроенной соседней клетки\n",
|
||||||
|
" \n",
|
||||||
|
" if f.completeness<REP_COMPLETENESS: \n",
|
||||||
|
" if candidatemax<f.completeness:\n",
|
||||||
|
" candidatemax=f.completeness\n",
|
||||||
|
" candidate=(nx,ny)\n",
|
||||||
|
" \n",
|
||||||
|
" # Если на участке нет клетки, проверяем можно ли там построить новую\n",
|
||||||
|
" # Постройка новых клеток имеет меньший приоритет, чем достройка начатых\n",
|
||||||
|
" \n",
|
||||||
|
" else: \n",
|
||||||
|
" if Terrain[nx,ny]>0:\n",
|
||||||
|
" if candidatemax<1:\n",
|
||||||
|
" candidate=(nx,ny)\n",
|
||||||
|
" candidatemax=1\n",
|
||||||
|
" \n",
|
||||||
|
" # Отображение на картах направления транспорта и градиента сигнала роста\n",
|
||||||
|
" \n",
|
||||||
|
" if concmax>0:\n",
|
||||||
|
" Dir[c.x,c.y]=needer\n",
|
||||||
|
" Flow[c.x,c.y]=math.atan2(fx,fy)\n",
|
||||||
|
" \n",
|
||||||
|
" \n",
|
||||||
|
" if candidatemax>0: # Если есть недостроенные или пустые участки\n",
|
||||||
|
" if candidatemax==1: # Если есть только пустые\n",
|
||||||
|
" cneed=Cell(candidate[0],candidate[1]) # Создать клетку\n",
|
||||||
|
" else: # Иначе\n",
|
||||||
|
" cneed=cells[(candidate[0],candidate[1])] # Помогаем строящейся клетке\n",
|
||||||
|
" \n",
|
||||||
|
" # Транспорт объектов в соседние клетки\n",
|
||||||
|
" \n",
|
||||||
|
" if cneed:\n",
|
||||||
|
" \n",
|
||||||
|
" # Установим объем грузоперевозок в зависимости от концентрации сигнала роста\n",
|
||||||
|
" # и ограничим его минимум и максимум\n",
|
||||||
|
" \n",
|
||||||
|
" kgr=(cneed.conc)/INCOMPLETENESS_SIGNAL_THRESHOLD\n",
|
||||||
|
" if kgr<0:\n",
|
||||||
|
" kgr=0\n",
|
||||||
|
" if kgr>1:\n",
|
||||||
|
" kgr=1\n",
|
||||||
|
" \n",
|
||||||
|
" # Если запасы не меньше, чем планируемый экспорт,\n",
|
||||||
|
" # то отправим сколько планировали\n",
|
||||||
|
" \n",
|
||||||
|
" if c.storage>=c.transportivity*kgr:\n",
|
||||||
|
" cneed.completeness+=c.transportivity*kgr # Передача\n",
|
||||||
|
" TransportActivity[c.x,c.y]+=c.transportivity*kgr # Отображение на карте перевозок\n",
|
||||||
|
" c.storage-=c.transportivity*kgr # Удаление со склада\n",
|
||||||
|
"\n",
|
||||||
|
" # Иначе отправим сколько можем\n",
|
||||||
|
" \n",
|
||||||
|
" else:\n",
|
||||||
|
" cneed.completeness+=c.storage # Передача \n",
|
||||||
|
" TransportActivity[c.x,c.y]+=c.storage # Отображение на карте перевозок \n",
|
||||||
|
" c.storage=0 # Удаление со склада\n",
|
||||||
|
" \n",
|
||||||
|
" # Если получатель принял больше чем нужно для строительства, \n",
|
||||||
|
" # излишки у него складируются\n",
|
||||||
|
" # (на следующем ходу он может передать их дальше)\n",
|
||||||
|
" \n",
|
||||||
|
" if cneed.completeness>REP_COMPLETENESS:\n",
|
||||||
|
" cneed.storage+=cneed.completeness-REP_COMPLETENESS\n",
|
||||||
|
" cneed.completeness=REP_COMPLETENESS\n",
|
||||||
|
" cneed.refresh()\n",
|
||||||
|
" \n",
|
||||||
|
" # Бомбардировка\n",
|
||||||
|
" \n",
|
||||||
|
" if len(cells)>BOMB_START:\n",
|
||||||
|
" b=BOMB_MAX\n",
|
||||||
|
" for i in range(b): \n",
|
||||||
|
" sx=int(random()*Terrain.shape[0])\n",
|
||||||
|
" sy=int(random()*Terrain.shape[1])\n",
|
||||||
|
" for xi in range(sx,sx+BOMB_SIZE):\n",
|
||||||
|
" for yi in range(sy,sy+BOMB_SIZE):\n",
|
||||||
|
" if (xi,yi) in cells.keys():\n",
|
||||||
|
" cells[(xi,yi)].destroy()\n",
|
||||||
|
"\n",
|
||||||
|
" # Вывод текстом номера кадра и числа клеток (чтобы следить за процессом при записи анимации в файл) \n",
|
||||||
|
" \n",
|
||||||
|
" framecounter+=1\n",
|
||||||
|
" clear_output(wait=True)\n",
|
||||||
|
" print(framecounter,len(cells)) \n",
|
||||||
|
" \n",
|
||||||
|
" # Отображение выбранной карты\n",
|
||||||
|
" \n",
|
||||||
|
" if DISPLAY==0:\n",
|
||||||
|
" im1=plt.imshow(ShowTerrain, cmap=plt.get_cmap('bone'))\n",
|
||||||
|
" elif DISPLAY==1:\n",
|
||||||
|
" Zm = np.ma.masked_where(Terrain == 0, Conc)\n",
|
||||||
|
" im1=plt.imshow(Zm, cmap=plt.get_cmap('magma').with_extremes(bad='#101020'))\n",
|
||||||
|
" elif DISPLAY==2:\n",
|
||||||
|
" Zm = np.ma.masked_where(TransportActivity<0.1, Flow)\n",
|
||||||
|
" im1=plt.imshow(Zm, cmap=plt.get_cmap('hsv').with_extremes(bad='k'))\n",
|
||||||
|
" elif DISPLAY==3:\n",
|
||||||
|
" Zm = np.ma.masked_where(TransportActivity<0.1, Dir)\n",
|
||||||
|
" im1=plt.imshow(Zm, cmap=plt.get_cmap('brg').with_extremes(bad='k'))\n",
|
||||||
|
" elif DISPLAY==4:\n",
|
||||||
|
" im1=plt.imshow(Store, cmap=plt.get_cmap('gist_stern'))\n",
|
||||||
|
" elif DISPLAY==5:\n",
|
||||||
|
" Zm = np.ma.masked_where(Terrain == 0, TransportActivity)\n",
|
||||||
|
" im1=plt.imshow(Zm, cmap=plt.get_cmap('hot').with_extremes(bad='#101020'))\n",
|
||||||
|
" return im1,\n",
|
||||||
|
"\n",
|
||||||
|
"# Настройка анимации\n",
|
||||||
|
"ani = animation.FuncAnimation(fig, updatefig, frames=600, interval=3, blit=True)\n",
|
||||||
|
"plt.show()\n",
|
||||||
|
"#ani.save('im0.mp4', writer=writer) # Сохранить анимацию в файле"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": null,
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "Python 3",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.6.5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 1
|
||||||
|
}
|
42
docs/models/growth/growth.md
Normal file
42
docs/models/growth/growth.md
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
---
|
||||||
|
id: growth
|
||||||
|
title: Модель распространения клеток робофабрики
|
||||||
|
---
|
||||||
|
## Режимы отображения (выбираются цифровыми клавишами 0-5)
|
||||||
|
|
||||||
|
* 0. Terrain - местность, черным показаны непригодные для строительства участки, светлым - клетки, яркость пропорциональна степени зрелости. (см. файл terrain.mp4)
|
||||||
|
* 1. Incompleteness Signal Concentration - концентрация сигнала роста. Он вырабатывается в недостроенных клетках, диффундирует в соседние и распадается согласно настройкам. В режиме бомбардировки видно как вокруг исчезнувших клеток вспыхивают облачка сигнала роста и тают по мере зарастания раны.
|
||||||
|
* 2. Incompleteness Signal Direction - направление наибольшего градиента сигнала роста. Каждый цвет соответствует определенному направлению на плоскости. При бомбардировке зияющие раны искажают вокруг себя карту градиента, призывая строительные блоки. Если это происходит возле участка активного роста, то как только рана залечивается, фронт роста перетягивает градиент на себя.
|
||||||
|
* 3. Transport Direction - направление фактического транспорта блоков из данной клетки, каждый цвет соответствует одному из четырех направлений (вправо,влево,вверх,вниз). Черный соответствует пренебрежимо малому уровню транспорта.
|
||||||
|
* 4. Storage - объем запасов на складе клетки. Близкие к фронт роста клетки не накапливают запасов а все их передают в зону стройки. Поэтому за фронтом роста тянется фронт минимума запасов. Когда фронт роста ушел далеко, уровень запасов в клетках растет. При уничтожении группы клеток, соседи расходуют запасы на их регенерацию. (см. файл storage.mp4)
|
||||||
|
* 5. Transport Activity - объем транспорта запасов. Тоже следует за фронтом роста.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Работа алгоритма
|
||||||
|
|
||||||
|
(см. рабочий python-код в файле growth.ipynb - лучше открывать с помощью Jupyter Notebook)
|
||||||
|
|
||||||
|
Территория с препятствиями задается файлом test.png. Белые - доступные для занятие области территории, черные - недоступные.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* По картинке из файла генерируется карта местности, на нее можно добавить случайные препятствия.
|
||||||
|
* Задаются параметры клеток и параметры распространеняи сигнала об активном строительстве
|
||||||
|
* Настраивается момент начала и интенсивность бомбардировки
|
||||||
|
* Создается первоначальная клетка
|
||||||
|
|
||||||
|
Затем в каждом кадре для каждой клетки выполняется следующий цикл:
|
||||||
|
|
||||||
|
* Если клетка зрелая, то производит некоторое количество объектов на свой склад
|
||||||
|
* Составляем список соседних участков с учетом границ карты
|
||||||
|
* Для каждого участка из списка соседей если на нем есть клетка, расчитываем градиент сигнала роста
|
||||||
|
* Выявляем соседа с наибольшей концентрацией сигнала роста
|
||||||
|
* Моделируем диффузию сигнала роста между клетками
|
||||||
|
* Определяем наиболее готовую недостроенную соседнюю клетку
|
||||||
|
* Если на соседнем участке нет клетки, проверяем можно ли там построить новую.
|
||||||
|
* Если есть недостроенные участки - помогаем им, если есть только пустые - строим новую (постройка новых клеток имеет меньший приоритет, чем достройка начатых).
|
||||||
|
* Устанавливаем объем отдаваемого груза в зависимости от концентрации сигнала роста и ограничиваем его минимум и максимум
|
||||||
|
* Если запасы не меньше, чем планируемый экспорт, то отправим сколько планировали, иначе отправим сколько можем
|
||||||
|
* Если получатель принял больше чем нужно для строительства, излишки у него складируются (на следующем ходу он может передать их дальше)
|
||||||
|
* Если задано, проводится бомбарировка - случайные группы клеток выходят из строя с заданной интенсивностью
|
BIN
docs/models/growth/storage.mp4
Normal file
BIN
docs/models/growth/storage.mp4
Normal file
Binary file not shown.
BIN
docs/models/growth/terrain.mp4
Normal file
BIN
docs/models/growth/terrain.mp4
Normal file
Binary file not shown.
BIN
docs/models/growth/test.png
Normal file
BIN
docs/models/growth/test.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1 KiB |
BIN
docs/papers/img/self_training_framework_architecture.png
Normal file
BIN
docs/papers/img/self_training_framework_architecture.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 477 KiB |
153
docs/papers/mania-beetz-self-training-with-vr-2019.md
Normal file
153
docs/papers/mania-beetz-self-training-with-vr-2019.md
Normal file
|
@ -0,0 +1,153 @@
|
||||||
|
---
|
||||||
|
id: mania-beetz-self-training-with-vr-2019
|
||||||
|
title: 'Машинное обучение роботов в виртуальных средах'
|
||||||
|
---
|
||||||
|
|
||||||
|
*Оригинал: [A Framework for Self-Training Perceptual Agents in Simulated Photorealistic Environments, Patrick Mania and Michael Beetz, 2019](https://ai.uni-bremen.de/papers/mania19scenarios.pdf)*
|
||||||
|
|
||||||
|
## Введение
|
||||||
|
|
||||||
|
Обучающие алгоритмы требуют большого количества размеченных данных, что делает их применение затруднительным. Представленный фреймворк позволяет обучать роботов с помощью сценариев, генерирующихся игровым движком с фотореалистичным качеством графики.
|
||||||
|
|
||||||
|
Алгоритмы машинного обучения требуют больших датасетов. И это их узкое место. Изображения, которые генерируются людьми не подходят, потому что там объект съёмки всегда правильно сфокусирован, позиционирован и хорошо освещён, тогда как в реальности часто бывает по-другому. В тоже время игровые движки позволяют создавать фотореалистичные сцены для датасетов, где положение объектов нам заранее известно. Обладая этим знанием легче вычислить какие из полученных через сенсоры данных относятся к тем или иным объектам.
|
||||||
|
|
||||||
|
Модуль UnrealCV позволяет генерировать изображения с RGB, глубиной и маской объекта из камеры внутри виртуальной реальностти, что может быть использовано, например, для обучения моделей визуального распознавания объектов.
|
||||||
|
|
||||||
|
## Архитектура системы
|
||||||
|
|
||||||
|
Разработанный фреймворк может генерировать обучающие данные, соответствующие тем, которые робот получает во время работы в реальном окружении.
|
||||||
|
|
||||||
|
Фреймворк состоит из следующих компонентов:
|
||||||
|
* ___Training Data Collector___. Генерирует наборы изображений из сцен, связывая их с определёнными задачами робота.
|
||||||
|
* ___Scenario Description Language___ - язык семантической спецификации, который позволяет программистам специфицировать сценарии поведения роботов более понятным и модульным способом. Базовый сценарий модифицируется вероятностным образом, добавляя и убирая объекты и изменяя их положение. Дополнительно, параметризированное высокоуровневое описание поведения робота может быть специфицировано тогда, когда параметризация может быть изменена.
|
||||||
|
* ___Semantic Scenario Sampler___ (сэмплер семантических сценариев). Принимает вероятностное описание сценария и превращает его в стохастический процесс, который рисует примеры, подразумеваемые распределением, определенным в сценарии SDL.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
*Сценарии из различных предметных областей могут быть выражены с помощью SDL и помещена в специальную базу данных. Эти сценарии могут быть настроены в виртуальной среде(симуляторе), где действуют воспринимающие агенты. Агент воспринимает сенсорные данные от среды и использует свою систему восприятия, чтобы выполнить поставленную задачу.*
|
||||||
|
|
||||||
|
___Scenario Runner___ создаёт сцены в симуляторе в соответствии со сценариями и использует модуль ___High-Level Agent Control___, чтобы параметризировать совершенствуемого агента, исходя из обратной связи от ___Critic___. Симуляционная среда составляется из игрового движка и т.н. ___Interface Layer___, который обеспечивает эффективную коммуникацию и необходимую логику для программного управления виртуальной средой. После того как сцена и агент вводятся в симуляционную среду, агент использует высокоуровневую программу управления и систему восприятия, чтобы чувствовать среду, выводить движения и решать задачу. Каждый акт восприятия может быть помещён в ___Percept Database___ для логгирований и обеспечивать базис для вычисления и дальнейшего усовершенствования моделей.
|
||||||
|
Каждая ситуация, которой агент должен быть противопоставлен модет моделироваться как ___Scenario___ на языке SDL. Каждый сценарий содержит в себе три основных части: ___Scenario Meta Data___ используется, чтобы присвоить уникальные идентификаторы сценарию и его компонентам. Чтобы снизить "искусственность" сенсорных данных, в SDL можно задать модели шума. Описание виртуальной среды, где агент должен действовать, задаётся в ___Environment Parametrization___, которая включает в себя, например, такие сущности как примитивы, 3D-модели и параметры света, влияющие на алгоритмы визуального восприятия. Для поддержки обучения агентов различным моделям поведения внутри фреймворка High-Level Control тоже может быть параметризирован в сценарии. Все сценарии собираются в базу данных и могу быть заданы несколькими способами. Сценарии можно создавать и вручную - с помощью инструментов Move, Rotate и т.п. После того как всё настроено, структура среды может быть сохранена как сценарий и помещена в базу данных.
|
||||||
|
|
||||||
|
Чтобы генерировать обширное количество сценариев для мобильных роботов предлагается использовать вероятностные модели. С помощью этих моделей можно создавать различные случайные сцены из объектов и использовать их для обучения агента. Scenario Runner может настроить выбранное количество из семплированных сценариев в среде симуляции, разместить и запустить внутри неё агента, дождаться завершения и обозреть достигнутые результаты. Внутри цикла ___восприятие-действие-обратная связь___ агент может усовершенствовать свои механизмы восприятия, основываясь на полученных семплированных сценах и обратной связи от Critic.
|
||||||
|
|
||||||
|
## Scenario Description Language
|
||||||
|
|
||||||
|
Прежде чем описывать отдельные компоненты системы, рассмотрим разработанный язык описания сценариев. Запуская задачи компьютерного зрения в контексте задаче-специфичного обучения часть нам нужно а) экспериментальная установка, где нам нужно валидировать или тренировать вашу систему, б) достоверные данные, в) инструкции для агента, чтобы тот мог справляться с задачами и г) некоторые мета-данные для идентификации индивидуальных результатов в различных сценариях. Эти четыре части описаны в SDL в следующей форме
|
||||||
|
|
||||||
|
```clojure
|
||||||
|
(a scenario
|
||||||
|
(identified-by (a date) (an #id)
|
||||||
|
(an environment
|
||||||
|
(an object (type class1) (pose p1) (distribution dist1))
|
||||||
|
(a light (pose p2) (with light-parameters(...))))
|
||||||
|
(an agent
|
||||||
|
(task-description (a task(...)))
|
||||||
|
(with startup-parameters
|
||||||
|
(param-type1 val1)
|
||||||
|
...
|
||||||
|
(param-typen valn))))
|
||||||
|
```
|
||||||
|
|
||||||
|
Параметры среды (environment) содержат всю необходимую информацию для описания среды, в которой должен действовать агент. Описания объектов предоставляются для каждого объекта, который должен быть создан в виртуальной среде, и включают пространственные параметры, свойства распределения, достоверные данные и параметры для определения внешнего вида в моделировании. Чтобы получить реалистичное отображение объектов в моделировании, правильная настройка источников света является важной частью процесса проектирования виртуальной среды и поэтому также может быть задана.
|
||||||
|
|
||||||
|
Поддержка инициализации и параметризации различных агентов осуществляется Высокоуровневой частью параметризации (High-Level Parametrization) SDL, которая позволяет определить процесс запуска агента и задачу описания действия объекта. Это описание используется для запуска агента, запускаемого исполнителем сценариев(Scenario Runner), который координирует выполнение агента, а также настройку и уничтожение виртуальной среды.
|
||||||
|
|
||||||
|
Последняя часть SDL - это метаданные сценария, которые используются для индексации отдельных сценариев, содержат ссылку на Параметризацию среды и параметризацию высокого уровня, а также пользовательские метаданные, необходимые для выполнения поставленной задачи (например, модели шума датчиков или текстовые описания Сценария и т. Д.).
|
||||||
|
|
||||||
|
Процесс генерации новых сценариев в соответствии с типичными распределениями сущностей реализуется семантическим шаблоном сценариев. Во-первых, мы разделяем сценарии на два типа: нормативные и конкретные. Оба сценария объявлены в одном и том же SDL, но необходимы для двух разных задач: Нормативные сценарии используются в качестве предварительного
|
||||||
|
для моделирования абстрактной структуры сцены. В примере настройки таблицы это будет включать потенциальное положение и количество всех объектов, имеющих отношение к задаче. Используя эту базовую структуру в дополнение к свойствам распределения для каждого объекта в параметризации среды, мы можем выбрать бесконечное количество различных сценариев для улучшения в стохастическом процессе. В рамках этого процесса сэмплер будет решать, будут ли объекты из Нормативных сценариев удалены со сцены, изменены в их количестве или будут размещены в других областях. Эти новые, сгенерированные сценарии будут описаны в нашем SDL и называются Конкретными сценариями. Такой сценарий будет создан в среде моделирования и будет использоваться для улучшения перцептивных возможностей агента.
|
||||||
|
|
||||||
|
## Интерфейсы для симуляции
|
||||||
|
|
||||||
|
Основным компонентом среды моделирования в предлагаемой нами структуре является Unreal Engine 4, который представляет собой современный игровой движок, способный создавать очень реалистичные рендеринги. UE4 использует собственный формат данных для описания виртуальной среды в нем. Для настройки среды, которая была определена в нашем SDL в этом игровом движке, был реализован коммуникационный уровень, который позволяет изменять среду моделирования во время выполнения. Это позволяет нашей платформе настраивать различные среды без необходимости длительных перезапусков среды моделирования и, следовательно, более высокой пропускной способности выполнения сценариев. Наш коммуникационный уровень основан на ROS (Robot Operating Systems), который является широко используемым роботизированным фреймворком в научном сообществе. Каждое действие, такое как появление или разрушение объектов или изменение настроек освещения, может быть выполнено с использованием стандартных методов связи ROS. Центральной конечной точкой этого уровня связи является реализованный интерфейсный уровень внутри UE4. Этот уровень обрабатывает стек связи и предоставляет методы для управления данной виртуальной средой. Центральным компонентом является модуль порождения SDL, который обрабатывает запросы на создание объектов. Можно либо создавать геометрические примитивы, либо 3D-сетки. Примитивы могут быть полезны для визуализации состояния робота или изучения результатов физических процессов, как в [13], в то время как 3D-mesh незаменимы при изучении распределения изображений в реальных задачах с текстурированными объектами, такими как предметы домашнего обихода. Чтобы записать пространственное соотношение объектов во время выполнения, мы реализовали ROS tf2 в UE4 для анализа движения объектов во время выполнения агента или для записи заданной настройки в качестве сценария. Мы публикуем наш интерфейс между UE4 и ROS, который необходим для программного управления виртуальными средами и позволяет другим исследователям проводить свои собственные эксперименты в этом игровом движке.
|
||||||
|
|
||||||
|
## Оптимизация перцептивных агентов
|
||||||
|
|
||||||
|
В этом разделе объясняется интеграция перцептивных агентов в этой фреймворке. Самый важный источник данных для перцептивных агентов - это данные, которые генерируются из Среды моделирования. Эти данные должны быть захвачены компонентом восприятия агента, который может резко измениться в зависимости от поставленной задачи. Чтобы иметь дело с различными системами восприятия и интерфейсами, мы интегрировали ROS в среду моделирования, чтобы обеспечить
|
||||||
|
сенсорные данные в систему восприятия. Поскольку UE4 доступен на наиболее распространенных платформах, мы использовали rosbridge для обеспечения независимого от платформы интерфейса моделирования.
|
||||||
|
|
||||||
|
Основные сенсорные данные нашего агента - это восприятие виртуальной среды в RGBD. Поскольку эти потоки данных восприятия требуют большой пропускной способности канала, необходимо компактно передавать эти двоичные данные. Rosbridge использует JSON для связи, который не имеет встроенной поддержки двоичных данных и поэтому должен быть преобразован в base64, что является вычислительно дорогостоящим. Чтобы увеличить производительность связи, мы расширили rosbridge для поддержки сериализации BSON. Это улучшение было объединено в официальный репозиторий rosbridge, чтобы помочь другим приложениям с аналогичными требованиями к производительности.
|
||||||
|
|
||||||
|
Генерация данных RGB-D осуществляется специализированной виртуальной камерой в моделируемой среде, которая генерирует данные RGB, маски объектов и глубины. Код рендеринга этой камеры основан на UnrealCV. Он был расширен для поддержки кодирования данных датчиков в формате BSON, включения моделей шума датчиков и необходимой интеграции для его использования в ROS, включая базовые координатные фреймы и параметры камеры.
|
||||||
|
|
||||||
|
Каждый перцептивный агент может использовать топики ROS для получения данных и параметров камеры из Среды моделирования. Высокоуровневый элемент управления агента должен быть создан путем реализации интерфейса, предоставляемого Высокоуровневым элементом управления агента, чтобы иметь контроль над жизненным циклом агента, запущенного в моделировании.
|
||||||
|
|
||||||
|
В качестве образцовой системы восприятия для мобильных роботов мы интегрировали RoboSherlock[17] в нашу структуру. Он совместим с ROS и обертывает различные алгоритмы машинного зрения для того, чтобы для классификации объектов в данных от датчиков. При получении данных RoboSherlock может их анализировать и поддерживать внутреннее состояние окружающей среды. После анализа данных каждый акт восприятия может быть сохранено во внутренней базе данных вместе со всеми отдельными алгоритмами восприятия внутри RoboSherlock. Зарегистрированные акты восприятия и аннотации могут не только использоваться для решения задач обучения, но также подходят для отладки уже обученных моделей на уровне восприятия или сценария.
|
||||||
|
|
||||||
|
Критик(Critic) измеряет производительность текущего агента в выбранном сценарии. Это происходит путем наблюдения за текущим состоянием Scenario Runner, High-Level Agent Control и собранных метаданных о текущем выполняемом сценарии. Кроме того, Критик захватывает вычисленное состояние от системы восприятия и сравнивает его с исходными данными текущего сценария. Полученная в результате этой оценки обратная связь будет отправлена обратно в
|
||||||
|
систему восприятия, которая способна улучшить свои собственные модели, включив соответствующие методы обучения.
|
||||||
|
Несмотря на то, что предлагаемая система способна предоставлять данные для задач контролируемого обучения, она также может быть использована
|
||||||
|
для систематической оценки алгоритмов зрения. Различные настройки совокупностей объектов или
|
||||||
|
изменения ориентации могут быть смоделированы в нашем SDL, а затем систематически протестированы с помощью предлагаемой нами программной системы.
|
||||||
|
|
||||||
|
## Сопутствующие исследования
|
||||||
|
|
||||||
|
Qiu et al.[6] представили UnrealCV, который является основой для использования UE4 для задач машинного зрения. В своей работе они создали синтетический набор данных изображений с аннотациями и протестировали модель нейронной сети на изображениях с разных точек зрения сцены. Чжун[20] использовал UnrealCV в обучении с подкреплением, где движущиеся агенты должны научиться избегать столкновений. Наш подход позволяет использовать аналогичный набор функций, но также включает инструменты для управления виртуальной средой во время выполнения и обработки выполнения пакеты сценариев. Скиннер и др.[5] изучали использование игровых движков в компьютерном зрении. Они показали связь между производительностью алгоритмов машинного зрения в реальном мире и синтетическими данными в эксперименте SLAM. Авторы также заявили, что интеграция игрового движка в среду ROS позволит нам запустить алгоритм роботизированного зрения аналогично аппаратному симулятору в цикле, с его выходом, командующим позой камеры в симуляторе и отображаемым изображением, служащим входным сигналом. С нашим опубликованным коммуникационным интерфейсом ROS эта интеграция стала возможной. Шах и др.[21] представили симулятор на основе UE4 для мультикоптеров и связанных с ними задач обучения. Наша работа расширяет этот подход, используя язык описания сценариев для начальной загрузки различных сред обучения, управляя произвольным сложным агентом в нем и предоставляя более обобщенный способ доступа к симулятору путем интеграции хорошо известной платформы ROS вместо специфичного для домена API RPC. Ганони и др.[22] также создали моделирование на основе UE4 для мультикоптеров и измерили влияние изменений ветра или света на производительность алгоритмов слежения в фиксированном природная среда. Связанная с этим работа над описаниями сценариев варьируется в разных доменах. Формат описания Сцены [23] часто используется с роботизированным симулятором Gazebo для описания виртуальных сред. Однако он не включает в себя необходимые метаданные сценария и Высокоуровневую параметризацию для обработки серии экспериментов, выполняемых на основе различных описаний сценариев. Симулятор транспортного средства STIM[24] использовался в исследованиях для изучения эффектов различных сценариев для автомобилей. Субъект столкнется с запрограммированными сценариями, которые определены на языке определения сценариев.
|
||||||
|
Возможные определения на этом языке сосредоточены на размещении заранее определенных объектов, связанных с движением, в сцене или изменении условий дорожной среды. Точность визуализации не соответствует UE4, что делает невозможным использование STIM для задач машинного зрения реального мира.
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
Мы представили новый фреймворк со специализированным языком описания сценариев для автоматического создания обучающих данных в соответствии с распределением задач. Соблюдение этого
|
||||||
|
распределения для обучающих данных важно, поскольку многие алгоритмы обучения предполагают, что обучающие данные следуют тому же распределению, что и входные данные целевой области. Собранные данные ценны для роботов, поскольку современные игровые движки позволяют нам создавать обучающие данные из
|
||||||
|
среды фотореалистичного моделирования. Это может повысить надежность будущих алгоритмов машинного зрения, поскольку они могут быть обучены на более реалистичных данных при учете фактического
|
||||||
|
распределения целевой области.
|
||||||
|
В наших экспериментах мы показали правдоподобность
|
||||||
|
фреймворка, продемонстрировав пример распознавания объектов системы на реальном роботе. Система показала аналогичные результаты производительности при обучении с реальными данными по сравнению с той
|
||||||
|
же системой, обученной с данными, сгенерированными нашей платформой.
|
||||||
|
В будущей работе мы стремимся использовать этот фреймворк в контексте мобильной бытовой робототехники. Робот с базовой системой
|
||||||
|
восприятия будет сталкиваться с множеством домашних задач. Затем он должен улучшить свои показатели восприятия, используя нашу структуру, чтобы извлечь выгоду из обучающих данных, которые следуют за распределением конкретных задач.
|
||||||
|
Мы также исследуем использование виртуальной реальности(VR) в сочетании с нашим фреймворком. Чтобы изучить распределение объектов в реальном мире в конкретных задачах, испытуемым может быть предложено
|
||||||
|
выполнить эту задачу в виртуальной среде с помощью устройств виртуальной реальности. Виртуальная реальность позволяет субъекту почти естественным образом взаимодействовать с виртуальным миром и, следовательно, манипулировать окружающей средой аналогично тому, как это было бы сделано в той же задаче в реальном мире, получая более реалистичные данные.
|
||||||
|
|
||||||
|
## Ссылки
|
||||||
|
|
||||||
|
[1] C. D. Manning, P. Raghavan, and H. Schutze, ¨ Introduction to Information Retrieval. New York, NY, USA: Cambridge University Press,2008.
|
||||||
|
|
||||||
|
[2] G. Ros, L. Sellart, J. Materzynska, D. Vazquez, and A. M. Lopez, “The synthia dataset: A large collection of synthetic images for semantic segmentation of urban scenes,” in 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), June 2016, pp. 3234–3243.
|
||||||
|
|
||||||
|
[3] X. Peng, B. Sun, K. Ali, and K. Saenko, “Learning deep object detectors from 3d models,” in Proceedings of the IEEE International Conference on Computer Vision, 2015, pp. 1278–1286.
|
||||||
|
|
||||||
|
[4] A. Teichman and S. Thrun, “Tracking-based semi-supervised learning,” in Robotics: Science and Systems, Los Angeles, CA, USA, 2011.
|
||||||
|
|
||||||
|
[5] J. Skinner, S. Garg, N. Sunderhauf, P. Corke, B. Upcroft, and M. Milford, “High-fidelity simulation for evaluating robotic vision performance,” in 2016 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), Oct. 2016, pp. 2737–2744.
|
||||||
|
|
||||||
|
[6] W. Qiu and A. Yuille, “Unrealcv: Connecting computer vision to unreal engine,” arXiv preprint arXiv:1609.01326, 2016.
|
||||||
|
|
||||||
|
[7] S. Qiao, W. Shen, W. Qiu, C. Liu, and A. Yuille, “Scalenet: Guiding object proposal generation in supermarkets and beyond,” arXiv
|
||||||
|
preprint arXiv:1704.06752, 2017.
|
||||||
|
|
||||||
|
[8] M. Roberts, D. Dey, A. Truong, S. Sinha, S. Shah, A. Kapoor, P. Hanrahan, and N. Joshi, “Submodular trajectory optimization for aerial 3d scanning,” in International Conference on Computer Vision (ICCV) 2017, 2017.
|
||||||
|
|
||||||
|
[9] A. Farhadi, I. Endres, D. Hoiem, and D. Forsyth, “Describing objects by their attributes,” in Computer Vision and Pattern Recognition, 2009. CVPR 2009. IEEE Conference on. IEEE, 2009, pp. 1778–1785.
|
||||||
|
|
||||||
|
[10] C. H. Lampert, H. Nickisch, and S. Harmeling, “Attribute-based classification for zero-shot visual object categorization,” IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 36, no. 3, pp. 453–465, 2014.
|
||||||
|
|
||||||
|
[11] I. D. Horswill, “Specialization of perceptual processes,” Ph.D. dissertation, Massachusetts Institute of Technology, 1993.
|
||||||
|
|
||||||
|
[12] Epic Games, “What is Unreal Engine 4,” http://www.unrealengine.
|
||||||
|
com, 2018, [Online; accessed 10-09-2018].
|
||||||
|
|
||||||
|
[13] A. Lerer, S. Gross, and R. Fergus, “Learning physical intuition of block towers by example,” CoRR, vol. abs/1603.01312, 2016. [Online]. Available: http://arxiv.org/abs/1603.01312
|
||||||
|
|
||||||
|
[14] Open Source Robotics Foundation, “tf2,” http://wiki.ros.org/tf2, 2018, [Online; accessed 10-09-2018].
|
||||||
|
|
||||||
|
[15] C. Crick, G. Jay, S. Osentoski, B. Pitzer, and O. C. Jenkins, “Rosbridge: Ros for non-ros users,” in Robotics Research. Springer, 2017, pp. 493–504.
|
||||||
|
|
||||||
|
[16] MongoDB, Inc., “BSON Specification,” http://bsonspec.org, 2018, [Online; accessed 10-09-2018].
|
||||||
|
|
||||||
|
[17] M. Beetz, F. Balint-Benczedi, N. Blodow, D. Nyga, T. Wiedemeyer and Z.C. Marton, “Robosherlock: Unstructured information processing for robot perception,” in Robotics and Automation (ICRA), 2015 IEEE International Conference on. IEEE, 2015, pp. 1549–1556.
|
||||||
|
|
||||||
|
[18] A. Krizhevsky, I. Sutskever, and G. E. Hinton, “Imagenet classification with deep convolutional neural networks,” in Advances in neural information processing systems, 2012, pp. 1097–1105.
|
||||||
|
|
||||||
|
[19] J. Donahue, Y. Jia, O. Vinyals, J. Hoffman, N. Zhang, E. Tzeng, and T. Darrell, “Decaf: A deep convolutional activation feature for generic visual recognition,” in International conference on machine learning, 2014, pp. 647–655.
|
||||||
|
|
||||||
|
[20] F. Zhong, “Integrate unreal engine with openai gym for reinforcement learning based on unrealcv,” https://github.com/zfw1226/gymunrealcv, 2016, [Online; accessed 10-09-2018].
|
||||||
|
|
||||||
|
[21] S. Shah, D. Dey, C. Lovett, and A. Kapoor, “Airsim: Highfidelity visual and physical simulation for autonomous vehicles in Field and Service Robotics, 2017. [Online]. Available: https://arxiv.org/abs/1705.05065
|
||||||
|
|
||||||
|
[22] O. Ganoni and R. Mukundan, “A framework for visually realistic multi-robot simulation in natural environment,” arXiv preprint arXiv:1708.01938, 2017, wSCG 2017 proceedings.
|
||||||
|
|
||||||
|
[23] Open Source Robotics Foundation, “SDFormat,” http://sdformat.org/, 2018, [Online; accessed 10-09-2018].
|
||||||
|
|
||||||
|
[24] Y. I. Noy, T. L. Lemoine, C. Klachan, and P. C. Burns, “Task interruptability and duration as measures of visual distraction,” Applied Ergonomics, vol. 35, no. 3, pp. 207–213, 2004.
|
19
sidebars.js
19
sidebars.js
|
@ -26,7 +26,24 @@
|
||||||
label: 'Технологии',
|
label: 'Технологии',
|
||||||
collapsed: false,
|
collapsed: false,
|
||||||
items: [
|
items: [
|
||||||
'technologies/photopolymer',
|
'technologies/photopolymer'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
label: 'Модели',
|
||||||
|
collapsed: false,
|
||||||
|
items: [
|
||||||
|
'models/generation',
|
||||||
|
'models/growth'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
label: 'Переводы',
|
||||||
|
collapsed: false,
|
||||||
|
items: [
|
||||||
|
'papers/mania-beetz-self-training-with-vr-2019'
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue