Обзор шикарного робота LEGO, который можно программировать. Конструкторы программируемых роботов

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

А кроме самого материала также комментарии одного из наших робо-экспертов, куратора екатеринбургского , Олега Евсегнеева.

Инженеры-робототехники, как правило, попадают в две категории специалистов: думающих (теоретиков) и делающих (практиков). Это означает, что робототехники должны отличаться хорошим сочетанием двух противоположных стилей работы. «Склонные к исследованиям» люди вообще любят решать проблемы, думая, читая и изучая. С другой стороны, специалисты-практики любят решать проблемы лишь «испачкав руки», можно так сказать.

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

1. Системное мышление

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

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

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

2. Мышление программиста

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

Сегодня используется более 1500 языков программирования. Несмотря на то, что вам явно не нужно будет учить их все, хороший робототехник обладает мышлением программиста. А они будут комфортно чувствовать себя при изучении любого нового языка, если вдруг это потребуется. И тут мы плавно переходим к следующему навыку.

Комментарий Олега Евсегнеева: Я бы добавил, что для создания современных роботов требуется знание языков низкого, высокого и даже сверхвысокого уровня. Микроконтроллеры должны работать очень быстро и эффективно. Чтобы этого достичь, нужно углубляться в архитектуру вычислительного устройства, знать особенности работы с памятью и низкоуровневыми протоколами. Сердцем робота может быть тяжелая операционная система, например, ROS. Здесь уже может понадобиться знание ООП, умение пользоваться серьезными пакетами машинного зрения, навигации и машинного обучения. Наконец, чтобы написать интерфейс робота в веб и связать его с сетью интернет, неплохо будет научиться скриптовым языкам, тому же python.

3. Способность к самобучению

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

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

Комментарий Олега Евсегнеева: Это ключевой навык в любом творческом деле. С помощью него можно получить другие навыки

4. Математика

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

Комментарий Олега Евсегнеева: Поведение робота, его реакция на окружающие раздражители, способность учиться – это все математика. Простой пример. Современные беспилотники хорошо летают благодаря фильтру Калмана – мощному математическому инструменту для уточнения данных о положении робота в пространстве. Робот Asimo умеет различать предметы благодаря нейронным сетям. Даже робот-пылесос использует сложную математику, чтобы правильно построить маршрут по комнате.

5. Физика и прикладная математика

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

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

6. Анализ и выбор решения

Быть хорошим робототехником означает постоянно принимать инженерные решения. Что выбрать для программирования - ROS или другую систему? Сколько пальцев должен иметь проектируемый робот? Какие датчики выбрать для использования? Робототехника использует множество решений и среди них почти нет единственно верного.

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

Одним из наиболее перспективных направлений в сфере IT-технологий является робототехника. Почему? Да потому что в течение следующих пятнадцати лет в мире появится дюжина новых профессий, в основе которых и будут знания из робототехнической области.

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

Самоуправляющие устройства стали применятся во второй половине прошлого столетия. Изначально роботы трудились в сферах производства и исследований, но затем успешно перекочевали в сферу услуг. Безусловно, роботы на текущий момент не являются каким-нибудь массовым явлением, но вектор выбран и изменить его практически невозможно. Именно поэтому можно говорить о том, что в ближайшем будущем роль человека, как рабочего, кардинально измениться. Но как подступиться к робототехнике? С чего начать свое увлекательное путешествие? Давайте попробуем ответить на эти вопросы.

Робототехника для детей

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

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

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

В каком возрасте начинать учиться?

Идеальный возраст для старта в робототехнике 8-12 лет. Раньше у ребенка могут возникнуть трудности с пониманием принципов работы тех или иных механизмов, а о желании учить математику (которая крайне необходима для составления алгоритмов, проектирования схем и механизмов) в раннем возрасте лучше не упоминать. Ну кто из нас хотел штудировать формулы и теоремы, когда на улице отличная погода, а под телевизором расположилась Sony PlayStation? Вопрос риторический.

А вот в 8-9 лет дети без особых проблем могут понимать и запоминать, что такое конденсатор, светодиод, резистор. В этом возрасте они уже могут осваивать понятия из школьной физики, значительно опережая программу наших учебных заведений.

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

Немного о выборе конструкторов

