URBI — введение в urbiScript — часть 1


Кратко рассмотрим что из себя представляет urbiScript.
Как уже говорилось — urbiScript — это скриптовый язык, используемый для написания программ (скриптов) для управления роботами.
Важными чертами urbiScript являются:

* параллельность
* программирования на основе событий
* прототипное программирование (объекты могут изменяться «на лету»)
* синтаксис в стиле С++

urbiScript выполняется на Urbi-сервере, который запускается либо на роботе, либо на компьютере и к которому можно подключиться простым telnet-ом.

Взаимодействие с аппаратной частью робота осуществляется через объекты UObject, которые выполняют роль драйверов (прослойка между Urbi и аппаратной частью робота).
Данные драйвера реализуются в виде библиотек (.dll), подключаются к серверу Urbi и далее могут прозрачным образом использоваться в urbiScript (вызывать функции, изменять переменные).

Чтобы попробовать urbiScript на вкус нужно запустить Urbi-сервер (устанавливается при инсталляции Urbi SDK) через ярлык «runtime» в меню Пуск, который всего-лишь выполняет команду
«С:\Program Files\Gostai Engine Runtime\bin\urbi.exe» —interactive —port 54000
и прямо в этой консоли можно сразу вводить команды.
Либо можно подключиться telnet-ом к 54000-му порту или лучше всего воспользоваться
Gostai urbiConsole.

Дальнейший материал про urbiScript — это вольный перевод официальной документации, которая идёт в комплекте URBI SDK. Заранее приношу извинения за возможные неточности или ошибки. В случае сомнений рекомендую обращаться к первоисточнику.

1. Комментарии

Комментарии в urbiScript аналогичны комментариям в С++:

/* это блочный комментарий */
// это комментарий до конца строки

2. Значения

42; // целое число
[00000000] 42
3.14; // число с плавающей точкой
[00000000] 3.14
"string"; // строка
[00000000] "string"
[1, 2, "a", "b"]; // список
[00000000] [1, 2, "a", "b"]
["a" => 1, "b" => 2]; // словарь (ассоциированный список)
[00000000] ["a" => 1, "b" => 2]
nil; // нейтральное значение
void; // отсутствие значения


3. Вызов функций

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

cos(0); // вычисление косинуса
[00000000] 1
max(1, 3); // вернёт максимальный аргумент
[00000000] 3
max(1, 3, 4, 2);
[00000000] 4

результат выполнения функции выводится на экран. Стоит обратить внимание, что функции могут иметь переменное число аргументов (как max())
А вот и долгожданная функция вывода на экран:

echo("Hello world!");
[00000000] *** Hello world!

4. Переменные

переменные определяются ключевым словом var

var x = 42;
[00000000] 42
echo(x);
[00000000] *** 42
x = 51;
[00000000] 51
x;
[00000000] 51

если переменная не инициализирована, то она по-умолчанию содержит void.
! При попытке распечатать такую переменную интерпритатор ничего не выдаст.

var y;
y;
// интерпритатор хранит молчание,
// т.к. void не распечатывается
// Можно убедиться, что переменная хранит
// void с помощью следующих методов:
y.asString;
[00000000] "void"
y.isVoid;
[00000000] true

5. Операторы

urbiScript поддерживает классическую семантику арифметических операторов.

1 + 1 == 2;	 	// сложение
1 - 2 == -1; 	// вычитание
2 * 3 == 6; 	// умножение
10 / 2 == 5; 	// деление
2 ** 10 == 1024; // возведение  в степень
5%2 == 1; 		// модуль (целочисленное деление)
-(1 + 2) == -3; // смена знака
1 + 2 * 3 == 7;
(1 + 2) * 3 == 9;
-2 ** 2 == -4;
- - - - 1 == 1;

5.1 Операторы присваивания

Присваивание в urbiScript выполняется оператором равно (=). Так же существуют сокращённые версии арифметического действия и присваивания (например +=). Эти операторы не могут быть переопределены, т.к. они эквивалентны простому оператору с последующей операцией присваивания.

var y = 0;
[00000000] 0
y = 10;
[00000000] 10
y += 10;
[00000000] 20
y /= 5;
[00000000] 4
y++;
[00000000] 4
y;
[00000000] 5

5.2 Поразрядные операторы

4 << 2 == 16; // сдвиг влево на 2 бита
4 >> 2 == 1; // сдвиг вправо на 2 бита

2^1; // XOR - исключающе ИЛИ
[00000000] 3

