Роботы, лабиринты и архитектура поглощения. Программирование промышленных роботов в SprutCAM

Детские товары 05.08.2019
Детские товары

Весь процесс состоит из двух этапов: сборки и программирования. Чтобы собрать хорошего робота, нужны знания в механике. Чтобы запрограммировать робота на определённые действия, нужно знать язык, который поймёт системная плата или программный блок. Школьными знаниями по информатике тут не обойтись.

Где взять материал?

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

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

Из чего состоит робот?

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

Чтобы заставить робота двигаться, понадобятся моторы. «Голова» всего механизма – системная плата или программный блок. С их помощью робот подключается к компьютеру и получает набор задач.

Как заставить его что‑то делать?

Чтобы робот выполнил какое‑то действие, нужно создать компьютерную программу. Сложность этого этапа зависит от сборки. Если робот собран из набора Lego Mindstorms или mBot, то с их программным обеспечением справятся даже дети.

Если вы собираете робота сами, вам нужно изучить основы программирования и язык, на котором собираетесь писать программу, например C++.

Почему робот может не выполнить программу?

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

Можно научиться собирать и программировать в школе?

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

«После уроков с учителями физики и информатики мы учимся программировать. Уже умеем работать в LegoMindstorms и Robolab (программное обеспечение для роботов – прим. авт. ). Также иногда учимся делать 3D-чертежи деталей», – рассказали ученики Белгородского инженерного юношеского лицея-интерната и участники «РобоФеста-2018» Антон Першин и Дмитрий Чернов .

Где, кроме школы, можно стать робототехником?

В инжиниринговой школе БелГУ есть класс, в котором учат собирать и программировать роботов. В 2017 году в Белгороде открылся «Кванториум» , в котором робототехнике учат школьников с девяти лет.

Чтобы стать настоящим робототехником, можно поступить на робототехнический факультет. В Белгороде пока таких нет, но в БГТУ им. Шухова есть кафедра технической кибернетики . Её студенты занимают призовые места на всероссийских соревнованиях по робототехнике.

Можно ли научиться самому?

Да. Есть множество ресурсов в Интернете, на которых можно узнать, из чего собрать и как запрограммировать робота.

Будет ли робот полезным?

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

Как подтвердить свои успехи в создании роботов?

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

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

Редакция благодарит за помощь в создании материала участников «РобоФеста-2018» Дмитрия Агафонова , Дмитрия Чернова , Антона Першина и Данила Мигрина .

Наталья Малыхина

Sphero SPRK

Sphero SPRK - робот для обучения программированию, замаскированный под небольшой полупрозрачный шарик. Управлять устройством нужно с помощью кода: его набирают в редакторе смартфона, используя блоки с командами. Шарик может катиться, крутиться, прыгать и менять цвета. Играть могут и те, кто пока не умеет программировать – для этого разработчики загрузили 12 базовых алгоритмов.

Шарик придумала компания Sphero, основанная в 2010 году для производства детских игрушек. Робота специально сделали прозрачным: дети могут следить за тем, как механизмы внутри шарика управляют его движениями. Кстати, название SPRK расшифровывается как Schools-Parents-Robots-Kids (школы, родители, роботы, дети). В магазинах игрушку можно купить за $129.99.

Ozobot

Робот Ozobot размером не превышает мячик для гольфа. Если нарисовать жирным маркером линию на бумаге (или виртуальным маркером - на экране планшета), он по ней покатится. Для дальнейших действий потребуется придумать код: например, можно запрограммировать шарик так, чтобы он повернулся вокруг своей оси или ускорился. Пока к роботу прилагается оригинальный редактор кода Ozobot, но в скором времени можно будет пользоваться языком программирования Blockly.

Основатель проекта рассказал в интервью Techcrunch: «Дети сегодня стали очень замкнутые, поэтому мы хотели сделать что-то такое, что побудило бы их вернуться в реальный физический мир». Сейчас Ozobot работает на iOS и Android, а полный комплект стоит около $50 (туда входит сам робот, игры, приложения и другие программы).

Project Bloks

Конструктор Project Bloks был разработан Google в партнерстве со студией дизайна IDEO. Используя готовые запчасти, можно создавать различные устройства и проводить эксперименты: сочинять музыку или дистанционно управлять вещами в комнате. Платформа состоит из трех частей: процессора, работающего на основе Raspberry Pi, панели управления и инструментов (например, светодиодных лампочек или аудиопроигрывателя).

Главное достоинство Project Bloks состоит в том, что платформа позволяет не просто нажимать на кнопки и ждать эффекта, но прочувствовать связь между софтом и железом. Например, иконки команд нанесены прямо на физические кнопки, через которые выполняются эти команды. С помощью Project Bloks дети могут создавать алгоритмы для управления различными роботами: к примеру, Lego WeDo 2.0 или Mirobot.

Cubetto

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

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

AERobot