Для каждой возрастной группы имеются свои образовательные платформы и конструкторы, отличающиеся степенью сложности. Сегодня на рынке представлены как зарубежные, так и отечественные наборы, стоимость которых варьирует от 400 до 15 000 гривен.
8-11 летнему ребенку подойдут конструкторы от BitKit, Fischertechnik или (конечно, в ассортименте этих производителей имеются наборы и для взрослых детей). Например, продукция BitKit направлена на изучение электроники (их конструктор Омка я тестировал лично и писал об этом зимой 2016 года – ); Fischertechnik – приближает к настоящей разработке роботов, в их наборах есть и штекеры, и провода, и визуальная среда программирования; Lego предлагает очень известные конструкторы с интересными и яркими деталями, подробной инструкцией и большими возможностями.

Стандартом в области образовательной робототехники являются модули Arduino, а также одноплатный компьютер . Для работы с ними потребуются базовые навыки программирования, но в конечном итоге можно научиться собственными руками создавать всевозможные “умные” устройства – от системы автоматического полива до сигнализации.


Где заниматься робототехникой?

Курсы робототехники для детей в Украине предлагают следующие организации:
курс “Stem Fll” от First Lego League;
курс “Робо-3D Junior” от RoboUa;
курс “Робо-3D” от Lego Mindstorms;
курсы на базе Arduino, Lego и Fischertechnik от Robot School;
курсы для детей от 4х лет от студии МАН;
учебная программа от Boteon;
курс “Подготовка к полету” от Singularity Studio;
курсы от IT-школы “Смарт”.

Самостоятельное обучение: возможно ли?

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

Что касается ребенка, ему в помощь помимо увлекательных и полезных наборов пригодятся книги по робототехнике, а именно:

Брага Ньютон, “Создание роботов в домашних условиях”;
Дуглас Вильямс, “Программируемый робот, управляемый с КПК”;
Оуэн Бишоп, “Настольная книга разработчика роботов”;
Вадим Мицкевич, “Занимательная анатомия роботов”;
Владимир Гололобов, “С чего начинаются роботы”.

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

Что в итоге?

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter .

Программирование виртуальных роботов на языке Java

Робототехника давным давно вышла за пределы научно-фантастических романов и в настоящее время является одной из движущих сил, определяющих прогресс во многих областях, таких как автоматизация производства, медицина, космос и т.д. Важную роль в робототехнике играют программные симуляторы, т.к. они не только упрощают работу инженеров, но и позволяют исследователям испытывать новейшие алгоритмы искусственного интеллекта (AI) и машинного обучения. Одним из таких симуляторов является Simbad – проект с открытым кодом, разработанный на основе технологии Java 3D (см. ). В данной статье мы расскажем, как программировать виртуальных роботов, используя инструментарий Simbad, для получения лучшего представления об одной из философий проектирования роботов – архитектуре поглощения (subsumption architecture ).

Начало статьи посвящено краткому обзору робототехники и концепции архитектуры поглощения. Затем мы перейдем к инструментарию Simbad и расскажем, как, используя его, можно реализовать данную архитектуру. После этого придет время создания простого робота в соответствии с описанной архитектурой. В конце концов, вы окунетесь в занимательный мир лабиринтов и создадите второго робота, который, подобно Гомеру из Симпсонов (см. ), сможет самостоятельно из них выбираться. Разумеется, созданные роботы будут “виртуальными”, т.е. будут жить в виртуальной среде Simbad.

Программирование роботов

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

  • Набора сенсоров
  • Программы, определяющей поведение робота
  • Набора приводов и эффекторов

Традиционная робототехника

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

Таким образом, традиционный робот получает данные от множества сенсоров, комбинирует эти данные в процессе обновления картины мира, затем вырабатывает план действий на основе данной картины, и наконец, приводит его в исполнение. К сожалению, данный подход сопряжен с определенными трудностями. Во-первых, он требует большого объема вычислений. Во-вторых, поддержка актуальной картины окружающего мира – задача очень сложная, т.к. мир меняется постоянно. При этом известно, что многие организмы, например, насекомые, благополучно существуют и без поддержки полной картины мира, более того, даже не имея памяти как таковой. Так может стоит попробовать перенять их подход к функционированию? Подобные размышления стали отправной точкой нового течения в робототехнике, доминирующего в настоящее время. Оно получило название “поведенческая робототехника” (behavior-based robotics - BBR).

Архитектура поглощения

