В статье содержится описание опыта использования конструктора 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.

Листинг конфигурационного файла config.ini для RCML
[robot_modules]
module = lego_ev3
[control_modules]
module = keyboard
module = gamepad

Далее следует произвести сопряжение контроллера EV3 и адаптера.

Инструкция для сопряжения контролера EV3 и Bluetooth адаптера
Инструкция содержит пример сопряжения контроллера Lego Ev3 и ПК под управлением операционной системы Windows 7.

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.

Листинг конфигурационного файла config.ini для модуля lego_ev3
[connections]
connection = COM14
[options]
dynamic_connection = 0


Теперь необходимо произвести настройку модуля keyboard. Модуль находится в каталоге control_modules, далее keyboard. Следует создать конфигурационный файл config.ini рядом с файлом keyboard_module.dll. Перед тем, как создать конфигурационный файл, необходимо определить, какие действия должны быть совершены по нажатию клавиш.

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

В качестве примера, буду использовать нажатия следующих клавиш:

  • Стрелки вверх/вниз используются для вращения мотора задних колес вперед/назад
  • Стрелки влево/вправо поворачивают колеса влево/вправо

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

Правила описания осей для модуля keyboard
1. При добавлении новой оси, необходимо в секцию [mapped_axis] добавить свойство, имя которого есть имя оси, и присвоить ему значение кнопки клавиатуры в HEX формате, при этом на каждую кнопку заводится подобная запись, т.е. имя оси может быть использовано несколько раз. В общем случае запись в секцию [mapped_axis] будет выглядеть следующим образом:

имя_оси = значение_кнопки_клавиатуры_в_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.

Листинг конфигурационного файла config.ini для модуля keyboard
;Обязательная секция
[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 описано большинство функций, поддерживаемых контроллером. В качестве тестового примера, была создана программа для автоматического вхождения робота в занос.

Алгоритм программы следующий:

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

Листинг программы для Lego робота на языке RCML
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. Следующий шаг – управление роботом в ручном режиме при помощи клавиатуры.

Далее будет продемонстрирован процесс программной установки связи между двигателями робота и клавиатурой.

При помощи клавиатуры возможно управление любым двигателем робота. В рамках примера реализовано управление следующими механизмами:

  • Углом поворота передних колес
  • Направлением вращения задних колес

Листинг программы взаимодействия клавиатуры и робота Lego на базе контроллера EV3
function main() { 
   	@tr = robot_lego_ev3; //Резервирование робота
	@tr->setTrackVehicle("B","C",0,0); //Установка синхронизации двигателей
	
	system.hand_control(@tr,"keyboard",
				"straight","go",
				"speedMotorD","rotate");
}


Далее следует откомпилировать программу и выполнить её. Результат ручного управления Lego роботом при помощи на клавиатуры показан на видео внизу страницы.

5. Помимо клавиатуры доступен модуль gamepad позволяющий манипулировать роботом при помощи геймпада. Для реализации управления робота при помощи геймпада необходимо описать на уровне программы, какие оси робота будут принимать значения осей геймпада.

Листинг программы взаимодействия геймпада и робота Lego
function main() { 
   	@tr = robot_lego_ev3; //Резервирование робота
	@tr->setTrackVehicle("B","C",0,0); //Установка синхронизации двигателей
	system.hand_control(@tr,"gamepad",
				"straight"," RTUD",
				"speedMotorD"," RTLR");
}


Далее следует повторить процесс компилирования программы и затем выполнить её. Далее показан результат ручного управления Lego роботом при помощи на геймпада, и все ранее подключенные способы:



В статье кратко продемонстрированы только лишь некоторые возможности RCML. Наиболее подробное описание находиться в справочном руководстве.

Комментарии (4)


  1. malan
    10.03.2016 09:59

    А что за RCML?


    1. artyom_n
      10.03.2016 11:06

      RCML (англ. Robot Control Meta Language, произносится [ар-си-эм-эль] — компилируемый статически типизированный язык программирования высокого уровня. Разработан для получения одинакового результата независимо от исполнения робота. Позволяет создавать условия для совместной работы нескольких роботов. Используется для описания действий робота или группы роботов. Включает ряд визуальных аспектов представления кода относительно классов и объектов из языков программирования, реализующих парадигму объектно-ориентированного программирования.

      Более подробная информация о целях и возможностях языка находиться на официальном сайте http://robotct.ru


      1. malan
        10.03.2016 11:30

        Так это вы этот язык разрабатываете? Круто:)
        А кроме компилятора и интерпретатора ещё что-нибудь есть? Какая-нибудь среда разработки или дебаггер?


        1. artyom_n
          17.03.2016 19:18

          RCML имеет Си-подобный синтаксис, поэтому в качестве среды разработки можно использовать любую IDE, умеющую работать с данным языком. Дебаггер тоже есть, однако очень простецкий написанный на коленке :) пока для внутреннего пользования. Для паблика, готовим более функциональный и удобный.