Показаны сообщения с ярлыком программное обеспечение. Показать все сообщения
Показаны сообщения с ярлыком программное обеспечение. Показать все сообщения

29 Май 2008 г.

Искусственный интеллект роботов. Игры

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

Ведь согласитесь, BEAM-роботы хороши, но это ведь каменный век!

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

Тогда я упоминал проект Арена Роботов. Недавно со мной связался создатель этого проекта, Александр Залога, и поинтересовался моим мнением относительно своей Арены.

Также, Александр подкинул пару ссылок на в той или иной степени аналогичные проекты:

  • Robot Warfire - это проект, послуживший основной для Арены Роботов. Все довольно примитивно, однако играть, я подозреваю, было очень интересно. Вкратце: на поле выставляется несколько типов предметов: стена, яма, элемент питания, боеприпасы, вражеский робот, дружественный робот. У самого робота есть 4 слота, смотрящих в разные стороны. В слот можно помещать либо оружие, либо глаз робота. Робот видит соседние клетки, если они примыкают к его глазам. Ну и наконец, пишем суперхитрый скрипт поведения и маневрирования, и вперед, на чемпионат... Скриптовый язык, кстати, очень напоминает Бэйсик. Об этой простой, в общем-то, программке писали даже на Игромании!
  • Описание трехмерной арены роботов можно найти на Delphi Lab. Написано, правда, не русскими, но зато ребята очень мощно шагнули в графическом плане.

Кстати, самой крутой игрой по части "игрового искусственного интеллекта" я до сих пор считаю игрушку Генерал от NewGame Software. Ничего лишнего, никакой графики, но уж очень интересно играть. И, как ни странно, безумно реалистично (сочетание реализма и геймплея - это весьма сложная задача для практически любой игры).

Создание игрового ИИ - задача сложная и очень серьезная. Играя в проекты, подобные RoboChamps или Арене Роботов, Вы эту задачу пытаетесь решить.