Одним из способов организации BBR-роботов является архитектура поглощения, предложенная в 1986 г. Родни Бруксом (Rodney A. Brooks) — в настоящее время главой лаборатории искусственного интеллекта в Массачусетском Технологическом Институте (MIT) — в его фундаментальной статье под названием “Слоны не играют в шахматы” (см. ). Согласно Бруксу, поведенческие роботы можно рассматривать как набор простых и независимых поведенческих узлов (behaviors), каждый из которых определяется двумя вещами – тем, что вызывает данное поведение (как правило, информация, поступающая от сенсоров), и тем действием, что является его результатом (как правило, выполненным с помощью эффектора). Поведения могут наслаиваться друг на друга, а также конфликтовать между собой. В этом случае, в действие вступает специальный механизм арбитража , который решает, какое поведение в данный момент является приоритетным. Ключевым моментом является то, что поведение робота, как единого целого, не закладывается заранее, а вырисовывается из взаимодействия его поведенческих узлов. Более того, по мнению сторонников BBR, глобальное поведение является чем-то большим, чем просто суперпозицией его частей. Оно поглощает каждое из локальных, низкоуровневых поведений. В целом, идея заключается в том, что вместо проектирования робота и точного описания его поведения во всех ситуациях, можно просто добавлять поведенческие узлы и смотреть, что получится в результате.

Simbad: среда для моделирования роботов

LEGO Mindstorms

В данной статье рассматривается создание программных агентов (ботов), но если вас интересуют реальные физические роботы, то обратите внимание на LEGO Mindstorms – замечательный инструментарий для робототехника.

Слоган в штаб-квартире LEGO Mindstorms гласит: “Мы сделаем для робототехники то, что iPod сделал для музыки” ("We will do for robotics what iPod did for music"). Первая версия Mindstorms была представлена в 1998 г. и сразу же превзошла ожидания LEGO по объему продаж. Цена комплекта ($250) может показаться слегка завышенной, но не забывайте, что столько же стоит iPod Classic, а он есть практически у каждого .

При этом iPod не предоставляет собой такого интереса для взлома как Mindstorms. Стоило выйти первому релизу Mindstorms, как различного рода хакеры начали взламывать и анализировать блоки RCX, являющиеся “мозгами” роботов. LEGO пребывала в некотором недоумении и сначала не могла решить, оставить ли все как есть или же выпустить официальное требование прекратить подобные действия. К чести руководства компании, они решили предоставить хакерам полную свободу действий в отношении Mindstorms.

Это привело к расцвету сообщества Mindstorms (см. ). Одним из следствий стало стороннее портирование платформы Mindstorms под другие языки, такие как C и Java, в то время, как сам инструментарий изначально поставлялся только вместе с графическим языком программирования NXT-G. В итоге, более половины пользователей инструментария – это взрослые специалисты.

Simbad предназначен для программного моделирования роботов. Согласно Web-странице проекта, Simbad “предоставляет программные средства для разработки роботов, описания их воздействия на окружающий мир, а так же использования сенсоров. Simbad был в первую очередь разработан для исследователей, которым необходим простой инструментарий для изучения ситуационного искусственного интеллекта, машинного обучения и алгоритмов AI вообще, особенно применительно к автономным роботам и агентам”.

Simbad был разработан на Java Луи Уге (Louis Hugue) и Николя Бредешем (Nicolas Bredeche). Проект размещен на сервере SourceForge.net и может свободно использоваться или модифицироваться в соответствии с лицензией GNU GPL (General Public License).

Технические подробности

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

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

Simbad API

В примерах к данной статье в основном затрагиваются вопросы, связанные со следующими двумя пакетами, входящими в состав Simbad API:

  • simbad.sim : Классы данного пакета описывают как самих роботов, так и окружающий их мир. Основными классами являются:
    • Agent: Сами роботы.
    • Arch: Арки, которые роботы могут объезжать либо проезжать под ними.
    • Box: Описывают препятствия на пути робота.
    • CameraSensor: Позволяет получать доступ к картине окружающего мира с точки зрения робота.
    • EnvironmentDescription: Описывает среду, в которую можно добавлять как роботов, так и неодушевленные объекты, например, стены и другие препятствия.
    • LampActuator: Фары, которые можно добавлять к своему роботу.
    • LightSensor: Сенсоры света.
    • RangeSensorBelt: Набор датчиков расстояния, которые могут быть расположены по периметру робота.
    • RobotFactory: Используется для добавления различных сенсоров к роботу.
    • Wall: Еще один тип препятствия для движения робота.
  • simbad.gui : Классы из данного пакета отображают самого робота и позволяют его контролировать. Основным классом являются следующий:
    • Simbad: Окно, отображающее картину мира робота, информацию, поступающую с его сенсоров, а так же управляющие элементы.

Реализация архитектуры поглощения с помощью Simbad

Румба

