Robot Control Meta Language (RCML)

17.1 Пример подключения модулей роботов

17.1.1 Быстрое подключение модуля робота test к RCML

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

Для включения модуля робота test необходимо в секции [robot_modules] конфигурационного файла RCML добавить свойство module и установить его равным значению test в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML". Дополнительной конфигурации модулю test не требуется.

Далее приведен текст программы на языке RCML. Программа обращается к тестовому роботу, и отправляет ему команду на выполнение функции do_ something(). Более подробно о том, что означает эта функция написано далее

function main() {
	@lr = robot_test; 
	@lr->do_something(1000);
}

Во время выполнения данной программы, тестовый робот имитирует физическое выполнение действия, которое бы заняло 1 секунду времени.

После подключения модуля программисту доступны следующие функции:

Наименование

Кол-во параметров

Возвращает значение

Бросает исключение

Описание

none

0

Нет

Нет

Ничего не делающая функция.

do_something

1

Нет

Нет

В качестве параметра функция принимает кол-во миллисекунд, на которые будет остановлен процесс выполнения программы.

get_some_value

1

Да

Нет

Возвращает значение, переданное на вход в качестве параметра.

throw_exception

0

Нет

Да

При вызове бросает исключение.

print

2

Нет

Нет

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

Кроме этого, тестовый робот имеет также оси:

Наименование

Верхняя граница

Нижняя граница

Примечание

X

100

-100

Y

1

0

Бинарная

Z

100

0

 

17.1.2 Быстрое подключение модуля lego_ev3 к RCML

Lego Mindstorms EV3 – третье поколение конструктора Lego.

Более подробно о конструкторе и его возможностях на официальном сайте компании Lego:

Модуль робота lego_ev3 используется для подключения блоков Lego Ev3 к RCML

    1. Для включения модуля lego_ev3 необходимо добавить запись в секцию [robot_modules] конфигурационного файла RCML свойство module и установить его равным lego_ev3 в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML"
    2. Следует произвести сопряжение Bluetooth-адаптера с модулем Lego Ev3.
    3. После сопряжения, следует зайти в свойства добавленного устройства. Необходимо узнать адрес COM-порта, с которым осуществляется взаимодействие.
  1. Далее следует произвести настройку модуля. А именно необходимо указать, через какой COM-порт следует взаимодействовать с модулем Ev3. Нужно перейти в каталог с модулями роботов (robot_modules), а затем в каталог модуля Ev3 (lego_ev3).
  2. В директории модуля lego_ev3 нужно создать файл config.ini со следующим содержанием:
[connections]
connection = COM6
[options]
dynamic_connection = 0

Файл настроек config.ini включает в себя следующие свойства, разнесенные на две секции [connections] и [options]:

В секции [connections] отражаются номера портов подключенных роботов, на каждого робота заводится надпись вида: 

connection = COMX, где X это номер порта, который используется в свойствах подключения.

Секция [options] содержит свойство dynamic_connection.

dynamic_connection используется для динамического подключения роботов, то есть позволяет менять состав используемых роботов прямо в момент исполнения программы. Однако каждое задействование робота занимает время на подключение к нему. Если значение dynamic_connection установлено равным 1, то Bluetooth соединение с роботом будет устанавливаться в момент запроса робота и разрываться при его освобождении, что может вызывать значительную временную задержку при задействовании робота в  RCML программе.

Если значение dynamic_connection установлено равным 0, то Bluetooth соединение с роботом будет устанавливаться в момент старта программы и разрываться при ее завершении.

По умолчанию будет присвоено значение 0.

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

function main() {
	@lr = robot_lego_ev3;
	@lr->motorMoveTo("B",10,200,0);
}

Первая строка создаст переменную, к которой будет прикреплен Lego робот.

Вторая строка переместит мотор B в позицию 200 со скоростью 10 не используя тормоз.

Кроме этого Lego робот, может быть представлен для RCML, как «Track Vehicle», что позволит обращаться к двум моторам робота Lego, как к единому целому и открывает дополнительные функции управления. Функция setTrackVehicle создана специально для роботов особых конфигураций, с двумя ведущими колесами и одним поворотным колесом/упором, или конфигураций роботов на гусеничном ходу, по 1 мотору на каждое колесо или гусеницу. Такой режим автоматизирует управление моторами для маневрирования робота. Для инициализации робота в режиме «Track Vehicle» необходимо использовать в программном коде функцию setTrackVehicle.

Далее приведен пример текста программы на языке RCML в которой создаётся «Track Vehicle» и происходит управление им.

function main() {
	@lr = robot_lego_ev3; 
	@lr->setTrackVehicle("B","C",1,1);
	@lr->trackVehicleForward(10);
	system.sleep(1000);
	@lr->trackVehicleOff();
}

В результате исполнения программы робот совершит симметричное вращение обоими двигателями, подключенными к портам B и С со скоростью 10. Более подробный список команд представлен далее.

В случае, если в коде программы не будет вызвана функция создания «Track Vehicle» setTrackVehicle, то при выполнении функции связанных с использованием «Track Vehicle» произойдет выброс исключения, который можно обработать при помощи конструкции try/catch, более подробно о котором написано в разделе "Исключения".

Существуют особенности, связанные с входящими значениями для функций модуля.

Для обращения к моторам A,B,C,D используются буквы "A","B","C" и "D" соответственно;

Для обращения к датчикам под номерами 1,2,3,4 используются соответствующие номера;

На параметры функций speed и percent наложены следующие ограничения:

  • speed принимает значения [-100;100];
  • percent принимает значения [0;100].

При превышении указанных ограничений вызываемая функция бросает исключение, которое можно обработать с помощью конструкции языка RCML. Более подробно об обработке исключений написано в разделе "Исключения"

Доступные функции робота приведены в таблице:

Определение

Описание

Пример

motorSetSpeed(
      motor,
      speed
  )

Задает мотору motor скорость speed

@lr->motorSetSpeed ("B",20); Задает мотору B скорость 20.

motorOff(
motor
  )

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

@lr->motorOff("C"); Остановит моторC.

motorBrake(
motor
  )

Останавливает мотор motor, используя тормоза. Мгновенная остановка.

@lr->motorBrake("D"); Остановит мотор D.

motorSetDirection(
      motor,
      direction
  )

Устанавливает направление мотора motor. direction=0 задает направление мотора "назад". direction != 0 задает направление мотора "вперед"

@lr->motorSetDirection("A",0); Установит направление мотора А"назад".

motorGetDirection(
      motor
  )

Возвращает 1 если направление мотора motor установлено как "вперед", возвращает 0 если направление мотора motor установлено как "назад". Мотор остановится не сразу.

RecievedDirection = @lr->motorGetDirection("C");

motorMoveTo(
      motor,
      speed,
      position,
      brake
  )

Перемещает мотор motor в положение position со скоростью speed. brake = 0 - не использовать тормоз, brake != 0 - использовать тормоз.

@lr->motorMoveTo("B",10,200,0); Переместит мотор B в позицию 200 со скоростью 10 не используя тормоз.

motorGetTacho(
      motor
  )

Возвращает позицию мотора motor.

RecievedTacho = @lr->motorGetTacho("C");

motorResetTacho(
      motor
  )

Устанавливает текущую позицию мотора motor как нулевую.

@lr->motorResetTacho("C");

waitMotorToStop(
      motor
  )

Ждет пока остановится мотор motor.

@lr->waitMotorToStop("C");

waitMultiMotorsToStop(
      motorA,
      motorB,
      motorC,
      motorD
  )

Ждет пока остановится несколько моторов. Если motor != 0, то ждет остановки, если motor = 0, то не ждет.

@lr->waitMultiMotorsToStop(1,0,0,1); Ждет пока остановятся моторы А иD.

setTrackVehicle(
      motorLeft,
      motorRight,
      LeftReverse,
      RightReverse
  )

Логически соединяет 2 мотора motorLeft иmotorRight в Track Vehicle (гусеничный транспорт). Позволяет обращаться к этим моторам как к единому целому и открывает дополнительные функции управления Track Vehicle, имеющие префикс trackVehicle. Left и Right Reverse при значении != 0 задает моторам обратное направление.

@lr->setTrackVehicle("B","C",1,0); Логически соединяет моторы B и C в Track, при этом мотор B изменяет свое направление на обратное.

trackVehicleBackward(
      speed
  )

Track Vehicle движется назад со скоростью speed.

@lr->trackVehicleBackward(20);

trackVehicleForward(
      speed
  )