На самом деле, если бы я стал делать что-то подобное проекту Александра, вот на что я бы обратил внимание в первую очередь:

  1. Позаботился бы о наличии в игре реализма.
    • Выбор типа шасси. У каждого типа шасси свои особенности - разная проходимость, разная скорость передвижения, и т.д. Основные типы шасси: колесное, шагающее, прыгающее, ползающее, гусеничное, летающее, плавающее, амфибия и т.п.
    • Выбор набора датчиков. Тепловые, световые, видеокамера, радары разной дальности, дальномеры и т.п. Набор датчиков сильно влияет на способ выбора цели, скорость наведения, скорость движения по пересеченной местности; на способ обхода препятствий и построения маршрута движения и т.п.
    • Выбор набора оружия. Разная поражающая способность, разный вес, разный нагрев, разное потребление припасов и боезапаса. Я бы даже сделал оружие более приближенным к реальному. Т.е. например, пневматическая стрельба железными пульками; укрепленная на роботе бензопила и т.п.
    • Выбор количества и типа элементов питания. Солнечные батареи, различные аккумуляторы (какие-то работают дольше, но и заряжаются дольше, какие-то всем хороши, но имеют очень большой вес) и т.п. Это будет сильно влиять на зависимость робота от подзарядки.
    • Выбор брони. Ну здесь главное - вес. Чем тяжелее броня, тем сложнее роботу двигаться, а следовательно, тем больше он жрет энергии и медленнее ходит.
    На самом деле, настоящий робототехник действует по сути точно также: выбирает шасси, набор датчиков, тип элементов питания. Ну оружие и броня - только в случае роботов сумо или роботов для чемпионатов по стрельбе в цель.
    Реализм прибавляет игре привлекательность, но важно при этом не забыть о геймплее. Если выбора слишком много - глаза начинают разбегаться, и интерес к игре пропадает, либо сводится к перебору многих сотен вариантов оснащения робота, даже не доходя до главного - до алгоритма его поведения...
  2. Я бы сделал игру достаточно простой в графическом исполнении, но такой, чтобы максимальное число людей могли за игрой наблюдать онлайн. Например, чтобы можно было смотреть за игрой через браузер.
  3. Я бы сделал формат задания роботов и алгоритмов их поведения максимально стандартизированным. Например, есть такой язык RoboML, я о нем написал целую статью в свое время: Язык описания роботов - RoboML.
    Это весьма проработанный язык для описания роботов и их поведенческих функций. Как показывает практика, стандартизация в современном мире - это задача №1. Также, можно использовать стандарты, совместимые с Microsoft Robotics Studio, это еще более перспективное направление. Например, как вам такая идея: робот может работать согласно алгоритмам, созданным в Visual Programming Language? :) Ведь потом благодаря Robotics Studio можно будет перенести наработки алгоритмов на использование с совершенно реальными роботами!
  4. Систему управления я бы организовал из множества блоков "если". Например:
    • Если увидел цель - сближайся на максимальной скорости и тарань ее.
    • Если зарядки осталось 20% - ищи электростанцию.
    • Если зарядки более 20% и никто не нападает - свободный поиск..
    Это обыкновенный алгоритмический способ управления. Все алгоритмы более низкого уровня (поиск пути, захват цели) - пусть будут реализованы внутри игры. И для задания алгоритмов верхнего уровня я бы сделал нормальный обычный интерфейс, можно даже интерфейс на сайте, чтобы никуда не надо было ходить и ничего не нужно было бы скачивать.
    Таким образом, игра будет иметь больше игроков, ведь алгоритм может придумать почти каждый, а на С или на чем-нибудь еще - умеет программировать лишь ограниченное число людей. Даже после появления .Net...
    Но для истинных любителей, конечно, можно оставить альтернативную возможность создания полномасштабной программы управления.
  5. Добавил бы игрокам вселенскую цель, помимо уничтожения друг друга. Ведь сами подумайте, вот например в Арене Роботов. Там есть электростанции, от которых роботы подзаряжаются. Напрашивается следующая тактика: ищем электростанцию, заряжаемся, сидим ждем. Приходит враг - расстреливаем его, заряжаемся снова, ждем дальше. Разве интересно?! А представьте два противника и две электростанции - и сидят ждут друг друга...
    Нужна вселенская цель, которой заканчивается игра. Скорее всего, захват какого-либо артефакта, или флага.
  6. Добавил бы возможность командной игры. Это чрезвычайно важно в любой онлайн-игре. Банальный хороший чат. И как следствие - нужна возможность перепрограммирования роботов "на лету". И еще как одно следствие - необходима возможность создания и сохранения нескольких типов поведения, которые можно быстро, одним кликом мыши, менять друг с другом в процессе игры (типа мирное существование, избегание боев, агрессивность и т.п. Кстати, чтобы перепрограммирование не было слишком частым, лучше всего ввести зависимость этой возможности от наличия на роботе, например, некоего радиоприемника. А вместо радиоприемника ведь всегда можно поставить хорошую пушку, так что возможность перепрограммирования в данном случае компенсируется.

Да, кстати, если вдруг кто захочет такую вот штуковину написать - с удовольствием предоставлю бесплатный хостинг :) Обращайтесь!

19 Апрель 2008 г.

Wiimote + Robotics Studio

Сегодня я хочу рассказать еще немного о замечательном устройстве ввода информации с обратной связью от компании Nintendo - Wii Remote. Для тех, кто забыл, или не знал (я уже о Wii Remote писал) - вот какие, например, возможности дает это устройство:

Этот прекрасный демонстрационный ролик от Джонни Ли (я был просто поражен, когда увидел это видео впервые...), конечно, больше относится к игровой индустрии, однако и для роботов Wii Remote может пригодиться. Например, вот в таком виде:

Это видео сделано французом по имени Альберто Биэтти (Alberti Bietti), который на своем блоге разместил целое руководство по подключению Wii Remote к Microsoft Robotics Studio, и использованию этой связки для управления роботом Lego Nxt. Достаточно вольный и немного укороченный перевод данного руководства я постараюсь привести здесь.

К сожалению, я сам в данный момент не могу себе позволить приобрести Wii Remote, чтобы проверить все, о чем сейчас напишу - на практике, хотя недавно видел этот прекрасный «девайс» в свободной продаже (отдельно от приставки), и обязательно куплю его позже, когда позволят финансовые возможности...

Помимо устройства WiiRemote, для создания описываемой программы, необходимо установить на Вашем компьютере .Net Framework, Microsoft Visual Studio, Microsoft Robotics Studio. Речь будет идти о программировании на C#, и подразумевается, что Вы уже имеете какие-то базовые знания о .Net и C#.

Итак, задача: совместить мощную среду разработки ПО для роботов - Microsoft Robotics Studio - с устройством Wii Remote (обычно его сокращают - до Wiimote).

Задача эта, на самом деле, уже решена на низком уровне совместимости. Так что драйвер мы писать не будем - ведь существует специальная библиотека для этих целей, Managed Library for Nintendo's Wiimote, которую можно свободно скачать с CodePlex.