В то время как я пишу эти строки, Румба (Roomba) пылесосит ковер у меня под ногами (при этом периодически наталкиваясь на котенка). Румба – это робот, разработанный компанией iRobot, основанной тремя выпускниками MIT: Родни Бруксом, Колином Энглом (Colin Angle) и Хелен Грейнер (Helen Greiner). Он был создан в согласии с принципами архитектуры поглощения и предоставляет открытый интерфейс, позволяющий менять его поведение самым произвольным образом. Книга Тода Курта (Tod E. Kurt) “Взламывая Румбу” рассказывает о множестве таких возможностей (см. ).

Реализовывать архитектуру поглощения на основе Simbad мы начнем с объявления класса-потомка Agent под названием BehaviorBasedAgent . Каждый экземпляр данного класса будет содержать массив поведений (объектов типа Behavior), а так же булеву матрицу, хранящую информацию об их попарном поглощении.

private Behavior behaviors; private boolean suppresses;

Класс BehaviorBasedAgent выступает в роли планировщика поведений. В листинге 1 приведен фрагмент кода, итерирующего по массиву поведений и регулирующего их запуск. При этом переменная currentBehaviorIndex используется для хранения ссылки на поведение, которое должно быть активировано на следующем шаге алгоритма.

Листинг 1. Цикл для поочередной активации поведений и разрешения конфликтов
protected void performBehavior() { boolean isActive = new boolean; for (int i = 0; i < isActive.length; i++) { isActive[i] = behaviors[i].isActive(); } boolean ranABehavior = false; while (!ranABehavior) { boolean runCurrentBehavior = isActive; if (runCurrentBehavior) { for (int i = 0; i < suppresses.length; i++) { if (isActive[i] && suppresses[i]) { runCurrentBehavior = false; break; } } } if (runCurrentBehavior) { if (currentBehaviorIndex < behaviors.length) { Velocities newVelocities = behaviors.act(); this.setTranslationalVelocity(newVelocities .getTranslationalVelocity()); this .setRotationalVelocity(newVelocities .getRotationalVelocity()); } ranABehavior = true; } if (behaviors.length > 0) { currentBehaviorIndex = (currentBehaviorIndex + 1) % behaviors.length; } } }

Отметьте, что метод performBehavior() перегружает аналогичный метод в классе simbad.sim.Agent .

В классе поведения Behavior объявлено два абстрактных (abstract) метода:

  • isActive() : Метод возвращает булево значение, показывающее, должно ли данное поведение быть активировано в данный момент времени, учитывая информацию, поступающую от сенсоров. При этом все экземпляры класса Behavior имеют доступ к общему набору сенсоров.
  • act() : Метод возвращает новые значения поступательной и вращательной скорости (именно в таком порядке), являющиеся результатом активации поведения.

Пример блуждающего робота, притягивающегося к источникам света

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

  • Avoidance: Изменяет направление движения после столкновения или в попытке предотвратить столкновение.
  • LightSeeking: Направляет движение в сторону источника света.
  • Wandering: Периодически меняет направление движения произвольным образом.
  • StraightLine: Направляет движение по прямой.
