Основной модуль конструктора 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 градусов и сжиманием/разжиманием «пальцев».
Самым сложным механическим узлом является «кисть». Из-за необходимости выноса трех тяжелых двигателей в район «локтя» конструкция получилась достаточно хитрой.
В целом все выглядит так (коробок спичек был с трудом найден для масштаба):
Для передачи картинки установлены две камеры:
Код главных классов ПО руки-манипулятора
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
Для каждого типа датчика и мотора создан интерфейс 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 }
Как ни странно, на этом программирование закончилось. На стороне сервера и операторского рабочего места не было написано ни одной строчки кода.
Прежде всего, нужно создать аккаунт 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.
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 карту):
Чтобы наработать опыт в работе с платой Arduino, так сказать в качестве учебного опыта и просто для интереса был создан этот проект. Целью проекта было создать автомобиль, который может автономно перемещаться, объезжая различные препятствия и не сталкиваясь с ними.
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 долларов, это при условии, если закупать все эти компоненты, поскольку возможно у вас уже что то имеется из этого.
Радиоуправление изъяли из ненужной игрушки, которая стоила 15 баксов.
Машинка здесь с двумя двигателями. С помощью одного движка пультом контролируется скорость движения робота, а с помощью другого контролируется рулевое управления.
Использовалась тонкая доска в качестве монтажной поверхности, на которой были прикреплены макетные платы, Arduino, ЖК и т.д. Батарейки размещены под доской и провода пропущены через просверленные отверстия.
Arduino управляется через программу С ++.
RC_Car_Test_2014_07_20_001.ino
1. TH - Задача, курс к текущей маршрутной точки
2. CH - Текущее направление робота
3. Err - Направление по компасу, показывает в каком направлении движется робот (влево или вправо)
4. Dist - Фокусное расстояние (в метрах) до текущей маршрутной точки
5. SNR - Sonar расстояние, то есть расстояние до любых объектов в передней части робота
6. Spd - Скорость робота
7. Mem - Память (в байтах). В памяти Arduino имеется 2 КБ
8. WPT n OF x - Показывает, где робот находится в списке маршрутных точек
Чтобы робот избегал препятствий, здесь использовался ультразвуковой датчик » Ping». Было решено совместить его с библиотекой Arduino NewPing, поскольку она лучше, чем простая PIng библиотека.
Библиотека была взята отсюда: https://github.com/fmbfla/Arduino/tree/master/NewPing
Датчик был установлен на бампере робота.
Сегодня никого не удивишь радиоуправляемыми самоделками . Но согласитесь, как-то «по старинке» нажимать на клавиши управления… Гораздо интереснее управлять поделками с помощью движений кисти, не так ли? В данной статье показан пример того, как можно организовать дистанционное управление при помощи платы Arduino и нескольких датчиков изгиба. В качестве подопытного будет выступать PHIRO Pro
Необходимо загрузить стандарт firmata на плату Ардуино, для того, что соединить её с Pocket Code. В данном проекте используем Arduino UNO, однако может быть использована любая плата Arduino.
Датчики изгиба — это резистивные устройства, что могут использоваться для фиксации сгибания или наклона. Ниже приводится схема подключения датчиков на Arduino. Для того, чтобы надежно закрепить датчики на перчатке использовал согнутые скобки для степлера, однако вы можете при желании использовать пластиковые стяжки.
Соединяем выводы bluetooth модуля и платы Arduino следующим образом:
Используем 9В батарею для питания платы Arduino с Bluetooth модулем. Такой тип компоновки объясняется возможностью легкого монтажа на запястье/браслете. Чем компактнее тем лучше.
Ниже представлены примеры использования программы. Прежде всего убедитесь, что PHIRO Pro находится в Mode 3 (Bluetooth Mode). Нажмите на кнопку Mode на PHIRO не раньше, чем синий светодиод, что расположен рядом с дисплеем на верху, включится.
Для программы, в общем есть 7 режимов.
Для крепления телефона на руке, можете воспользоваться наручной повязкой или сделать так, как сделал я.
Купил дешевую крышку под мой мобильник, прорезал отверстия и протянул ленту липучку. Наручная повязка с телефоном готова.
Вот и всё!) Спасибо за внимание)
Управление роботом является сложной задачей. Определение, которое мы выбрали для , требует, чтобы устройство получало данные о своей среде. Затем принимало решение и предпринимало соответствующие действия. Роботы могут быть автономными и полуавтономными.
Хорошим примером полуавтономного робота является сложный подводный робот. Человек контролирует основные движения робота. И в это время бортовой процессор измеряет и реагирует на подводные токи. Это позволяет держать робота в одном и том же положении без дрейфа. Камера на борту робота отправляет видео обратно человеку. Дополнительно бортовые датчики могут отслеживать температуру воды, давление и многое другое.
Если робот теряет связь с поверхностью, то включается автономная программа и поднимает подводного робота на поверхность. Для того, чтобы иметь возможность управлять своим роботом, нужно будет определить его уровень автономности. Возможно вы хотите чтобы управление роботом осуществлялось по кабелю, было беспроводное или полностью автономное.
Самый простой способ управления роботом — это ручной контроллер, физически подключенный к нему с помощью кабеля. Переключатели, ручки, рычаги, джойстики и кнопки на этом контроллере позволяют пользователю управлять роботом без необходимости включать сложную электронику.
В этой ситуации двигатели и источник питания могут быть подключены непосредственно к переключателю. Следовательно, можно контролировать его вращение вперед / назад. Это используется обычно в транспортных средствах.
Они не имеют интеллекта и считаются скорее «дистанционно управляемыми машинами», чем «роботами».
Следующим шагом будет установка микроконтроллера на робота, но при этом продолжать использовать кабель. Подключение микроконтроллера к одному из портов ввода / вывода вашего компьютера (например, USB-порт) позволяет вам управлять своими действиями. Управление происходит с помощью клавиатуры, джойстика или другого периферийного устройства. Добавление микроконтроллера в проект также может потребовать, чтобы вы запрограммировали робота на входные сигналы.
Используется разъём Ethernet RJ45 . Для управления нужно Ethernet соединение. Робот физически подключен к маршрутизатору. Следовательно его можно контролировать через Интернет. Также это возможно (хотя и не очень практично) для мобильных роботов.
Настройка робота, который может общаться через Интернет, может быть довольно сложной. В первую очередь предпочтительным является соединение WiFi (беспроводной интернет). Проводная и беспроводная комбинация также являются опцией, где есть приемопередатчик (передача и прием). Приемопередатчик физически подключен к Интернету, и данные, полученные через Интернет, затем передаются беспроводным способом роботу.
Инфракрасные передатчики и приемники исключают кабель, соединяющий робота с оператором. Это, как правило, используется начинающими. Для работы инфракрасного управления требуется «линия визирования». Приемник должен иметь возможность «видеть» передатчик в любое время, чтобы получать данные.
Инфракрасные пульты дистанционного управления (такие, как универсальные пульты дистанционного управления, для телевизоров), используются для отправки команд инфракрасному приемнику, подключенному к микроконтроллеру. Он затем интерпретирует эти сигналы и контролирует действия робота.
Для управления при помощи радиочастот требуется передатчик и приемник с небольшими микроконтроллерами для отправки, приема и интерпретации данных, передаваемых по радиочастоте (RF). В коробке приемника имеется печатная плата (печатная плата), которая содержит приемный блок и небольшой контроллер сервомотора. Для радиосвязи требуется передатчик, согласованный / сопряженный с приемником. Возможно использование трансивера, который может отправлять и принимать данные между двумя физически разными средами систем связи.
Радиоуправление не требует прямой видимости и может быть осуществлено на большом расстоянии. Стандартные радиочастотные устройства могут обеспечивать передачу данных между устройствами на расстоянии до нескольких километров. В то время как более профессиональные радиочастотные устройства могут обеспечивать управление роботом практически на любом расстоянии.
Многие конструкторы роботов предпочитают изготавливать полуавтономных роботов с радиоуправлением. Это позволяет роботу быть максимально автономным, обеспечивать обратную связь с пользователем. И может давать пользователю некоторый контроль над некоторыми его функциями в случае необходимости.
Bluetooth является радиосигналом (RF) и передается по определенным протоколам для отправки и получения данных. Обычный диапазон Bluetooth часто ограничен примерно 10 м. Хотя он имеет то преимущество, что позволяет пользователям управлять своим роботом через устройства с поддержкой Bluetooth. Это в первую очередь сотовые телефоны, КПК и ноутбуки (хотя для создания интерфейса может потребоваться настраиваемое программирование). Так же, как и радиоуправление, Bluetooth предлагает двустороннюю связь.
Управление по WiFi часто является дополнительной опцией для роботов. Способность управлять роботом по беспроводной сети через Интернет представляет некоторые существенные преимущества (и некоторые недостатки) для беспроводного управления. Чтобы настроить управление роботом по Wi-Fi нужен беспроводной маршрутизатор, подключенный к Интернету, и блок WiFi на самом роботе. Для робота можно использовать устройство, которое поддерживает TCP / IP протокол.
Другая беспроводная технология, которая была первоначально разработана для связи человека и человека — сотовый телефон, теперь используется для управления роботами. Поскольку частоты сотового телефона регулируются, включение сотового модуля на робота обычно требует дополнительного программирования. Также не нужно понимания системы сотовой сети и правил.
Следующим шагом будет использование микроконтроллера в вашем роботе в полном объеме. И в первую очередь программирование его алгоритма работы по вводу данных от его датчиков. Автономное управление может осуществляться в различных формах:
Настоящее автономное управление включает в себя множество датчиков и алгоритмов. Они позволяют роботу самостоятельно определять лучшее действие в любой заданной ситуации. Самые сложные методы управления, которые в настоящее время реализуются на автономных роботах, являются визуальными и слуховыми командами. Для визуального контроля робот смотрит на человека или объект, чтобы получить свои команды.
Управление роботом для поворота налево при помощи чтения с листа бумаги стрелки, указывающей влево, намного сложнее выполнить, чем можно было бы представить. Служебная команда, такая как «повернуть налево», также требует довольно много программирования. Программирование множества сложных команд, таких как «Принесите мне тапочки» уже не фантазия. Хотя требует очень высокого уровня программирования и большого количества времени.
Целью нашего проекта является создание автономной платформы, способной принимать решение, основанное на внешних сигналах от датчиков. Мы будем использовать микроконтроллер Lego EV3. Он нам позволяет сделать как полностью автономную платформу. Так и полуавтономную, управляемую по Bluetooth или при помощи инфракрасного пульта управления.