Удаленное управление роботом. Удаленное управление роботом Lego Mindstorms по JMX и IP Video

Чтобы наработать опыт в работе с платой Arduino, так сказать в качестве учебного опыта и просто для интереса был создан этот проект. Целью проекта было создать автомобиль, который может автономно перемещаться, объезжая различные препятствия и не сталкиваясь с ними.

Шаг 1: Список компонентов и стоимость проекта

1. Игрушечная Машинка с радиоуправлением (radio controlled).

Стоит эта штука около 20 баксов, если у вас есть возможность потратить больше, то можете использовать и получше.

2. Arduino Uno микроконтроллер - 25 долларов

3. Motor shield для контроля электромоторов - 20 долларов

4. GPS для навигации. Adafruit Ultimate GPS Shield - 50 долларов

5. Магнитометр в качестве компаса для навигации. Adafruit HMC5883 Magnetometer - 10 долларов

6. Ультразвуковой датчик расстояния, чтобы избегать препятствия. HC-SR04 - 6 долларов

7. ЖК-дисплей для отображения состояния транспортного средства и информации. LCD Display Blue 1602 IIC, I2C TWI - 6 долларов (можете использовать другой)

8. Инфракрасный датчик и пульт.

9. Arduino sketch (программа C++).

10. Тонкая древесная плита в качестве монтажной платформы.

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

12. Перемычки.

13. Набор для монтажа ультразвукового датчика - 12 долларов

14. Паяльник и припой.

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

Шаг 2: Шасси и монтаж платформы

Радиоуправление изъяли из ненужной игрушки, которая стоила 15 баксов.

Машинка здесь с двумя двигателями. С помощью одного движка пультом контролируется скорость движения робота, а с помощью другого контролируется рулевое управления.

Использовалась тонкая доска в качестве монтажной поверхности, на которой были прикреплены макетные платы, Arduino, ЖК и т.д. Батарейки размещены под доской и провода пропущены через просверленные отверстия.

Шаг 3: Программа

Arduino управляется через программу С ++.

Исходный код

RC_Car_Test_2014_07_20_001.ino

Шаг 4: ЖК-дисплей

Во время работы экран отображает следующую информацию:

Ряд 1:

1. TH - Задача, курс к текущей маршрутной точки

2. CH - Текущее направление робота

Ряд 2:

3. Err - Направление по компасу, показывает в каком направлении движется робот (влево или вправо)

4. Dist - Фокусное расстояние (в метрах) до текущей маршрутной точки

Ряд 3:

5. SNR - Sonar расстояние, то есть расстояние до любых объектов в передней части робота

6. Spd - Скорость робота

Ряд 4:

7. Mem - Память (в байтах). В памяти Arduino имеется 2 КБ

8. WPT n OF x - Показывает, где робот находится в списке маршрутных точек

Шаг 5: Избежать столкновения с объектами

Чтобы робот избегал препятствий, здесь использовался ультразвуковой датчик » Ping». Было решено совместить его с библиотекой Arduino NewPing, поскольку она лучше, чем простая PIng библиотека.

Библиотека была взята отсюда: https://github.com/fmbfla/Arduino/tree/master/NewPing

Датчик был установлен на бампере робота.

Remoute Control, ver. 0.1.1

(управление роботом удаленно по сети Wi-Fi с планшета в ручном режиме)

многоцелевая программа для мода OpenComputers

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

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

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

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

Реактор на ИТ в настройках рушит блоки в радиусе 2-4 блоков. Есть шанс, что вы проберетесь в домик жертвы, при этом вы в укрытии и вас не видно никак.

Код программы (latest):

ПЛАНШЕТ: (pastebin get b8nz3PrH tabletRC.lua)

РОБОТ: (pastebin get 7V2fvm7L robotRC.lua)

Старые версии (old):

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

Планшет (хард возьмите сразу с установленной OS):

