четверг, 10 января 2008 г.

Навигация роботов

Очередной выпуск из серии «Интернет о роботах», на этот раз - немного тематический.

Прежде всего, хочется немножко рассказать о навигации. Как я уже не раз говорил, навигация, несмотря на кажущуюся ее обыденность, является весьма нетривиальной задачей в робототехнике.
Например, одна из классических задач роботостроения - следование линии, нарисованной на полу. Воплощается с помощью тех или иных разновидностей фотодатчиков.
Еще из классики - объезд препятствий, согласно показаний датчиков касания (типа «бампер»).
Помимо стандартного объезда препятствий, для грамотного ориентирования и передвижения робота нужны системы обратной связи, по которым бы происходило постоянное корректирование текущего запомненного положения. Обратная связь может осуществляться множеством методов, от обыкновенных датчиков поворота колеса, до лазерных дальномеров, GPS, веб-камер, систем ориентирования по маякам.
Даже если текущее положение уже известно, что скажете о построении маршрута движения из точки в точку? Я по этому поводу уже писал в статье «Алгоритмы поиска пути для роботов».
Ну а если карта местности неизвестна? Конечно же, требуется ее вычислить и построить на лету! Подход к этой задаче - не слишком исследован и далеко не однозначен.
Ну и наконец, вот представьте, высадили автономного робота на Марсе. Что ему делать? Видимо, исследовать показания датчиков, составлять примерную карту местности, двигаться в направлении наиболее интересных районов... Здесь уже настолько много вариантов, настолько много опасностей, что без методик искусственного интеллекта, наверное, не обойтись!

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

Ветеринарный Центр «Животный Мир», прекрасный кандидат в список «Интересное в неожиданных местах», который я начал составлять еще в прошлом выпуске серии «Интернет о роботах» - спрятал в своих недрах несколько интересных мыслей по навигации.

Многие датчики, используемые при навигации робота, описаны мной на моем сайте о самодельном роботе, в разделе Датчики робота.
Из неописанного:

На английском языке доступен сайт проекта Carmen (Carnegie Mellon Robot Navigation Toolkit), это софт с открытым исходным кодом - для навигации робота. Его использование позволит многим сохранить массу собственного времени. С другой стороны, если Вам требуется лишь реализовать банальный объезд препятствий - лучше используйте собственные изыски, быстрее и полезнее!

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

среда, 9 января 2008 г.

Microsoft Robotics Studio: первое знакомство

На сайте Microsoft информация о Robotics Studio очень поверхностна, а страничка на русском языке - вообще, изобилует неработоспособными ссылками (на сегодняшний день).
Полезный материал о Robotics Studio - мне удалось найти в виде видеозаписи 9го канала, где Павел Хижняк, один из разработчиков Robotics Studio, по-русски и очень доступно демонстрирует возможности Robotics Studio.
Видеозапись весит 69Мб, и доступна для скачивания на сайте GotDotNet.Ru - очень рекомендую ознакомиться, если, конечно, Ваш интернет-канал позволит это сделать.
Также, существует еще видеозапись + презентация в формате PowerPoint 2007 на сайте Платформа 2008, общим весом 8Мб, правда, информации там гораздо меньше...

В любом случае, надеюсь, не менее полезным будет мой собственный опыт знакомства и работы с Robotics Studio, изложенный ниже.

Для начала, проясним, что это вообще такое. Как не трудно догадаться, Microsoft Robotics Studio - это система, специально созданная для разработки программного обеспечения для роботов. Причем, в основном, для «конструкторов» роботов (т.е. заготовок из модулей, которые Вы можете собирать в домашних условиях и перепрограммировать на свой вкус) - таких как iRobot Create, LEGO Mindstorm, и т.д.

Инсталляционный пакет представляет из себя exe-файл, который весит всего 82Мб. Его можно преспокойно скачать с microsoft.com. Процесс установки прошел очень гладко. Замечу, что, желательно, кроме Robotics Studio установить еще .NET 2 и DirectX, иначе система будет работать не в полную силу. В частности, DirectX требуется для симуляционной 3D-среды, которую я подробно опишу позже.

Вообще, разработчики Robotics Studio - молодцы. Они правильно выделили современные проблемы роботостроения и пошли по пути популяризации этого прекрасного направления науки и техники. Теперь многие вещи, ранее доступные лишь профессиональным роботостроителям, отдающим робототехнике огромное количество личного времени - доступны даже любителям. А раз уж даже Microsoft активно ведет линию робототехники (вспомните еще, например, робота WiMo, о котором я писал в статье «Роботы и КПК»), то и уважаемым читателям рекомендую эту линию не оставлять!

Возвращаясь к нашим баранам: помимо того, что компоненты Robotics Studio прекрасно и автоматически интегрируются в среду разработки Visual Studio, этот продукт содержит два основных модуля, призванных помочь робототехникам-любителям, таким как я, например. Это модули - Visual Programming Language (VPL, визуальный язык программирования) и симуляционная среда.

Язык VPL обеспечивает возможность программирования роботов визуальными методами. Диаграммы VPL кодируются с помощью XML-схем и представляют, на мой взгляд, одну из очень немногих удачных попыток создания полностью визуального языка программирования. Конечно, базовые навыки алгоритмического мышления все равно потребуются, но зато совсем необязательно знать синтаксис C#, или, например, что такое анонимные делегаты. Согласитесь, это очень важный шаг! Ведь многие робототехники - очень посредственные программисты, и облегчить их труд - прекрасная идея.

