Дистанционное Управление Роботом Lego Mindstorms Через Jmx И Ip-Видео

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

Обычная JVM позволила мне использовать встроенный в нее протокол Java Management Extensions (JMX) для реализации удаленного управления роботизированной рукой.

Для объединения элементов управления, показаний датчиков и изображений с IP-камер, установленных на роботе, используется мнемосхема, выполненная на платформе AggreGate.

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

Они управляются двумя полностью независимыми компьютерами EV3, работа которых координируется через сервер управления.

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

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

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

Другой двигатель вращает всю роботизированную руку на 360 градусов.



Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

В самом манипуляторе за подъем и опускание «плеча» и «предплечья» отвечают два мотора.

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



Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

Самым сложным механическим агрегатом является «щетка».

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



Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

  • Обычный Android-смартфон с установленным приложением.

    IP-веб-камера для общего обзора (на фото HTC One)

  • Автономная микрокамера с Wi-Fi AI-Болл , устанавливается непосредственно на «руки» манипулятора и помогает захватывать предметы сложной формы


Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

Программирование 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<String, Object> props = new HashMap<String, Object>(); 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 включает драйвер протокола JMX и позволяет подключать до десяти хостов JMX. Нам потребуется подключить два — по одному на каждый кирпич EV3. Прежде всего вам необходимо создать учетную запись устройства JMX, указав в настройках URL, указанный при запуске сервера JMX: Свойства подключения устройства JMX

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

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

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

Используется высокая частота опроса (100 раз в секунду), так как сервер управления находится в локальной сети вместе с роботом, и именно сервер принимает решения об остановке вращения при столкновении с препятствием и т.п.

Решение, безусловно, есть.

не промышленный, но в хорошо работающей сети Wi-Fi в пределах одной квартиры показал себя вполне адекватно.

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

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

Интерфейс оператора Теперь перейдем к созданию интерфейса оператора.

Для этого сначала создадим новый виджет и добавим в него необходимые компоненты.

Окончательная рабочая версия выглядит так:

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

Просмотр изнутри редактора интерфейса Полная форма:

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

Теперь, как говорят специалисты АСУ, осталось только «оживить мнемосхему».

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

Поскольку компьютеры EV3 уже подключены к серверу, MBean-компоненты нашего робота также могут быть объектами сервера.

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

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

Половина однотипных привязок реализует управление посредством нажатия на кнопки, расположенные на мнемосхеме.

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

Активаторами привязок из этой группы являются события мышьНажата И мышьВыпущена различные кнопки.

Вторая половина привязок позволяет управлять роботом с клавиатуры, предварительно нажав кнопку «Управление с клавиатуры».

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

Все методы вызова привязок элементов управления вперед() , назад() И останавливаться() различные MBean-компоненты.

Поскольку доставка событий происходит асинхронно, важно, чтобы вызовы функций вперед() / назад() и последующие звонки останавливаться() не перепутал.

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

Привязка скорости и ускорения двигателя

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

Все остальные привязки подсвечивают части мнемосхемы при срабатывании сенсорных датчиков, показывают измеренные датчиками расстояния до объектов на весах и выполняют различные сервисные функции.

Другие привязки

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

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

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

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

Привязки модели управления

Дистанционное управление роботом Lego Mindstorms через JMX и IP-видео

Закончив настройку виджета и модели, вы можете запустить виджет, активировать клавиатурное управление и развлекаться: Теги: #lego Mindstorms #lego Mindstorms ev3 #linux #jmx #remote control #remote control #jmx мониторинг #jmx control #jmx control #java

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.