ДО курс по робототехнике

9 апреля 2013 г.

Бесконечный лабиринт для мячиков

(C)
LEGO Mindstorms NXT Ball Roller Coaster

Потеряли сантиметр? Можно сделать свой!

(C)

1-3
Start by building the Dial Remote Control.  Click the picture for building instructions.

3х колесный бегун

(C)

Робот-исследователь

(C)

3х колесный робот

(C)

1

Робот: "Пятиминутка"

(C)



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

написать всё это по-русски!

5 апреля 2013 г.

Определение положения предмета с помощью датчиков расстояния

(C)
Понятие триангуляция знакомо многим, кто хоть раз разбирался как работают GPS приемникиили тем, кто изучал что такое радиопеленгация. На самом деле это понятие пришло из геометрии и геодезии. Но сейчас пойдет речь именно о триангуляции, как способе определения координат или местоположении предмета.
Aswin - блогер из Дании, регулярно публикующий свои заметки на блоге NXT Time. Недавно опубликовал очень интересный материал - он показал, как с помощью двух датчиков расстояния (он использовал стандартные NXT Ultrasonic датчики) можно с допустимой точностью определить местоположение предмета. Для определения местоположения как раз и использовался метод триангуляции. 

В качестве экспериментальной установки он использовал следующую конструкцию:

NXT и Python: мотор застрял?

(C)
Предыдущие статьи по программированию NXT роботов на языке Python можно считать вводными - они вкратце знакомили с базовыми API, применив которые можно было уже написать простые программы.
Естественно, многое осталось за рамками тех материалов - например, функции, управляющие движением моторов, были описаны не все, да и дляописанных не были указаны все возможные параметры.

Если попробовать запустить робота с небольшими (меньше 50 процентов) параметрами мощности с помощью функции run() - такое, к примеру, возможно при движении тележки вдоль черной линии по PID регулятору, то соответствующий мотор может вообще не начать вращаться. Причем, при этом сам мотор может выдавать высокочастотный писк.

На самом деле метод run() принимает еще один параметр, кроме мощности мотора:

run(self, power=100, regulated=False)
    Tells the motor to run continuously. If regulated is True, then the
    synchronization starts working.

Как видно из документации, параметр принимает False как значение по-умолчанию. При этом, какого рода синхронизация и зачем она нужна в документации описания нет.

Однако, когда при запуске мотора передаем в качестве значения этого параметра True, то мотор работает как и ожидается.

Видео ниже демонстрирует, как мотор работает при разных значениях этого параметра.

На чем программировать NXT блок?

(C)
В течение прошлого месяца несколько раз поднимался вопрос в духе "Посоветуйте язык/среду программирования LEGO роботов". Чтобы помочь сориентироваться и подвести вопрошающих к более конкретным вопросам вида "Что лучше X или Y", была сформирована специальная диаграмма.
Данная диаграмма категоризирует наиболее популярные языки и среды программирования NXT блока (NXC, NBC, RobotC, leJOS, nxtOSEK, NXT-G, LabView, Enchanting, Robolab) исходя из следующих критериев:
  • Операционная система, где будет проходить программирование
  • Текстовый язык программирования или графическая среда. При этом текстовый язык, скорее всего, имеет свою собственную среду разработки
  • Нужно ли перепрошивать блок специальным Firmware
  • На сколько просто изучить программирование в данном конкретном инструменте. Чем больше плюсиков, тем сложнее
Она не рассматривает языки программирования, позволяющие запускать программу для управления роботом на компьютере или ноутбуке.


Следует отметить ситуацию со средами LabView и NXT-G на не-Windows операционных системах: NXT-G есть только под Mac OS X; LabView же существует и под Linux и под Mac OS X, но они не доступны для свободной загрузки и поэтому нет возможности провести оценку, на сколько эта среда программирования подходить для программирования NXT блока в этих операционных системах.

Установка nxt-python модуля под Windows