Далеко не все школы могут себе позволить приобретение робота. Другое дело, если он стоит всего 11 долларов. Такова примерная цена AERobot — небольшого устройства, оснащённого несколькими датчиками и способного выполнять запрограммированные команды. Его придумали несколько исследователей из Гарварда, увлечённых идеей дать возможность школьникам из развивающихся стран поиграть с настоящим роботом, попутно обучаясь программированию.

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

Robbo

Создатели Robbo мечтают вдохновлять детей на изучение окружающей среды и решение практических проблем. Устройства выполняют команды пользователя, которые пишутся на визуальном и простом языке программирования Scratch.

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

Root

Робот Root, разработанный в Гарварде – это глазастый шестиугольник, наводящий на мысль о роботах-пылесосах или детях из рассказа Брэдбери. У робота есть сканеры и бамперы, позволяющие передвигаться, следовать заданной траектории и избегать препятствий. Кстати, Root умеет ездить не только по полу, но и по школьной доске, а также рисовать и стирать нарисованное. Для управления роботом нужно установить приложение Square на iPad.

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

Бонус: игра «Битва Големов»

На первый взгляд, «Битва Големов» – это обычная настольная игра, но на самом деле авторы заложили в нее многое. Цели этого российского проекта – обучить детей программированию, зародить в них интерес к робототехнике, посеять начальные знания и дать навыки, необходимые затем для погружения в мир интернет-технологий. Проект совмещает основы алгоритмики, работы с исполнителями, принципы построения и выполнения программ, основные алгоритмические конструкции, пространственное мышление и логику команд для роботов-исполнителей, основы программных конструкций типа условий и циклов. И всё это без использования компьютеров!

Для iPad — образовательного приложения для кодирования. Приложение позволяет программировать роботов, дронов и музыкальных инструментов на Swift — языке от Apple.

“Несмотря на то, что Swift предназначен в первую очередь для разработчиков iOS и mac OS, приложение также позволит понять общие концепции программирования, зная которые, можно смелее начать изучение любого понравившегося языка программирования и углубляться в его тонкости”, — говорит Илья Вислоцкий, руководитель департамента разработки Stack Group.

“В прошлом, если человеку захотелось разобраться, как работают программы, или хотел попробовать себя в программировании, то у него не было выбора, кроме как сразу использовать профессиональные IDE”, — отмечает Илья Вислоцкий. Сейчас создано уже довольно много учебных программ, они позволяют привлечь детей в программирование и разобрать основные конструкции алгоритмизации (условие, цикл, подпрограммы). «Я сам часто играю в подобные игры, например Lightbot. На мой взгляд вдвойне полезно, если программа ограничивает алгоритм по количеству операций, так как задание можно выполнить множеством способов, стремясь к самому эффективному», — добавляет Максим Бекурин, тренер по робототехнике центр «Техноit».

А вот аналогов в формате приложения для планшета, даже немного схожих по функционалу и назначению, нет. В Swift Playgrounds пользователь может мгновенно увидеть созданный им код и напрямую управлять устройствами — уроки программирования станут еще увлекательнее и более наглядными. С помощью Bluetooth приложение легко подключается к разным роботам и дронам от нескольких компаний.

Универсальная платформа взаимодействует с пятью моделями:

  1. С помощью популярного набора LEGO MINDSTORMS EV3 миллионы детей по всему миру могут кодировать и управлять моторами и датчиками своих учебных роботов.
  2. Роботизированный шар Sphero SPRK + умеет вращаться, катиться, поворачиваться, ускоряться и менять цвет. С Swift Playgrounds станет возмножным контролировать шар с помощью датчиков, обеспечивающих обратную связь.
  3. Под управлением кода на Swift дроны Parrot Mambo, Airborne и Rolling Spider могут взлетать, приземляться, поворачиваться и выполнять различные трюки.
  4. Робота UBTECH Jimu Robot MeeBot Kit можно запрограммировать и научить его ходить, наклоняться и танцевать.
  5. Робот от Wonder Workshop иллюстрирует основные принципы написания кода. С Swift Playgrounds он поможет ученикам младших классов изучить программирование на практике.

“Возможность подключения к нескольким роботам является безусловным плюсом, создавая этим самым дополнительное направление изучения робототехники. К тому же, учитывая многолетнюю работу компании Apple, можно с уверенностью сказать, что они будут и дальше развивать это приложение, чтобы оно подходило и для крупных серьезных проектов”, — отмечает Александр Кормильцев, преподаватель отделения политехнического образования Дворца молодежи, Екатеринбург.

Swift Playgrounds совместим со всеми моделями iPad Air, iPad Pro и iPad mini 2, а также с iOS 10 или более поздними версиями.

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

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, в которой есть куча обучающих материалов и примеров разработки. Также посмотри

Программирование виртуальных роботов на языке 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, вы вполне сможете создать простого робота за вечер.

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



Рекомендуем почитать

Наверх