Второй важный модуль Robotics Studio - симуляционная среда. Она реализует поистине классную идею, а именно - о том, что для программирования роботов Вам сами роботы, в принципе, и не нужны! Симуляционная среда является графической 3D-моделью, отображающей действия роботов, и объекты, которые роботов окружают. Например, если в модели присутствует шарик, то Вы можете подогнать робота к шарику и откатить этот шарик куда-нибудь. Физические моменты настолько глубоко продуманы, что становится возможным даже моделирование переворотов роботов, отрыва роботов от земли, столкновения объектов - все что угодно. Одним из примеров использования симуляционной среды является моделирование ринга сумо-роботов (которые стараются вытолкнуть друг друга за пределы ринга). Эта симуляция поставляется в виде аддона, который можно скачать там же, где и саму Robotics Studio.

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

VPL описывает в основном некоторые модули робота, и их связи друг с другом. Модулями робота могут быть разнообразные датчики (расстояния, касания, света и т.д.), веб-камера, устройство GPS-навигации (кстати говоря, производимое компанией Microsoft, что еще раз говорит о серьезности намерений мирового софтверного гиганта в отношении робототехники), моторы и сервоприводы, динамики, светодиоды, различные индикаторы, дисплеи и тому подобные устройства. Кроме того, модулями в Robotic Studio могут выступать специальные диалоговые окошки, например, для ручного дистанционного управления роботом.

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

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

Применительно к VPL также обязательно необходимо сказать о манифестах. Манифесты - это своеобразные драйверы низкого уровня, или, с другой стороны - конфигурации той или иной программы VPL. Идея состоит в том, что одна и та же программа, в принципе, может выполняться на различных роботах, несмотря на то, что на низком уровне управление реализуется неодинаково. Благодаря манифестам, чтобы перенести программу VPL с одного железа робота на другое - нужно всего-то выбрать манифесты соответствующего робота для основных модулей диаграммы. Тем же самым образом - с помощью специальных «Simulation»-манифестов - реализуется перенос программы в среду симуляции. Несколько манифестов - для наиболее популярных существующих конструкторов роботов - присутствует в базовой поставке Robotic Studio. Также есть все возможности для создания собственных манифестов.

Перейдем, наконец, к примерам. В качестве задачи я выбрал создание простейшего робота, способного объезжать препятствия. У этого робота - два датчика касания, и два мотора: мотор поворота и мотор движения. Этого же самого робота я описывал в своей статье о RoboML.

Давайте попробуем запрограммировать такого робота с помощью Microsoft Robotics Studio, и запустить его симуляцию в какой-нибудь подходящей симуляционной среде.

Открываем среду VPL, видим слева список модулей робота. Добавляем на диаграмму два модуля GenericMotor, один модуль GenericContactSensors и один модуль Timer - он потребуется для реализации отъезда назад на небольшое расстояние при объезде препятствий.

Теперь нам нужно определиться, что будет происходить при смене показаний датчиков. Для этого добавляем модуль условия (if-then-else) на диаграмму, и создаем нотификацию на Replace от датчиков касания. Нотификация (оповещение о событии) создается очень просто. На любом модуле в диаграмме есть квадратики слева, и кружочек с квадратиком - справа. Это своеобразные входы и выходы данного модуля (выход для события обозначается кружочком). Если перетащить выход одного модуля ко входу другого, между ними образуется связь.

Уточню еще один неочевидный момент - содержимое блока if-then-else. Здесь Вам очень помогут раскрывающиеся списки с подсказками, которые появляются при попытке набрать что-либо в поле условия. У меня условий было два, и записывались они так: Sensors[0].Pressed и Sensors[1].Pressed. Иными словами, сработал ли первый датчик (левый), или второй (правый). Количество датчиков и соответствие номеров датчиков их положению - определяется в зависимости от выбранного манифеста, для робота, которого мы будем использовать.

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

Итоговый вид диаграммы:

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

Но зато, я бросил взгляд на «внутренности» получившейся диаграммы. Это, конечно же, XML-файл. Было очень интересно сравнить практический и работающий XML для описания роботов от Microsoft - с теоретическим и не имеющим практических реализаций RoboML.
Представляю фрагмент XML-кода от Microsoft:

<Connections>
  <Connection>
    <Name>link</Name> 
    <To>program.activity.Start.__use__0.snippet.snippet.join.TargetPower.sink</To> 
    <From>program.activity.Start.__use__0.snippet.snippet.expr.source</From> 
  </Connection>
  <Connection>
    <Name>link0</Name> 
    <To>program.activity.Start.__use__0.snippet.snippet.expr.sink</To> 
    <From>program.activity.Start.__use__0.snippet.snippet.noop.source</From> 
  </Connection>
</Connections>

Здесь представлено всего лишь описание двух связей...

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

Анализируя XML, я понял, что сравнивать RoboML и Microsoft Robotics Studio XML сложно, поскольку они описывают, в принципе, одно и то же - но с разных сторон. XML от Microsoft гораздо более практичен, приближен к деталям, к реализации. И весьма ограничен - вся диаграмма записывается в виде заранее жестко предопределенных блоков (их можно создавать самостоятельно, но исключительно). В то же время, RoboML - абстрактен, даже роботов он описывает не алгоритмическими конструкциями (например if-then-else), а математическим языком.

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

Продолжение следует...

Игры о роботах

Вот и кончились праздники!

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

Кто-то скажет, что это хлам, но мне очень нравится. Так что в эти выходные играл, например, в такие игры как Sven и Warcraft 1.

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

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

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

Начнем с самого старого. Как известно, одной из самых интересных идей в робототехнике является построение боевых роботов, а этим знаменита целая вселенная из серии ролевых игр AD&D - BattleTech.

Вот как, примерно, выглядит настольная игра серии BattleTech:

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

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