Листинг 2. Класс Avoidance (на основе демонстрационного примера SingleAvoiderDemo.java из поставки Simbad)
public boolean isActive() { return getSensors().getBumpers().oneHasHit() || getSensors().getSonars().oneHasHit(); } public Velocities act() { double translationalVelocity = 0.8; double rotationalVelocity = 0; RangeSensorBelt sonars = getSensors().getSonars(); double rotationalVelocityFactor = Math.PI / 32; if (getSensors().getBumpers().oneHasHit()) { // Произошло столкновение translationalVelocity = -0.1; rotationalVelocity = Math.PI / 8 - (rotationalVelocityFactor * Math.random()); } else if (sonars.oneHasHit()) { // Считывание показаний эхолокаторов double left = sonars.getFrontLeftQuadrantMeasurement(); double right = sonars.getFrontRightQuadrantMeasurement(); double front = sonars.getFrontQuadrantMeasurement(); // Препятствие близко if ((front < 0.7) || (left < 0.7) || (right < 0.7)) { double maxRotationalVelocity = Math.PI / 4; if (left < right) rotationalVelocity = -maxRotationalVelocity - (rotationalVelocityFactor * Math.random()); else rotationalVelocity = maxRotationalVelocity - (rotationalVelocityFactor * Math.random()); translationalVelocity = 0; } else { rotationalVelocity = 0; translationalVelocity = 0.6; } } return new Velocities(translationalVelocity, rotationalVelocity); }
Листинг 3. Класс LightSeeking (на основе демонстрационного примера LightSearchDemo.java из поставки Simbad)
public boolean isActive() { float llum = getSensors().getLightSensorLeft().getAverageLuminance(); float rlum = getSensors().getLightSensorRight().getAverageLuminance(); double luminance = (llum + rlum) / 2.0; // Активизироваться если источник света неподалеку return luminance > LUMINANCE_SEEKING_MIN; } public Velocities act() { // Повернуть в сторону источника света float llum = getSensors().getLightSensorLeft().getAverageLuminance(); float rlum = getSensors().getLightSensorRight().getAverageLuminance(); double translationalVelocity = 0.5 / (llum + rlum); double rotationalVelocity = (llum - rlum) * Math.PI / 4; return new Velocities(translationalVelocity, rotationalVelocity); }
Листинг 4. Класс Wandering
public boolean isActive() { return random.nextDouble() < WANDERING_PROBABILITY; } public Velocities act() { return new Velocities(0.8, random.nextDouble() * 2 * Math.PI); }
Листинг 5. Класс StraightLine class
public boolean isActive() { return true; } public Velocities act() { return new Velocities(0.8, 0.0); }

В листинге 6 показано поглощение одних поведений другими.

Листинг 6. Объявление булевой матрицы, описывающей попарное поглощение поведений
private void initBehaviorBasedAgent(BehaviorBasedAgent behaviorBasedAgent) { Sensors sensors = behaviorBasedAgent.getSensors(); Behavior behaviors = { new Avoidance(sensors), new LightSeeking(sensors), new Wandering(sensors), new StraightLine(sensors), }; boolean subsumes = { { false, true, true, true }, { false, false, true, true }, { false, false, false, true }, { false, false, false, false } }; behaviorBasedAgent.initBehaviors(behaviors, subsumes); }

В данном примере набор поведений полностью упорядочен в соответствии с приоритетом. В общем случае, это необязательно.

В качестве упражнения вы можете попробовать реализовать следующие вещи:

  • Социальное поведение: движение навстречу друзьям и в сторону от врагов.
  • Избегание источников света.
  • Добавить фары к некоторым роботам, так, чтобы они начали притягиваться друг к другу.

Лабиринты

"Ну, наконец-то! Я так и знала, что из этого лабиринта можно выбраться, действуя по алгоритму Тремо!" — Лиза Симпсон

Из всей массы алгоритмов выхода из лабиринтов, два выделяются тем, что используют объем памяти, не зависящий от размера самого лабиринта. Они известны под названиями “следование вдоль стены” (wall-following) и алгоритм Пледжа . Последний был назван в честь Джона Пледжа (Jon Pledge) из Эксетера, который изобрел алгоритм в возрасте 12 лет. Кроме этого есть еще великолепный алгоритм Тремо (Tremaux algorithm) – любимый алгоритм Лизы Симпсон – но в целях упрощения мы рассмотрим только первые два.

Алгоритмы генерации лабиринтов

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

Следование вдоль стены

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

Алгоритм Пледжа

Алгоритм Пледжа более сложен, но зато способен находить выход из большего числа лабиринтов за счет возможности переходов от одного острова к другому. Идея алгоритма заключается в том, что надо выбрать некое абсолютное направление (север, юг, запад или восток) и всегда стараться ему следовать. Назовем его предпочтительным направлением . В случае если вы упираетесь в стену, вы поворачиваете направо и движетесь в соответствии с алгоритмом “следование вдоль стены” до тех пор, пока не выполнится два условия. Первое – это поворот в предпочтительном направлении, а второе – сумма всех ранее сделанных поворотов равна нуля (при этом каждый поворот против часовой стрелки принимается за единицу, а по часовой стрелке, соответственно, за минус единицу). После этого вы продолжаете двигаться в предпочтительном направлении пока это возможно и так далее. Условие на нулевую сумму поворотов необходимо для избегания разного рода ловушек, например, участков лабиринтов, имеющих форму G (нарисуйте ее на бумаге и сразу поймете, о чем я).

Алгернон: робот, выбирающийся из лабиринтов

Пришло время удивить ваших друзей, создав робота по имени Алгернон (Algernon), задачей которого будет выход из лабиринтов.

Проектирование робота

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

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

Реализация алгоритма следования вдоль стены

Весь код Алгернона будет размещен в пакете algernon.subsumption (весь код доступен для ). Алгернон — это достаточно простой робот и его вполне можно запрограммировать в процедурном стиле. В то же время, даже для такого простого робота, подход, основанный на поглощении поведений, делает код намного чище, легче для понимания, а также способствует лучшей организации модулей.

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

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

  • Идти прямо.
  • Упершись в стену, повернуть направо.
  • Встретив ответвление влево, повернуть.
  • Остановиться при нахождении выхода.

Поведениям необходимо присвоить приоритеты. В данном примере, мы их выберем в том же порядке, в каком они перечислены выше. В итоге нам понадобятся четыре класса-наследника Behavior:

  • GoStraight
  • TurnRight
  • TurnLeft
  • ReachGoal

В листинге 7 показан код класса GoStraight , в котором TRANSLATIONAL_VELOCITY – это константа, равная 0.4:

Листинг 7. Реализация поведения для движения по прямой
public boolean isActive() { return true; } public Velocities act() { double rotationalVelocity = 0.0; return new Velocities(TRANSLATIONAL_VELOCITY, rotationalVelocity); }

Код класса TurnRight показан в листинге 8. Метод getRotationCount() возвращает количество временных интервалов, необходимых для поворота на 90 градусов при данной скорости вращения.

Листинг 8. Реализация поведения для поворота направоBehavior code for turning right
public boolean isActive() { if (turningRightCount > 0) { return true; } RangeSensorBelt bumpers = getSensors().getBumpers(); // Проверка переднего бампера. if (bumpers.hasHit(0)) { backingUpCount = 10; turningRightCount = getRotationCount(); return true; } else { return false; } } public Velocities act() { if (backingUpCount > 0) { // Робот уперся в стену. Надо чуть отойти назад перед поворотом backingUpCount--; return new Velocities(-TRANSLATIONAL_VELOCITY, 0.0); } else { turningRightCount--; return new Velocities(0.0, -Math.PI / 2); } }

Для поворота налево, Алгернон должен сначала чуть продвинуться вперед так, что стена слева от него закончится. Затем он поворачивается налево и проходит еще немного вперед так что, по его левую сторону опять находится стена. Код показан в листинге 9.

Листинг 9. Реализация поведения для поворота налево
public boolean isActive() { if (postGoingForwardCount > 0) { return true; } RangeSensorBelt sonars = getSensors().getSonars(); // Проверка эхолокатора слева if (sonars.getMeasurement(1) > 1.0) { // Слева коридор preGoingForwardCount = 20; postGoingForwardCount = 40; turnLeftCount = getRotationCount(); return true; } else { return false; } } public Velocities act() { if (preGoingForwardCount > 0) { preGoingForwardCount--; return new Velocities(TRANSLATIONAL_VELOCITY, 0.0); } else if (turnLeftCount > 0) { turnLeftCount--; return new Velocities(0.0, Math.PI / 2); } else { postGoingForwardCount--; return new Velocities(TRANSLATIONAL_VELOCITY, 0.0); } }

Код класса ReachGoal показан в листинге 10.

Листинг 10. Поведение при обнаружении выхода из лабиринта
public boolean isActive() { RangeSensorBelt sonars = getSensors().getSonars(); // Впереди открытое пространство? Другими словами, нашли ли мы выход из лабиринта? double clearDistance = 1.2; return sonars.getMeasurement(0) > clearDistance && sonars.getMeasurement(1) > clearDistance && sonars.getMeasurement(3) > clearDistance && sonars.getMeasurement(2) > clearDistance; } public Velocities act() { // Остановка return new Velocities(0.0, 0.0); }

Главный метод, определяющий поведение Алгернона приведен в листинге 11.

Листинг 11. Код управления поведениями Алгернона
private void initBehaviorBasedAgent(algernon.subsumption.BehaviorBasedAgent behaviorBasedAgent) { algernon.subsumption.Sensors sensors = behaviorBasedAgent.getSensors(); algernon.subsumption.Behavior behaviors = { new ReachGoal(sensors), new TurnLeft(sensors), new TurnRight(sensors), new GoStraightAlways(sensors) }; boolean subsumes = { { false, true, true, true }, { false, false, true, true }, { false, false, false, true }, { false, false, false, false } }; behaviorBasedAgent.initBehaviors(behaviors, subsumes); }

На рисунке 1 показано, как Алгернон движется по лабиринту.

Рисунок 1. Алгернон, двигающийся по лабиринту

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

Заключение

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

Обратите внимание на инструментарий LEGO Mindstorms, если вы заинтересовались проектированием и программированием роботов. В качестве альтернативы, можно поработать с роботами BEAM (Biological Electronic Aesthetics Mechanics). BEAM далее развивает идею поведенческой робототехники, вообще убирая программирование как таковое. Глобальное поведение робота определяется жестко заданными соединениями поведенческих узлов, работающих на рефлексах. Заплатив не более $30 вы сможете построить своего первого BEAM-робота. Также можно спроектировать робота по чертежам, которые вы найдете в книге Гарета Бранвина (Gareth Branwyn) “Создание роботов для абсолютных новичков” (см. ). Ну и, наконец, всегда можно купить Румбу и взломать его.

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

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

Хочешь попробовать себя в робототехнике, но не хочешь тратить деньги, ждать доставки компонентов и мучиться со сборкой? Тебе интересно протестировать код, не оглядываясь на ограничения железа? Эта статья позволит тебе начать работать сразу после прочтения, ведь речь пойдет о симуляции роботов.

Google купила Boston Dynamics. Это сообщение у меня вызвало некий шок. Boston Dynamics - одна из самых известных компаний, специализирующихся на робототехнике, и, если учесть, что Google покупает уже восьмую компанию на этом рынке, возникает правомерный вопрос: что же они задумали? Похоже, нас ждет интересное десятилетие!

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

Физический и графический движок

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

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

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

Достоинства и недостатки симуляторов

Достоинства:

  • низкая стоимость;
  • возможность в любой момент доработать модель;
  • возможность отдельно тестировать функциональные составляющие робота;
  • возможность одновременной симуляции нескольких типов роботов.

Недостатки:

  • даже самый совершенный физический движок не может симулировать все законы реального мира;
  • требовательность к ресурсам машины.

Microsoft Robotics Developer Studio

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

  • библиотека Concurrent and Coordination Runtime (CCR) - предназначена для организации обработки данных с помощью параллельно и асинхронно выполняющихся методов. Взаимодействие между такими методами организуется на основе сообщений. Рассылка сообщений основана на использовании портов;
  • Decentralized Software Services (DSS) - среда, которая позволяет запускать алгоритмы обработки данных на разных ЭВМ, организовывать асинхронное взаимодействие процессов управления различными подсистемами робота;
  • Visual Simulation Environment (VSE) - среда визуализации, которая позволяет экспериментировать с моделями роботов, тестировать алгоритмы управления роботами;
  • Visual Programming Language (VPL) - язык, предназначенный для разработки программ управления роботами. Программа на таком языке представляется в виде последовательности блоков, которые выполняют обработку данных, и связей между ними.

За симулятор физики в Robotics отвечает Ageia Physx. Очень печально, но в симуляторе отсутствует трение между создаваемыми объектами, хотя моделируется трение между отдельным объектом и платформой, на которой он размещается.

Создать сцену в симуляторе и запрограммировать робота можно на VPL или C#. Естественно, что на C# сцену сделать сложнее, но зато и код получится более эффективный. Возможности Robotics позволяют смоделировать футбол роботов, железную дорогу, манипулятор, добавить на сцену нескольких роботов. Доступные из коробки сенсоры: GPS, лазерный дальномер, инфракрасный дальномер, компас, сенсор цвета, сенсор яркости, веб-камера.

Подробнее о работе с этой средой ты можешь прочитать в номерах 01’13 («Стань робототехником!») и 03’13 («Робот-шпион - это просто!»).

Robotino - робот, созданный Festo Didactic для обучения робототехнике. Для программирования робота требуется программа Robotino® View. На сайте Festo доступен симулятор робота для Windows - Robotino® SIM (есть профессиональная и бесплатная версия, бесплатная - немного урезанная по функциональности).

Немного о роботе, который встроен в симулятор. В его состав входят три двигателя, которые позволяют перемещаться роботу по плоскости в любом направлении. Сенсорная система робота включает девять инфракрасных сенсоров расстояния, два цифровых оптических сенсора и камеру. Программировать робота можно с помощью C/C++, Java, .NET.

Вообще, способности бесплатного симулятора удручают. Но! Если хорошенько поискать в интернете, то можно найти версии данного симулятора, заточенные под разные задачи. Да будет тебе известно, что компания Festo Didactic выступает одним из спонсоров RoboCup . Поэтому здесь goo.gl/Wtle15 и здесь goo.gl/pHA2oL ты сможешь найти версии этого симулятора, использовавшиеся в соревнованиях.

Gazebo - мощный симулятор роботов, разработанный для операционной системы Linux. Абсолютно бесплатен для использования. Gazebo может симулировать нескольких роботов с сенсорами в окружении различных объектов. Также тут доступен редактор, который позволяет создавать 3D-сцены без программирования. Моделируемые сенсоры: лазерный дальномер, камера, кинект-сенсор, устройство для чтения RFID-меток и бамперы. Из коробки в симуляторе имеются модели следующих роботов: PR2, Pioneer2 DX, iRobot Create, TurtleBot, а также манипуляторы и захваты. К симулятору для создания качественной графики можно подключить OGRE (графический движок с открытым исходным кодом). В Gazebo встроена возможность чтения файлов в формате Collada, что позволяет добавлять в симулятор объекты, спроектированные в одном из редакторов 3D-моделей.

Gazebo используется в качестве симулятора в DARPA Robotics Challenge (DRC). В рамках DRC разработано приложение CloudSim для запуска Gazebo на платформе облачных вычислений Amazon.

AnyKode Marilou Robotics Studio

AnyKode Marilou Robotics Studio - среда разработки и симулирования мобильных роботов, гуманоидов и манипуляторов с учетом физических законов реального мира. Для объектов можно указать следующие физические параметры: массу, упругость, свойства материала, вращающие моменты, а также некоторые другие.

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

В редакторе объектов Marilou доступны статические и динамические объекты, которые можно размещать в симулируемом мире (поддерживается одновременная симуляция нескольких роботов). Сложные объекты в Marilou строятся из более простых (используется иерархический подход к представлению объекта), что позволяет повторно использовать части объектов. В симуляторе доступны несколько источников света: точечный, прожектор, внешний и направленный.

В Marilou есть MODA (Marilou Open Devices Access) - SDK для работы с роботами и их компонентами в симуляторе. После синхронизации с часами симулятора алгоритмы управления роботом могут запускаться на другом компьютере сети. В зависимости от выбранного языка MODA предоставляет библиотеки (.lib или.a) или.NET-сборки (.dll) для доступа к симулятору по сети. Программирование алгоритмов управления роботов возможно с помощью языков C/C++, C++ CLI, C#, J#, VB#.

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

В ноябре 2013 года вышел новый движок симулятора для Marilou - Exec V5. Бета-версия движка может работать на Windows, Ubuntu и Mint. Новый движок многопоточный, кросс-платформенный и использует OpenGL 2.1.

Code Rally: гонки на роботах

Code Rally (разработка IBM) нельзя назвать полноценным симулятором роботов. Если быть точным, Code Rally - симулятор гонок машин (бесплатный и с открытым исходным кодом).

Цель программиста - написать алгоритм управления движения машины («роботом») по трассе (кругу) с учетом следующих правил игры:

  1. В процессе движения машина должна проходить через контрольные точки, за что ей начисляются очки.
  2. Перемещаясь по трассе, машина тратит топливо, а также может расстреливать другие машины пулями.
  3. Машине доступны координаты заправочных станций, кассет с пулями и контрольных точек; трасса ограничена стенами, за пределы которых машина не может выехать.
  4. Допускается управление скоростью машины.
  5. На трассе могут находиться заправочные станции и кассеты с пулями. При заправке топливом машина должна оставаться неподвижной. Машина может включать защиту, но в это время в удвоенном объеме тратится топливо.
  6. Очки начисляются за проезд через контрольную точку (за проезд через точки в установленном порядке начисляется больше очков), за попадание в машину противника (подбитая машина теряет топливо) и за топливо, оставшееся на момент окончания гонки.

Побеждает машина, набравшая максимальное количество очков.

Тестировать свой алгоритм управления машиной можно на сервере (на своем компьютере), посоревноваться с друзьями по сети или запустить приложение на облачном сервере IBM (ведется рейтинг игроков).

Разработка алгоритма управления машиной выполняется в Eclipse на Java. Так что, занимаясь симуляторами, можно не только развлечься, но и Java подтянуть. В симуляторе доступно шесть трасс различной степени сложности.

Algodoo: специализированный симулятор физики

Algodoo - физический 2D-симулятор. Объекты, которые создаются в этом симуляторе, сразу начинают подчиняться законам физики. Конечно, полноценного робота в трехмерном пространстве ты в этой программе не сделаешь, зато сможешь проверить возможность работы любого механизма. В программе можно моделировать воду, пружины, оптические устройства, ракетные двигатели, оружие, автомобили.

Может показаться, что данный симулятор неполноценен в том смысле, что позволяет проектировать и исследовать только «плоских» роботов. Однако ты можешь сначала спроектировать 2D-робота, а потом создать в реале его трехмерную версию. Пример показан здесь (2:07): goo.gl/wzQ7q4 . В Algodoo встроен скриптовый язык программирования Thyme, который добавляет большую свободу действий в симуляторе. В Thyme доступны переменные, условный оператор, массивы, обработка событий, происходящих в песочнице (среде моделирования).

История Algodoo началась с игры Phun, которую разработал швед Эмиль Эрнерфельдт (это была его магистерская работа). Поддерживаемые ОС: Windows, OS X, iOS. На сайте доступна библиотека AlgoBox, в которой есть куча обучающих материалов и примеров разработки. Также посмотри