5.3 Логические операторы

urbiScript поддерживает обычные логические операторы.
Обратите внимание, что у операторов && и || условие справа будет проверяться только если это необходимо.

true && true;
true || false;
!true == false;
true || (1 / 0);
(false && (1 / 0)) == false;

5.4 Операторы сравнения

urbiScript использует классические операторы сравнения.

Обратите внимание на операторы == и ===
== возвращает симантическое равенство (сравнивается величины (содержимое объектов))
=== возвращает физическое равенство (т.е. если два объекта имеют одинаковый идентификатор (uid) ):

var a = 42;
[00000000] 42
var b = 42;
[00000000] 42
a == b;
[00000000] true
a === b; // a и b - разные объекты
[00000000] false
a = b; // теперь a указывает на объект b
[00000000] 42
a === b;
[00000000] true

5.5 Операторы контейнеров

операторы in и not in — проверяют содержится ли требуемая величина в контейнере (списке):

1 in [0, 1, 2];
[00000000] true
3 not in [0, 1, 2];
[00000000] true
"one" in ["zero" => 0, "one" => 1, "two" => 2];
[00000000] true
"three" not in ["zero" => 0, "one" => 1, "two" => 2];
[00000000] true

так же обратите внимание, что оператор [] — варьируемый: он может принимать сразу несколько аргументов.

// на списке
var l = [1, 2, 3, 4, 5];
[00000000] [1, 2, 3, 4, 5]
assert
{
	l[0] == 1;
	l[-1] == 5;
	(l[0] = 10) == 10;
	l == [10, 2, 3, 4, 5];
};
// на строках
var s = "abcdef";
[00000005] "abcdef"
assert
{
	s[0] == "a";
	s[1,3] == "bc";
	(s[1,3] = "foo") == "foo";
	s == "afoodef";
};


5.6 Операторы доступа к свойствам объектов

Для доступа к свойствам объекта используются те же операторы, что и в С++:
. и ->

class Foo
{
	var a = 42;
	var b = "foo";
};
[00000000] Foo
Foo.a;
[00000000] 42

6. Области

Области обозначаются фигурными скобками ({}). Они могут содержать любое количество операторов.
Переменные, объявленные внутри области и существуют только внутри данной области.

{
	var x = "test";
	echo(x);
};
[00000000] *** test
// здесь x уже больше не определён

7. Вызов методов

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

0.cos();
[00000000] 1
"a-b-c".split("-");
[00000000] ["a", "b", "c"]
// пустые круглые скобки не обязательны
"foo".length();
[00000000] 3
"foo".length;
[00000000] 3
// последовательный вызов методов
"".length.cos;
[00000000] 1

8. Функции

Функции определяются ключевым словом function

// определение функции myFunction
function myFunction()
{
	echo("Hello world");
	echo("from my function!");
};
[00000000] function () {
echo("Hello world");
echo("from my function!");
}
// вызов
myFunction();
[00000000] *** Hello world
[00000000] *** from my function!

Обратите внимание, что после определения функции, интерпритатор распечатывает её. Это происходит из-за того, что определение myFunction приводит к созданию этой новой функции, а интерпритатор просто распечатывает результат выполнения операции:

// работаем в области
{
	// определяем f
	function f()
	{
		echo("f")
	};
	// Это не вызывает f, а возвращает её значение.
	f;
};
[00000000] function () {
	echo("f")
}
{
	// определяем f
	function f()
	{
		echo("Hello World");
	};
	// вызываем f
	f();
};
[00000000] *** Hello World

здесь f выступает как обычная переменная. Вызвав её без круглых скобок можно увидеть тело функции. А с круглыми скобками — это уже вызов данной функции. В это состоит отличие функций от вызова методов: для методов круглые скобки не обязательны, методы всегда выполняются.

Т.к. вывод тела функции при её определении чаще всего нежелателен, можно воспользоваться | {}; (или даже |; )
Работает это просто — при выполнении команды
code | {};
Urbi-сервер сначала выполняет code, затем выполняет {} и возвращает значение (void) последнего, что приводит к тому что сервер ничего не выводит.

function sum(a, b, c)
{
	return a + b + c;
} | {};
sum(20, 2, 20);
[00000000] 42

Ключевое слово return позволяет возвращать значение от функции. Если return не определён, то возвращается значение последнего выражения функции:

function succ(i) { i + 1 } | {};
succ(50);
[00000000] 51

Читать далее: введение в urbiScript — часть 2


Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение