1. URBI — Введение
2. URBI — архитектура URBI
3. URBI — введение в программирование UObject
Для программирования модулей под Urbi потребуется компилятор:
Microsoft Visual Studio C++ 2008(2005)
Я мучился с попытками компиляции объектов из Visual Studio C++ 6.0, но безрезультатно.
В коде Urbi используются макросы с переменным числом аргументов и ещё разные нюансы, которые, похоже, реализованы только в более современных компиляторах .
Так что придётся остановиться на
Microsoft Visual Studio Express Edition
— бесплатная версия среды разработки для создания приложений под ОС Windows на C#, C++
скачать можно здесь:
http://www.microsoft.com/express/Downloads/
(выбираем либо инсталяцию через веб для отдельных продуктов, либо, в самом низу, образ диска с полным комплектом).
Скачиваем и устанавливаем urbi SDK 2.1 (windows-x86-vcxx2008):
при установке urbi SDK 2.1 (windows-x86-vcxx2008)
создаётся директория
С:\Program Files\Gostai Engine Runtime\
так же по запросу устанавливается urbiConsole
С:\Program Files\Gostai urbiConsole 2.1\
При установленной VS C++ 2008
добавляется шаблон для создания объектов UObject
Т.е. при создании проекта выбирается
Visual C++ -> uobject

в появившемся поле вводится название объекта
и из шаблона
С:\Program Files\Gostai Engine Runtime\share\templates\Visual Studio\Templates\1033\uobject.cpp
формируется каркас:
#include <urbi/uobject.hh>
class [!output UOBJECT_NAME]: public urbi::UObject
{
public:
[!output UOBJECT_NAME](const std::string& str);
int init();
};
[!output UOBJECT_NAME]::[!output UOBJECT_NAME](const std::string& s)
: urbi::UObject(s)
{
UBindFunction([!output UOBJECT_NAME], init);
};
int [!output UOBJECT_NAME]::init()
{
return 0;
};
UStart([!output UOBJECT_NAME]);
Т.е. назвав объект, например, MyAdder получим вот такой код:
#include <urbi/uobject.hh>
class MyAdder: public urbi::UObject
{
public:
MyAdder(const std::string& str);
int init();
};
MyAdder::MyAdder(const std::string& s)
: urbi::UObject(s)
{
UBindFunction(MyAdder, init);
};
int MyAdder::init()
{
return 0;
};
UStart(MyAdder);
Посмотрев свойства проекта можно заметить, что добавляются дополнительные директории для поиска заголовочных файлов и файлов библиотек:
include
С:\Program Files\Gostai Engine Runtime\include
lib
С:\Program Files\Gostai Engine Runtime\bin;С:\Program Files\Gostai Engine Runtime\bin\gostai\engine
так же добавляются дополнительные библиотеки при линковке:
additional
libjpeg4urbi-vc90-d.lib libport-vc90-d.lib libsched-vc90-d.lib libuobject-vc90-d.lib
при отладке запускается:
Debug
С:\Program Files\Gostai Engine Runtime\bin\urbi-launch-d.exe
Добавим тестовый код для суммирования:
#include <urbi/uobject.hh>
class MyAdder: public urbi::UObject
{
public:
// класс должен иметь единственный конструктор, принимающий строчку
MyAdder(const std::string& str);
// переменная
urbi::UVar v;
// методы
int init();
double add (double);
};
// конструктор определяет что доступно из Urbi
MyAdder::MyAdder(const std::string& s)
: urbi::UObject(s) // необходимо
{
// доступ к переменной
UBindVar (MyAdder, v);
// доступ к функции
UBindFunction (MyAdder, add);
UBindFunction(MyAdder, init);
};
int MyAdder::init()
{
return 0;
};
double
MyAdder::add (double rhs)
{
return (v + rhs);
}
UStart(MyAdder);
При компиляции компилятор ругается на строчку:
return (v + rhs);
error C2593: operator + is ambiguous
ситуация исправилась только при явном приведении типа:
return ((double)v + rhs);
При попытке собрать проект получаем ошибку линковки:
LINK : fatal error LNK1104: cannot open file ‘libboost_thread-vc90-mt-gd-1_38.lib’
такого файла в каталоге
С:\Program Files\Gostai Engine Runtime\bin\
действительно нет, но есть boost_thread-vc90-mt-gd-1_38.lib
скопировал boost_thread-vc90-mt-gd-1_38.lib в требуемую библиотеку.
следующая ошибка аналогична:
LINK : fatal error LNK1104: cannot open file ‘libboost_date_time-vc90-mt-gd-1_38.lib’
скопировал boost_date_time-vc90-mt-gd-1_38.lib
Отлично!
dll-ка успешно слинковалась.
NB при попытке соборать Release-версию выпадают аналогичные ошибки, только теперь библиотеки с суффиксом «-s-» вместо «-gd-»
libboost_thread-vc90-mt-s-1_38.lib
libboost_date_time-vc90-mt-s-1_38.lib
Осталось проверить наш тестовый Urbi-объект.
Для этого нужно:
* Сначала запустить Gostai runtime:
через ярлык в меню пуск, который выполняет команду
«С:\Program Files\Gostai Engine Runtime\bin\urbi.exe» —interactive —port 54000
* загрузка модуля осуществляется программой urbi-launch:
С:\Program Files\Gostai Engine Runtime\bin\urbi-launch.exe -r «C:\Documents and Settings\Myadder.dll»
посмотреть справку можно с флагом (-h)
С:\Program Files\Gostai Engine Runtime\bin\urbi-launch.exe -h