Track Vehicle движется вперед со скоростью speed.

@lr->trackVehicleForward(40);

trackVehicleOff()

Выключает моторы Track Vehicle. Моторы остановятся не сразу.

@lr->trackVehicleOff();

trackVehicleBrake()

Останавливает моторы Track Vehicle, используя тормоза.

@lr->trackVehicleBrake();

trackVehicleSpinLeft(
      speed
  )

Track Vehicle поворачивается влево вокруг своей вертикальной оси.

@lr->trackVehicleSpinLeft(10);

trackVehicleSpinRight(
      speed
  )

Track Vehicle поворачивается вправо вокруг своей вертикальной оси.

@lr->trackVehicleSpinRight(90);

trackVehicleTurnLeftForward(
      speed,
      percent
  )

Track Vehicle поворачивает влево, двигаясь вперед. Правый мотор будет иметь со скорость speed, а левый (speed - speed*percent/100). Таким образом если percent=0 то моторы будут иметь одинаковую скорость, а при percent=100 левый мотор будет иметь нулевую скорость.

@lr->trackVehicleTurnLeftForward(20, 50);

trackVehicleTurnRightForward(
      speed,
      percent
  )

Track Vehicle поворачивает влево, двигаясь вперед. Левый мотор будет иметь со скорость speed, а правый (speed - speed*percent/100). Таким образом если percent=0 то моторы будут иметь одинаковую скорость, а при percent=100 правый мотор будет иметь нулевую скорость.

@lr->trackVehicleTurnRightForward(10, 90);

trackVehicleTurnLeftReverse(
      speed,
      percent
  )

Track Vehicle поворачивает влево, двигаясь назад. Скорость правого мотора равна speed, а левого (speed - speed*percent/100)

@lr->trackVehicleTurnLeftReverse(10,20);

trackVehicleTurnRightReverse(
      speed,
      percent
  )

Track Vehicle поворачивает вправо, двигаясь назад. Скорость левого мотора равна speed, а правого (speed - speed*percent/100)

@lr->trackVehicleTurnRightReverse(50,50);

readSensor(
      sensor,
      mode
  )

Считывает показания сенсора под номером sensor в режиме mode. Для разных датчиков существует разное количество режимов.

@lr->readSensor(2,1); Считывает показания датчика подключенного к порту 2 в режиме 1.

isMotorRunning(
      motor,
      sleep
  )

Возвращает 1 если мотор motor включен и 0 если нет. Если sleep отлично от 0, то мотор будет опрошен с задержкой в 200 микросекунд.

@lr->isMotorRunning("B",1);

getMotorSpeed(
      motor,
      sleep
  )

Возвращает значение скорости мотора motor. Если sleep отлично от 0, то мотор будет опрошен с задержкой в 200 микросекунд.

@lr->getMotorSpeed("B",1);

Для модуля lego_ev3 доступно подключение датчиков 8-ми типов, индексы которых используются в командах языка RCML. Типы датчиков и их индексы представлены в таблице:

Датчик

Режим

Ультразвуковой

1 - режим определения расстояния в сантиметрах

2 - режим определения расстояния в дюймах

3 - режим прослушивания

Инфракрасный

1 - режим определения расстояния

2 - режим определения местоположения инфракрасного дистанционного пульта

3- режим определения нажатия кнопок на инфракрасном пульте

Цветовой

1 - режим определения интенсивности света

2 - режим определения цвета (см. таблицу цветов)

3- режим определения raw значения отраженного света

4 - режим определения отраженного света

Гироскопический

1 - режим определения угла в градусах

2 - режим определения угловой скорости в градусах в секунду

Датчик нажатия

1 - режим отслеживания нажатия

2 - режим вывода количества нажатий

Датчик Температуры

1 - режим измерения температуры по шкале Цельсия

2 - режим измерения температуры по шкале Фаренгейта

Датчик Звука

1 - режим измерения громкости звука в dB

2 - режим измерения громкости звука в dBA

Датчик Света

1 - режим измерения интенсивности

2 - режим измерения отраженного света

Цветовой датчик, имеет возможность вернуть код цвета. Коды возвращаемых цветом, представлены в таблице:

Цвет

Возвращаемое значение

Черный

1

Синий

2

Зеленый

3

Желтый

4

Красный

5

Белый

6

Коричневый

7

Всегда доступны следующие оси для управления блоком Ev3:

Ось

Верхняя граница

Нижняя граница

Описание

locked

1

0

Бинарная ось. Если её значение равно 1, то робот считается заблокированным и игнорирует изменение значений по любым другим осям.

speedMotorA

100

-100

Значение оси задает скорость мотора, подключенного к порту A.

speedMotorB

100

-100

Значение оси задает скорость мотора, подключенного к порту B.

speedMotorC

100

-100

Значение оси задает скорость мотора, подключенного к порту C.

speedMotorD

100

-100

Значение оси задает скорость мотора, подключенного к порту D.

moveMotorA

1000

-1000

Значение оси задает позицию, на которую повернется мотор A со скоростью 50.

moveMotorB

1000

-1000

Значение оси задает позицию, на которую повернется мотор B со скоростью 50.

moveMotorC

1000

-1000

Значение оси задает позицию, на которую повернется мотор C со скоростью 50.

moveMotorD

1000

-1000

Значение оси задает позицию, на которую повернется мотор D со скоростью 50.

В случае, использования робота Lego в режиме «Track Vehicle», робот имеет следующие оси робота, к которым можно подключиться для управления:

straight

100

-100

Значение оси задает скорость, с которой прямолинейно перемещается «Track Vehicle»

rotation

100

-100

Значение оси задает скорость, с которой «Track Vehicle» вращается вокруг своей вертикальной оси.

Робот Lego должен быть инициализирован в режим «Track Vehicle» прежде чем будет задействована ось straight или rotation, т.е. до включения режима ручного управления!

17.1.3 Быстрое подключение модуля lego_nxt к RCML

Lego Mindstorms NXT – второе поколение конструктора Lego.

Подробнее на официальном сайте конструктора: 

Модуль робота lego_nxt используется для подключения блоков Lego NXT к RCML. 

    1. Для включения модуля lego_nxt необходимо добавить запись в секцию [robot_modules] конфигурационного файла RCML свойство module и установить его равным lego_nxt в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML"
    2. Следует произвести сопряжение Bluetooth-адаптера с модулем Lego NXT.
    3. После сопряжения, следует зайти в свойства добавленного устройства. Необходимо узнать адрес COM-порта, с которым осуществляется взаимодействие.
  1. Далее следует произвести настройку модуля. А именно необходимо указать, через какой COM-порт следует взаимодействовать с модулем NXT. Нужно перейти в каталог с модулями роботов (robot_modules), а затем в каталог модуля NXT (lego_nxt).
  2. В директории модуля lego_nxt нужно создать файл config.ini со следующим содержанием:
[connections]
connection = COM6
[options]
dynamic_connection = 0

Файл настроек config.ini включает в себя следующие свойства, разнесенные на две секции [connections] и [options]:

В секции [connections] отражаются номера портов подключенных роботов, на каждого робота заводится надпись вида: 

connection = COMX, где X это номер порта, который используется в свойствах подключения.

Секция [options] содержит свойство dynamic_connection.

dynamic_connection используется для динамического подключения роботов, то есть позволяет менять состав используемых роботов прямо в момент исполнения программы. Однако каждое задействование робота занимает время на подключение к нему. Если значение dynamic_connection установлено равным 1, то Bluetooth соединение с роботом будет устанавливаться в момент запроса робота и разрываться при его освобождении, что может вызывать значительную временную задержку при задействовании робота в  RCML программе.

Если значение dynamic_connection установлено равным 0, то Bluetooth соединение с роботом будет устанавливаться в момент старта программы и разрываться при ее завершении.

По умолчанию будет присвоено значение 0.

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

function main() {
	@lr = robot_lego_nxt;
	@lr->motorMoveTo("B",10,200,0);
}

Первая строка создаст переменную, к которой будет прикреплен Lego робот.

Вторая строка переместит мотор B в позицию 200 со скоростью 10 не используя тормоз.

Кроме этого Lego робот, может быть представлен для RCML, как «Track Vehicle», что позволит обращаться к двум моторам робота Lego, как к единому целому и открывает дополнительные функции управления. Функция setTrackVehicle создана специально для роботов особых конфигураций, с двумя ведущими колесами и одним поворотным колесом/упором, или конфигураций роботов на гусеничном ходу, по 1 мотору на каждое колесо или гусеницу. Такой режим автоматизирует управление моторами для маневрирования робота. Для инициализации робота в режиме «Track Vehicle» необходимо использовать в программном коде функцию setTrackVehicle.

