Основной модуль конструктора Lego Mindstorms EV3 может работать с прошивкой леЖОС , который позволяет запускать приложения Java. Специально для этого Oracle выпустила и поддерживает отдельная версия полной Java SE .
Обычная JVM позволила мне использовать встроенный в нее протокол Java Management Extensions (JMX) для реализации удаленного управления роботизированной рукой.
Для объединения элементов управления, показаний датчиков и изображений с IP-камер, установленных на роботе, используется мнемосхема, выполненная на платформе AggreGate.
Сам робот состоит из двух основных частей: шасси и руки-манипулятора.
Они управляются двумя полностью независимыми компьютерами EV3, работа которых координируется через сервер управления.
Прямой связи между компьютерами нет. Оба компьютера подключены к IP-сети помещения через адаптеры Wi-Fi NETGEAR WNA1100. Робот управляется восемью моторами Mindstorms — из них 4 «больших» и 4 «маленьких».
Также установлены инфракрасный и ультразвуковой датчики для автоматической остановки у препятствия при движении задним ходом, два сенсорных датчика для остановки вращения манипулятора из-за препятствия и гироскопический датчик для облегчения ориентации оператора за счет визуализации положения плеча.
Шасси имеет два двигателя, каждый из которых передает мощность на пару гусеничных приводов.
Другой двигатель вращает всю роботизированную руку на 360 градусов.
В самом манипуляторе за подъем и опускание «плеча» и «предплечья» отвечают два мотора.
Еще три мотора отвечают за подъем/опускание руки, поворот ее на 360 градусов и сжимание/размыкание «пальцев».
Самым сложным механическим агрегатом является «щетка».
Из-за необходимости переместить три тяжелых двигателя в «локтевую» зону конструкция оказалась достаточно сложной.
В целом все выглядит так (коробок спичек для масштаба найти было сложно):
Для передачи изображения установлены две камеры:
- Обычный Android-смартфон с установленным приложением.
IP-веб-камера для общего обзора (на фото HTC One)
- Автономная микрокамера с Wi-Fi AI-Болл , устанавливается непосредственно на «руки» манипулятора и помогает захватывать предметы сложной формы
Программирование EV3 Программное обеспечение самого робота оказалось максимально простым.
Программы двух компьютеров очень похожи: они запускают сервер JMX, регистрируют MBean-компоненты, соответствующие двигателям и датчикам, и переходят в режим ожидания в ожидании операций JMX. Код основных классов программного обеспечения роботизированного манипулятора
Для каждого типа датчика и двигателя создан интерфейс MBean и реализующий его класс, который напрямую делегирует все вызовы классу, включенному в leJOS API. Пример кода интерфейса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); } }
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
}
Как ни странно, на этом программирование закончилось.
На стороне сервера или рабочей станции оператора не было написано ни одной строчки кода.
Подключение к серверу Робот управляется напрямую с сервера.
Установлена бесплатная версия продукта Менеджер сети AggreGate включает драйвер протокола JMX и позволяет подключать до десяти хостов JMX. Нам потребуется подключить два — по одному на каждый кирпич EV3.
Прежде всего вам необходимо создать учетную запись устройства JMX, указав в настройках URL, указанный при запуске сервера JMX: Свойства подключения устройства JMX
После этого выберите ресурсы (в данном случае MBeans), которые будут добавлены в профиль устройства: Выбор MBean-компонентов
И через несколько секунд смотрим и меняем текущие значения всех опрашиваемых свойств MBeans: Снимок устройства
Вы также можете протестировать различные операции, вручную вызывая методы MBean, такие как вперед() и стоп().
Список операций
Далее настраиваем периоды опроса датчиков.
Используется высокая частота опроса (100 раз в секунду), так как сервер управления находится в локальной сети вместе с роботом, и именно сервер принимает решения об остановке вращения при столкновении с препятствием и т.п.
Решение, безусловно, есть.
не промышленный, но в хорошо работающей сети Wi-Fi в пределах одной квартиры показал себя вполне адекватно.
Периоды опроса
Интерфейс оператора
Теперь перейдем к созданию интерфейса оператора.
Для этого сначала создадим новый виджет и добавим в него необходимые компоненты.
Окончательная рабочая версия выглядит так:
Фактически весь интерфейс состоит из нескольких панелей с кнопками, ползунками и индикаторами, сгруппированных в различную сетку, и двух больших видеоплееров, транслирующих изображение с камер.
Просмотр изнутри редактора интерфейса Полная форма:
Вид с показанными панелями контейнера:
Теперь, как говорят специалисты АСУ, осталось только «оживить мнемосхему».
Для этого используются так называемые переплеты связывание свойств и методов компонентов графического интерфейса со свойствами и методами серверных объектов.
Поскольку компьютеры EV3 уже подключены к серверу, MBean-компоненты нашего робота также могут быть объектами сервера.
Весь интерфейс оператора содержит около 120 привязок, большинство из которых однотипные:
Половина однотипных привязок реализует управление посредством нажатия на кнопки, расположенные на мнемосхеме.
Это красиво, удобно для тестирования, но совершенно непригодно для реального перемещения робота и перемещения грузов.
Активаторами привязок из этой группы являются события мышьНажата И мышьВыпущена различные кнопки.
Вторая половина привязок позволяет управлять роботом с клавиатуры, предварительно нажав кнопку «Управление с клавиатуры».
Эти привязки реагируют на события клавишаНажата И ключОтпущен , а в условии каждой привязки написано, на какой код кнопки следует реагировать.
Все методы вызова привязок элементов управления вперед() , назад() И останавливаться() различные MBean-компоненты.
Поскольку доставка событий происходит асинхронно, важно, чтобы вызовы функций вперед() / назад() и последующие звонки останавливаться() не перепутал.
Для этого в одну очередь добавляются привязки, вызывающие методы одного MBean. Две отдельные группы привязок задают начальные скорости и ускорения двигателей (сейчас это реализовано на стороне сервера с помощью модели, поэтому эти привязки отключены) и изменяют скорости/ускорения при перемещении ползунков Скорость и Ускорение.
Привязка скорости и ускорения двигателя
Все остальные привязки подсвечивают части мнемосхемы при срабатывании сенсорных датчиков, показывают измеренные датчиками расстояния до объектов на весах и выполняют различные сервисные функции.
Другие привязки
Помимо учетных записей устройств JMX и описанного выше виджета, на сервере есть еще один объект, который участвует в управлении роботом.
Этот модель , который останавливает двигатели при срабатывании одного из сенсорных датчиков.
Это также делается с помощью привязок; единственная разница между ними и привязками виджетов заключается в том, что привязки модели обрабатываются на сервере и связывают одни свойства объектов сервера с другими.
Привязки модели управления
Закончив настройку виджета и модели, вы можете запустить виджет, активировать клавиатурное управление и развлекаться:
Теги: #lego Mindstorms #lego Mindstorms ev3 #linux #jmx #remote control #remote control #jmx мониторинг #jmx control #jmx control #java
-
Песня Явы
19 Oct, 24 -
Что Общего Между Ядром Linux И Ios?
19 Oct, 24