Управление квадрокоптером ArDrone 2.0 через ROS с помощью джойстика
http://cxem.net/uprav/uprav53.php
![Фотография](https://vse.kz/public/style_images/osnovnoi34/profile/default_large.png)
Программирование на квадрокоптере AR.Drone
Автор erbol, 07.03.2013, 17:42
#22
Отправлено 15.03.2013, 13:31:15
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Сервер URBI позволяет программисту выполнять различные манипуляции с теми инструментами которыми располагает сервер
С помощью объекта UObject можно создавать свои инструменты которыми манипулирует сервер.
Эти инструменты пишутся на языке С++ и оформляются в виде динамических библиотек. Для подгрузки этих библиотек, т.е. создания общего с сервером адресного пространства используется утилита сервера urbi-launch.exe.
Например, под Windows это будет так
urbi-launch.exe -r Myadder.dll
С помощью объекта UObject можно создавать свои инструменты которыми манипулирует сервер.
Эти инструменты пишутся на языке С++ и оформляются в виде динамических библиотек. Для подгрузки этих библиотек, т.е. создания общего с сервером адресного пространства используется утилита сервера urbi-launch.exe.
Например, под Windows это будет так
urbi-launch.exe -r Myadder.dll
#23
Отправлено 17.03.2013, 15:58:58
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Как в Eclipse открыть существующие исходники?
http://www.cyberforu...read434584.html
После установке URBI на ноутбук заметил два проекта на java для работы с URBI. Попробовал запустить, не получилось, не получается загрузить нативную библиотеку. Сейчас разбираюсь c устройством проекта.
Файлами которые определяют пути к библиотекам. И еще непонятно где находится сама нативная библиотека
http://www.cyberforu...read434584.html
После установке URBI на ноутбук заметил два проекта на java для работы с URBI. Попробовал запустить, не получилось, не получается загрузить нативную библиотеку. Сейчас разбираюсь c устройством проекта.
Файлами которые определяют пути к библиотекам. И еще непонятно где находится сама нативная библиотека
#24
Отправлено 18.03.2013, 12:33:37
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Хорошие статьи про то как работать с java приложениями с консоли
Работа с Java в командной строке
http://habrahabr.ru/post/125210/
Ликбез
http://www.skipy.ru/...ics/likbez.html
Работа с Java в командной строке
http://habrahabr.ru/post/125210/
Ликбез
http://www.skipy.ru/...ics/likbez.html
#25
Отправлено 18.03.2013, 19:38:50
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Запускаем программу на java из архива
1. Создаем программу
2. Компилируем ее
javac fpre.java
3. Создаем архив
jar cvf erbol.jar *.class
4. Запускаем на выполнение
java -classpath ./erbol.jar fpre
----------------
Вторая задача : Скомпилировать класс входящий в пакет examples.erbol , поместить его в java архив erbol1.jar и выполнить его
Структура папок такая - C:\2\examples\erbol
В папке erbol находится файл fpr.java
Текущая папка - C:\2
1. Компилируем
javac examples/erbol/fpr.java
2. Создаем архив
jar cvf erbol1.jar examples/erbol/*.class
В текущей папке создается java архив с путями erbol1.jar. Копируем его в папку C:\2\examples\erbol
3. Выполняем скомпилированный файл класса содержащийся в java архиве
java -classpath ./examples/erbol/erbol1.jar examples.erbol.fpr
1. Создаем программу
public class fpre { public static void main(String args[]) { System.out.println("Hello Worls!"); } }
2. Компилируем ее
javac fpre.java
3. Создаем архив
jar cvf erbol.jar *.class
4. Запускаем на выполнение
java -classpath ./erbol.jar fpre
----------------
Вторая задача : Скомпилировать класс входящий в пакет examples.erbol , поместить его в java архив erbol1.jar и выполнить его
Структура папок такая - C:\2\examples\erbol
В папке erbol находится файл fpr.java
package examples.erbol; public class fpr { public static void main(String args []) { System.out.println("Hello World!"); } }
Текущая папка - C:\2
1. Компилируем
javac examples/erbol/fpr.java
2. Создаем архив
jar cvf erbol1.jar examples/erbol/*.class
В текущей папке создается java архив с путями erbol1.jar. Копируем его в папку C:\2\examples\erbol
3. Выполняем скомпилированный файл класса содержащийся в java архиве
java -classpath ./examples/erbol/erbol1.jar examples.erbol.fpr
#26
Отправлено 19.03.2013, 15:20:49
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Как в Eclipse открыть существующие исходники?
http://www.cyberforu...read434584.html
В .project определяем имя проекта и имя построителя проекта. Для eclipse имя потроителя - org.eclipse.jdt.core.javabuilder
Зачем нужен тег <natures> не определил
.project
.classpath
У меня в импортированном проекте urbijava есть еще файл с расширением .launch с инструкциями для интерпретатора.
Для определения путей необходимых построителю проекта (Java Build) в eclipse выполняем следующие действия
Выделяем в окне Package Explorer нужный проект и через контекстное меню выполняем
Properties->Java Build Path
http://www.cyberforu...read434584.html
В .project определяем имя проекта и имя построителя проекта. Для eclipse имя потроителя - org.eclipse.jdt.core.javabuilder
Зачем нужен тег <natures> не определил
.project
<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>project_name</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jdt.core.javanature</nature> </natures> </projectDescription>
.classpath
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="path_to_source_files"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry kind="output" path="path_to_compiled_files"/> </classpath>
У меня в импортированном проекте urbijava есть еще файл с расширением .launch с инструкциями для интерпретатора.
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> <booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> <listEntry value="/urbijava"/> </listAttribute> <mapAttribute key="org.eclipse.debug.core.environmentVariables"> <mapEntry key="URBI_ROOT" value="${resource_loc:urbijava}/../../../"/> </mapAttribute> <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="urbijava"/> <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="${workspace_loc:urbijava}/examples/uobjectjava/UObjectJava.jar"/> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> <listEntry value="4"/> </listAttribute> <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="urbi.UMain"/> </launchConfiguration>
Для определения путей необходимых построителю проекта (Java Build) в eclipse выполняем следующие действия
Выделяем в окне Package Explorer нужный проект и через контекстное меню выполняем
Properties->Java Build Path
#27
Отправлено 19.03.2013, 21:05:53
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Патерны ant
http://ant.apache.or...s.html#patterns
http://ant.apache.or...patternset.html
Значения подстановочных символов (патернов) в файле .classpath
Используются следующие символы
1. "?" - соответствует любому одному символу;
example:
?.java matches x.java, A.java, but not .java or xyz.java (both don't have one character before .java).
2. "*" - соответствует любому количеству символов;
example:
*.java matches .java, x.java and FooBar.java, but not FooBar.xml (does not end with .java).
3. "**" - шаблон соответствует любому числу символов в пути на месте каталога. Когда "**" используется в качестве имени каталога в шаблоне, он соответствует нулю или более каталогов.
To make things a bit more flexible, we add one extra feature, which makes it possible to match multiple directory levels. This can be used to match a complete directory tree, or a file anywhere in the directory tree. To do this, ** must be used as the name of a directory. When ** is used as the name of a directory in the pattern, it matches zero or more directories.
For example: /test/** matches all files/directories under /test/, such as /test/x.java, or /test/foo/bar/xyz.html, but not /xyz.xml.
------------
Существует одно «сокращение»: если путь заканчивается / или \, то шаблон "**" прилагается. Например, "mypackage/test/" интерпретируется как если бы оно было "mypackage/test/**".
------------
Комбинации '*' и '?' не допускаются
http://ant.apache.or...s.html#patterns
http://ant.apache.or...patternset.html
Значения подстановочных символов (патернов) в файле .classpath
Используются следующие символы
1. "?" - соответствует любому одному символу;
example:
?.java matches x.java, A.java, but not .java or xyz.java (both don't have one character before .java).
2. "*" - соответствует любому количеству символов;
example:
*.java matches .java, x.java and FooBar.java, but not FooBar.xml (does not end with .java).
3. "**" - шаблон соответствует любому числу символов в пути на месте каталога. Когда "**" используется в качестве имени каталога в шаблоне, он соответствует нулю или более каталогов.
To make things a bit more flexible, we add one extra feature, which makes it possible to match multiple directory levels. This can be used to match a complete directory tree, or a file anywhere in the directory tree. To do this, ** must be used as the name of a directory. When ** is used as the name of a directory in the pattern, it matches zero or more directories.
For example: /test/** matches all files/directories under /test/, such as /test/x.java, or /test/foo/bar/xyz.html, but not /xyz.xml.
------------
Существует одно «сокращение»: если путь заканчивается / или \, то шаблон "**" прилагается. Например, "mypackage/test/" интерпретируется как если бы оно было "mypackage/test/**".
------------
Комбинации '*' и '?' не допускаются
#28
Отправлено 19.03.2013, 21:14:40
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
#29
Отправлено 20.03.2013, 11:59:12
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Java Native Interface. C++. Linux. Первые шаги
http://habrahabr.ru/post/160293/
У меня проблема с загрузкой нативной билиотеки из java
java говорит что не может найти зависимые библиотеки. Для решения проблемы скачал программу Dependency Walker 2.2
http://www.dependencywalker.com/
Получил список библиотек которых не хватает
http://habrahabr.ru/post/160293/
У меня проблема с загрузкой нативной билиотеки из java
java говорит что не может найти зависимые библиотеки. Для решения проблемы скачал программу Dependency Walker 2.2
http://www.dependencywalker.com/
Получил список библиотек которых не хватает
#30
Отправлено 24.03.2013, 17:15:17
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Создание драйвера для робота в системе URBI
Прочитал статью интересную URBI - введение в программирование UObject
http://robocraft.ru/...orithm/294.html
В ней описывается процесс создания dll, которая подключается к серверу и взаимодействует с роботом.
Скачал нужные программы по ссылкам и попробовал пройти весь процесс, не получилось.
Разница в том что у автора статьи VC полный, а у меня Express. В Express не понятно как создать шаблон проекта UObject
Пришлось настраивать проект самостоятельно
Весь процесс поиска решения описывать не буду, а расскажу только про установки проекта, которые были найдены методом "тыка".
1. Создаем проект. Тип проекта - консольное приложение Win32. В поле "Имя" ввел MyAdder.
Далее следуем за "мастером". В параметрах приложения выбираем Тип приложения - Консольное, дополнительные параметры - Пустой проект. Создаем приложение - Ок
2. Слева, в окне обозревателя выбираем папку "Файлы исходного кода" и создаем новый элемент - Файл С++. Называем MyAdder и копируем туда текст класса из статьи. Работа с кодом на этом закончена
3. Теперь делаем необходимые установки для проекта. Для проекта определены две конфигурации - debug и release.
Сначала сконфигурируем debug
a. Свойства конфигурации -> C/C++ -> Общие -> Дополнительные каталоги включения : "C:\Program Files\Gostai Engine Runtime\include"
b. Свойства конфигурации -> Компоновщик -> Общие -> Дополнительные каталоги библиотек : С:\Program Files\Gostai Engine Runtime\bin; С:\Program Files\Gostai Engine Runtime\bin\gostai\engine
c. Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости : libjpeg4urbi-vc90-d.lib libport-vc90-d.lib libsched-vc90-d.lib libuobject-vc90-d.lib
d. Свойства конфигурации -> C/C++ -> Определения препроцессора : WIN32;_DEBUG;_WINDOWS;_USRDLL;MYADDER_EXPORTS;BOOST_ALL_DYN_LINK. То есть три определения там уже было, я добавил BOOST_ALL_DYN_LINK
Конфигурируем release
a. Свойства конфигурации -> C/C++ -> Общие -> Дополнительные каталоги включения : "C:\Program Files\Gostai Engine Runtime\include"
b. Свойства конфигурации -> Компоновщик -> Общие -> Дополнительные каталоги библиотек : С:\Program Files\Gostai Engine Runtime\bin; С:\Program Files\Gostai Engine Runtime\bin\gostai\engine
c. Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости : libjpeg4urbi-vc90.lib libport-vc90.lib libsched-vc90.lib libuobject-vc90.lib
d. Свойства конфигурации -> C/C++ -> Определения препроцессора : WIN32;_DEBUG;_WINDOWS;_USRDLL;MYADDER_EXPORTS;BOOST_ALL_DYN_LINK. То есть три определения там уже было, я добавил BOOST_ALL_DYN_LINK
Строим проект
Прочитал статью интересную URBI - введение в программирование UObject
http://robocraft.ru/...orithm/294.html
В ней описывается процесс создания dll, которая подключается к серверу и взаимодействует с роботом.
Скачал нужные программы по ссылкам и попробовал пройти весь процесс, не получилось.
Разница в том что у автора статьи VC полный, а у меня Express. В Express не понятно как создать шаблон проекта UObject
Пришлось настраивать проект самостоятельно
Весь процесс поиска решения описывать не буду, а расскажу только про установки проекта, которые были найдены методом "тыка".
1. Создаем проект. Тип проекта - консольное приложение Win32. В поле "Имя" ввел MyAdder.
Далее следуем за "мастером". В параметрах приложения выбираем Тип приложения - Консольное, дополнительные параметры - Пустой проект. Создаем приложение - Ок
2. Слева, в окне обозревателя выбираем папку "Файлы исходного кода" и создаем новый элемент - Файл С++. Называем MyAdder и копируем туда текст класса из статьи. Работа с кодом на этом закончена
3. Теперь делаем необходимые установки для проекта. Для проекта определены две конфигурации - debug и release.
Сначала сконфигурируем debug
a. Свойства конфигурации -> C/C++ -> Общие -> Дополнительные каталоги включения : "C:\Program Files\Gostai Engine Runtime\include"
b. Свойства конфигурации -> Компоновщик -> Общие -> Дополнительные каталоги библиотек : С:\Program Files\Gostai Engine Runtime\bin; С:\Program Files\Gostai Engine Runtime\bin\gostai\engine
c. Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости : libjpeg4urbi-vc90-d.lib libport-vc90-d.lib libsched-vc90-d.lib libuobject-vc90-d.lib
d. Свойства конфигурации -> C/C++ -> Определения препроцессора : WIN32;_DEBUG;_WINDOWS;_USRDLL;MYADDER_EXPORTS;BOOST_ALL_DYN_LINK. То есть три определения там уже было, я добавил BOOST_ALL_DYN_LINK
Конфигурируем release
a. Свойства конфигурации -> C/C++ -> Общие -> Дополнительные каталоги включения : "C:\Program Files\Gostai Engine Runtime\include"
b. Свойства конфигурации -> Компоновщик -> Общие -> Дополнительные каталоги библиотек : С:\Program Files\Gostai Engine Runtime\bin; С:\Program Files\Gostai Engine Runtime\bin\gostai\engine
c. Свойства конфигурации -> Компоновщик -> Ввод -> Дополнительные зависимости : libjpeg4urbi-vc90.lib libport-vc90.lib libsched-vc90.lib libuobject-vc90.lib
d. Свойства конфигурации -> C/C++ -> Определения препроцессора : WIN32;_DEBUG;_WINDOWS;_USRDLL;MYADDER_EXPORTS;BOOST_ALL_DYN_LINK. То есть три определения там уже было, я добавил BOOST_ALL_DYN_LINK
Строим проект
#31
Отправлено 25.03.2013, 14:12:21
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
очень позновательно, автору респект за проделанную работу!
если можно вопрос, как решается задача с навигацией? я так понимаю что весь грип управляется с наземного ПКУ, и летает в пределах видимости, а если допустим в ночное время, или радиус полета увеличить, предусмотрен радиомаяк или привязка навсету?
если можно вопрос, как решается задача с навигацией? я так понимаю что весь грип управляется с наземного ПКУ, и летает в пределах видимости, а если допустим в ночное время, или радиус полета увеличить, предусмотрен радиомаяк или привязка навсету?
#33
Отправлено 27.03.2013, 00:26:59
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Работа с сокетами на С++ под Windows
http://www.cyberforu...6453-page2.html
--------------------------
http://www.insidepro.../006/006r.shtml
структура sockaddr_in, определенна следующим образом:
struct sockaddr_in
{
short sin_family; // семейство протоколов (как правило, AF_INET)
u_short sin_port; // порт
struct in_addr sin_addr; // IP-адрес
char sin_zero[8]; // хвост
};
Для преобразования IP-адреса, записанного в виде символьной последовательности наподобие "127.0.0.1" в четырехбайтовую числовую последовательность предназначена функция "unsigned long inet_addr (const char FAR * cp )". Она принимает указатель на символьную строку и в случае успешной операции преобразует ее в четырехбайтовый IP-адрес или -1, если это невозможно. Возвращенный функцией результат можно присвоить элементу структуры sockaddr_in следующим образом: "struct sockaddr_in dest_addr; dest_addr.sin_addr.S_addr = inet_addr("195.161.42.222");". При использовании структуры sockaddr это будет выглядеть так: "struc sockaddr dest_addr; ((unsigned int *)(&dest_addr. sa_data[0] + 2))[0] = inet_addr("195.161.42.222");"
http://www.cyberforu...6453-page2.html
--------------------------
http://www.insidepro.../006/006r.shtml
структура sockaddr_in, определенна следующим образом:
struct sockaddr_in
{
short sin_family; // семейство протоколов (как правило, AF_INET)
u_short sin_port; // порт
struct in_addr sin_addr; // IP-адрес
char sin_zero[8]; // хвост
};
Для преобразования IP-адреса, записанного в виде символьной последовательности наподобие "127.0.0.1" в четырехбайтовую числовую последовательность предназначена функция "unsigned long inet_addr (const char FAR * cp )". Она принимает указатель на символьную строку и в случае успешной операции преобразует ее в четырехбайтовый IP-адрес или -1, если это невозможно. Возвращенный функцией результат можно присвоить элементу структуры sockaddr_in следующим образом: "struct sockaddr_in dest_addr; dest_addr.sin_addr.S_addr = inet_addr("195.161.42.222");". При использовании структуры sockaddr это будет выглядеть так: "struc sockaddr dest_addr; ((unsigned int *)(&dest_addr. sa_data[0] + 2))[0] = inet_addr("195.161.42.222");"
#34
Отправлено 27.03.2013, 16:28:22
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Сделал вот такое консольное приложение на VC++ для управления светодиодами AR.Drone
Теперь можно писать драйвер для URBI под Windows
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <sys/types.h> #include <string> #include "string.h" #include <winsock2.h> #include <windows.h> #include <ws2tcpip.h> #pragma comment(lib, "ws2_32.lib") #define PORT 5556 #define SERVERADDR "192.168.1.1" int main(int argc, char** argv) { //Инициализируем библиотеку WinSock с промощью вызова функции WSAStartup WSADATA wsaData; int my_sock; char buff[10 * 1014]; printf("UDP DEMO Client\nType quit to quit\n"); // Шаг 1 - иницилизация библиотеки Winsocks if (WSAStartup(0x202, (WSADATA *)&buff[0])) { printf("WSAStartup error: %d\n", WSAGetLastError()); return -1; } /* Создание сокета и присвоение значения дескриптору сокета для UDP пакетов * PF_INET - IP protocol family * SOCK_DGRAM - Raw protocol interface */ if (( my_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { perror("socket"); return -1; } // Объявляем переменные dest_addr и hst HOSTENT *hst; sockaddr_in dest_addr; dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(PORT); // определение IP-адреса узла if (inet_addr(SERVERADDR) != INADDR_NONE) dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR); else { if (hst = gethostbyname(SERVERADDR)) dest_addr.sin_addr.s_addr = ((unsigned long **) hst->h_addr_list)[0][0]; else { printf("Unknown host: %d\n", WSAGetLastError()); closesocket(my_sock); WSACleanup(); return -1; } } char msg[256] = "AT*CONFIG=1,\"leds:leds_anim\",\"3,1073741824,2\"\r"; int er = strlen(msg); // Передача сообщений на сервер sendto(my_sock, msg, er, 0, \ (sockaddr *)&dest_addr, sizeof(dest_addr)); //printf("erbol"); // Шаг последний - выход closesocket(my_sock); WSACleanup(); }
Теперь можно писать драйвер для URBI под Windows
#35
Отправлено 28.03.2013, 12:46:16
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Для работы с сокетами необходимо подключить библиотеку ws2_32.lib. Это можно сделать двумя способами.
1. В VC++ нужно зайти в Проект -> Свойства -> Компоновщик -> Ввод -> Дополнительные зависимости и ввести в поле значение - ws2_32.lib
2. Того же самого результата можно добиться непосредственным обращением к Linker’у из кода программы. Это делается следующим образом:
#pragma comment(lib, "ws2_32")
#include <winsock2.h>
Необходимо специальным образом подготовить библиотеку к работе. Для этого необходимо вызвать на исполнение функцию WSAStartup(Ver, lpWSAData),
В первом аргументе типа WORD передаётся в старшем байте номер требуемой версии, а в младшем номер подверсии библиотеки
Второй аргумент типа LPWSADATA должен указывать на структуру WSADATA, в которую при успешной инициализации будет занесена информация о производителе библиотеки.
Если инициализация не удалась, то функция возвращает не нулевое значение.
Чтобы инициализировать библиотеку WinSock2, а также проверить успешность выполнения этого действия, можно использовать следующих код:
char buff[10 * 1014];
printf("UDP DEMO Client\nType quit to quit\n");
// Шаг 1 - иницилизация библиотеки Winsocks
if (WSAStartup(0x202, (WSADATA *)&buff[0]))
{
printf("WSAStartup error: %d\n", WSAGetLastError());
return -1;
}
После работы с сокетом, его необходимо закрыть, тем самым освободить порт, через который программа взаимодействовала с сервером, а также очистить занимаемую дескриптором память.
closesocket (my_sock);
WSACleanup();
http://bitbybit.ru/t.../cpp/lesson/148
1. В VC++ нужно зайти в Проект -> Свойства -> Компоновщик -> Ввод -> Дополнительные зависимости и ввести в поле значение - ws2_32.lib
2. Того же самого результата можно добиться непосредственным обращением к Linker’у из кода программы. Это делается следующим образом:
#pragma comment(lib, "ws2_32")
#include <winsock2.h>
Необходимо специальным образом подготовить библиотеку к работе. Для этого необходимо вызвать на исполнение функцию WSAStartup(Ver, lpWSAData),
В первом аргументе типа WORD передаётся в старшем байте номер требуемой версии, а в младшем номер подверсии библиотеки
Второй аргумент типа LPWSADATA должен указывать на структуру WSADATA, в которую при успешной инициализации будет занесена информация о производителе библиотеки.
Если инициализация не удалась, то функция возвращает не нулевое значение.
Чтобы инициализировать библиотеку WinSock2, а также проверить успешность выполнения этого действия, можно использовать следующих код:
char buff[10 * 1014];
printf("UDP DEMO Client\nType quit to quit\n");
// Шаг 1 - иницилизация библиотеки Winsocks
if (WSAStartup(0x202, (WSADATA *)&buff[0]))
{
printf("WSAStartup error: %d\n", WSAGetLastError());
return -1;
}
После работы с сокетом, его необходимо закрыть, тем самым освободить порт, через который программа взаимодействовала с сервером, а также очистить занимаемую дескриптором память.
closesocket (my_sock);
WSACleanup();
http://bitbybit.ru/t.../cpp/lesson/148
#36
Отправлено 28.03.2013, 13:34:35
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Код драйвера для URBI с помощью которого можно поморгать лампочками AR.Drone
В проекте используем установки для компоновщика
Для этого нужно зайти в Проект -> Свойства -> Компоновщик -> Ввод -> Дополнительные зависимости и ввести в поле значение - ws2_32.lib
После построения проекта нужно подключить созданную библиотеку DroneLed.dll к серверу URBI
Я делаю это так копирую файл библиотеки в папку bin по адресу C:\Program Files\Gostai Engine Runtime\2.7.5\bin
Запускаю сервер URBI с помощью bat файла urbi.bat. Файл находится в папке C:\Program Files\Gostai Engine Runtime\2.7.5
Для запуска консольных программ использую программу Far. Вхожу в папку C:\Program Files\Gostai Engine Runtime\2.7.5\bin
Затем в командую строку ввожу команду : urbi-launch.exe -r DroneLed.dll
Подключаем компьютер к сети drone. На панели задач Windows находим значок сети и щелкаем левой кнопкой мыши, в меню выбираем "подключение или отключение" , затем в списке выбираем сеть drone и подключаемся к ней
Теперь нужно запустить программу UrbiConsole.exe. Она находится в папке C:\Program Files\Gostai urbiConsole 2.1\bin. Подключаем консоль URBI к серверу и в поле команд вводим две инструкции
var DroneLed = DroneLed.new;
DroneLed.led;
В результате drone моргает своими лампочками несколько секунд
Переменная v и метод add в данном случае не используются, остались от исходного класса MyAdder. Их можно удалить из кода дрйвера
#include <urbi/uobject.hh> #include <stdio.h> #include <string.h> #include <winsock2.h> #include <windows.h> #define PORT 5556 #define SERVERADDR "192.168.1.1" class DroneLed: public urbi::UObject { public: // The class must have a single constructor taking a string. DroneLed(const std::string& str); int init(); // Our variable. urbi::UVar v; // Our method. double add (double); int led(); }; // the constructor defines what is available from Urbi DroneLed::DroneLed(const std::string& s) : urbi::UObject(s) // required { // Bind the variable. UBindVar (DroneLed, v); // Bind the function. UBindFunction (DroneLed, add); UBindFunction (DroneLed, led); UBindFunction(DroneLed, init); }; int DroneLed::init() { return 0; }; double DroneLed::add (double rhs) { return ((double)v + rhs); } int DroneLed::led() { //Инициализируем библиотеку WinSock с промощью вызова функции WSAStartup int my_sock; char buff[10 * 1014]; printf("UDP DEMO Client\nType quit to quit\n"); // Шаг 1 - иницилизация библиотеки Winsocks if (WSAStartup(0x202, (WSADATA *)&buff[0])) { printf("WSAStartup error: %d\n", WSAGetLastError()); return -1; } /* Создание сокета и присвоение значения дескриптору сокета для UDP пакетов * AF_INET - protocol family * SOCK_DGRAM - Raw protocol interface */ if (( my_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { printf("socket"); return -1; } // Объявляем переменные dest_addr и hst HOSTENT *hst; sockaddr_in dest_addr; dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(PORT); // определение IP-адреса узла if (inet_addr(SERVERADDR) != INADDR_NONE) dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR); else { if (hst = gethostbyname(SERVERADDR)) dest_addr.sin_addr.s_addr = ((unsigned long **) hst->h_addr_list)[0][0]; else { printf("Unknown host: %d\n", WSAGetLastError()); closesocket(my_sock); WSACleanup(); return -1; } } char msg[256] = "AT*CONFIG=1,\"leds:leds_anim\",\"3,1073741824,2\"\r"; int er = strlen(msg); // Передача сообщений на сервер sendto(my_sock, msg, er, 0, \ (sockaddr *)&dest_addr, sizeof(dest_addr)); // Шаг последний - выход closesocket(my_sock); WSACleanup(); return 0; } UStart(DroneLed);
В проекте используем установки для компоновщика
Для этого нужно зайти в Проект -> Свойства -> Компоновщик -> Ввод -> Дополнительные зависимости и ввести в поле значение - ws2_32.lib
После построения проекта нужно подключить созданную библиотеку DroneLed.dll к серверу URBI
Я делаю это так копирую файл библиотеки в папку bin по адресу C:\Program Files\Gostai Engine Runtime\2.7.5\bin
Запускаю сервер URBI с помощью bat файла urbi.bat. Файл находится в папке C:\Program Files\Gostai Engine Runtime\2.7.5
Для запуска консольных программ использую программу Far. Вхожу в папку C:\Program Files\Gostai Engine Runtime\2.7.5\bin
Затем в командую строку ввожу команду : urbi-launch.exe -r DroneLed.dll
Подключаем компьютер к сети drone. На панели задач Windows находим значок сети и щелкаем левой кнопкой мыши, в меню выбираем "подключение или отключение" , затем в списке выбираем сеть drone и подключаемся к ней
Теперь нужно запустить программу UrbiConsole.exe. Она находится в папке C:\Program Files\Gostai urbiConsole 2.1\bin. Подключаем консоль URBI к серверу и в поле команд вводим две инструкции
var DroneLed = DroneLed.new;
DroneLed.led;
В результате drone моргает своими лампочками несколько секунд
Переменная v и метод add в данном случае не используются, остались от исходного класса MyAdder. Их можно удалить из кода дрйвера
Сообщение отредактировал erbol: 28.03.2013, 13:54:19
#37
Отправлено 29.03.2013, 08:23:25
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Для того чтобы создавать алгоритмы поведения роботов URBI имеет свой язык. То есть определены множество операторов и объектов.
Хорошее описание языка URBI в переводе на русский есть тут (пять статей про URBI язык)
URBI - введение в urbiScript
http://robocraft.ru/...orithm/295.html
Примеры использования объектов в программировании описаны в urbi-sdk.pdf и в виде файлов с расширением .u в папке share\gostai\urbi относительно корневой папки URBI
Хорошее описание языка URBI в переводе на русский есть тут (пять статей про URBI язык)
URBI - введение в urbiScript
http://robocraft.ru/...orithm/295.html
Примеры использования объектов в программировании описаны в urbi-sdk.pdf и в виде файлов с расширением .u в папке share\gostai\urbi относительно корневой папки URBI
#38
Отправлено 30.03.2013, 08:04:20
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Раньше имел дело только с алгоритмическими языками. Взаимодействие процессов в них есть , но мало как то обращал внимания на его практическую ценность.
URBI - событийный язык. Похож по моим ощущениям на аналоговое программирование, но без ненужных абстракций. Только конструкции процессов и способы их взаимодействия. Очень положительные ощущения от способов описания ситуации c инструментами URBI
Событийное программирование в URBI
AR.Drone регулярно отправляет информацию измерительную со своих сенсоров. Эту информацию надо обрабатывать и выдавать drone инструкции о том как вести себя в текущей ситуации
URBI предлагает следующие инструменты
1. Триггер at. Такие конструкции называются в программировании watchdog, конструкции "сторожевого пса" или триггеры
Синтаксис:
at (выражение)
код1
onleave
код2 ;
Код1 будет выполняться всякий раз когда выражение становится истинным.
То есть триггер вычисляет выражение всякий раз когда значение x меняется и если до этого момента ложное выражение стало истинным, то триггер срабатывает.
Если выражение стало истинным в результате изменения x и до этого было истинным, со старым значением x , то триггер не срабатывает
onleave определяет, что будет выполняться в том случае если истинное до последнего изменения значения x выражение становится ложным
Вот пример
И еще один
http://robocraft.ru/...orithm/360.html
URBI - событийный язык. Похож по моим ощущениям на аналоговое программирование, но без ненужных абстракций. Только конструкции процессов и способы их взаимодействия. Очень положительные ощущения от способов описания ситуации c инструментами URBI
Событийное программирование в URBI
AR.Drone регулярно отправляет информацию измерительную со своих сенсоров. Эту информацию надо обрабатывать и выдавать drone инструкции о том как вести себя в текущей ситуации
URBI предлагает следующие инструменты
1. Триггер at. Такие конструкции называются в программировании watchdog, конструкции "сторожевого пса" или триггеры
Синтаксис:
at (выражение)
код1
onleave
код2 ;
Код1 будет выполняться всякий раз когда выражение становится истинным.
То есть триггер вычисляет выражение всякий раз когда значение x меняется и если до этого момента ложное выражение стало истинным, то триггер срабатывает.
Если выражение стало истинным в результате изменения x и до этого было истинным, со старым значением x , то триггер не срабатывает
onleave определяет, что будет выполняться в том случае если истинное до последнего изменения значения x выражение становится ложным
Вот пример
var x = 0; [00000000] 0 at (x > 5) echo("ping"); x = 5; [00000000] 5 // это запустит(trigger) событие x = 6; [00000000] 6 [00000000] *** ping // код не запускается(trigger), т.к. выражение уже истинно. x = 7; [00000000] 7 // выражение станет ложным x = 3; [00000000] 3 x = 10; [00000000] 10 [00000000] *** ping
И еще один
var x = false; [00000000] false at (x) echo("x") onleave echo("!x"); x = true; [00000000] true [00000000] *** x x = false; [00000000] false [00000000] *** !x
http://robocraft.ru/...orithm/360.html
Сообщение отредактировал erbol: 30.03.2013, 08:07:08
#39
Отправлено 31.03.2013, 18:26:09
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Тренируем глазомер и ориентацию в пространстве.
Пусть робот висит в воздухе и пытается определить свое расстояние от стенки коридора и от земли
Измерения:
1. Можем измерить высоту робота над поверхностью с помощью сонара (ультразвукового дальномера)
2. Можем измерить свою скорость по осям
3. Можем измерить угол носа вертолета к направлению на север
4. Можем измерить высоту стенки коридора в пикселах на картинках которые получаем в горизонтальной видеокамеры вертолета отдельно для левой и правой стенки коридора
Пусть точно известно, что со временем нуль сонара "плывет". А это так и есть, по крайней мере у моего вертолета. В начале полета высота примерно соответствует реальной высоте, с течением времени она все время увеличивается и в конце, скажем на девятой минуте полета, альтиметр показывает 4 метра над поверхностью, хотя вертолет висит на высоте 0,5 метра
Нужно регулярно производить измерения для того чтобы калибровать показания сонара. Будем делать это с помощью картинок стенок коридора которые получаем с горизонтальной камеры.
Предполагается что магнитометр вертолета не врет, то есть мы всегда можем повернуть камеру вертолета перпендикулярно к боковой стенке коридора
Для простоты предположим линейный по времени дрейф нуля в сторону увеличения расстояния от земли
В дальнейшем конечно нужно будет калибровать показания магнитометра. Для этого можно использовать тот факт, что расстояние между боковыми стенками коридора известно и если нос вертолета перпендикулярен боковой стенке, то сумма расстояний от левой и правой стенки коридора до вертолета должна быть равна ширине коридора
Надо определить несколько значений необходимых для определения порядка измерений высоты, калибровки показаний сонара и правил используемых для поддержания заданной высоты полета
1. Вертикальная скорость - 10 см/сек
2. Частота калибровки сонара - 1 раз в секунду
3. Корректировка высоты - 10 раз в секунду. Для корректировки высоты используем показания сонара
4. Полет длится 10 минут. За это время вертолет 10 раз меняет высоту полета случайным образом, опускаясь и поднимаясь на 10 см в течении секунды
5. Точность показаний альтиметра (сонара) примерно 5 см
Пусть робот висит в воздухе и пытается определить свое расстояние от стенки коридора и от земли
Измерения:
1. Можем измерить высоту робота над поверхностью с помощью сонара (ультразвукового дальномера)
2. Можем измерить свою скорость по осям
3. Можем измерить угол носа вертолета к направлению на север
4. Можем измерить высоту стенки коридора в пикселах на картинках которые получаем в горизонтальной видеокамеры вертолета отдельно для левой и правой стенки коридора
Пусть точно известно, что со временем нуль сонара "плывет". А это так и есть, по крайней мере у моего вертолета. В начале полета высота примерно соответствует реальной высоте, с течением времени она все время увеличивается и в конце, скажем на девятой минуте полета, альтиметр показывает 4 метра над поверхностью, хотя вертолет висит на высоте 0,5 метра
Нужно регулярно производить измерения для того чтобы калибровать показания сонара. Будем делать это с помощью картинок стенок коридора которые получаем с горизонтальной камеры.
Предполагается что магнитометр вертолета не врет, то есть мы всегда можем повернуть камеру вертолета перпендикулярно к боковой стенке коридора
Для простоты предположим линейный по времени дрейф нуля в сторону увеличения расстояния от земли
В дальнейшем конечно нужно будет калибровать показания магнитометра. Для этого можно использовать тот факт, что расстояние между боковыми стенками коридора известно и если нос вертолета перпендикулярен боковой стенке, то сумма расстояний от левой и правой стенки коридора до вертолета должна быть равна ширине коридора
Надо определить несколько значений необходимых для определения порядка измерений высоты, калибровки показаний сонара и правил используемых для поддержания заданной высоты полета
1. Вертикальная скорость - 10 см/сек
2. Частота калибровки сонара - 1 раз в секунду
3. Корректировка высоты - 10 раз в секунду. Для корректировки высоты используем показания сонара
4. Полет длится 10 минут. За это время вертолет 10 раз меняет высоту полета случайным образом, опускаясь и поднимаясь на 10 см в течении секунды
5. Точность показаний альтиметра (сонара) примерно 5 см
#40
Отправлено 01.04.2013, 11:33:44
![](https://vse.kz/public/style_images/osnovnoi34/post_offline.png)
Строим структуры с помощью абстракций URBI
Включаем воображение
В алгоритмическом языке используется один тип разделителя между операторами. Обычно это символ ";"
Смысл этого разделителя понятен из определения понятия программы. Все операторы выполняются последовательно , один за другим и так до самого последнего оператора в программе.
Машина ждет конца выполнения каждого оператора в программе и только после этого запускает на выполнение следующий оператор
В URBI операторы могут запускаться на выполнение различным образом.
1. Последовательно
2. Параллельно
Для последовательного выполнения команд используется разделитель точка с запятой - ";"
Вот пример такого вывода двух последовательных операций
function test(name)
{
echo(name + ": 1");
echo(name + ": 2");
echo(name + ": 3");
} |;
// Serialized executions
test("left") ; test ("middle");
//Вывод URBI результата выполнения блока инструкций
[00000000] *** left: 1
[00000000] *** left: 2
[00000000] *** left: 3
[00000000] *** middle: 1
[00000000] *** middle: 2
[00000000] *** middle: 3
В этом примере после определения функции test стоит знак "|". Он воспринимается интерпретатором как символ неоконченной инструкции.
То есть интерпретатор получив определение функции не знает что с ним делать. Для того чтобы инструкция была определена нужно вызвать функцию после ее определения
Включаем воображение
В алгоритмическом языке используется один тип разделителя между операторами. Обычно это символ ";"
Смысл этого разделителя понятен из определения понятия программы. Все операторы выполняются последовательно , один за другим и так до самого последнего оператора в программе.
Машина ждет конца выполнения каждого оператора в программе и только после этого запускает на выполнение следующий оператор
В URBI операторы могут запускаться на выполнение различным образом.
1. Последовательно
2. Параллельно
Для последовательного выполнения команд используется разделитель точка с запятой - ";"
Вот пример такого вывода двух последовательных операций
function test(name)
{
echo(name + ": 1");
echo(name + ": 2");
echo(name + ": 3");
} |;
// Serialized executions
test("left") ; test ("middle");
//Вывод URBI результата выполнения блока инструкций
[00000000] *** left: 1
[00000000] *** left: 2
[00000000] *** left: 3
[00000000] *** middle: 1
[00000000] *** middle: 2
[00000000] *** middle: 3
В этом примере после определения функции test стоит знак "|". Он воспринимается интерпретатором как символ неоконченной инструкции.
То есть интерпретатор получив определение функции не знает что с ним делать. Для того чтобы инструкция была определена нужно вызвать функцию после ее определения
Количество пользователей, читающих эту тему: 2
пользователей: 0, неизвестных прохожих: 2, скрытых пользователей: 0