Далее приведен пример текста программы на языке RCML в которой создаётся «Track Vehicle» и происходит управление им.

function main() {
	@lr = robot_lego_nxt; 
	@lr->setTrackVehicle("B","C",1,1);
	@lr->trackVehicleForward(10);
	system.sleep(1000);
	@lr->trackVehicleOff();
}

В результате исполнения программы робот совершит симметричное вращение обоими двигателями, подключенными к портам B и С со скоростью 10. Более подробный список команд представлен далее.

В случае, если в коде программы не будет вызвана функция создания «Track Vehicle» setTrackVehicle, то при выполнении функции связанных с использованием «Track Vehicle» произойдет выброс исключения, который можно обработать при помощи конструкции try/catch, более подробно о котором написано в разделе "Исключения".

Существуют особенности, связанные с входящими значениями для функций модуля.

Для обращения к моторам A,B,C,D используются буквы "A","B","C" и "D" соответственно;

Для обращения к датчикам под номерами 1,2,3,4 используются соответствующие номера;

На параметры функций speed и percent наложены следующие ограничения:

  • speed принимает значения [-100;100];
  • percent принимает значения [0;100].

При превышении указанных ограничений вызываемая функция бросает исключение, которое можно обработать с помощью конструкции языка RCML. Более подробно об обработке исключений написано в разделе "Исключения". 

Доступные функции робота приведены в таблице:

Определение

Описание

Пример

motorSetSpeed(
     motor,
     speed
  )

Задает мотору motor скорость speed

@lr->motorSetSpeed ("B",20); Задает мотору B скорость 20.

motorOff(
     motor
  )

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

@lr->motorOff("C"); Остановит моторC.

motorBreak(
     motor
  )

Останавливает мотор motor, используя тормоза. Мгновенная остановка.

@lr->motorBreak("A"); Остановит мотор A.

motorSetDirection(
     motor,
     direction
  )

Устанавливает направление мотораmotor. direction=0 задает направление мотора "назад". direction != 0 задает направление мотора "вперед"

@lr->motorSetDirection("A",0); Установит направление мотора А"назад".

motorGetDirection(
     motor
  )

Возвращает 1 если направление мотораmotor установлено как "вперед", возвращает 0 если направление мотораmotor установлено как "назад". Мотор остановится не сразу.

RecievedDirection = @lr->motorGetDirection("C");

motorMoveTo(
     motor,
     speed,
     position,
     brake
  )

Перемещает мотор motor в положениеposition со скоростью speed. brake = 0 - не использовать тормоз, brake != 0 - использовать тормоз.

@lr->motorMoveTo("B",10,200,0); Переместит мотор B в позицию 200 со скоростью 10 не используя тормоз.

motorGetTacho(
     motor
  )

Возвращает позицию мотора motor.

RecievedTacho = @lr->motorGetTacho("C");

motorResetTacho(
     motor
  )

Устанавливает текущую позицию мотораmotor как нулевую.

@lr->motorResetTacho("C");

waitMotorToStop(
     motor
  )

Ждет пока остановится мотор motor.

@lr->waitMotorToStop("C");

waitMultiMotorsToStop(
     motorA,
     motorB,
     motorC
  )

Ждет пока остановится несколько моторов. Если motor != 0, то ждет остановки, если motor = 0, то не ждет.

@lr->waitMultiMotorsToStop(1,0,1); Ждет пока остановятся моторы А иС.

setTrackVehicle(
     motorLeft,
     motorRight,
     LeftReverse,
     RightReverse
  )

Логически соединяет 2 мотора motorLeft иmotorRight в Track Vehicle (гусеничный транспорт). Позволяет обращаться к этим моторам как к единому целому и открывает дополнительные функции управления Track Vehicle, имеющие префикс trackVehicle. Left и Right Reverse при значении != 0 задает моторам обратное направление.

@lr->setTrackVehicle("B","C",1,0); Логически соединяет моторы B и C в Track, при этом мотор B изменяет свое направление на обратное.

trackVehicleBackward(
     speed
  )

Track Vehicle движется назад со скоростьюspeed.

@lr->trackVehicleBackward(20);

trackVehicleForward(
     speed
  )

Track Vehicle движется вперед со скоростью speed.

@lr->trackVehicleForward(40);

trackVehicleOff()

Выключает моторы Track Vehicle. Моторы остановится не сразу.

@lr->trackVehicleOff();

trackVehicleBrake()

Останавливает моторы Track Vehicle, используя тормоза.

@lr->trackVehicleBrake();

trackVehicleSpinLeft(
     speed
  )

Track Vehicle поворачивается влево вокруг своей вертикальной оси.

@lr->trackVehicleSpinLeft(10);

trackVehicleSpinRight(
     speed
  )

Track Vehicle поворачивается вправо вокруг своей вертикальной оси.

@lr->trackVehicleSpinRight(90);

trackVehicleTurnLeftForward(
     speed,
     percent
  )

Track Vehicle поворачивает влево, двигаясь вперед. Правый мотор будет иметь со скорость speed, а левый (speed - speed*percent/100). Таким образом еслиpercent=0 то моторы будут иметь одинковую скорость, а при percent=100 левый мотор будет иметь нулевую скорость.

@lr->trackVehicleTurnLeftForward(20, 50);

trackVehicleTurnRightForward(
     speed,
     percent
  )

Track Vehicle поворачивает влево, двигаясь вперед. Левый мотор будет иметь со скорость speed, а правый (speed - speed*percent/100). Таким образом еслиpercent=0 то моторы будут иметь одинковую скорость, а при percent=100 правый мотор будет иметь нулевую скорость.

@lr->trackVehicleTurnRightForward(10, 90);

trackVehicleTurnLeftReverse(
     speed,
     percent
  )

Track Vehicle поворачивает влево, двигаясь назад. Скорость правого мотора равна speed, а левого (speed - speed*percent/100)

@lr->trackVehicleTurnLeftReverse(10,20);

trackVehicleTurnRightReverse(
     speed,
     percent
  )

Track Vehicle поворачивает вправо, двигаясь назад. Скорость левого мотора равна speed, а правого (speed - speed*percent/100)

@lr->trackVehicleTurnRightReverse(50,50);

isMotorRunning(
     motor,
     sleep
  )

Возвращает 1 если мотор motor включен и 0 если нет. Если sleep отлично от 0, то мотор будет опрошен с задержкой в 200 микросекунд.

@lr->isMotorRunning("B",1);

Для модуля lego_nxt доступны следующие функции опроса датчиков:

Определение

Описание

Режимы

readHiTecColor( port,mode)

Считывает показания HiTecColor сенсора на порту port в режиме mode.

1 - Возвращает значение красного цвета [0;255]

2 - Возвращает значение зеленого цвета [0;255]

3 - Возвращает значение синего цвета [0;255]

readHiTecCompass(port)

Считывает показания HiTecCompass сенсора на порту port.

Возвращает значение в градусах

readHiTecGyro( port)

Считывает показания HiTecGyro сенсора на порту port.

Возвращает угловое ускорение в градусах в секунду

readHiTecTilt( port,mode)

Считывает показания HiTecTilt сенсора на порту port в режиме mode.

1 - Возвращает целочисленное значение положения датчика по оси x

2 - Возвращает целочисленное значение положения датчика по оси y

3 - Возвращает целочисленное значение положения датчика по оси z

readNXTColor( port,mode)

Считывает показания NXTColor сенсора на порту port в режиме mode.

1 - Возвращат целочисленное значение, соответствующее таблице цветов

2 - Возвращает интенсивность красного цвета в процентах

3 - Возвращает интенсивность зеленого цвета в процентах

4 - Возвращает интенсивность синего цвета в процентах

5 - Возвращает интенсивность света в процентах

readNXTLight( port,mode)

Считывает показания NXTLight сенсора на порту port в режиме mode.

1 - Возвращает интенсивность света в виде целочисленного значения

2 - Возвращает интенсивность света в процентах

readNXTSonar( port,mode)

Считывает показания NXTSonar сенсора на порту port в режиме mode.

1 - режим определения расстояния в сантиметрах

2 - режим определения расстояния в дюймах

readNXTSound( port,mode)

Считывает показания NXTSound сенсора на порту port в режиме mode

1 - режим измерения громкости звука в dB

2 - режим измерения громкости звука в dBA