(C)
Не смотря на то, что на блоге было опубликовано уже много статей посвященных программированию LEGO роботов на языке Python,еще не было заметки, которая бы помогала настроить среду программирования на операционной системе Windows (хотя под Linux уже было одна).
Поэтому пора восполнить этот пробел.

Будем подразумевать, что сам язык программирования уже установлен на компьютере и следующий шаг установить все остальное программное обеспечение, необходимые для работы с NXT блоком. Единственное, что хочется добавить, что поскольку другие модули python, которые понадобятся для аспектов программирования роботов, поставляются только для 32битной ОС, то и python придется поставить в его 32битной версии.

Все начнется с установки модуля nxt-python, который можно скачать здесь. Скачав ZIP архив, необходимо распаковать его в удобное место, желательно, чтобы путь при этом получился не очень длинный, поскольку потом его придется вбивать руками в командной строке. Затем, запустите командный интерпретатор cmd.

Python и MotorControl

(C)
В предыдущей заметке уже упоминалось о том, что модуль nxt-python для языка программирования Python уже имеет встроенную поддержку инструмента по управлению моторамиMotorControl.
По сути, это заключается в следующем:
  • в составе архива модуля есть скомпилированный исполняемый модуль MotorControl22.rxe (22 - это версия модуля - 2.2), который можно загрузить на NXT блок с помощью поставляющегося в архиве скрипта nxt_push или программы NeXTTool, доступной для загрузке на сайте BricxCC. Тут же есть и исходный код, который можно собрать исполняемый файл с помощью компилятора NXC непосредственно или с помощью среды BricxCC
  • в самом модуле nxt-python доступен набор методов класса MotCont, реализованного в под-модуле nxt.motcont, обеспечивающих обмен сообщениями по USB/Bluetooth с управляющей программойMotorControl. Примечательным фактом является, что никакого специального объекта этого класса создавать не надо. Он автоматически создается в результате инициализации объектаBrick, т.е., например, доступен сразу после того, как объект Brickвернется функцией find_one_brick(). К объекту класса MotCont в этом случае можно обращаться через имя mc (см. пример ниже).

NXC: датчики, енкодеры, кнопки - взаимодействуем с внешним миром

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

NXC: повороты - практика программирования моторов

(C)
При задании сложных траекторий движения робота развороты и повороты - неотъемлемая часть программы. В этой статье будут рассматриваться способы, как программируются эти элементы движения с помощью функций и команд языка Not eXactly C рассмотренных ранее здесь и здесь.
Пример 1. Поворот одним двигателем
На самом деле в этом примере рассматриваются два способа поворота одним двигателем.
В качестве входных данных для обоих способов, задается необходимость выполнения разворота вправо.

NXC: использование циклов

(C)
Продолжение публикации материалов из методички по языку программирования Not eXactly C, подготовленной в рамках учебных курсов Нижегородского Института Информационных Технологий.

Как и в обычном C, в NXC поддерживается несколько видов циклов: for, while, do ... while, repeat.
Есть даже не совсем обычная команда until, которая является макросом к использованию while().

В этой заметке основной акцент сделан не на стандартное поведение программы при использовании циклов, а на особенности, существующие в NXC.

NXC: Управление моторами

(C)
С этой статьи начинается публикация материалов из методички по языку программирования Not eXactly C, подготовленной в рамках учебных курсов Нижегородского Института Информационных Технологий.
В NXC существует около 40 команд для работы с моторами. Их условно можно разделить на команды управления движением, команды остановки, команды опроса датчиков и состояния моторов.

В данной статье рассматриваются команды управления движением.

NXT и Python: опрашиваем датчики