Робот (можно отказаться пока от ЧЛ и впихать контроллер-расширитель плат. Роботу сможете на лету тогда запихивать при необходимости WF карту или INET карту):

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

  1. Автономный робот работает по заданному алгоритму исходя из поступающих от датчиков данных.
  2. У полуавтономного робота есть задачи, которые контролируются человеком. И дополнительно есть другие задачи, которые он выполняет сам по себе...

Полуавтономные роботы

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

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

Управление по кабелю

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

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

Они не имеют интеллекта и считаются скорее «дистанционно управляемыми машинами», чем «роботами».


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

Управление роботом при помощи кабеля и встроенного микроконтроллера

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


  • Основные преимущества такие же, как и при непосредственном управлении по кабелю. Может быть запрограммировано более сложное поведение робота и его реакция на отдельные кнопки или команды. Имеется большой выбор управления контроллером (мышь, клавиатура, джойстик и т. д.). Добавленный микроконтроллер имеет встроенные алгоритмы. Это означает, что он может взаимодействовать с датчиками и принимать определенные решения самостоятельно.
  • К недостаткам относится более высокая стоимость из-за наличия дополнительной электроники. Другие недостатки такие же как и при непосредственном управлении роботом по кабелю.

Управление по Ethernet

Используется разъём Ethernet RJ45 . Для управления нужно Ethernet соединение. Робот физически подключен к маршрутизатору. Следовательно его можно контролировать через Интернет. Также это возможно (хотя и не очень практично) для мобильных роботов.

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


  • Преимуществами является то, что робота можно контролировать через интернет из любой точки мира. Робот не ограничен по времени работы, так как он может использовать Power over Ethernet. PoE. Это технология, которая позволяет передавать удалённому устройству электрическую энергию вместе с данными через стандартную витую пару по сети Ethernet. Использование интернет-протокола (IP) может упростить и улучшить схему связи. Преимущества те же, что и при прямом проводном компьютерном управлении.
  • Недостатком является более сложное программирование и те же недостатки, что и при управлении по кабелю.

Управление при помощи ИК-пульта

Инфракрасные передатчики и приемники исключают кабель, соединяющий робота с оператором. Это, как правило, используется начинающими. Для работы инфракрасного управления требуется «линия визирования». Приемник должен иметь возможность «видеть» передатчик в любое время, чтобы получать данные.

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


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

Радиоуправление

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

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


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

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

Управление по Bluetooth

Bluetooth является радиосигналом (RF) и передается по определенным протоколам для отправки и получения данных. Обычный диапазон Bluetooth часто ограничен примерно 10 м. Хотя он имеет то преимущество, что позволяет пользователям управлять своим роботом через устройства с поддержкой Bluetooth. Это в первую очередь сотовые телефоны, КПК и ноутбуки (хотя для создания интерфейса может потребоваться настраиваемое программирование). Так же, как и радиоуправление, Bluetooth предлагает двустороннюю связь.


  • Преимущества: управляемый с любого устройства с поддержкой Bluetooth. Но, как правило, требуется дополнительное программирование. Это смартфоны, ноутбуки и т.д. Более высокие скорости передачи данных могут быть всенаправленными. Следовательно, не нужна прямая видимость и сигнал может немного проходить через стены.
  • Недостатки. Должен работать в паре. Расстояние обычно составляет около 10 м (без препятствий).

Управление по WiFi

Управление по WiFi часто является дополнительной опцией для роботов. Способность управлять роботом по беспроводной сети через Интернет представляет некоторые существенные преимущества (и некоторые недостатки) для беспроводного управления. Чтобы настроить управление роботом по Wi-Fi нужен беспроводной маршрутизатор, подключенный к Интернету, и блок WiFi на самом роботе. Для робота можно использовать устройство, которое поддерживает TCP / IP протокол.


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

Управление при помощи сотового телефона

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


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

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

  1. быть предварительно запрограммировано без обратной связи с окружающей средой
  2. с ограниченной обратной связью с датчиками
  3. со сложной обратной связью с датчиками

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


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

  • Преимущества – это ”настоящая" робототехника. Задачи могут быть очень простым, например, от мигания света, основанного на показаниях одного датчика. До посадки космического корабля на далекой планете.
  • Недостатки зависят только от программиста. Если робот делает что-то, чего вы не хотите чтобы он делал, то у вас есть единственный вариант. Это проверить свой код, изменить его и загрузить изменения в робота.