readNXTTouch( port,mode)

Считывает показания NXTTouch сенсора на порту port в режиме mode.

1 - режим отслеживания нажатия

2 - режим вывода количества нажатий

readRCXLight( port,mode)

Считывает показания RCXLight сенсора на порту port в режиме mode.

1 - режим измерения интенсивности

2 - режим измерения отраженного света

readRCXRotation(port)

Считывает показания RCXRotation сенсора на порту port.

Возвращает шаг поворота [-16;+16]

readRCXTemperature(port, mode)

Считывает показания RCXTemperature сенсора на порту port в режиме mode.

1 - режим измерения температуры по шкале Цельсия

2 - режим измерения температуры по шкале Фаренгейта

Цветовой датчик, имеет возможность вернуть код цвета. Коды возвращаемых цветом, представлены в таблице:

Цвет

Возвращаемое значение

Черный

1

Синий

2

Зеленый

3

Желтый

4

Красный

5

Белый

6

Всегда доступны следующие оси для управления блоком NXT:

Ось

Верхняя граница

Нижняя граница

Описание

locked

1

0

Бинарная ось. Если её значение равно 1, то робот считается заблокированным и игнорирует изменение значений по любым другим осям.

speedMotorA

100

-100

Значение оси задает скорость мотора, подключенного к порту A.

speedMotorB

100

-100

Значение оси задает скорость мотора, подключенного к порту B.

speedMotorC

100

-100

Значение оси задает скорость мотора, подключенного к порту C.

moveMotorA

1000

-1000

Значение оси задает позицию, на которую повернется мотор A со скоростью 50.

moveMotorB

1000

-1000

Значение оси задает позицию, на которую повернется мотор B со скоростью 50.

moveMotorC

1000

-1000

Значение оси задает позицию, на которую повернется мотор C со скоростью 50.

В случае, использования робота Lego в режиме «Track Vehicle», робот имеет следующие оси робота, к которым можно подключиться для управления:

Ось

Верхняя граница

Нижняя граница

Описание

straight

100

-100

Значение оси задает скорость, с которой прямолинейно перемещается Track Vehicle.

rotation

100

-100

Значение оси задает скорость, с которой Track Vehicle вращается вокруг своей вертикальной оси.

Робот Lego должен быть инициализирован в режим «Track Vehicle» прежде чем будет задействована ось straight или rotation, т.е. до включения режима ручного управления!

17.1.4 Быстрое подключение модуля uarm к RCML

uArm – это 4-х осевой манипулятор, миниатюрная версия промышленного робота ABB PalletPack IRB460

Изучить подробности о манипуляторе uArm можно на официальном сайте:

Модуль робота uarm используется для подключения робота uArm к RCML.

  1. Необходимо выполнить подключение робота uArm к компьютеру. Нужно перейти на сайт производителя в раздел Download Center, далее следует перейти в раздел Instructions и перейти в раздел Getting Started и далее выполнить инструкцию для подходящей модели uArm.
  2. Далее необходимо сменить программное обеспечение робота для работы с SDK С#. Инструкция быстрого старта по работе с SDK С#.
  3. Для включения модуля uarm необходимо добавить запись в секцию [robot_modules] конфигурационного файла RCML свойство module и установить его значение равным uarm в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML".
  4. Далее следует произвести настройку модуля. Необходимо указать, через какой COM-порт следует взаимодействовать с роботом. Для этого нужно перейти в каталог с модулями роботов (robot_modules), а затем в каталог модуля uarm.
  5. В директории модуля uarm нужно создать файл config.ini со следующим содержанием:
[main]
count_robots = 1
is_debug = 0
robot_port_0 = com3

Файл конфигурации модуля состоит из секции [main], которая включает в себя следующие свойства:

  • count_robots – свойство, качестве параметра принимающее количество роботов uArm (число) к которым необходимо будет подключиться.
  • is_debug – отображает в консоль дополнительную информацию о исполняемых функциях роботом uArm. Может принимать значение 0 или 1.
  • robot_port_X – содержит имя COM-порта, к которому подключен робот Х, причем отсчет роботов начинается с 0. Адрес порта должен быть указан в формате comY, где Y – порядковый номер порта, который был ранее использован в пунктах 1 и 2.

Далее приведен текст программы на языке RCML. Программа обращается к роботу uArm и включает вакуумную помпу на 5 секунд и выключает её:

function main() {
	@ur = robot_uarm;
	@ur-> pump_on();
	system.sleep(1000);
	@ur-> pump_off();
}

Доступные функции робота приведены в таблице:

Определение

Описание

Пример

move_to(X, Y, Z)

перемещает захват робота в точку с координатами X, Y, Z. Движение происходит с максимально возможной скоростью перемещения.

@Robot->move_to (10, 10, 10); перемещает захват робота в точку с координатами X=10, Y=10, Z=10

pump_on()

включает помпу захвата

@Robot->pump_on(); включает помпу захвата

pump_off()

вкылючает помпу захвата

@Robot->pump_off(); выключает помпу захвата

find_x()

возвращает значение координаты X точки, в которой находится захват робота

X = @Robot->find_x(); получает значение координаты X точки, в которой находится захват робота и сохраняет ее в переменную X

find_y()

возвращает значение координаты Y точки, в которой находится захват робота

Y = @Robot->find_y(); получает значение координаты Y точки, в которой находится захват робота и сохраняет ее в переменную Y

find_z()

возвращает значение координаты Z точки, в которой находится захват робота

Z = @Robot->find_z(); получает значение координаты Z точки, в которой находится захват робота и сохраняет ее в переменную Z

move_to_at_once(x,Y, Z)

перемещает захват робота в точку с координатами X, Y, Z. Движение происходит с максимально возможной скоростью перемещения.

@Robot->move_to_at_once (10, 10, 10); перемещает захват робота в точку с координатами X=10, Y=10, Z=10

move(x, Y, Z)

перемещает захват робота из точки с текущими координатами X_текущее,Y_текущее, Z_текущее в точку с координатами X_текущее + X,Y_текущее + Y, Z_текущее + Z. Движение происходит плавно.

@Robot->move(1, 1, 1); изменит координаты точки в которой находится захват робота на указанные значения (X_текущее + 1, Y_текущее + 1, Z_текущее + 1)

move_to_1(x, Y, Z,T)

перемещает захват робота в точку с координатами X, Y, Z с задержками между промежуточными шагами на время T. Время указывается в миллисекундах

@Robot->move_to_1(1, 1, 1, 50); переместит захват робота в точку с координатами X=1, Y=1, Z=1, с 50 миллисекундной задержкой между промежуточными перемещениями

move_to_2(x, Y, Z,T, R, Th4)

перемещает захват робота в точку с координатами X, Y, Z с задержками между промежуточными шагами на время T. Так же поворачивает захват роботоа вокруг оси на Th4 градусов

@Robot->move_to_2(1, 1, 1, 1, 1, 30); переместит захват робота в точку с координатами X=1, Y=1, Z=1, с 50 миллисекундной задержкой между промежуточными перемещениями. Так же повернет захват робота вокруг оси на 30 градусов

write_angles(Th1,Th2, Th3, Th4)

изменяет углы положения сервоприводов на указанные значенияTh1, Th2, Th3, Th4

@Robot->write_angles(10, 10, 10, 10); изменит углы положения сервоприводов на 10 градусов

rotate_servo4(Th4)

изменит угол положения сервопривода захвата робота на указанное значениеTh4

@Robot->rotate_servo4(15); изменит угол положения сервопривода захвата робота на 15 градусов

Доступны следующие оси управления роботом uArm:

Ось

Верхняя
граница

Нижняя
граница

Описание

locked

1

0

Бинарная ось. Если её значение равно 1, то робот считается заблокированным и игнорирует изменение значений по любым другим осям.

pump

1

0

Бинарная ось. Если её значение равно 1, то будет включена помпа робота. При значении равном 0 помпа будет отключена.

servo1

180

0

ось изменения угла первого сервопривода, находящегося в основании.

servo2

180

0

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

servo3

180

0

ось изменения угла третьего сервопривода - между плечами робота.

servo4

180

0

ось изменения угла четвертого сервопривода, изменяющего угол поворота захвата.

17.1.5 Быстрое подключение модуля smc к RCML

Модуль робота smc позволяет в RCML управлять промышленными электромеханическими захватами серии LEH производства компании SMC, посредством контроллера LECP6 этого же производителя. Каждый захват представляется в RCML как робот, которого соответственно можно задействовать и освободить. Контроллер LECP6 подключается к ПК, на котором работает RCML, через фирменный кабель из комплекта SMC Controller setting kit LEC-W2, используемый для управления захватом с ПК.

