В статье содержится описание опыта использования конструктора Lego Mindstorms EV3 для создания прототипа робота с его последующим программным и ручным управлением при помощи Robot Control Meta Language (RCML).
Далее будут рассмотрены следующие ключевые моменты:
- Сборка прототипа робота на базе конструктора Lego Mindstorms EV3
- Быстрая установка и настройка RCML для Windows
- Программное управление роботом на базе контроллера EV3
- Ручное управление периферией робота с помощью клавиатуры и геймпада
Забегая немного вперед, добавлю, что для реализации управления Lego-роботом с помощью клавиатуры требуется создать программу, содержащую всего 3 строки программного кода. Подробней о том, как это сделать написано под катом.
1. Для начала из конструктора Lego Mindstorms EV3 был создан прототип робота, который будет использоваться для программирования и ручного пилотирования.
2. Следующий шаг — подготовка RCML для работы с конструктором Lego Mindstorms EV3.
Следует скачать архивы с исполняемыми файлами и файлами библиотек rcml_build_1.0.6.zip и rcml_modules_build_1.0.6.zip.
Далее описан процесс выполнения быстрого старта для взаимодействия RCML и Lego робота, управляемого контроллером EV3.
Скаченные архивы нужно извлечь в каталог с произвольным именем, однако следует избегать русских букв в названии.
Далее необходимо создать файл конфигурации config.ini, который необходимо расположить в этом же каталоге. Для реализации возможности управления контроллером EV3 при помощи клавиатуры и геймпада, следует подключить модули lego_ev3, keyboard и gamepad.
[robot_modules]
module = lego_ev3
[control_modules]
module = keyboard
module = gamepad
Далее следует произвести сопряжение контроллера EV3 и адаптера.
1. Нужно перейти в раздел настроек контроллера Ev3, далее в пункт меню «Bluetooth».
2. Следует убедиться в правильности установки параметров конфигурации. На против пунктов “Visibility”,” Bluetooth” должны быть установлены галочки.
3. Необходимо перейти в «Панель управления», далее «Устройства и принтеры», далее «Устройства Bluetooth».
4. Необходимо нажать кнопку «Добавление устройства». Откроется окно для выбора доступных Bluetooth устройств.
5. Следует выбрать устройство “EV3” и нажать кнопку «Далее».
6. На экране контроллера EV3 отразится диалоговое окно «Connect?». Нужно выбрать вариант галочки, и подтвердить свой выбор нажатием центральной клавиши.
7. Далее отобразиться диалоговое окно «PASSKEY», в строке ввода должны быть указаны цифры «1234», далее следует подтвердить ключевую фразу для сопряжения устройств, путем нажатия центральной клавиши на позиции с изображением галочки.
8. В мастере сопряжения устройства появится форма для ввода ключа для сопряжения устройств. Нужно ввести код «1234» и нажать клавишу «Далее».
9. Далее отобразиться окно, с успешным подключением устройства. Следует нажать клавишу «Закрыть».
10. На ПК необходимо вернуться в «Панель управления», далее «Устройства и принтеры», далее «Устройства Bluetooth». В списке доступных устройств отобразится устройство, с которым было произведено сопряжение.
11. Следует двойным нажатием зайти в свойства подключения “EV3”.
12. Далее необходимо перейти во вкладку «Оборудование».
13. Далее следует двойным нажатием перейти в свойства подключения «Стандартный последовательный порт по соединению Bluetooth».
14. Указанный в свойствах индекс COM-порта, следует использовать в конфигурационном файле config.ini модуля lego_ev3. В примере показаны свойства Bluetooth подключения контроллера Lego EV3 с использованием стандартного последовательного порта COM14.
Дальнейшая конфигурация модуля сводится к тому, что необходимо прописать в конфигурационном файле модуля lego_ev3 адрес COM-порта, через который осуществляется коммуникация с роботом Lego.
[connections]
connection = COM14
[options]
dynamic_connection = 0
Теперь необходимо произвести настройку модуля keyboard. Модуль находится в каталоге control_modules, далее keyboard. Следует создать конфигурационный файл config.ini рядом с файлом keyboard_module.dll. Перед тем, как создать конфигурационный файл, необходимо определить, какие действия должны быть совершены по нажатию клавиш.
Модуль клавиатуры позволяет задействовать клавиши, которые имеют определенный числовой код. Таблицу виртуальных кодов клавиш можно посмотреть здесь.
В качестве примера, буду использовать нажатия следующих клавиш:
- Стрелки вверх/вниз используются для вращения мотора задних колес вперед/назад
- Стрелки влево/вправо поворачивают колеса влево/вправо
Файл конфигурации модуля keyboard описывает, какие оси доступны программисту, для осуществления взаимодействия с роботом в режиме ручного управления. Таким образом, в примере получилось две управляющих группы – это оси клавиатуры. Для добавления новой оси, следует придерживаться следующих правил описания осей.
имя_оси = значение_кнопки_клавиатуры_в_HEX_формате
2. Необходимо установить максимальное и минимальное значение, которое может откладываться по данной оси. Для этого необходимо с новой строки добавить секцию в конфигурационном файле config.ini, одноименную с именем оси, и задать свойства upper_value и lower_value, которые соответствуют максимум и минимуму оси соответственно. В общем виде данная секция выглядит следующим образом:
[имя_оси]
upper_value = максимальное_значение_оси
lower_value = минимальное_значение_оси
3. Далее следует определить, какое значение будет иметь ось в случае нажатия кнопки на клавиатуре, которая ранее была прикреплена к ней. Определение значений происходит посредством создания секции, название которой состоит из имени оси и значения кнопки клавиатуры в HEX формате, разделенные между собой символом нижнего подчеркивания. Для задания значения по умолчанию (в не нажатом) и нажатом состоянии используются свойства unpressed_value и pressed_value соответственно, в которые передаются значения. Общий вид секции в таком случае выглядит следующим образом:
[имя-оси_значение-кнопки-клавиатуры]
pressed_value = значение_оси_при_нажатой_клавише
unpressed_value = значение_оси_при_отжатой_клавише
Текст спойлера для удобства просмотра скопирован из документации по RCML.
Для реализации управления прототипом робота был создан конфигурационный файл модуля keyboard, который включает в себя оси go и rotate. Ось go используется для задания направления движения робота. При нажатии клавиши “стрелка вверх” ось получит значение 100, при нажатии клавиши “стрелка вниз” ось примет значение -50. Ось rotate используется для установки угла поворота передних колес. При нажатии клавиши “стрелка влево” значение оси будет равно -5, при нажатии «стрелки вправо» ось примет значение 5.
;Обязательная секция
[mapped_axis]
;название_оси = код_клавиши (в HEX формате)
;Ось go получает значения от стрелки_вверх
go = 0x26
;Ось go получает значения от стрелки_вниз
go = 0x28
;Ось rotate получает значения от стрелки_влево
rotate = 0x25
;Ось rotate получает значения от стрелки_вправо
rotate = 0x27
;Описание оси go, всегда должно иметь оба ключа
[go]
;Верхняя граница значений оси go
upper_value = -100
;Нижняя граница значений оси go
lower_value = 100
;Описание оси rotate, всегда должно иметь оба ключа
[rotate]
;Верхняя граница значений оси rotate
upper_value = -100
;Нижняя граница значений оси rotate
lower_value = 100
;Описание поведения оси go для клавиши *стрелка_вверх* (0x26)
[go_0x26]
;При нажатии клавиши *стрелка_вверх* значение оси задать равным 50
pressed_value = 100
;При отпускании клавиши *стрелка_вверх* значение оси задать равным 0
unpressed_value = 0
;Описание поведения оси go для клавиши *стрелка_вниз* (0x28)
[go_0x28]
;При нажатии клавиши *стрелка_вниз* значение оси задать равным -50
pressed_value = -50
;При отпускании клавиши *стрелка_вниз* значение оси задать равным 0
unpressed_value = 0
;Описание поведения оси rotate для клавиши *стрелка_влево* (0x25)
[rotate_0x25]
;При нажатии клавиши *стрелка_влево* значение оси задать равным -5
pressed_value = -5
;При отпускании клавиши *стрелка_влево* значение оси задать равным 0
unpressed_value = 0
;Описание поведения оси rotate для клавиши *стрелка_вправо* (0x27)
[rotate_0x27]
;При нажатии клавиши *стрелка_вправо* значение оси задать равным 5
pressed_value = 5
;При отпускании клавиши *стрелка_вправо* значение оси задать равным 0
unpressed_value = 0
Далее для реализации управления при помощи геймпада, необходимо настроить модуль gamepad. Конфигурирование модуля включает в себя создание конфигурационного файла config.ini рядом с gamepad_module.dll, находящего в каталоге control_modules, далее gamepad.
;Обязательная секция описания используемых осей
[axis]
;Ось для завершения режима ручного управления
Exit = 9
; 11 бинарных осей, соответствующих кнопкам геймпада
B1 = 1
B2 = 2
B3 = 3
B4 = 4
L1 = 7
L2 = 5
R1 = 8
R2 = 6
start = 10
T1 = 11
T2 = 12
; 4 оси стиков
;Правый стик движение вверх/вниз
RTUD = 13
;Правый стик движение влево/вправо
RTLR = 16
;Левый стик движение вверх/вниз
LTUD = 15
;Левый стик движение влево/вправо
LTLR = 14
; 2 оси крестовины
;Движение крестовины вверх/вниз
arrowsUD = 17
;Движение крестовины влево/вправо
arrowsLR = 18
;Описание поведения оси B1
[B1]
;При нажатии кнопки B1 значение оси задать равным 1
upper_value = 1
;При отпускании кнопки B1 значение оси задать равным 0
lower_value = 0
[B2]
upper_value = 1
lower_value = 0
[B3]
upper_value = 1
lower_value = 0
[B4]
upper_value = 1
lower_value = 0
[L1]
upper_value = 1
lower_value = 0
[L2]
upper_value = 1
lower_value = 0
[R1]
upper_value = 1
lower_value = 0
[R2]
upper_value = 1
lower_value = 0
[start]
upper_value = 1
lower_value = 0
[T1]
upper_value = 1
lower_value = 0
[T2]
upper_value = 1
lower_value = 0
;Описание поведения оси правого стика движение вверх/вниз
[RTUD]
;Значение оси при перемещении в максимально возможное верхнее положение
upper_value = 0
;Значение оси при перемещении в максимально возможное нижнее положение
lower_value = 65535
[RTLR]
upper_value = 0
lower_value = 65535
[LTUD]
upper_value = 0
lower_value = 65535
[LTLR]
upper_value = 0
lower_value = 65535
;Описание поведения оси крестовины движение вверх/вниз
[arrowsUD]
;Значение оси при нажатии стрелки вверх
upper_value = 1
;Значение оси при нажатии стрелки вниз
lower_value = -1
[arrowsLR]
upper_value = 1
lower_value = -1
Дополнительная информация об особенностях настройки модуля gamepad отображена в справочном руководстве по RCML.
3. Следующий шаг — написание программы на языке RCML.
В корне созданного каталога, необходимо создать файл программы. Имя файла программы и его расширение может быть любым, однако следует избегать русских букв в названии. В примере использовано имя файла — hello.rcml.
Для модуля lego_ev3 программный код резервирования робота, имеет следующий вид:
@tr = robot_lego_ev3;
На странице подключения модуля lego_ev3 описано большинство функций, поддерживаемых контроллером. В качестве тестового примера, была создана программа для автоматического вхождения робота в занос.
Алгоритм программы следующий:
После резервирования первого свободного работа, устанавливается связь двух двигателей для последующей работы с ними, как с одним. Затем робот начинает выполнять заносы. Программное описание действий робота позволяет точно устанавливать углы поворота передних колес и скорость вращения задних. Использование этого приёма позволяет добавиться результатов, которых сложно повторить во время ручного пилотирования с клавиатуры или геймпада.
function main() {
@tr = robot_lego_ev3; //Резервирование робота
@tr->setTrackVehicle("B","C",0,0); //Установка синхронизации двигателей
@tr->motorMoveTo("D",100,0,0);
system.sleep(500);
@tr->trackVehicleForward(-100);
system.sleep(1000);
@tr->motorMoveTo("D",50,-50,0);
system.sleep(4000);
@tr->motorMoveTo("D",50,50,0);
system.sleep(4000);
@tr->trackVehicleOff();
system.sleep(1000);
}
Для компилирования программы необходимо использовать командную строку window. Сначала следует переместиться в созданный каталог с исполняемыми файлами rcml_compiler.exe и rcml_intepreter.exe. Далее нужно ввести следующие команды.
Команда для компилирования файла hello.rcml:
rcml_compiler.exe hello.rcml hello.rcml.pc
В результате компилирования, в созданной директории появится новый файл hello.rcml.pc.
Теперь следует убедиться в том, что контроллер EV3 включен, сопряжен с Bluetooth адаптером. Геймпад должен быть подключен к ПК. После этого нужно выполнить команду исполнения программного файла:
rcml_intepreter.exe hello.rcml
Видеоролик демонстрирующий программу движения робота расположен внизу статьи.
4. Следующий шаг – управление роботом в ручном режиме при помощи клавиатуры.
Далее будет продемонстрирован процесс программной установки связи между двигателями робота и клавиатурой.
При помощи клавиатуры возможно управление любым двигателем робота. В рамках примера реализовано управление следующими механизмами:
- Углом поворота передних колес
- Направлением вращения задних колес
function main() {
@tr = robot_lego_ev3; //Резервирование робота
@tr->setTrackVehicle("B","C",0,0); //Установка синхронизации двигателей
system.hand_control(@tr,"keyboard",
"straight","go",
"speedMotorD","rotate");
}
Далее следует откомпилировать программу и выполнить её. Результат ручного управления Lego роботом при помощи на клавиатуры показан на видео внизу страницы.
5. Помимо клавиатуры доступен модуль gamepad позволяющий манипулировать роботом при помощи геймпада. Для реализации управления робота при помощи геймпада необходимо описать на уровне программы, какие оси робота будут принимать значения осей геймпада.
function main() {
@tr = robot_lego_ev3; //Резервирование робота
@tr->setTrackVehicle("B","C",0,0); //Установка синхронизации двигателей
system.hand_control(@tr,"gamepad",
"straight"," RTUD",
"speedMotorD"," RTLR");
}
Далее следует повторить процесс компилирования программы и затем выполнить её. Далее показан результат ручного управления Lego роботом при помощи на геймпада, и все ранее подключенные способы:
В статье кратко продемонстрированы только лишь некоторые возможности RCML. Наиболее подробное описание находиться в справочном руководстве.
Автор: artyom_n