Роботы, которые видят, слышат, говорят и двигаются… (с помощью Java)
В нашем очень быстро развивающемся мире робототехника играет огромнейшую роль. Сегодня существует масса роботов, начиная с тех, которых производят в обычной промышленности, для выполнения различных механических задач, поисково-спасательных роботов, которые спасают жизни людей, ползая под обломками разрушенных строений, до межпланетарных роботов-исследователей, которые зондируют просторы бесконечного космоса. Все эти роботы используются преимущественно для выполнения слишком скучной, дорогостоящей и опасной для человека работы.
Однако чтобы разработать эффективную и не слишком дорогую роботизированную систему, нам необходима технологическая инфраструктура, которая была бы достаточно стойкая и долговечная. В нашем мире, где появляется все больше и больше разнообразных устройств и операционных систем, которые в корне отличаются друг от друга по возможностям и методам проектировки, вполне логично, что инфраструктура робототехники не должна зависеть от какого-либо устройства, либо операционной системы. Кроме того, в сферах, занимающихся исследованиями космоса, поставщики управляющих систем могут меняться неожиданно и достаточно часто.
Еще во время ранних попыток исследования луны, когда исследователи обнаружили, что их оборудование неожиданно оказалось неработоспособным, согласно их техническим руководствам, они должны были остановить все оставшееся диагностическое оборудование. Что они, собственно, незамедлительно и сделали. Однако для марсианского вездехода, который находится на чужой планете на расстоянии приблизительно 141 миллиона миль от Земли, никто не сможет произвести подобные действия так быстро. Робот, находясь на “красной” планете, в поисках инопланетной жизни не может позволить себе “синий экран смерти”.
Причем здесь Java?
Для того чтобы существовать и жить в этом мире, человеку необходимо, как минимум, видеть, слышать, говорить и двигаться. Но чтобы выполнять все эти функции, свойственные человеку, роботизированные системы должны иметь возможность эмулировать их с помощью программного обеспечения. Java-технология предлагает целый ряд API, которые могут удовлетворить всем потребностям возникающим при изготовлении подобных систем в сфере робототехники. Java Speech API дает возможность строить командно-контрольные системы для распознавания человеческой речи, системы диктовки, а также возможность синтеза речи. В свою очередь Java Media Framework используется для получения и обработки визуальных изображений.
Саймон Риттер (Simon Ritter) – это технологический эксперт компании Sun Microsystems. Он знаком и работает над множеством различных аспектов Java-технологии. Но помимо этого, Саймон является еще и лучшим специалистом использования Java-технологии в мире робототехники. Он разработал Robotics Software Development Kit (инструментарий для разработки программной начинки роботов на Java) и регулярно демонстрирует невероятные роботизированные системы, построенные им с помощью Java-технологии. Среди этих демонстрационных показов представляются небольшие, не ресурсоемкие роботы, которые используют блок LEGO Mindstorms RCX. Риттер предоставляет детальные инструкции (как для аппаратной части, так и для программной) для построения, программирования и разворачивания его разнообразных LEGO-роботов.
Для Риттера, превосходство стандартных Java API, касающихся робототехники, над другими имеющимися средствами в том, что с помощью Java, процесс разработки значительно упрощается, позволяя сконцентрироваться исключительно на логических аспектах поставленной задачи. Таким образом, вам не обязательно вникать в особенности и тонкости каждой, индивидуальной роботизированной системы.
И чтобы вы не думали, что заниматься робототехникой на основе Java-технологии невозможно, если только ты не являешься разработчиком соответствующей компании корпоративного масштаба, Риттер обращает ваше внимание на следующие немаловажные моменты. Движок синтеза речи для робототехники можно приобрести приблизительно за 30 долларов США, веб-камеры сегодня стоят не больше 100 долларов США, ну а блок LEGO Mindstorms можно купить приблизительно за 200 долларов США.
Распознавание речи
Java Speech API (JSAPI) предоставляет достаточно простой, но очень функциональный интерфейс к системе работы с речью. Он включает элементы, как для распознавание речи, так и для ее синтеза. “Java Speech API сам по себе не содержит самой системы для распознавания и синтеза речи”, - объясняет Риттер. “Он является просто интерфейсом для работы с этими системами”.
Существует ряд недорогих систем, которые вы можете использовать с Java Speech API. “В приложении, которое я использую в своих демонстрациях, я применил движок IBM ViaVoice”, - говорит Риттер. “Это относительно новая технология, и IBM сделала очень доброе дело, выложив свою реализацию Java Speech API, которую вы можете скачать совершенно бесплатно с сайта AlphaWorks”. А цена на сам движок ViaVoice была подобрана достаточно разумно. Менее чем за 30 долларов США, разработчики могут снабжать свои Java-приложения возможностями распознавания и синтеза речи.
Ключевой функциональностью в распознавании речи у JSAPI является так называемый командно-контрольный распознаватель. “Вы просто определяете несколько слов, которые хотите, чтобы система смогла распознать, - говорит Риттер, - и после устанавливаете соответствующие события, которые будут вам посланы, когда система распознает то, или иное слово“. Формат грамматики (Grammar Format) в Java Speech API позволяет задать слова, которые система должна распознавать. “Это предоставляет нам платформонезависимый вариант контроля над распознавателем речи”, - добавляет Риттер.
Пример грамматики для Java Speech API
grammar robot;
public <stop> = stop {stop};
public <left> = [Turn] left {left};
public <right> = [Turn] right {right};
public <forward> = [Go] Forward {forward};
public <reverse> = [Go] Back {back};
public <bye> = ([Good] Bye) | So long {bye};
"С помощью этого кода, я определяю набор слов, которые хочу, чтобы система распознавала, - объясняет Риттер, - а после – события, которые хочу получать при распознавании того или иного слова. Также я могу сделать систему более умной, например, добавив несколько вариантов прощания: ‘bye’, ‘good bye’ или ‘so long’. Для всех этих слов, в случае, если они будут распознаны, в программу будет возвращено одно и то же событие".
Java Speech API может также использоваться и для систем диктовки, которые предлагают, по существу, расширенный набор функциональности командно-контрольного распознавателя. Вместо того чтобы искать отдельное слово/команду, такая система обрабатывает каждое сказанное слово для использования в текстовых процессорах или же web-браузерах
Ниже приведен код, который использует непосредственно заданную JSAPI-грамматику. Для того чтобы сократить объем статьи, более полную версию этого кода смотрите в SDK робототехники от Риттера (смотри ссылки в конце этой статьи).
Пример кода для создания обработчика событий согласно заданному файлу грамматики
import javax.speech.*;
import javax.speech.recognition.*;
// Создание распознавателя и распределение ресурсов
Recognizer recognizer = Central.createRecognizer(null);
recognizer.allocate();
/*
* Добавление обработчика – для оповещения, когда речевой движок остановлен,
* запущен и т.д.
*/
recognizer.addEngineListener(engineListener);
// Чтение файла грамматики
File gf = new FileReader(grammarFile);
RuleGrammar rules = recognizer.loadJSGF(gf);
/*
* Добавления обработчика. VoiceListener вызывается тогда, когда определенное
* грамматическое слово распознано. Событие, которое связано с этим словом,
* передается этому методу обработки
*/
rules.addResultListener(new VoiceListener());
// Сообщает распознавателю о необходимости принять изменения
recognizer.commitChanges();
// Системный запрос на получение управления над микрофоном
recognizer.requestFocus();
// Начинаем слушать
recognizer.resume();
// Не забывайте про “отлов” исключений
Пример кода для получения и обработки речевой команды
import javax.speech.*;
import javax.speech.recognition.*;
// Вызывается, когда распознано какое-либо слово из файла грамматики
public class VoiceListener extends ResultAdaptor {
public void resultAccepted(ResultEvent re) {
FinalRuleResult result = (FinalRuleResult) re.getSource();
// Получаем и анализируем грамматический тэг
String[] tags = result.getTags();
System.out.println("First tag was :" + tags[0]);
}
}
Синтез речи
С противоположной стороны голосовых возможностей робота лежит ни что иное, как синтез речи. Специально для этого был разработан язык Java Speech API Markup Language, который улучшает функциональность и усовершенствует произносимый текст. “Мы можем выбрать конкретный голос, - говорит Риттер, - в зависимости от системы, которая используется вместе с JSAPI. Мы также можем добавлять контекстную информацию о том, как именно нужно произносить разные вещи. Например, в случае, когда нужно сказать ‘JXML’, необходимо, чтобы система произнесла это слово не иначе, как четыре буквы”.
По некоторым исследования и оценкам, лишь 10% информации воспринимается при вербальном общении из непосредственно произносимых слов. Поэтому для того, чтобы сделать синтезируемую речь более информативной и понятной, как если бы ее произносил человек, очень важно включать элементы расстановки, громкости, длительности, также как и ударения/выделения. “Очень много информации поступает именно от расстановки, громкости и длительности произносимой речи”, - говорит Риттер. “Если мы хотим, чтобы компьютер звучал более реалистично, нам нужно каким-то образом эмулировать эти характеристики человеческой речи”.
Пример использования Java Speech API Markup Language
Контекстная информация:
<sayas class="literal">JSML</sayas>
Выделение слова интонацией:
Java technology is <emphasis>cool</emphasis>
Просодия:
This car, <prosody volume="-20%">but not this one</prosody>, is new
Ниже приведен код, который необходим для эффективного синтеза речи в программе, написанной на языке программирования Java.
Пример кода синтеза речи с помощью Java Speech API
import javax.speech.*;
import javax.speech.synthesis.*;
public void say(String words) {
// Создание синтезатора
Synthesizer s = Central.createSynthesizer(null);
// Распределение ресурсов
s.allocate();
// Произношение строки
s.speak(words, null);
Замечание: Последняя версия Java Speech API на данный момент собирается пройти проверку у Java Community Process – Java Specification Request 113 (JSR-113).
Визуальное восприятие
При существовании человека наиболее ключевое свойство для навигации им его окружающего физического мира – это зрение. Фактически, как показали исследования, половина человеческого мозга занята непосредственно поддержкой обработки визуальной информации. Поэтому естественно, что это также является ключевым приспособлением для многих роботизированных систем. Но опять же, аппаратные средства для организации подобных функций у роботов на удивление легко доступны. “USB-web-камеры, в действительности крайне не дороги в наше время”, - говорит Риттер.
Существует два базовых метода для доступа к визуальным данным из роботизированной системы на базе Java-технологии. Самый быстрый и простой метод – это использование интерфейса TWAIN. “TWAIN начинал свое существование, как интерфейс для соединения сканнеров и персональных компьютеров, - объясняет Риттер, - но теперь он расширен с тем, чтобы дать программистам возможность работать с такими устройствами, как web-камеры. Группа выходцев из Словакии на данный момент создали интерфейс Java/TWAIN, и, если вы некоммерческая организация, то вы можете скачать его совершенно бесплатно. Это позволит вам получать изображения из TWAIN-устройства и создавать из него изображение Java AWT, которое впоследствии можно легко обработать”.
Но, будучи простым в использовании, интерфейс TWAIN представляет телевизионный пользовательский интерфейс, оставляя множество параметров изображения, которые невозможно менять путем программирования. Плюс к этому, TWAIN первоначально спроектирован для получения одиночных изображений. “Когда я использовал TWAIN для демонстрации, - говорит Риттер, - я должен был получать приблизительно один фрейм в полторы секунды. Это уже больше напоминает слайд-шоу, особенно, если вы хотите делать обработку в реальном времени”.
Пример кода для доступа к изображениям снятым web-камерой (интерфейс Java/TWAIN)
// Создание TWAIN-объекта
Twain t = new Twain();
/* Отключаем телевизионный пользовательский
* интерфейс TWAIN
*/
t.setVisible(false);
// Настраиваемся получить 20 изображений
t.setTransferCount(20);
// Получаем AWT-изображение
Image i = Toolkit.getDefaultTookit().createImage(new TwainImage(t));
Наиболее богатый по возможностям и гибкий для программирования метод управления web-камерами – это метод с использованием Java Media Framework (JMF). Изначально, JMF был спроектирован для того, чтобы обеспечить возможность проигрывания различного типа медиа-информации без привязки к какой-либо конкретной платформе. Но совсем недавно он был расширен и теперь включает возможность проигрывания, захвата изображений, передачи, транскодирования, а также множество различных кодеков (компрессор/декомпрессор) в виде плагинов. Поскольку JMF куда больше поддается программированию, вы можете получить более полный контроль над получаемым изображением, включая управление размером, контрастом, глубиной цвета и многим другим.
Первый шаг к использованию JMF – это определить положение конкретной web-камеры, как устройства, используя CaptureDeviceManager. Следующим шагом вы должны получить источник данных через MediaLocator. Потом установить желаемый формат изображения (зависит от устройства). “С JMF мы получаем более полный контроль над процессом получения изображений”, - говорит Риттер. “Мы можем сами решать, что, например, нам необходимо изображение размером 160x120 пикселей, с заданной глубиной цвета, с заданным контрастом и т.д.”.
Следующим шагом нужно создать Processor, являющийся сущностью JMF. Он, фактически, передает изображение программе. После этого создается источник данных PushBuffer. Как только эта операция завершена, вы можете генерировать поток PushBufferStream через PushBufferDataSource и читать буферы, которые и представляют реальные фреймы из камеры. Эти изображения можно конвертировать в AWT-изображения с помощью метода BufferToImage.
Пример кода для получения изображений с web-камеры с использованием JMF
import javax.media.*;
import javax.media.control.*;
import javax.media.util.*;
// Получаем CaptureDevice, который соответствует определенной web-камере
CaptureDeviceInfo dev = CaptureDeviceManager.getDevice("vfw:USB Video
Camera:0");
Format[] cfmts = dev.getFormats();
RGBFormat fmt = null;
for (int i = 0; i < cfmts.length; i++) {
// Ищем формат с желаемым размером и пр.
fmt = (RGBFormat)cfmts[i];
}
// Получение MediaLocator
MediaLocator loc = dev.getLocator();
// Получение DataSource (из MediaLocator) – источник данных изображения
DataSource src = Manager.createDataSource(loc);
// Получение FormatControls для выходного источника данных
FormatControl[] fmtc = ((CaptureDevice)src).getFormatControls();
/*
* Цикл по доступным объектам FormatControls и попытка установить формат
*/
for (int i = 0; i < fmtc.length; i++) {
if (fmtc[i].setFormat(fmt) != null)
break;
}
// Создание Processor
Processor p = Manager.createProcessor(src);
// Реализация Processor
p.realize();
// Надо ждать до возникновения RealizeCompleteEvent
// Запуск Processor
p.start();
// Получение доступа к PushBufferDataSource
PushBufferDataSource pbSrc = (PushBufferDataSource)p.getDataOutput();
/*
* Теперь можем вернуть PushBufferStream, который позволит нам получить доступ к
* данным из камеры
*/
PushBufferStream[] strms = pbSrc.getStreams();
/*
* Тестирование формата – в рамках предыдущих выбранных параметров
*/
camStream = strms[0];
RGBFormat rgbf = (RGBFormat)camStream.getFormat();
// Подготовка к конвертированию
BufferToImage conv = new BufferToImage(rgbf);
// Получение изображения с web-камеры
Buffer b = new Buffer();
camStream.read(b);
// Конвертирование в AWT-изображение
Image i = conv.createImage(b);
Потом полученное изображение вы можете конвертировать в RGB с помощью класса PixelGrabber. Ну а растровое изображение может быть легко обработано и проанализировано (например, на предмет определения цвета и границ). Java 2D API – это идеальное средство для множества простых способов определения границ/краев, в то время как Java Advanced Imaging API больше подходит для более сложных операций анализа.
Перед тем как планировать реализовать функциональность web-камеры, очень важно осознать разницу между источниками данных PushBufferDataSource в JMF и USB-web-камере. “PushBufferDataSource начнет выдавать изображения от камеры, как только вы создадите его”, - говорит Риттер. “Таким образом, вы получите первое изображение, которое находится в буфере. Следовательно, если мы запустим камеру за четыре секунды до того, как нам понадобится изображение, мы получим то изображение, которое было снято четыре секунды назад”. Поэтому, если вам необходимо получать изображения в реальном времени, необходимо использовать PullBufferDataSource. “Согласно тому, как работает USB-web-камера, - продолжает Риттер, - вы не сможете получить PullBufferDataSource. В этом случае вам нужно писать отдельную нить (поток), которая бы постоянно получала бы изображения из камеры. А как только вам понадобится получить изображение, вы просто запрашиваете очередное у созданной вами нити”.
LEGO Mindstorms Robotics Invention System
Всем тем, кто думает, что мобильная робототехника – это что-то не для рядового Java-программиста совет обратить внимание на следующую систему: LEGO Mindstorms Robotics Invention System. “LEGO пришли на рынок с системой Mindstorms где-то три года тому назад”, - говорит Риттер. “Она была разработана совместно с MIT”.
В сердце этой системы располагается программируемый RCX-блок, небольшой компьютер в желтом корпусе LEGO. Этот блок содержит 8-битный процессор от Hitachi (16MHz), 16 Kb ROM, 32Kb RAM, 3 сенсорных устройства ввода, 3 ходовых вывода, 5-символьный LCD-дисплей и последовательный инфракрасный порт. Этот блок – это маленький и чрезвычайно ограниченный на количество ресурсов компьютер. Это понятно, особенно на фоне сегодняшних стандартов на настольные компьютеры с гигагерцовыми процессорами и сотнями мегабайтами оперативной памяти. “С другой стороны, - весело добавляет Риттер, - для меня этот маленький блок настолько же производителен, как и мой самый первый персональный компьютер”.
![]() |
Рисунок 1. Блок LEGO RCX |
Три выхода этого блока можно подсоединить к моторам или другим устройствам, а три устройства ввода могут соединяться с разнообразными сенсорными устройствами для восприятия света, соприкасания, вращения и даже тепла. Система может выполнять свыше 1000 операций в секунду, а также снабжена полностью многозадачной операционной системой, позволяющей синхронно выполнять до 10 процессов.
В начале блок RCX был спроектирован LEGO специально для того, чтобы его можно было программировать посредством систем на базе персональных компьютеров, которые позволяют визуально собирать функциональные компоненты. Эта система, управляемая компонентами, производит законченные программы, которые впоследствии могут быть загружены в блок RCX.
Но благодаря open-source среде разработки leJOS, открылось множество перспектив для новых изобретений и новых выполняемых функций этого блока. Создателям leJOS удалось сжать обычный вариант Java Runtime Environment (включая поддержку множественных потоков) в 14Kb специально для использования в блоке RCX. Понятно, что leJOS – это совсем не полная реализация Java-платформы. “Это в порядке вещей, не думаю, что кто-то надеялся на это”, - говорит Риттер. “Даже наличие AWT в этой реализации ничего не говорит”. Из-за серьезных ограничений по количеству доступной памяти в блоке, в leJOS не реализован даже “сборщик мусора”, но вот hook’и уже планируют включить в будущих реализациях.
Благодаря leJOS, Java-разработчики теперь получили дешевую (плюс к тому мульти-потоковую) платформу для разработки роботизированных систем. Базовый комплект стоит порядка 200 долларов США.
Для того чтобы проще приспособить блок для обновления до новых версий его операционной системы, он был спроектирован таким образом, что позволяет очень просто загружать в себя новые прошивки от LEGO. Поэтому вы можете без особого труда заменить родную прошивку блока средой leJOS. Первым шагом к тому, чтобы подготовить блок RCX для выполнения программ написанных на Java, в него надо загрузить LeJOS.
lejosfirmdl
“Это порядка 14Kb, - говорит Риттер, - и, не смотря ни на что, это достаточно эффективная Java Runtime среда”.
После этого, для запуска программ на обновленном блоке с поддержкой Java, нужно создать и скомпилировать Java-программу.
lejosc MyClass.java
“Lejosc устанавливает новый bootclasspath, собирает различные классы и пакеты из других classpath-мест, и запускает javac”, - объясняет Риттер. “Таким образом, производится новый class-файл, который практически ничем не отличается от обычных class-файлов, которые вы обычно получаете при компиляции нормальных частей Java-кода”. Однако, для того, чтобы сделать эту программу выполняемой на блоке с ограниченным количеством ресурсов, вы должны создать специфичный для RCX бинарный файл. Это повлечет за собой отбрасывание частей class-файла, которые несут за собой ненужную информацию.
lejos –o MyClass.bin MyClass
И, наконец, бинарный файл нужно загрузить (с помощью последовательного инфракрасного порта) в блок RCX.
lejosrun MyClass.bin
Для того чтобы запустить уже загруженную программу, вы просто нажимаете кнопку “start” на панели блока. Но 5-символьный LCD-дисплей – это единственное устройство вывода, поэтому процесс отладки программ зачастую бывает очень изнурителен.
На сегодняшний день существует три версии блока RCX. Версии 1.0 и 1.5 по существу ничем не отличаются друг от друга и используют последовательный инфракрасный порт для осуществления связи между персональным компьютером и самим блоком на скорости 2400 бод. При использовании среды leJOS, для связи с блоком можно использовать Java Communications API. “Кто-то как-то написал даже web-сервер, который работал на блоке RCX!”, - говорит Риттер.
Версия RCX 2.0 использует коммуникационный порт USB. И хотя среда leJOS без проблем может быть загружена в такую систему, на данный момент не существует поддержки для Java USB API (JSR-080). Теперь leJOS обеспечивает поддержку USB-соединений как на Windows, так и на Linux и включает коммуникационный API, который предоставляет почти такую же функциональность, как и JavaComm API.
Парад изобретений
Роботы, созданные с использованием Java-технологий и элементов LEGO, действительно впечатляют. В мае 2001 года евангелисты Java-технологии в Sun устроили соревнование в Bay Area университетах, чтобы посмотреть, кто же сможет изобрести самого непревзойденного робота на основе блока RCX от LEGO. UC Santa Cruz выдали “SlugBot”, робота, который одним пальцем играет мелодии на небольшой клавиатуре. Stanford произвели “MazeBot”, который решал задачу по прохождению лабиринтов. А UC Berkeley разработали выигравшего в этом соревновании робота “PaperBot”, который выбирал и сортировал цветные бумажки по их цвету.
![]() |
Рисунок 2. SlugBot от UC Santa Cruz |
![]() |
Рисунок 3. MazeBot от Stanford |
![]() |
Рисунок 4. PaperBot от UC Berkeley. |
Саймон Риттер демонстрировал ряд своих LEGO-роботов на конференции SunNetwork 2002 в Сан-Франциско. Один из них – это LEGO-блок на колесиках, запрограммированный обнаруживать и следовать по неравномерному черному следу на белом фоне. “Один поток обнаруживает события, - говорит Риттер, - а второй берет на себя управление моторами и поиском направления”.
Другой робот из серии Риттера LEGO-ботов работает в качестве крупье игры blackjack. Система распознает команды, озвучивает действия и визуально воспринимает выполняемые действия. “Начнем игру”, - объявляет робот. “У игрока шесть карт пиковой масти”, - говорит он.
Если брать во внимание ограниченные возможности обработки информации блока RCX от LEGO, то естественно, что для реализации демонстрационных роботов Риттера невозможно было бы обойтись функциями одного лишь блока RCX. С другой стороны, этот блок берет на себя функций гораздо больше, чем обычный набор моторов, управляемых компьютером. “Понятно, что часть обработки визуальной информации производится на персональном компьютере”, - говорит Риттер. “Например, если брать моего робота, который приносит мяч заданного цвета, то здесь задача определения местоположения мяча ложится на компьютер. После этого координаты мяча посылаются роботу. Но и то, что на RCX-блок накладываются задачи определения возможности взять мяч, поднять его, и принести обратно, говорит о многом. Помимо этого робот должен запомнить координаты своего изначального местоположения, чтобы знать, куда возвращаться обратно”.
Это также справедливо для робота-крупье. В то время как синтез речи и обработка визуальной информации обрабатывается персональным компьютером, блок RCX управляет всеми моторами, определяет, где находятся карты и т.д.
Код, написанный Риттером для своих демонстрационных роботов, также как и его SDK для робототехники, доступны в сети для скачивания (смотри ссылки в конце статьи).
Будущее
Мир робототехники стремительно демонстрирует мощь своей платформонезависимости и гибкость благодаря Java-технологии – начиная с полнофункциональных Java Speech и Java Media Framework API, до ограниченной в количестве ресурсов, но эффективной open-source среды leJOS. “Java Speech API – это очень подходящий, недорогой путь к добавлению голосового контроля, распознавания и синтеза речи в ваши приложения”, - говорит Риттер. “А Java Media Framework API – это полезный и очень мощный набор технологий, которые позволяют получать информацию от web-камеры и производить обработку полученной информации. Ну а leJOS – это великолепный open-source проект, предоставляющий мощность и простоту Java-технологии для управления роботами”.
Когда объединяются Java и робототехника, то даже небо не является какой-то границей в сфере применения роботов. В 2001 году, LEGO, Siemens, Hitachi и Introspace организовали соревнование на лучшего LEGO-робота. Система-победитель была взята на борт Международной Космической Станции (декабрь, 2001). “Робот парил вокруг и собирал куски строительного мусора”, - говорит Риттер. “Таким образом, он представлял собой самый настоящий уборщик мусора, в программном обеспечении которого сборщика мусора не было J!”
И совсем недавно, Джеймс Гослинг (James Gosling) из Sun Labs консультировался с учеными и инженерами из NASA и JPL, с целью рассмотрения возможности использования Java-технологии в вездеходе, предстоящая миссия которого – Марс. “Красная” планета примерно в двадцати световых минут от Земли. И получается, что, даже используя связь на скорости света (и радио волны), передача сообщения планетарному вездеходу будет осуществляться в течение двадцати минут. Плюс к этому, чтобы получить ответ и подтверждение о получении сообщения потребуется еще двадцать минут. Такие расстояния делают неосуществимым возможность контроля над транспортным средством в режиме реального времени. Поэтому роботы – исследователи планет – должны принимать множество решений самостоятельно. Программное обеспечения следующего поколения для марсианского вездехода в оригинале было спроектировано и построено с помощью C++. Однако Гослинг работает совместно с NASA и JPL, чтобы создать Java-версию кода, который будет послан вместе с вездеходом на Марс в 2009 году.
Ссылки
Домашняя страница Java Speech APIhttp://java.sun.com/products/java-media/speech/
Спецификация Java Speech Grammar Format
http://java.sun.com/products/java-media/speech/forDevelopers/JSGF/index.html
Спецификация Java Speech API Markup Language
http://java.sun.com/products/java-media/speech/forDevelopers/JSML/index.html
Java Speech API JSR-113
http://www.jcp.org/jsr/detail/113.jsp
Java Communications API
http://java.sun.com/products/javacomm/
Java Media Framework API 2.1.1
http://java.sun.com/products/java-media/jmf/2.1.1/
Интерфейс Java/TWAIN
http://www.gnome.sk/Twain/jtp.html
Домашняя страница Java 2D API
http://java.sun.com/products/java-media/2D/
Домашняя страница Java Advanced Imaging API
http://java.sun.com/products/java-media/jai/
Java Technology Robotics Developers Kit
http://www.sun.com/developers/evangcentral/totallytech/robo-sdk.html
Демонстрационный робот от Саймона Риттера
http://www.sun.com/developers/evangcentral/robot/
Java Technology LEGO MindStorms Challenge (университетское состязание на лучшего робота)
http://www.sun.com/developers/evangcentral/challenge/
Команда EvangCentral of Sun's Technology Evangelism
http://www.sun.com/developers/evangcentral/
Интервью с Саймоном Риттером
http://java.sun.com/features/2002/05/robot.html
Speech for Java от IBM (реализация Java Speech API)
http://alphaworks.ibm.com/tech/speech
IBM ViaVoice
http://www-3.ibm.com/software/speech/
Домашняя страница LEGO Mindstorms
http://mindstorms.lego.com/
Инструментарии для робототехники на основе LEGO Mindstorms
http://www.lego-mindstorms-robotic-kits.com/lego_mindstorms_info.html
Домашняя страница LeJOS
http://lejos.sourceforge.net/
Книги по программированию leJOS
http://lejos.sourceforge.net/books.html