Промышленные электромеханические захваты серии LEH производства SMC

Стандартный контроллер LECP6 для управления захватами серии LEH

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

 

Для управления захватом SMC LEH через RCML необходимо:

  1. Произвести установку и подключение захвата к контроллеру в соответствии с инструкциями производителя.
  2. Подключить контроллер к ПК.
  3. Добавить запись в секцию [robot_modules] конфигурационного файла RCML свойство module и установить его равным smc в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML".
  4. Далее следует произвести настройку модуля. Необходимо указать, через какой COM-порт следует взаимодействовать с контроллером захвата. Для этого нужно перейти в каталог с модулями роботов (robot_modules), а затем в каталог модуля SMC.
  5. В директории модуля smc нужно создать файл config.ini со следующим содержанием:
[main]
count_robots = 1
is_debug = 0
robot_port_0 = \\.\\COM3

Файл конфигурации модуля состоит из секции [main], которая включает в себя следующие свойства:

  • count_robots – свойство, в качестве параметра принимающее количество контроллеров SMC, к которым необходимо будет подключиться.
  • is_debug – отображает в консоль пакеты данных передаваемых контроллеру LECP6. Может принимать значение 0 или 1.
  • robot_port_X – содержит имя COM-порта, к которому подключен робот Х. Адрес порта должен быть указан в формате \\.\\COMY, где Y – порядковый номер порта. Отсчет должен начинаться с 0.

Далее приведен текст программы на языке RCML. Программа обращается к захвату SMC, передает команду развести губки на 1 см со скоростью 1 мм/с, а затем отправляет команду на возврат в позицию по умолчанию:

function main() {
@r = robot_smc;
@r-> move_to(1000, 1);
@ur->return_to_origin();
}

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

Определение

Описание

Пример

move_to(pos, spd)

устанавливает расстояние между губками захвата равное pos (в сотых долях миллиметра). Перемещение губок захвата происходит с заданной скоростью spd (мм/с)

@Robot->move_to (200, 10); устанавливает расстояние между губками захвата равное 2мм. Скорсоть движения губок захвата 10мм/с

return_to_origin()

возвращает губки захвата в положение по умолчанию (расстояние между губками 1мм)

@Robot->return_to_origin();

get_cur_position()

возвращает текущее расстояние между губками захвата (сотые доли миллиметра)

@Robot-\>get\_cur\_position();

get_cur_speed()

возвращает текущую скорость перемещения губок захвата в мм/с

X = @Robot->find_x(); получает значение координаты X точки, в которой находится захват робота и сохраняет ее в переменную X

get_cur_thrust()

возвращает значение текущей нагрузки (%)

thrust = @Robot->get_cur_thrust();

move_to2( move_mode, spd, pos, accel, decel, pushing_force, trigger_level, pushing_speed, moving_force, area_output1, area_output2, in_position)