(C)
Базовые способы работы с моторами в Python были рассмотрены в прошлой заметке - теперь настало время осветить, какие API (applications programming interface) доступны для работы со стандартными LEGO NXT датчиками.
Начнем с того, что посмотрим на модуль nxt.sensor, который предоставляет классы по работе с датчиками. Для этого в Python Shell запросим справку по модулю:
import nxt.sensor
help(nxt.sensor)
Небольшая информационная страничка расскажет, что данный модуль предоставляет доступ к следующим под-модулям:
  • analog
  • common
  • digital
  • generic
  • hitechnic
  • mindsensors
Т.е. видно, что помимо стандартных датчиков, библиотека nxt-python поддерживает работу и с датчиками известных производителей Mindsensors и HiTechnic. 

Скорость опроса сенсоров

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

Робо-состязания: базовые навыки по программированию роботов

(C)
Когда учащиеся проходят некоторый базовый курс обучения, то встает вопрос, что изучать дальше, какие навыки будут необходимы для участия команд в робо-состязаниях.
В ходе Летнего Робототехнического лагеря - 2012, вырисовалась примерная схема, как можно шаг за шагом готовить команды, на каких задачах их можно тренировать.
Итак, ниже представлен план по какому происходила тренировка команд в лагере. Данный план может быть легко адаптирован под нужды учебного процесса в кружке и/или уроки информатики. Причем он достаточно универсальный - не опирается на какой-то отдельный язык программирования - задания в нем могут быть выполнены, что на NXT-G, что на Robolab, а равно также и на RobotC, LabView и NXC.

NXT и Python: готовимся к работе

(C)
С точки зрения простоты обучения языки программирования можно разделить на две группы:

  • для начала программирования на одних надо прочитать толстые книжки
  • осваивать вторые можно уже с первых страниц учебника и показательных примеров
Одним из языков, относящихся ко второй категории, можно отнести язык программирования Python. Это скриптовый язык, т.е. его не нужно компилировать, а также он доступен, как в Windows, так и Unix-подобных операционных системах.

Чтобы получить понятие о простоте языка, можно посмотреть на банальный пример – вывод строчки на экран. В этом случае, скрипт будет состоят всего из одной строчки:
print "Hello, Robot!"

Подключаем NXT блок по USB в Linux

(C)
Хотя операционные системы на базе ядра Linux шагнули уже далеко вперед в плане пользовательского удобства и автоматической настройки, что называется, из коробки, но все же некоторые вопросы еще приходится решать по старинке - в ручную изменяя конфигурационные файлы и исследуя журналы работы системы (в обычной речи ITшников - логи).

Работа с файлами в RobotC

(C)
В официальных методических материалах по RobotC почти ничего не сказано про функции работы с файлами. Конечно, есть небольшой раздел в справке, идущей со средой программирования, но после его прочтения возникает больше вопросов, чем ответов.
Чтобы восполнить этот пробел, Андрей Брянский из Санкт-Петербурга поделился куском своей программы с читателями нашего блога, так чтобы они получили начальное представление, каким именно образом осуществляются файловые операции в этом языке программирования.
TFileHandle handle;
TFileIOResult IO;
string name="test.txt";
int size;
int a;
int b=0;
byte x[63][99];
byte read=0;
 

NXT и Python: подключаемся к NXT блоку

(С)
Любая Python-программа, которая будет взаимодействовать с Lego-роботом, прежде чем выполнять на нем какие-либо действия, должна подключиться к NXT блоку.
Без этого действия не получиться проинициализировать ни моторы, ни сенсоры.

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

В программе, для подключения, сначала нужно импортировать под-модульlocator из модуля nxt.

NXT и Python: включаем моторы

(С)
Традиционно изучение программирования Lego-роботов начинается с простых экспериментов с движением - именно эта функция в роботах используется чаще всего.
К тому же, при такого рода знакомстве, обычно сразу видно, что механизм делает и на сколько корректно.