Создание сервиса

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

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

Кроме того, веб-сервисы реализуют принцип создания "reusable" компонентов. Подробнее об этом можно почитать, например, в соответствующей статье на MSDN (по-английски).

Для создания заготовки для веб-сервиса, вам потребуется выполнить следующую команду (из командной строки, которая, кстати сказать, используется в MSRS очень часто):

dssnewservice /s:wiimoteNxt

Здесь параметр /s задает имя создаваемого сервиса.

Теперь перейдите в каталог (созданный при создании веб-сервиса) 'wiimoteNxt' в папке C:\Microsoft Robotics Studio (1.5)\ (или в другой, куда Вы установили MSRS 1.5). Откройте файл wiimoteNxt.sln (конечно, для этого у вас должна быть установлена среда разработки Visual Studio). Это и есть проект нашего веб-сервиса.

Добавление связей

Теперь, собственно, давайте добавим в проект связь с библиотекой WiimoteLib. Первая проблема, с которой придется столкнуться - это несовместимость версий, поскольку библиотека WiimoteLib была написана под использование с MSRS 1.0, а самая свежая версия - 1.5. Проблема решается просто, снова из командной строки:

dssProjectMigration "D:\wiimote\291133_WiimoteLib\WiimoteCS\WiimoteMSRS"

Параметром задается путь к библиотеке, исправьте, если у вас он другой.

Теперь библиотека совместима с версией 1.5 Robotics Studio, и можно перекомпилировать ее: открываем файл Wiimote.sln из студии, жмем Build, и затем закрываем проект - больше он нам не потребуется.

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

В появившемся окне выбираем вкладку .NET и ищем «Wiimote.Y2007.M06.Proxy» (каждый раз при создании подобных связей - необходимо выбирать сервисы типа Proxy).

Также следует добавить ссылку на «RoboticsCommon.Proxy».

Наконец, для упрощения записи, в начало файла WiimoteNxt.cs потребуется добавить примерно такие директивы «using»:

using wiimote = WiimoteLib.Proxy;
using drive = Microsoft.Robotics.Services.Drive.Proxy;

Благодаря этим двум нехитрым строчкам, мы сможем обращаться к нашим библиотекам максимально просто, поскольку это - алиасы для namespace-ов (область имен, т.е. все имена идентификаторов уникальны в пределах одной такой области). Drive означает двигатель, через этот namespace мы будем обращаться к моторам; область имен wiimote, как нетрудно догадаться - отвечает за хранение классов для манипуляций с нашим одноименным чудо-пультом.

Подписка на оповещения Wiimote

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

Прежде чем начать, следует учесть, что принятые оповещения нужно где-то хранить - для этого прекрасно подойдут существующий в Robotics Studio специальный класс объектов - «порт».

// порт Wiimote (со специальным атрибутом Partner)
[Partner("wiimote", Contract = wiimote.Contract.Identifier, CreationPolicy = PartnerCreationPolicy.UseExistingOrCreate)]
private wiimote.WiimoteOperations _wiiPort = new wiimote.WiimoteOperations();

// порт для оповещений
private wiimote.WiimoteOperations _wiiNotify = new wiimote.WiimoteOperations();

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

Вкратце определение рефлексии звучит так: рефлексия (синоним интроспекция, англ. reflection) — механизм языка программирования, позволяющий во время выполнения исследовать и изменять структуру программы. Один из инструментов рефлексии в C# - это как раз атрибуты.

Об атрибутах можно почитать, например, на сайте GotDotNet.ru.

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

Теперь у нас есть порты, давайте подпишемся на оповещения. Во-первых, в метод Start() после строчки base.Start() следует добавить вот такой код:

_wiiPort.Subscribe(_wiiNotify);

Это означает, что главный порт - _wiiPort - будет пересылать оповещения порту _wiiNotify. Чтобы активировать прием на порту _wiiNotify, добавим еще одну строку:

Activate(
    Arbiter.Receive(true,
                                            _wiiNotify, wiimoteChangedHandler));

wiimoteChangedHandler - это имя еще пока не созданного метода обработчика оповещений. Создадим его:

//wiimote notifications handler
void wiimoteChangedHandler(wiimote.WiimoteChanged wiimoteChanged)
{

}

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

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

Обращение к моторам осуществляется, как вы помните, через область имен drive. По аналогии с тем, что мы делали для wiimote, создаем порт для управления моторами (для оповещений нам порт не нужен, т.к. наши простые моторы не имеют обратной связи):