устанавливает расстояние между губками захвата равное pos (сотые миллиметра); move_mode - тип перемещения (1 - абсолютное перемещение, 2 - относительное перемещение); spd - скорость (мм/с); accel – ускорение при начале движения (мм/с^2); decel – замедление при остановке (мм/с^2); pushing_force (0 - позиционирование, [1-100] - воздействие с заданным моментом (%); trigger_level - значение воздействия, при котором флаг INP примет 1; pushing_speed - скорость перемещения при воздействии (мм/с); moving_force - максимальное усилие при перемещении (%); area_output1, area_output2 - если текущая позиция находится между заданными значениями, флаг AREA примет 1; in_position - если текущая позиция совпадает с заданным значением, флаг INP примет 1

set_hand_control_params(spd, accel, decel)

устанавливает скорость spd в мм/с, ускорение accel в мм/с^2 и замедление decel в мм/с^2 для режима ручного управления захватом

@Robot->set_hand_control_params(20, 50, 50);

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

Ось

Верхняя граница

Нижняя граница

Описание

locked

1

0

Бинарная ось. Если её значение равно 1, то захват считается заблокированным и игнорирует изменение значений по любым другим осям.

servo1

1000

100

Ось, задающая расстояние между губками захвата.

17.1.6 Быстрое подключение модуля FANUC к RCML

Для управления промышленными роботами FANUC с помощью RCML, существует одноименный модуль робота – FANUC. Данный модуль совместим с контроллерами производства FANUC серий A-cabinet и B-cabinet, имеющих включенную программную опцию Modbus TCP. Соответственно модуль FANUC поддерживает всех роботов совместимых с данными контроллерами.

Подробнее о роботах FANUC можно узнать на официальном сайте компании:

С помощью данного модуля возможно управлением робота с ПК через RCMLruntime задание произвольных траекторий перемещения роботу в том числе с поддержкой управления дополнительных групп осей (поворотный стол и пр.)

Низкоуровневый функционал модуля FANUC заключается в возможности передачи контроллеру из RCML данных различных типов: биты, целые числа, вещественные числа, а также запуск программ по механизму PNS.

Коммуникация ПК с RCML и контроллера FANUC осуществляется по FTP Ethernet кабелю. Предварительно робот, контроллер и ПК c RCML должны быть настроены соответствующем образом. Информация о процедуре настройки и подготовки высылается по запросу в произвольной форме, отправленному на info@robotct.ru

Для подключения модуля FANUC необходимо выполнить следующие шаги:

  1. Произвести необходимую предварительную настройку робота и контроллера;
  2. Произвести настройку ПК с RCML для установки связи с контроллером;
  3. Подключить контроллер FANUC к ПК с RCML по FTP Ethernet кабелю, если роботов несколько, то они могут быть подключены в одну сеть с помощью соответствующего сетевого оборудования.
  4. Добавить запись в секцию [robot_modules] конфигурационного файла RCML свойство module и установить его равным fanuc в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML"
  5. Далее следует произвести настройку самого модуля FANUC, для этого в директории модуля нужно создать файл config.ini и заполнить его по указанным ниже правилам.

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

Для каждого управляемого робота создается секция с именем вида robot_X, где X - порядковый номер робота, отсчет начинается с 1. Данная секция называется секцией робота. В секции робота должно быть 4 свойства:

  • robot_name – уникальное отображаемое имя робота, строка;
  • ip – IP адрес контроллера робота в сети, строка;
  • port – порт робота, число;
  • slave_id – номер робота в сети Modbus.

Ожидается, что все подключенные к RCML роботы будут иметь одинаковую конфигурацию цифровых входов и выходов, DI и DO, соответственно. Для задания конфигурации DI используется одноименная секция DI, в которой можно указать передаваемые ячейки данных и их типы. Каждая ячейка имеет отображаемое имя, используемое в программе на RCML для обращения к этой ячейке.

Поддерживаются следующие типы данных:

  • Логический. Указывается как logic_%name% = X, где %name% - имя ячейки, а X – номер входа. Данный тип задействует всего 1 вход.
  • Целочисленный. Указывается как integer_%name% = X, где %name% - имя ячейки, а X – номер входа, с которого начинается отсчет разрядов для передачи числа. Данный тип имеет размер 16 разрядов и соответственно задействует 16 входов. При этом для начала отсчета разрядов можно выбирать только те входа, номер которых при делении на 16 дает в остатке 1 (1, 17, 33, 49 и т.д.). Целочисленный тип может передавать только целые не отрицательные числа.
  • Вещественный. Указывается как real_%name% = A,B,C, где %name% - имя ячейки, а A – номер входа, для передачи знака числа, B- номер входа, с которого начинается отсчет разрядов для передачи целой части вещественного числа, С - номер входа, с которого начинается отсчет разрядов для передачи дробной части вещественного числа,. Данный имеет размер 1+16+16 = 33 разряда и задействует столько же входов. При этом привило выбора номера входа для B и C части, такие же как для целочисленного типа данных.
  • Расширенный целочисленный. Указывается как big_integer_%name% = A,B, где %name% - имя ячейки, а A - номер входа, с которого начинается отсчет разрядов для передачи первой части числа, B - номер входа, с которого начинается отсчет разрядов для передачи второй части вещественного числа,. Данный имеет размер 16+16 = 32 разряда и задействует столько же входов. При этом привило выбора номера входа для A и B части, такие же как для целочисленного типа данных. Основное назначение данного типа - передача больших целых не отрицательных чисел.

Для задания конфигурации цифровых выходов робота – DO, применимы такие же типы данных, правила их описания такие же. Единственное отличие – конфигурация цифровых выходов задается в секции с именем DO.

Модуль FANUC поддерживает механизм запуска PNS программ в роботе, однако для этого нужно предусмотреть выделение дополнительных входов/выходов со следующими именами.

Для DI:

  • logic_cycle_stop
  • logic_fault_reset
  • logic_start
  • logic_enable
  • logic_input_PNS1
  • logic_input_PNS2 
  • logic_input_PNS3
  • logic_input_PNS4
  • logic_input_PNS5
  • logic_input_PNS6
  • logic_input_PNS7
  • logic_input_PNS8
  • logic_PNS_strobe
  • logic_prod_start

Для DO:

  • logic_cmdenabled
  • logic_prg_running
  • logic_prg_paused
  • logic_motion_held
  • logic_fault
  • logic_busy
  • logic_out_PNS1
  • logic_out_PNS2
  • logic_out_PNS3
  • logic_out_PNS4
  • logic_out_PNS5
  • logic_out_PNS6
  • logic_out_PNS7
  • logic_out_PNS8
  • logic_snack

При задании всех этих входов/выходов у модуля будут доступны функции run_program и run_program_soft использующие механизм PNS.

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

Определение

Описание

run_program(number)

Запускает PNS программу под номером num в роботе и ждёт её завершения. При нормальном завершении возвращает значение по умолчанию – 0.0, при ошибке бросает исключение. Данная функция доступна, только если была проведена конфигурация входов выходов, необходимых для работы PNS механизма. В случае если конфигурация не была проведена, функция бросает исключение.

run_program_soft(num)

Запускает PNS программу под номером num в роботе и не ожидает её завершения. Завершение запущенной программы возможно только вручную через оперирование соответствующими входами/выходами, отвечающими за управление механизмом PNS. Данная функция доступна, только если была проведена конфигурация входов выходов, необходимых для работы PNS механизма. В случае если конфигурация не была проведена, функция бросает исключение.

set_logic_di(name, value)

Установка значения value для логического входа под именем name. Функция бросает исключение, если вход под данным именем не найден. На вход подается положительный сигнал если значение value отлично от нуля, в противном случае отрицательный.

get_logic_di(name)

Получение значения логического входа под именем name. Функция бросает исключение, если вход под данным именем не найден. Функция возвращает 1, если сигнал на входе положительный и 0, если отрицательный.

get_logic_do(name)

Получение значения логического выхода под именем name. Функция бросает исключение, если вход под данным именем не найден. Функция возвращает 1, если сигнал на входе положительный и 0, если отрицательный.

set_integer_di(name, value)

Установка значения value для целочисленного входа под именем name. Функция бросает исключение, если вход под данным именем не найден. Если при установке значение value вещественное, то оно округляется по математическим правилам.

get_integer_di(name)

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

get_integer_do(name)

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

set_real_di(name, value)

Установка значения value для вещественного входа под именем name. Функция бросает исключение, если вход под данным именем не найден. В передаваемом значении value знаки, следующие после 3-го знака после запятой, будут отброшены

get_real_di(name)

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

get_real_do(name)

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

set_big_integer_di(name, value)

Установка значения value для расширенного целочисленного входа под именем name. Функция бросает исключение, если вход под данным именем не найден. Если при установке значение value вещественное, то оно округляется по математическим правилам.

get_big_integer_di(name)

Получение значения расширенного целочисленного входа под именем name. Функция бросает исключение, если вход под данным именем не найден.

get_big_integer_do(name)

Получение значения расширенного целочисленного выхода под именем name. Функция бросает исключение, если вход под данным именем не найден.

Модуль робота FANUC не имеет осей доступных оси для режима ручного управления.

17.2 Пример подключения модулей функций

17.2.1 Быстрое подключение модуля math к RCML

Функциональный модуль math используется для доступа к математическим функциями, аналогичным библиотеке math.h в С++.

    1. Для включения модуля math необходимо добавить запись в разделе [function_modules] конфигурационного файла RCML в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML". Дополнительных настроек модуль не требует.
    2. Теперь, в Вашем распоряжении, есть следующие функции:

Определение

Описание

Выброс исключения, если

pow(a, b)

Возведение a в степень b.

 

sqrt(a)

Возвращает квадратный корень из a. a не может быть меньше 0.

a < 0

abs(a)

Возвращает модуль числа a.

 

rand(a,b)

Возвращает случайное целое число в пределах [b;a+b). a не может быть меньше или равно 0.

a ≤ 0

sin(a)

Функции sin, cos, tan принимают значения в радианах.

Возвращает cинус a.

 

cos(a)

Возвращает коcинус a.

 

tan(a)

Возвращает тангенс a.

 

asin(a)

Возвращает аркcинус a. Из-за свойств функции аргумент a должен быть в пределах [-1;1].

Функции asin, acos, atan возвращают значения в радианах.

a ∉ [-1;1]

acos(a)

Возвращает арккоcинус a. Из-за свойств функции аргумент a должен быть в пределах [-1;1].

a ∉ [-1;1]

atan(a)

Возвращает арктангенс a.

 

exp(a)

Возвращает e в степени a.

 

log(a)

Возвращает натуральный логарифм числа a. Из-за свойств функции аргумент a должен быть больше 0.

a ≤ 0

log10(a)

Возвращает десятичный логарифм числа a. Из-за свойств функции аргумент a должен быть больше 0.

a ≤ 0

    1. В соответствии с разделом "Вызов функций" синтаксис программы с использованием модуля math выглядит следующим образом: 
function main() {
	r = 9;
	r = math.sqrt(r);
	system.echo(r);
}

Результатом работы этой программы является число 3.0000

  1. Следующий пример демонстрирует выброс исключения в случае нарушения входных данных.
function main() {
	try {
		r=math.log(0);
	} catch {
		system.echo("Throw exception log(0) undefined");
	}
}

Более подробно об использовании исключений описано в разделе "Исключения"

17.3 Пример подключения модулей управления

17.3.1 Быстрое подключение тестового модуля управления test к RCML

Тестовый модуль управления test используется для имитации получения значений осей от устройств управления.

Для включения модуля test необходимо добавить свойство module и присвоить ему значение test в секции [control_modules] конфигурационного файла RCML в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML". Дополнительной конфигурации модуль тестового управления не требует.

Далее приведен пример использования модуля тестового управления при взаимодействии с тестовым роботом:

function main() {
	@lr = robot_test; 
	system.hand_control(@lr,"test","X","X");
}

При выполнении данной программы в течении 10 секунд, раз в секунду посылается случайное значение по оси Х. Для функционирования представленной программы должен быть подключен модуль тестового робота, более подробно о подключении написано в разделе "Быстрое подключение модуля робота test к RCML"

Тестовый модуль управления имеет следующие доступные оси:

Наименование

Верхняя граница

Нижняя граница

Примечание

X

100

-100

 

Y

1

0

Бинарная

Z

100

0

 

Значения осей, передаваемые каждую секунду времени:

Наименование

1

2

3

4

5

6

7

8

9

10

X

100

-30.1

-2.58

48.9

99.01

-100

12.0

-36.9

0.25

0

Y

0

0

0

1

1

0.5

0.25

0.1

0.75

0.35

Z

4.56

0

78.9

100

50

48.8

66.7

32.4

40

20

17.3.2 Быстрое подключение модуля keyboard к RCML

Модуль управления keyboard используется для ручного управления роботом при помощи клавиатуры.

  1. Для включения модуля keyboard необходимо добавить в секцию [control_modules] конфигурационного файла RCML свойство module и установить его значение равным keyboard в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML".
  2. В папке модуля keyboard, находящего в директории control_modules необходимо создать файл конфигурации модуля config.ini
  3. Файл конфигурации модуля keyboard описывает, какие оси доступны программисту, для осуществления взаимодействия с роботом в режиме ручного управления. Для добавления новой оси, следует придерживаться следующего правила её описания:

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

имя_оси = значение_кнопки_клавиатуры_в_HEX_формате

3.2. Необходимо установить максимальное и минимальное значение, которое может принимать ось. Для этого следует с новой строки добавить секцию в конфигурационного файла config.ini, одноименную с именем оси, и задать свойства upper_value и lower_value передать значения максимума и минимума оси. В общем виде секция выглядит следующим образом:

[имя_оси]
upper_value = максимальное_значение_оси
lower_value = минимальное_значение_оси

3.3. Далее следует определить, какое значение будет иметь ось в случае нажатия кнопки на клавиатуре, которая ранее была прикреплена к ней. Определение значений происходит посредством создания секции, название которой состоит из имени оси и значения кнопки клавиатуры в Hex формате, разделенные между собой нижним подчеркиванием. Для задания значения по умолчанию (в не нажатом) и нажатом состоянии используются свойства unpressed_value и pressed_value, в которые передаются значения. Общий вид секции в таком случае выглядит следующим образом:

[имя_оси_значение_кнопки_клавиатуры_в_HEX_формате]
pressed_value = значение_оси_при_нажатой_клавише
unpressed_value = значение_оси_при_отжатой_клавише 

Для наглядности приведен пример конфигурации модуля keyboard с комментариями:

;Секция для работы в Linux
[options]
input_path = /dev/input/event2 ;Путь до файла потока ввода

;Обязательная секция
[mapped_axis]
;название_оси = код_клавиши (в HEX формате)
go = 0x26 ;стрелка_вверх
go = 0x28 ;стрелка_вниз

;Описание оси go, всегда должно иметь оба ключа
[go]
upper_value = 1 ;Верхняя граница значений оси
lower_value = -1 ;Нижняя граница значений оси

;Описание поведения оси go для клавиши *стрелка_вверх* (0x26)
[go_0x26]
pressed_value = 1 ;При нажатии клавиши *стрелка_вверх* значение оси задать равным 1
unpressed_value = 0 ;При отпускании клавиши *стрелка_вверх* значение оси задать равным 0

;Описание поведения оси go для клавиши *стрелка_вниз* (0x28)
[go_0x28]
pressed_value = -1 ;При нажатии клавиши *стрелка_вниз* значение оси задать равным -1
unpressed_value = 0 ;При отпускании клавиши *стрелка_вниз* значение оси задать равным 0

Пример описания конфигурации модуля включает в себя одну ось go, которая вернёт максимальное значение 1 при нажатии стрелки вверх и 0 при её отпускании или -1 при нажатии стрелки вниз и 0 при её отпускании. Более подробно об осях и ручном управлении написано в разделе "Общие сведения".

В качестве примера, приведен расширенный файл конфигурации модуля keyboard в котором инициализированы следующие оси:

  • [go] – в качестве кнопок управлению используются стрелки вверх-вниз
  • [rotate] – ось управляется стрелками влево-вправо
  • [locked] – используется для блокировки робота, нажатием кнопки «А» на клавиатуре.

Далее приведен листинг файла конфигурации модуля keyboard с тремя осями:

[mapped_axis]
go = 0x26
go = 0x28
rotate = 0x25
rotate = 0x27
locked = 0x41

[go]
upper_value = 1
lower_value = -1

[rotate]
upper_value = 1
lower_value = -1

[locked]
upper_value = 1
lower_value = 0

[locked_0x41]
pressed_value = 1
unpressed_value = 0

[go_0x26]
pressed_value = 1
unpressed_value = 0
	
[go_0x28]
pressed_value = -1
unpressed_value = 0

[rotate_0x25]
pressed_value = 1
unpressed_value = 0

[rotate_0x27]
pressed_value = -1
unpressed_value = 0

Далее приведен пример текста программы на языке RCML. Программа обращается к тестовому роботу, который был подключен в разделе "Быстрый старт" и выглядит следующим образом:

function main() {
	@tr = robot_test; 
	system.hand_control(@tr,"keyboard","X","go");
}

Первой строкой программы создаётся переменная, которая прикрепляется к тестовому роботу, о том, что такое тестовый робот и как его подключить, написано в разделе "Быстрое подключение модуля робота test к RCML".

Вторая строка переводит тестового робота в ручной режим управления. Как было описано ранее ось go, принимает значение в зависимости от нажатия стрелок вверх и вниз и имеет максимальное значение 1 и минимальное значение -1, которое передаёт их ось робота X. Однако, во время выполнения программы значение оси управляющего устройства не будет равно значению оси робота. Автоматически происходит процесс масштабирования оси, то есть максимальное значение клавиши, преобразовывается в максимальное значение оси робота. Аналогичная ситуация происходит и во время нажатия стрелки вниз. Модуль управления keyboard получает минимальное значение оси клавиатуры и преобразует в минимальное значение оси робота. Таким образом, при нажатии стрелки вверх, тестовый робот сообщит, что он перейдет в максимальное положение 100, а при нажатии стрелки вниз в -100.

У тестового робота существует ещё две оси Y,Z. Используя файл конфигурации модуля keyboard описанного на шаге 3, добавим ещё одну ось управления роботом. Пусть по мимо существующей передачи значений в ось Z тестового робота, будет приходить значение оси rotate. Программный код в этом случае будет выглядеть следующим образом:

function main() {
	@tr = robot_test; 
	system.hand_control(@tr,"keyboard","X","go","Y","rotate");
}

Во время выполнения программы, нажатие на стрелки вверх или вниз вызовет сообщения от тестового робота, о том, что была получена команда на смену значения по оси X, и по оси Y, при нажатии клавиш влево-вправо. Причем принимаемые роботом значения будут максимально допустимые для этих осей.

Больше информации о ручном управлении находиться в разделе 4 «Режим ручного управления».

17.3.3 Быстрое подключение модуля gamepad к RCML

Модуль управления gamepad обеспечивает ручное управление роботом при помощи геймпада.

Количество используемых осей зависит от содержимого файла конфигурации модуля config.ini. Максимальное количество осей, которые могут быть определены в файле конфигурации 18, из них:

  • 11 бинарных осей, соответствующих кнопкам.
  • 4 оси для стиков.
  • 2 оси для крестовины (D-pad).
  • 1 ось с названием "Exit" назначает на кнопку функцию завершения режима ручного управления.
  1. Для включения модуля gamepad необходимо добавить в секцию [control_modules] конфигурационного файла RCML свойство module со значением gamepad в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML".
  2. Далее следует перейти в каталог модулей RCML, в котором располагаются модули управления (control_modules), далее в каталог gamepad.
  3. Нужно создать пустой файл config.ini в каталоге gamepad. Далее в этот файл будут помещены настройки конфигурации джойстика.
  4. Далее необходимо настроить конфигурационный файл модуля config.ini. Предлагается использовать одну из двух готовых конфигураций модуля, которые подходят для большинства геймпадов:

4.1. Универсальный файл конфигурации модуля для взаимодействия с геймпадом №1:

[axis]
Exit = 9
B1 = 1
B2 = 2
B3 = 3
B4 = 4
L1 = 7
L2 = 5
R1 = 8
R2 = 6
start = 10
T1 = 11
T2 = 12
RTUD = 13
RTLR = 16
LTUD = 15
LTLR = 14
arrowsUD = 17
arrowsLR = 18

[B1]
upper_value = 1
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
4.2. Универсальный файл конфигурации модуля для взаимодействия с геймпадом № 2:
[axis]
Exit = 9
B1 = 4
B2 = 2
B3 = 1
B4 = 3
L1 = 5
L2 = 7
R1 = 6
R2 = 8
start = 10
T1 = 11
T2 = 12
RTUD = 16
RTLR = 13
LTUD = 15
LTLR = 14
arrowsUD = 17
arrowsLR = 18
	
[B1]
upper_value = 1
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
	
[stick_zero_positions]
axis_1 = 31487
axis_2 = 31487
axis_3 = 31487
axis_4 = 31487
arrows = 4294967295

[options]
input_path = /dev/input/js1

[arrowsLR]
upper_value = 1
lower_value = -1

В случае использования файлов готовых конфигураций модуля, шаги 5-8 следует пропустить. Если файлы конфигурации не обеспечивают требуемого уровня управления, то следует дополнительно выполнить пропущенные шаги.

Рекомендуется, прежде чем приступить к управлению реальным физическим роботом, проверить конфигурацию геймпада на тестовом роботе, о том как подключить тестового робота к RCML написано в разделе "Быстрое подключение модуля робота test к RCML".

5. Необходимо убедиться в том, что геймпад подключен к компьютеру. В противном случае, при дальнейшем запуске 'calibrator.exe', будет сформирована ошибка ‘cant CreateDevice

6. Для заполнения конфигурационного файла нужно запустить файл 'calibrator.exe'
Это консольное приложение запустит мастера калибровки, инструкциям которого необходимо следовать для наполнения файла конфигурации config.ini.
Для пропуска назначения кнопки достаточно подождать время, заданное в качестве параметра. (по умолчанию – 5 секунд)

7. Если нажатие нужной кнопки было пропущено или нажата не та клавиша, то следует закрыть окно, перезапустить 'calibrator.exe' и выполнить все инструкции более внимательно.

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

9. Далее приведена таблица с расшифровкой каждой доступной оси геймпада:

Наименование

Верхняя граница

Нижняя граница

Примечание

B1

1

0

Бинарная ось. Соответствует любой кнопке из группы кнопок ABXY геймпада x-box.

B2

1

0

Бинарная ось. Соответствует любой кнопке из группы кнопок ABXY геймпада x-box.

B3

1

0

Бинарная ось. Соответствует любой кнопке из группы кнопок ABXY геймпада x-box.

B4

1

0

Бинарная ось. Соответствует любой кнопке из группы кнопок ABXY геймпада x-box.

L1

1

0

Бинарная ось. Соответсвует кнопке с таким же названием геймпада x-box

L2

1

0

Бинарная ось. Соответсвует кнопке с таким же названием геймпада x-box

R1

1

0

Бинарная ось. Соответсвует кнопке с таким же названием геймпада x-box

R2

1

0

Бинарная ось. Соответсвует кнопке с таким же названием геймпада x-box

start

1

0

Бинарная ось. Соответсвует кнопке с таким же названием геймпада x-box

T1

1

0

Бинарная ось. Соответсвует кнопке с таким же названием геймпада x-box

T2

1

0

Бинарная ось. Соответсвует кнопке с таким же названием геймпада x-box

RTUD

Назначается

Назначается

Дискретная ось. Соответствует правому стику.

RTLR

Назначается

Назначается

Дискретная ось. Соответствует правому стику.

LTUD

Назначается

Назначается

Дискретная ось. Соответствует левому стику.

LTLR

Назначается

Назначается

Дискретная ось. Соответствует левому стику.

arrowsUD

1

-1

Дискретная ось. Соответствует крестовине(D-pad) геймпада.

arrowsLR

1

-1

Дискретная ось. Соответствует крестовине(D-pad) геймпада.

Далее приведен пример текста программы на языке RCML. Программа обращается к тестовому роботу, который был подключен при выполнении раздела "Быстрый старт" и выглядит следующим образом:

function main() {
	@tr = robot_test; 
	system.hand_control(@tr,"gamepad","X","RTUD");
}

Первой строкой программы создаётся переменная, к которой прикрепляется тестовый робот.

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

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

Больше информации о ручном управлении находиться в разделе «Режим ручного управления».

17.3.4 Быстрое подключение Myo к RCML

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

Более подробно о браслете Myo можно прочитать на официальном сайте:

Модуль управления myo используется для ручного управления роботом при помощи устройства Myo которое отслеживает жесты и положение руки в пространстве.

  1. Для начала Вам следует выполнить установить и настроить Myo на Вашем компьютере, как это показано в Setting up the Myo armband with your Windows PC.
  2. Далее следует установить следующие настройки для Myo Connect

2.1. Необходимо установить настройки General в соответствии с изображением.

2.2. Следует настроить Presentation Mode как показано на рисунке.

2.3. Кроме этого следует отключить Connector и Presentation Mode в соответствии с рисунком.

2.4. Необходимо также настроить Myo Keyboard Mapper как показано на изображении.

  • Для включения модуля myo необходимо добавить в секцию [control_modules] конфигурационного файла RCML свойство module и установить его значение равным myo в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML". Дополнительно модуль в конфигурировании не нуждается и будет подключен по умолчанию к первому браслету в системе.
function main() {
	@r = robot_test;
	system.hand_control(@r,"myo","X","fist");
}

Первой строчкой программы, создаётся переменная, которая прикрепляется к тестовому роботу, о том, как подключить тестового робота, написано в разделе "Быстрое подключение модуля робота test к RCML".

Вторая строчка программы, указывает что управление роботов будет происходить в режиме ручного управления. То есть в ось X тестового робота @r передаётся значение оси fist устройства управления myo. Более подробно о том, что означает функция ручного управления написано в руководстве по RCML в разделе "Режим ручного управления".

Во время выполнения программы, необходимо сделать жесть fist (сжать кулак), жест будет распознан Myo и через модуль управления myo тестовому роботу, будет передано новое значение оси Х. Поскольку 1 это максимальное значение оси fist для Myo, а для тестового робота максимальное значение оси Х это 100, то верхняя граница значения оси fist будет преобразована до верхней границы оси X, тем самым робот изменит значение оси Х на максимально возможное – 100.

Браслет Myo умеет распознавать следующие жесты:

  • fist;
  • fingers spread;
  • double tap;
  • wave out;
  • wave in.
  • rest (отсутствие жеста, расслабленная рука)

Все из вышеперечисленных жестов доступны для программиста по умолчанию.

Кроме этого, программисту доступны следующие оси в модуле:

Наименование

Верхняя граница

Нижняя граница

Примечание

locked

1

0

Бинарная ось. Отражает статус браслета Myo: блокирован - 1, разблокирован - 0.

fist

1

0

Бинарная ось. Если наблюдается жест fist - 1, в противном случае - 0.

left_or_right

1

-1

Дискретная ось. Удобна для задания направления перемещения или поворота. Основана на жестах wave out и wave in. Автоматически определяет направление кисти в данных жестах направо или налево (независимо от того на какую руку надет браслет) и принимает следующие значения: -1 - налево, 0 - нет жеста, 1 - направо.

fingers_spread

1

0

Бинарная ось. Если наблюдается жест fingers spread - 1, в противном случае - 0.

double_tap

1

0

Бинарная ось. Если наблюдается жест double tap - 1, в противном случае - 0.

fist_pitch_angle

18

0

Непрерывная ось. Отмечает угол pitch (тангаж) браслета относительно земли, при жесте fist.

fist_roll_angle

18

0

Непрерывная ось. Отмечает угол roll (крен) браслета относительно земли, при жесте fist.

fist_yaw_angle

18

0

Непрерывная ось. Отмечает угол yaw (рысканье) браслета относительно земли, при жесте fist.

fingers_spread_pitch_angle

18

0

Непрерывная ось. Отмечает угол pitch (тангаж) браслета относительно земли, при жесте fingers spread.

fingers_spread_roll_angle

18

0

Непрерывная ось. Отмечает угол roll (крен) браслета относительно земли, при жесте fingers spread.

fingers_spread_yaw_angle

18

0

Непрерывная ось. Отмечает угол yaw (рысканье) браслета относительно земли, при жесте fingers spread.

Примечания к таблице:

  1. Значения всех осей передаются 20 раз в секунду.
  2. Значение осей с суффиксом angle, изменяется и передается только при наблюдении соответствующего жеста.
  3. Если браслет блокирован, то значения всех осей жестов, кроме оси locked и осей с суффиксом angle, будут равны 0.
  4. Браслет блокируется автоматически, если некоторое малое время (1-2 сек) по датчикам наблюдается не известный браслету жест или наблюдается жест rest, а также если обнаружен сдвиг браслета на руке или снятие браслета с руки.
  5. Разблокировка браслета происходит жестом double tap, как и во многих Myo-совместимых приложениях.
  6. Рекомендуется проявлять осторожность при использовании для управления роботом одновременно оси fist или fingers_spread, и осей содержащих одноименные префиксы fist или fingers_spread соответственно, т.к. оси жестов принимают значение 1 при попытке изменения значения осей, активных при соответствующем жесте, поскольку для этого требуется появление этого жеста.

Кроме тестового робота, к системе RCML можно подключить другого робота, совместимого с RCML.

17.4 Пример подключения модуля выбора робота

17.4.1 Быстрое подключение модуля avg к RCML

Модуль выбора робота avg реализует простейшую логику выбора наиболее быстрого робота на основе статистических данных RCML.

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

Затем всегда выбирает того робота или робота того модуля, у которого наименьшее среднеарифметическое время выполнения требуемой функции по его (робота) числу попыток выполнения этой функции.

Включение модуля avg стандартно - нужно добавить в секцию [choice_modules] конфигурационного файла RCML свойство module и установить его равным avg в соответствии с разделом "Установка и настройка компилятора и интерпретатора RCML".

Дополнительной конфигурации модуля avg не требуется. Однако у RCML должен быть включен режим записи статистической информации, в противном случае модуль запретит запуск RCML.

 

Адрес:

Россия, Пермь
ул. Монастырская, 12,
лит. А, офис 600

Телефон:

+7 (342) 214 01 84

E-mail:

info@robotct.ru