Практическая часть

Целью нашего проекта является создание автономной платформы, способной принимать решение, основанное на внешних сигналах от датчиков. Мы будем использовать микроконтроллер Lego EV3. Он нам позволяет сделать как полностью автономную платформу. Так и полуавтономную, управляемую по Bluetooth или при помощи инфракрасного пульта управления.


Программируемый блок LEGO EV3

Здравствуй, Хабрахабр! Я сидел вечером 11 июня, смотрел фильм. Неожиданно для себя я обнаружил, что мне написала незнакомая мне ранее женщина с предложением сделать робота для их нового квеста. Суть заключается в том, что нужно разгадывать головоломки, исследовать тайники, правильно применять подсказки, использовать доступные вещи и в итоге добывать ключи и открывать двери… От меня требовалось сделать робота, управляемого с компьютера с помощью отдельной программы. У мебя были сомнения по поводу некоторых проблем, например: успею ли я и как именно сделать беспроводную передачу данных (беспроводной передачей данных я занимался до этого только на NXT)? Взвесив все за и против я согласился. После этого я стал думать над передачей данных. Поскольку требовалось сделать робота быстро, то вспоминать и доосваивать, например, Delphi не было времени, поэтому возникла идея сделать модуль который будет заниматься отправкой команд. От компьютера требуется просто посылать данные в СОМ-порт. Этот способ странный, но наиболее быстрый. Его я и хочу описать здесь. Так же я приложу 3 программы которые помогут сделать радиоуправляемую машинку.
Сборка передатчика и его программа.
Я сделал модуль для компьютера из FTDI Basic Breakout 5/3.3V от DFrobot, довольно распространённого микроконтролера ATMEGA 328P-PU с загрузчиком Arduino и радиомодуля на основе микросхемы nRF24L01. По-сути это просто Arduino Uno с радиомодулем. Что есть, то есть. У радиомодуля есть особенность, которую я не сразу заметил: входное напряжение должно быть в диапазоне от 3 до 3.6 вольт (хотя подача на него 5 вольт его не убьёт, но работать не будет), верхняя граница логической единицы составляет 5В. Это означает то, что для подключения радиомодуля к меге не нужен преобразователь уровней между 3.3В и 5В, а вот стабилизатор на 3.3В установить нужно. У FTDI есть встроенный стабилизатор, от него я и подпитал радиомодуль.

Так выглядит сам модуль (внутри и в сборке) :

Программа состоит из инициализации, стартового сообщения и обработки команд из программы управления. Так было в моём случае. Основные команды библиотеки Mirf:

#include
#include
#include
#include
#include
Эти библиотеки нужны для работы радиомодуля

Mirf.csnPin = 4 - задаёт номер пина, отвечающего за «разрешение общаться» радиомодуля и МК
Mirf.cePin = 6 - задаёт номер пина, отвечающего за режим работы радиомодуля (приёмник/передатчик)
Mirf.spi = &MirfHardwareSpi - настраивает линию SPI
Mirf.init() - инициализирует радиомодуль
Mirf.payload = 1 - размер в байтах одного сообщения (поумолчанию 16, максимум 32)
Mirf.channel = 19 - задаёт канал (0 - 127, по умолчанию 0)
Mirf.config() - задаёт параметры передачи


Mirf.setTADDR((byte *)«serv1») - переводит радиомодуль в режим передатчика
Mirf.setRADDR((byte *)«serv1») - переводит радиомодуль в режим приёмника

Mirf.send(data) - отправляет массив типа byte
Mirf.dataReady() - сообщает об окончании обработки принятых данных
Mirf.getData(data) - записать принятые данные в массив data

Прилагаю код программы передатчика.

Программа передатчика

#include
#include
#include
#include
#include

Char active;
byte data;