// Точно также, создаем порт с атрибутом Partner
[Partner("drive", Contract = drive.Contract.Identifier, CreationPolicy = PartnerCreationPolicy.UseExistingOrCreate)]
private drive.DriveOperations _drivePort = new drive.DriveOperations();

Теперь вставим в обработчик оповещений от wiimote код для отсылки управляющих сигналов нашим моторам. Это достаточно просто:

void wiimoteChangedHandler(wiimote.WiimoteChanged wiimoteChanged)
{
    //для простоты дальнейшего горизонтального управления, меняем друг с другом X и Y
    float x = -wiimoteChanged.Body.AccelState.Y;
    float y = wiimoteChanged.Body.AccelState.X;

    //создаем управляющий сигнал для мотора
    drive.SetDrivePowerRequest request = new drive.SetDrivePowerRequest();
    //кстати, есть конструктор, который сразу же позволяет задать скорости, вот так:
    //drive.SetDrivePowerRequest request = new drive.SetDrivePowerRequest(leftSpeed, rightSpeed);
    // Здесь же мы зададим скорости вручную, вычислив их как разность координат:
    request.LeftWheelPower = y + x;
    request.RightWheelPower = y - x;
    //собственно, отсылаем наш управляющий сигнал!
    _drivePort.SetDrivePower(request);
}

Собственно, почти все.

Запускаем наш сервис

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

Файл манифеста можно указать следующим образом через командную строку:

dsshost -port:50000 -tcpport:50001 -manifest:"wiimoteNxt/wiimoteNxt.manifest.xml" -m:"samples/config/Lego.NXT.Tribot.manifest.xml"

Также можно указать файл манифеста в свойствах проекта - это может потребоваться при отладке:

Варианты командной строки для других роботов:

  • Lego NXT robot (Tribot или любой другой робот с двумя отдельно управляемыми моторами): "samples\config\LEGO.NXT.TriBot.manifest.xml"
  • Tribot - симуляция: "samples\config\LEGO.NXT.TriBot.simulation.manifest.xml"
  • BOE-Bot: "samples\config\Parallax.BoeBot.Drive.manifest.xml"
  • iRobot: "samples\config\iRobot.manifest.xml"
  • iRobot Create - симуляция: "samples\config\IRobot.Create.Simulation.xml"

Весь проект можно скачать с сайта Альберто Биетти.

6 Апрель 2008 г.

Программирование в Palm OS

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

Хороший обзор возможностей программирования в Palm OS представлен в статье «Операционная система PalmOS для программиста» на CitForum.

Ознакомительная статья по CodeWarrior имеется на Ладошках. Там же, в колонке справа внизу - еще много статей по Palm OS. Читаем!

Много хороших ссылок в данном направлении дано на OpenNet. В частности, оттуда узнал, что даже интерпретатор Perl пытались в свое время сделать для Palm OS. Я лично Perl обожаю - насколько это вообще можно сказать, Perl - мой любимый язык программирования. И с Linux/Unix системами знаком очень близко, однако в качестве десктопа предпочитаю все же Windows. Но, не будем отдаляться от темы...

Еще один очень полезный ресурс по Palm OS расположился на Исходниках. Что может быть лучше, нежели чем иметь перед глазами готовые примеры? Ничего! Правда, большинство представленных исходников написаны под PRC-tools (для Linux/Unix систем), но приспособить их решения под CodeWarrior - дело пяти минут. Помимо исходников, данный сайт предлагает такие очень полезные вещи, как, например, SDK для Palm-ов, Sony CLIE и др. устройств и компонентов, с которыми можно работать в Palm OS. SDK я себе скачал первым делом!

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

Как Вы уже поняли, я занят собственно написанием кода. Есть успехи: написал весь пакет CommPort, немного кода уже есть и в RobotMain. Уже сейчас проект нормально компилируется, умеет опрашивать COM-порт, и т.д. В данный момент занимаюсь проработкой модуля DBConnect (сохранение и загрузка данных из PDB-файла). Времени все это занимает не очень много, но у меня много и нету - как всегда, работа и семья съедают это время очень проворно :)

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

И еще одна не слишком, конечно, приятная новость, состоит в том, что, судя по всему, RoboNews.info загнулся окончательно. Уже больше месяца сайт не рожает новостей, ну, что же делать... Я создателям сразу говорил, что на энтузиазме они долго не протянут.

Зато пришла заявка в каталог Robotics.Ru: Робототехника в России - просится туда сайт Roboto.Ru, на первый взгляд мне понравился, да и контент уникальный. Буду пытаться связаться с владельцами, договориться о сотрудничестве... :)