Обратите внимание, что нормально загружаются только Release-версии библиотек.
далее уже в консоли (urbiConsole) создаём объект нашего класса:
=> var adder = MyAdder.new; #[0002435274] object_423 => adder.v=6; #[0002544069] 6 => adder.add(7); #[0002551242] 13

Вуаля!
Скачать исходный код примера и готовую dll-ку можно по ссылке:
/files/urbi/MyAdder.zip
выводы:
* класс объекта должен наследоваться от urbi::UObject.
* класс объекта должен иметь единственный конструктор, принимающий в качестве параметра — строку, передавая её в urbi::UObject
* если переменная должна быть доступна из Urbi, то она должна определяться с типом urbi::UVar
* в конструкторе нужно вызвать макрос UBindVar(class-name, variable-name) для каждой переменной UVar и макрос UBindFunction(class-name, function-name) для каждой функции, которые должны быть доступны из Urbi
* вызвать макрос UStart для каждого объекта.
При запуске сервера Urbi объект каждого класса, зарегистрированный с помощью UStart, создаётся с тем же имененм, что и у класса.
Объект класса может быть создан используя метод new.
Для каждого объекта созданного в Urbi создаётся объект объекта С++.
UBindFunction(class-name, function-name)
— даёт доступ к функции из urbiscript
функция может принимать в качестве аргументов/возвращать:
* базовые целочисленные типы и типы с плавающей точкой (int, double, float…)
* const std::string& or const char*.
* urbi::UValue или любые её подтипы (UBinary, UList…).
* std::list или std::vector перечисленных выше типов
UBindFunctions(class-name, function1, function2…)
— можно сразу дать доступ к нескольким функциям
Далее: UObject — пишем Urbi-драйвер для управления сервомашинкой через Arduino
Читать введение в urbiScript — часть 1.
Ссылки
Документация
Using the Visual C ++ Wizard
Скачать Microsoft Visual Studio Express Edition

4 комментария на «“URBI — введение в программирование UObject”»
«При установленной VS C++ 2008
добавляется шаблон для создания объектов UObject»
Ничего такого не произошло. Т.е. VC++ автоматически не обнаружил объект UObjec. Как его добавить ума не приложу.
А что если делать ДЛЛ-ки в Дельфи и пользоваться ими, а не в VC++.
можно обойтись и без шаблона, т.к. все нужные параметры проекта перечислены. По поводу делфи ничего подсказать не могу 🙂
1) Помогите подключить вручную класс UObject. Я очень плохо знаю VC++.
2) Подключил готовую Dll-ку к Urbi. В Gostai Console 2.5 пишу команды, а сервер на них не реагирует, т.е. не пишет таких строчек как
Помогите пожалуйста разобраться в этом.
приведённая dll-ка UObject-а собиралась под urbi SDK 2.1 и похоже не будет работать под другими (более новыми) версиями SDK.