Void setup()
{
Serial.begin(19200);

Mirf.csnPin = 4;
Mirf.cePin = 6;

Mirf.init();
Mirf.payload = 1;
Mirf.channel = 19;
Mirf.config();

Mirf.setTADDR((byte *)«serv1»);

//сигнальное сообщение о начале работы
data=7;
Mirf.send(data);
delay(200);
}

Void loop()
{
if (Serial.available()) //Если данные готовы к считыванию
{
active=Serial.read(); // Запись данных в переменную
}

If (active=="2")
{
data=2;
}

If (active=="3")
{
data=3;
}

If (active=="4")
{
data=4;
}

If (active=="5")
{
data=5;
}

If (active=="6")
{
data=6;
}

Mirf.send(data); //Отсылаем данные
while(Mirf.isSending()); // Ждём пока данные отсылаются
}

Программа управления.

Есть одна интересная штука - Processing. Синтаксис такой же как в Arduino, только вместо void loop() там расположился void draw(). Но она становилась ещё более интересной в моей ситуации с библиотекой processing Serial, которая позволяет работать с сериал-портом. Прочитав уроки на сайте Spurkfun`а, я поигрался с миганием светодиода на подключенной к компьютеру ардуинке по клику мышки. После этого я написал программу управления роботом с клавиатуры. Прилагаю код управления с помощью стрелок. В нём, в принципе, ничего необычного нет.

Программа управления машинкой

import processing.serial.*;
import cc.arduino.*;

Serial myPort;
PFont f=createFont(«LetterGothicStd-32.vlw», 24);

Void setup()
{
size(360, 160);
stroke(255);
background(0);
textFont(f);

String portName = «XXXX»; // Сюда нужно написать имя вашего порта
myPort = new Serial(this, portName, 19200);
}

Void draw() {
if (keyPressed == false)
{
clear();
myPort.write("6");
println(«6»);
}
}

Void keyPressed()
{
// 10 - enter
// 32 - probel
// 37/38/39/40 - keys
clear();

Fill(255);
textAlign(CENTER);
//text(keyCode, 180, 80);

Switch(keyCode)
{
case 37:
text(«Edem vlevo», 180, 80);
myPort.write("1");
break;

Case 38:
text(«Edem pryamo», 180, 80);
myPort.write("2");
break;

Case 39:
text(«Edem vpravo», 180, 80);
myPort.write("3");
break;

Case 40:
text(«Edem nazad», 180, 80);
myPort.write("4");
break;

Default:
text(«Takoy kommandi net», 180, 80);
myPort.write("6");
break;
}
}

Программа приёмника.

Инициализация этой программы отличается от инициализации программы передатчика буквально одной строчкой. Ключевая команда в бесконечном цикле Mirf.getData(data). Дальше полученная команда сравнивается с числами, которым соответствуют какие-либо действия робота. Ну а дальше робот действует точно по командам. Прилагаю код программы приёмника машинки.

Программ машинки

#include
#include
#include
#include
#include

Void setup()
{
Serial.begin(9600);

PinMode(13, OUTPUT); //LED

Mirf.csnPin = 10;
Mirf.cePin = 9;
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.payload = 1;
Mirf.channel = 19;
Mirf.config();
Mirf.setRADDR((byte *)«serv1»);
}

Void loop()
{
byte data;

If(!Mirf.isSending() && Mirf.dataReady())
{
Mirf.getData(data);
Serial.println(data);
}

Switch (data)
{
case 1:
motors(-100, 100); // поворачиваем влево
break;

Case 2:
motors(100, 100); // едем прямо
break;

Case 3:
motors(100, -100); // поворачиваем вправо
break;

Case 4:
motors(-100, -100); // едем назад
break;

Default:
motors(0, 0); // стоим
break;
}

Delay(50);
}

Заключение.

Что из этого всего вышло:

Этого робота я сделал для «Клаустрофобии» . Они проводят квесты в реальности в разных городах, и как раз для одного из таких квестов организаторам понадобился радиоуправляемый робот-сапер. Мне понравилось. Это, конечно, ущербно, т.к. на фоне управления с помощью встроенных в ноутбук средств связи, но зато своё, сделанное весьма быстро и без особых проблем. Надеюсь эта статья поможет сделать нечто подобное, а, может, даже сложнее. Тут уж кому что захочется.

Теги: Добавить метки

Основной модуль конструктора Lego Mindstorms EV3 может работать с прошивкой leJOS , позволяющей запускать Java-приложения. Специально для этого Oracle выпустил и поддерживает отдельную версию полноценной Java SE .

Нормальная JVM позволила мне использовать встроенный в нее протокол Java Management Extensions (JMX), чтобы реализовать удаленное управление роботом-манипулятором. Для объединения управляющих элементов, показаний датчиков и картинок с установленных на роботе IP-камер используется мнемосхема, сделанная на платформе AggreGate.


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

Оба компьютера подключены к IP-сети помещения через Wi-Fi адаптеры NETGEAR WNA1100. Робот управляется восемью двигателями Mindstorms - из них 4 «большие» и 4 «маленькие». Также установлены инфракрасный и ультразвуковой датчики для автоматической остановки у препятствия при движении задним ходом, два датчика прикосновения для остановки поворота манипулятора из-за препятствия, и гироскопический датчик, облегчающий ориентировку оператора при помощи визуализации положения плеча.

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

В самом манипуляторе два двигателя отвечают за подъем и опускание «плеча» и «предплечья». Еще три двигателя занимаются подъемом/опусканием кисти, ее поворотом на 360 градусов и сжиманием/разжиманием «пальцев».

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

В целом все выглядит так (коробок спичек был с трудом найден для масштаба):

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

  • Обычный Android-смартфон с установленным приложением IP Webcam для общего обзора (на снимке HTC One)
  • Автономная Wi-Fi микро-камера AI-Ball , установленная прямо на «кисти» манипулятора и помогающая хватать предметы сложной формы

Программирование EV3

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

Код главных классов ПО руки-манипулятора

public class Arm { public static void main(String args) { try { EV3Helper.printOnLCD("Starting..."); EV3Helper.startJMXServer("192.168.1.8", 9000); MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); EV3LargeRegulatedMotor motor = new EV3LargeRegulatedMotor(BrickFinder.getDefault().getPort("A")); LargeMotorMXBean m = new LargeMotorController(motor); ObjectName n = new ObjectName("robot:name=MotorA"); mbs.registerMBean(m, n); // Registering other motors here EV3TouchSensor touchSensor = new EV3TouchSensor(SensorPort.S1); TouchSensorMXBean tos = new TouchSensorController(touchSensor); n = new ObjectName("robot:name=Sensor1"); mbs.registerMBean(tos, n); // Registering other sensors here EV3Helper.printOnLCD("Running"); Sound.beepSequenceUp(); Thread.sleep(Integer.MAX_VALUE); } catch (Throwable e) { e.printStackTrace(); } } } public class EV3Helper { static void startJMXServer(String address, int port) { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); try { java.rmi.registry.LocateRegistry.createRegistry(port); JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + address + ":" + String.valueOf(port) + "/server"); Map props = new HashMap(); props.put("com.sun.management.jmxremote.authenticate", "false"); props.put("com.sun.management.jmxremote.ssl", "false"); JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, props, server); connectorServer.start(); } catch (Exception e) { e.printStackTrace(); } } static void printOnLCD(String s) { LCD.clear(); LCD.drawString(s, 0, 4); } }

Для каждого типа датчика и мотора создан интерфейс MBean"а и реализующий его класс, которые напрямую делегирует все вызовы классу, входящему в leJOS API.

Пример кода интерфейса

public interface LargeMotorMXBean { public abstract void forward(); public abstract boolean suspendRegulation(); public abstract int getTachoCount(); public abstract float getPosition(); public abstract void flt(); public abstract void flt(boolean immediateReturn); public abstract void stop(boolean immediateReturn); public abstract boolean isMoving(); public abstract void waitComplete(); public abstract void rotateTo(int limitAngle, boolean immediateReturn); public abstract void setAcceleration(int acceleration); public abstract int getAcceleration(); public abstract int getLimitAngle(); public abstract void resetTachoCount(); public abstract void rotate(int angle, boolean immediateReturn); public abstract void rotate(int angle); public abstract void rotateTo(int limitAngle); public abstract boolean isStalled(); public abstract void setStallThreshold(int error, int time); public abstract int getRotationSpeed(); public abstract float getMaxSpeed(); public abstract void backward(); public abstract void stop(); public abstract int getSpeed(); public abstract void setSpeed(int speed); }

Пример кода реализации MBean"а

public class LargeMotorController implements LargeMotorMXBean { final EV3LargeRegulatedMotor motor; public LargeMotorController(EV3LargeRegulatedMotor motor) { this.motor = motor; } @Override public void forward() { motor.forward(); } @Override public boolean suspendRegulation() { return motor.suspendRegulation(); } @Override public int getTachoCount() { return motor.getTachoCount(); } @Override public float getPosition() { return motor.getPosition(); } @Override public void flt() { motor.flt(); } @Override public void flt(boolean immediateReturn) { motor.flt(immediateReturn); } // Similar delegating methods skipped }

Как ни странно, на этом программирование закончилось. На стороне сервера и операторского рабочего места не было написано ни одной строчки кода.

Подключение к серверу

Непосредственное управление роботом осуществляет сервер IoT-платформы AggreGate . Установленная бесплатная версия продукта AggreGate Network Manager включает драйвер протокола JMX и позволяет подключить до десяти JMX-хостов. Нам понадобится подключить два - по одному на каждый кирпичик EV3.

Прежде всего, нужно создать аккаунт JMX устройства, указав в настройках URL, заданный при запуске JMX сервера:

Свойства соединения с JMX-устройством


После этого выбираем активы (т.е. MBean"ы в данном случае), которые будут добавлены в профиль устройства:

Выбор MBean"ов


И через несколько секунд смотрим и меняем текущие значения всех опрошенных свойств MBean"ов:

Снимок устройства


Можно также потестировать различные операции вызывая вручную методы MBean"ов, например forward() и stop().

Список операций


Далее настраиваем периоды опроса для датчиков. Высокая частота опроса (100 раз в секунду) используется, так как управляющий сервер находится в локальной сети вместе с роботом и именно сервер принимает решения об остановке вращения при упоре в препятствие и т.п. Решение, безусловно, не промышленное, но в хорошо работающей Wi-Fi сети в рамках одной квартиры показало себя вполне адекватным.

Периоды опроса


Интерфейс оператора

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

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

Вид изнутри редактора интерфейсов

Вся форма:

Вид с показанными панелями-контейнерами:


Теперь, как говорят АСУТПшники, осталось «оживить мнемосхему». Для этого применяются так называемые привязки связывающие свойства и методы графических компонентов интерфейса со свойствами и методами серверных объектов. Так как компьютеры EV3 уже подключены к серверу, серверными объектами могут быть и MBean"ы нашего робота.

Весь интерфейс оператора содержит около 120 привязок, большая часть из которых однотипна:

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

Вторая половина привязок позволяет управлять роботом с клавиатуры, предварительно нажав на кнопку Keyboard Control. Эти привязки реагируют на события keyPressed и keyReleased , а в условии каждой привязки прописано, на какой именно код кнопки нужно реагировать.

Все управляющие привязки вызывают методы forward() , backward() и stop() различных MBean"ов. Поскольку доставка событий происходит асинхронно, важно, чтобы вызовы функций forward() /backward() и последующие вызовы stop() не перепутались. Для этого привязки, вызывающие методы одного MBean"а, добавлены в одну очередь (Queue).

Две отдельные группы привязок выставляют начальные скорости и ускорения двигателей (сейчас это реализовано на стороне сервера при помощи модели, поэтому эти привязки отключены) и меняют скорости/ускорения при перемещении ползунков Speed и Acceleration.