Чтобы узнать, какие функции модуля nxt-python нужно использовать, чтобы заставить робота двигаться, можно использовать два способа. В одном случае, можно воспользоваться свойством открытости - языки с открытым исходным кодом тем и хороши, что позволяют зайти в любой модуль, любую функцию и посмотреть для чего она нужна и что она делает. Другой способ, воспользоваться встроенной в Python функцией подсказки - например, через терминал, предоставляющий доступ к командной строке в Linux:
$ python
Python 2.7.2 (default, Oct 27 2011, 01:36:46) 
[GCC 4.6.1 20111003 (Red Hat 4.6.1-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import nxt.motor
>>> help(nxt.motor)
Итак, что можно почерпнуть из этих источников?

NiNoXT: Lego на службе текстильной промышленности

NiNoXT: Lego на службе текстильной промышленности: Состоявшийся факт, что LEGO Mindstorms можно использовать для моделирования. Вы можете моделировать, что угодно: автомобили, бытовые приборы...

(С)

NXT-G: решаем задачки. Задача #2

(С)NiNoXT

4 апреля 2013 г.

Домашние задания для занятий по робототехнике

(С)NiNoXT
Когда занятия по робототехнике вводятся в учебный процесс, то встает вопрос давать или не давать домашние задания учащимся. Это ведь может быть даже не формальное задание, а предложение к ученикам использовать свободное время ребят для их же пользы.

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

При размышлении на эту тему возникают следующие идеи:

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

Робототехническая школа. Вторая ступень. План занятий.

(С)NiNoXT

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

Курс рассчитан на 5 занятий общей продолжительностью 20 ак. часов. Т.е. одно занятие длиться 4 ак. часа, так же как и в первой ступени.

Робототехническая школа. Первая ступень. План занятий

(С) NiNoXT
Те, кто начинает вести занятия по робототехнике со школьниками вне школьных стен практически сразу при наборе групп выясняет несколько аспектов: не все могут посещать занятия во время учебных четвертей, не всех устраивают курсы идущие по 2-3 месяца. Тогда приходит в голову использовать время летних и зимних каникул, а в силу их непродолжительности сделать адаптированный "короткий" цикл занятий.
К тому же время свободное от основных занятий можно использовать сильнее: если в "трудовые" будни занятия продолжительностью 2 ак. часа достаточны, то во время каникул каждое занятие может длиться и по четыре часа, и идти они могут одно за другим практически каждый день.

NiNoXT: Lego-механизмы: интересные конструкции от akiyuky

NiNoXT: Lego-механизмы: интересные конструкции от akiyuky: Как показывает практика для каждого увлекающегося Lego робототехникой не достаточно просто хорошо уметь программировать - нужно еще довольно...

(С)

NiNoXT: Lego Mindstorms на Linux Install Fest 12.04 в Нижн...

NiNoXT: Lego Mindstorms на Linux Install Fest 12.04 в Нижн...: Неделю назад, 27 мая в Нижнем Новгороде проходил Linux Install Fest , проводимый активистами Нижегородской группой пользователей Linux . Цел...

(С)

NiNoXT: Ресурсы по программированию Lego-роботов в Robotic...

NiNoXT: Ресурсы по программированию Lego-роботов в Robotic...: Хотя многие и негативно высказываются в сторону продукции компании Microsoft, не стоит сбрасывать со счетов, что все-таки эта компания много...

(С)

NiNoXT: Обсуждаем различия между наборами NXT

NiNoXT: Обсуждаем различия между наборами NXT: Конструктор Lego Mindstorms NXT поставляется в трех разных наборах. В чем же различия и что общего в этих наборах? Эта статья ответит на д...

(С)

Не видна панель настройки блоков NXT-G?

(С)
Пожалуй каждый, кто программировал робота на нетбуке сталкивался с проблемой маленького разрешения экрана. И если выделить себе место для программы можно, закрыв справа панель Robo Center или My Portal, то с панелью настройки блоков (та, что возникает внизу экрана при выделении любого блока) дело обстоит сложнее. В данной заметке я приведу 2 способа решения проблемы, когда панель настройки в NXT-G не видна.

1 способ: Изменение разрешения экрана
Некоторые решают эту проблему путем установки более высокого разрешения по вертикали. Например, если у нетбука стандартное разрешение 1024*600, то можно выставить разрешение 1024*768. В Windows 7 для изменения разрешения вызовите контекстное меню Рабочего стола и выберите пункт "Разрешение экрана". В Windows XP также надо вызвать контекстное меню и выбрать вкладку "Параметры". После изменения разрешения надо нажать кнопку "Применить".
В этом случае на экран нетбука будет отображаться только часть окна программы, и чтобы увидеть нижнюю часть окна, достаточно подвести мышку вниз.
Этот способ имеет несколько недостатков:
  • не на каждом нетбуке можно его применить (поскольку не установлен нужный драйвер видеокарты)
  • требуется изменение настроек системы
2 способ: Создание незакрепленной панели

Данный способ позволяет сделать панель настройки незакрепленной, "плавающей". Эту панель вы можете передвигать в любое место окна. Выглядит она так:


Ниже приведена инструкция создания подобной панели:
  1. Скачайте специальный документ LabView (88 Кб).
  2. Скопируйте его в папку [LEGO MINDSTORMS]\engine\project\. По умолчанию эта папка будет такой: C:\Program Files\LEGO Software\LEGO MINDSTORMS NXT\engine\project
Вот и все! Панель установлена, но надо научиться ей пользоваться:
  1. Запустите NXT-G.
  2. Выберите в меню "Tools" команду "Configuration Popup...". У вас должна появиться панель на подобии той, что показана на изображении выше.
  3. Например, нам нужно настроить блок Move. Для этого находим данный блок в списке панели справа и затем выделяем данный блок в программе. Теперь можно его настроить.
Не забывайте, что сначала надо выбрать тип блока в панели настройки, а уже затем выделять этот блок. Если вы сначала выделите блок, а только потом выберете тип блока - работать панель не будет.

Если вы знаете еще способы решения данной проблемы или хотите поделиться подобными "уловками" при работе с NXT-G или другими средами разработки - пишите в комментариях, обсудим!

Накопление данных с сенсоров, как средство отладки

В ходе отладки программ для Lego роботов, особенно когда идет интенсивная работа с сенсорами, возникает ситуация когда сенсор вопреки ожиданиям не срабатывает на какое-то значение. В таком случае используется обычно подход "попробуй и измени" (try and fix): сначала выставляется одно значение, если оно не работает, то выставляется другое и так может продолжаться очень долго.
Помимо временных затрат, данный метод не дает понимания почему одни значения не работают, а другие начинают работать.

Робот для состязаний: Робот "Менделеев"

(С)NiNoXT

Задание для младшей группы основной категории Международных Состязаний Роботов называется "Робот Менделеев" и оно подразумевает, что нужно построить робота, который способен к систематизации объектов в соответствии с характеристикой ячейки.
А именно, робот должен проехать из ячейки Старта в ячейку Финиша по дороге раскладывая нужное число теннисных шариков в другие ячейки.

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

Если размышлять над конструкцие робота, то очевидно, что робот должен уметь:

Робот для состязаний: творческая категория МСР/WRO 2012

(С)NiNoXT
Для того чтобы участники Международных Соревнований Роботов (a.k.a WRO) 2012 лучше подготовились к творческой категории, хочется еще раз обратить внимание на формулировку темы этого года.
Для начало хочется привести аннотацию к правилам, опубликованным на сайтеwroboto.ru:

Роботы, сумевшие стать неотъемлемой частью нашей повседневной жизни, способные общаться с людьми и выполнять для них различного рода сложные задачи, всегда были предметом самых заветных мечтаний научных фантастов. Чтобы воплотить эти мечты в реальность, роботы должны обладать способностью учиться и развивать свой искусственный интеллект самостоятельно. Вместе с тем еще важнее, чтобы роботы в первую очередь "понимали", как люди функционируют и взаимодействуют между собой на межличностном и социальном уровнях.
Именно этим аспектам и предстоит уделить особое внимание в рамках темы творческой категории Международных состязаний роботов этого года, которая звучит так: "Объединение роботов и людей". Участникам этих соревнований необходимо будет создать роботов, способных убедительно продемонстрировать понимание отдельных сторон человеческой природы, того, как человек живет и трудится в обществе других людей.

Робот для состязаний: Робот "Колумб"

(С)NiNoXT
Задание в средней возрастной группе Международных Состязаний Роботов в 2012 году позволяет почувствовать конструкторов и программистов роботов первооткрывателями.
Им нужно построить робота который способен к исследованию сложного ландшафта в поисках полезных ресурсов, а после того как они найдены возвращения с ними домой.

WRO 2010: Правила творческой категории

(С)WRO

Правила творческой категории


·    Творческая категория включает в себя следующие темы:
o   Роботы и Туризм.
o   Свободная тема.

WRO 2010: Альпинизм (старшая группа)

(С)WRO

Альпинизм (старшая группа)

WRO 2010: Триатлон (средняя группа)

(С)WRO

Триатлон (средняя группа)

WRO 2010: Траектория (младшая группа)

(С)WRO

Траектория (младшая группа)

WRO 2011: Творческая категория. Тема: "Механизмы Чебышева"

(С)WRO

Творческая категория. Тема: "Механизмы Чебышева"

Творческая категория :
Тема: Механизмы Чебышева
О механизмах Чебышева смотрите: http://tcheb.ru/

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

WRO 2011: Творческая категория. Тема: "Роботы и космос"

(С)WRO

Творческая категория. Тема: "Роботы и космос"

·    Презентация проектов проводится в форме выставки.
·    Командам будет предоставлено примерно по 10 минут для демонстрации проекта судьям: из них 5 минут отводится на демонстрацию, а оставшиеся 2-5 минут займут ответы на вопросы судей.
·    Под каждый проект будет предоставлен стенд размером 2 х 2 х 2 метра, со стенами с трех сторон. Стол размером 60 х 80 сантиметров, два стула, электрическая розетка 220 В и мощностью не более 0,5 КВт (параметры предварительные). При необходимости дополнительного места и с другими пожеланиями необходимо обращаться в оргкомитет. Пожелания команды могут быть учтены за дополнительную плату.
·    В творческой категории не могут участвовать операторы команд, участвующие в основной категории.

WRO 2011: Творческая категория. Тема: "Роботы помощники"

(С)WRO

Творческая категория. Тема: "Роботы помощники"


·    К участию в теме "Роботы помощники" творческой категории допускаются команды, реализовавшие проекты, собранные на основе ЛЕГО – микрокомпьютера RCX или NXT, но, в отличие от основной категории, в их конструкции могут использоваться не только детали ЛЕГО,  но и любые другие материалы.
·    Презентация проектов проводится в форме выставки.
·    Командам будет предоставлено примерно по 10 минут для демонстрации проекта судьям: из них 5 минут отводится на демонстрацию, а оставшиеся 2-5 минут займут ответы на вопросы судей.
·    Под каждый проект будет предоставлен стенд размером 2 х 2 х 2 метра, со стенами с трех сторон. Стол размером 60 х 80 сантиметров, два стула, электрическая розетка 220 В и мощностью не более 0,5 КВт (параметры предварительные). При необходимости дополнительного места и с другими пожеланиями необходимо обращаться в оргкомитет. Пожелания команды могут быть учтены за дополнительную плату.

WRO 2011: Сортировщик

(С)WRO

Основная категория. Сортировщик

WRO 2011: Лестница

(С)WRO

Основная категория. Лестница

WRO 2011: Лабиринт

(С)WRO

Основная категория. Лабиринт