Перейти к содержимому

Фотография

Программирование на квадрокоптере AR.Drone


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 187

#21
erbol

erbol
  • Читатель
  • 361 сообщений
Управление квадрокоптером ArDrone 2.0 через ROS с помощью джойстика

http://cxem.net/uprav/uprav53.php

#22
erbol

erbol
  • Читатель
  • 361 сообщений
Сервер URBI позволяет программисту выполнять различные манипуляции с теми инструментами которыми располагает сервер

С помощью объекта UObject можно создавать свои инструменты которыми манипулирует сервер.

Эти инструменты пишутся на языке С++ и оформляются в виде динамических библиотек. Для подгрузки этих библиотек, т.е. создания общего с сервером адресного пространства используется утилита сервера urbi-launch.exe.

Например, под Windows это будет так

urbi-launch.exe -r Myadder.dll

#23
erbol

erbol
  • Читатель
  • 361 сообщений
Как в Eclipse открыть существующие исходники?

http://www.cyberforu...read434584.html

После установке URBI на ноутбук заметил два проекта на java для работы с URBI. Попробовал запустить, не получилось, не получается загрузить нативную библиотеку. Сейчас разбираюсь c устройством проекта.

Файлами которые определяют пути к библиотекам. И еще непонятно где находится сама нативная библиотека

#24
erbol

erbol
  • Читатель
  • 361 сообщений
Хорошие статьи про то как работать с java приложениями с консоли

Работа с Java в командной строке
http://habrahabr.ru/post/125210/

Ликбез
http://www.skipy.ru/...ics/likbez.html

#25
erbol

erbol
  • Читатель
  • 361 сообщений
Запускаем программу на java из архива

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
erbol

erbol
  • Читатель
  • 361 сообщений
Как в Eclipse открыть существующие исходники?

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
erbol

erbol
  • Читатель
  • 361 сообщений
Патерны 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/**".

------------

Комбинации '*' и '?' не допускаются

#28
erbol

erbol
  • Читатель
  • 361 сообщений
Квадрокоптер научили охотничьему приему орла

http://rnd.cnews.ru/...13/03/18/522820



#29
erbol

erbol
  • Читатель
  • 361 сообщений
Java Native Interface. C++. Linux. Первые шаги

http://habrahabr.ru/post/160293/


У меня проблема с загрузкой нативной билиотеки из java

java говорит что не может найти зависимые библиотеки. Для решения проблемы скачал программу Dependency Walker 2.2

http://www.dependencywalker.com/

Получил список библиотек которых не хватает

#30
erbol

erbol
  • Читатель
  • 361 сообщений
Создание драйвера для робота в системе 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

Строим проект

#31
орелик

орелик
  • Завсегдатай
  • 142 сообщений
очень позновательно, автору респект за проделанную работу!
если можно вопрос, как решается задача с навигацией? я так понимаю что весь грип управляется с наземного ПКУ, и летает в пределах видимости, а если допустим в ночное время, или радиус полета увеличить, предусмотрен радиомаяк или привязка навсету?
  • 0

#32
erbol

erbol
  • Читатель
  • 361 сообщений
орелик,

Спасибо. Ночью не летал. Просто интересно писать программы.

Сейчас фирма Parrot делает GPS модуль к drone. Так что перспективы летать далеко по карте имеются

#33
erbol

erbol
  • Читатель
  • 361 сообщений
Работа с сокетами на С++ под 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");"

#34
erbol

erbol
  • Читатель
  • 361 сообщений
Сделал вот такое консольное приложение на VC++ для управления светодиодами AR.Drone

#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
erbol

erbol
  • Читатель
  • 361 сообщений
Для работы с сокетами необходимо подключить библиотеку 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

#36
erbol

erbol
  • Читатель
  • 361 сообщений
Код драйвера для URBI с помощью которого можно поморгать лампочками AR.Drone

#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
erbol

erbol
  • Читатель
  • 361 сообщений
Для того чтобы создавать алгоритмы поведения роботов URBI имеет свой язык. То есть определены множество операторов и объектов.

Хорошее описание языка URBI в переводе на русский есть тут (пять статей про URBI язык)

URBI - введение в urbiScript
http://robocraft.ru/...orithm/295.html

Примеры использования объектов в программировании описаны в urbi-sdk.pdf и в виде файлов с расширением .u в папке share\gostai\urbi относительно корневой папки URBI

#38
erbol

erbol
  • Читатель
  • 361 сообщений
Раньше имел дело только с алгоритмическими языками. Взаимодействие процессов в них есть , но мало как то обращал внимания на его практическую ценность.

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
erbol

erbol
  • Читатель
  • 361 сообщений
Тренируем глазомер и ориентацию в пространстве.

Пусть робот висит в воздухе и пытается определить свое расстояние от стенки коридора и от земли

Измерения:

1. Можем измерить высоту робота над поверхностью с помощью сонара (ультразвукового дальномера)
2. Можем измерить свою скорость по осям
3. Можем измерить угол носа вертолета к направлению на север
4. Можем измерить высоту стенки коридора в пикселах на картинках которые получаем в горизонтальной видеокамеры вертолета отдельно для левой и правой стенки коридора

Пусть точно известно, что со временем нуль сонара "плывет". А это так и есть, по крайней мере у моего вертолета. В начале полета высота примерно соответствует реальной высоте, с течением времени она все время увеличивается и в конце, скажем на девятой минуте полета, альтиметр показывает 4 метра над поверхностью, хотя вертолет висит на высоте 0,5 метра

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

Предполагается что магнитометр вертолета не врет, то есть мы всегда можем повернуть камеру вертолета перпендикулярно к боковой стенке коридора

Для простоты предположим линейный по времени дрейф нуля в сторону увеличения расстояния от земли

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

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

1. Вертикальная скорость - 10 см/сек

2. Частота калибровки сонара - 1 раз в секунду

3. Корректировка высоты - 10 раз в секунду. Для корректировки высоты используем показания сонара

4. Полет длится 10 минут. За это время вертолет 10 раз меняет высоту полета случайным образом, опускаясь и поднимаясь на 10 см в течении секунды

5. Точность показаний альтиметра (сонара) примерно 5 см

#40
erbol

erbol
  • Читатель
  • 361 сообщений
Строим структуры с помощью абстракций 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 стоит знак "|". Он воспринимается интерпретатором как символ неоконченной инструкции.

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


Количество пользователей, читающих эту тему: 2

пользователей: 0, неизвестных прохожих: 2, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.