23 Февраль 2008 г.

Еще о Microsoft Robotics Studio

Не совсем прав был я, говоря, что хороших материалов по Robotics Studio в природе не существует.

Заполняя свой каталог робототехнических сайтов, обнаружил блог Евгения Марченкова, разработчика из Microsoft, и серию статей в нем - о Robotics Studio! Статьи достаточно занимательные, вот собственно ссылки:

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

6 Февраль 2008 г.

Robotics Studio Maze Simulator

Продолжая тему Microsoft Robotics Studio, и ее симуляционной среды, нашел неплохой инструмент для редактирования мира той самой симуляционной среды - Microsoft Robotics Studio Maze Simulator.
Если вкратце - он может формировать местность симуляционного мира, принимая на вход обычный монохромный графический файлик. Вот что получается в итоге:

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

Более продвинутые пользователи Robotics Studio продолжают создавать своеобразные шедевры, например, вот оцените - виртуальный музей:

14 Январь 2008 г.

RoboRealm. Машинное зрение.

Для начала, хочу сообщить, что вот уже 6 дней мой сайт о том, как сделать робота, имеет ежесуточную посещаемость более 80 человек. За 14 дней января, общее количество уникальных посетителей превысило это же количество за весь ноябрь.

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

Таким людям очень рекомендую ознакомиться с парой рекомендаций от Маула. Ибо я человек терпимый, но кнопку «Пометить как спамера» никто не отменял...

Что же касается e-mail, иногда бывает, что отписываешься человеку, и не получаешь от него более ничего. Это, конечно, тоже не слишком приятно...

Но, хватит о грустном! Вот на затравку: не так давно раскопал один занимательный блог - dxdt.ru. Очень много интересного, на технические темы, причем, больше половины - про роботов.

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

Вот, например, видео, с демонстрацией того, что может RoboRealm:

Кстати, нашел немного информации о RoboRealm и на русском языке: на робофоруме и на отдельном сайте о RoboRealm.

Более подробно расскажу после того, как познакомлюсь с этой программкой поближе.

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

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

26 Декабрь 2007 г.

Меня полюбил Гугель

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

Кстати, работаю над созданием еще одной статьи, про Robotics Studio - никак не могу дописать, из-за этой предновогодней суеты...

Но это все собственно не совсем то, о чем я хотел написать это сообщение!
Все дело в том, открою вам секрет, что меня (а точнее мой сайт про то, как сделать робота) полюбил Google!

Во-первых, после произведенных исправлений и их переиндексации, значительно улучшились позиции моего сайта по требуемым запросам. Восстановилась посещаемость - до 55-75 человек в сутки. Общее количество посетителей давно обогнало прошлый месяц, и сейчас перевалило за 1300 уникальных человек. И самое главное - буквально недавно сайт вылез на пятое место и на Google.Ru, и на Google.Com - по запросу робот(!).

Лично мое мнение о причинах такой любви - очень простое. Google любит Blogger, а у меня на Blogger'e - этот блог, в котором почти в каждом посте есть ссылки на основной сайт. Кстати, сам блог я сегодня обнаружил на второй странице по запросу робототехника, плюс к тому, он еще на первом месте, например, по запросам робот кпк и блог робототехника, и в топе по некоторым другим запросам, например, секс с роботами и блог роботы. Думаю и дальше стараться захватывать с помощью блога максимум низкочастотных запросов, что будет для уважаемых читателей, безусловно, весьма полезно - так как появится множество новых статей.

Что касается Яндекса - Яндекс любит ya.ru. Из всех зеркал этого блога, несмотря на то, что в каждом таком зеркале есть ссылки на оригинал сообщения - тем не менее, в поиске Яндекс показывает insiderobot.ya.ru - и чаще, и выше, чем любые другие зеркала или этот блог.

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

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

Это, безусловно, дало хорошие результаты, например, запрос как сделать робота в Яндексе выдавил мой сайт на первое место, да и в Google - уже в топе (google.ru - 4, google.com - 5), но гугл, он ведь всегда медленнее меняет место сайта...

Но самое интересное заключается вот в чем:
Я совершенно случайно заглянул в старый запрос создание робота, и с превеликим удивлением обнаружил свой сайт, уже обновленный - без слова «создание» в заголовке, - на первом месте в Яндексе и Google.com(!), и на третьем месте - на Google.ru. При этом вообще слово «создание» встречается в тексте первой страницы 2 раза, анкоров с этим словом - отсилы 2-3 штуки...

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