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

Фотография

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


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

#1
erbol

erbol
  • Читатель
  • 361 сообщений
Здравствуйте ,

Я раньше вел эту тему на форуме bunker.kz
http://i.bunker.kz/i...20

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

#2
erbol

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

«Для всех организаторов проект стал настоящим зарядом позитива: столько у нас интересных, азартных и технически одаренных людей… Мы получили свыше 500 заявок, а именно 295 командных заявки и 241 от индивидуальных участников; проект активно обсуждается – и в Интернете, и в офлайне мы получаем массу вопросов. Очень надеюсь на то, что у участников все получится!», – поделился своими впечатлениями Алексей Добровольский, директор по разработке программного обеспечения компании КРОК.

Среди участников работники авиационного КБ, космической компании "Энергия" и пр.

Представление участников с ссылками на их страницы в vk.com
http://www.robots.cr...heroes/team.php

Сообщение отредактировал erbol: 08.03.2013, 09:21:26


#3
erbol

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


#4
erbol

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

Как извлечь нужную информацию из картинки которую мы получаем из видео которое получаем с камеры установленной на роботе ?

Такого рода вопросы будут решаться в этой теме.

#5
erbol

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


По моему удобнее всего искать зону посадки на рисунке по матрице градиентов. Они будут максимальными по контуру креста

Изображение

#6
erbol

erbol
  • Читатель
  • 361 сообщений
Вот собственно код для выделения зоны посадки из рисунка


import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;


import javax.imageio.ImageIO;

public class Cross {

// В методе main создаем имидж картинки в формате GRAY
// (градации серого)
public static void main(String[] args) throws Exception {
// Читаем цветной файл с диска и 
// помещаем его в экземпляр объекта BufferedImage





BufferedImage image = ImageIO.read(new File("C://temp/example/image9.bmp"));

int height = image.getHeight();
int width = image.getWidth();



BufferedImage imageJava = new BufferedImage(width, height,
           BufferedImage.TYPE_BYTE_GRAY);  




// Копируем содержимое цветного буфера в буфер с "градациями серого"
Graphics g = imageJava.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();



// Используем метод gauss_canny1() для обработки изображения 
// фильтром Гаусса, результат помещаем в матрицу b
sobel_cross(imageJava);
/* 
// Помещаем содержимое матрицы b в буфер im3 и сохраняем его
// на диск
        for (int x = 0; x < height-4; x++) {
       for (int y = 0; y < width-4; y++) {
                    int gray=255-b[x][y];
                    im3.setRGB(y, x, gray << 16 | gray << 8 | gray);
       }}

ImageIO.write(im3, "bmp", new File("C://temp/example/sobel_cross.bmp"));
*/


}




public static void sobel_cross(BufferedImage imageJava) throws Exception{

int height = imageJava.getHeight();
int width = imageJava.getWidth();

int[]  lineData = new int[width * height];
// таблица пикселов рисунка
int[][] a = new int[height][width];
// таблица градиентов рисунка
int[][] b = new int[height-2][width-2];


// Помещаем содержимое буфера im2 (в градациях серого) 
// в список LineData
imageJava.getRaster().getPixels(0, 0, width, height, lineData);



// Помещаем содержимое списка в матрицу а
int k = 0;
for (int y=0; y < height; y++){
                for (int x=0; x < width; x++){
                a[y][x]=lineData[k];
                k++;   }}



        for (int m=1; m < height-1; m++){
            for (int n=1; n < width-1; n++){
             
             // Вычисляем проекции градиента на оси X и Y
             int Gx = a[m-1][n-1] + 2*a[m][n-1] + a[m+1][n-1] - (a[m-1][n+1]+2*a[m][n+1]+a[m+1][n+1]);
             int Gy = -(a[m-1][n-1] + 2*a[m-1][n] + a[m-1][n+1]) + a[m+1][n-1]+2*a[m+1][n]+a[m+1][n+1];
             

             
             // Значение градиента помещаем в матрицу d
             b[m-1][n-1] = (int) Math.sqrt(Gx*Gx + Gy*Gy)/4;
             
               }}


        // Фильтр "Двойной порог"

int max=0;
int min=255;
        for (int m=0; m < height-2; m++){
            for (int n=0; n < width-2; n++){
              //if (d[m][n]>val1) d[m][n]=255;
             if (b[m][n]!=0) {
             if (b[m][n]>max) max = b[m][n]; // 255 это черный цвет, 0 - это белый
             if (b[m][n]<min) min = b[m][n]; // 0 это белый цвет 
             }

               }}
        // Оставляем только элементы, которые меньше максимума не больше
        // чем на треть разности между максимальным и минимальным градиентами
        int r = max - min;
        int r1 = max - r/3;
        int r2 = max - r/2;
        System.out.println("max: " + max);
        System.out.println("r1: " + r1);

        for (int m=0; m < height-2; m++){
            for (int n=0; n < width-2; n++){
              //if (d[m][n]>val1) d[m][n]=255;
             if (b[m][n]!=0) {
             //if (b[m][n]>r1) b[m][n] = 255; // 255 это черный цвет, 0 - это белый
             
             // Убираем с рисунка очень светлые пикселы 
             // то есть делаем их белыми
             // Главный вопрос состоит в том чтобы выбрать минимальное
             // пороговое значеие чтобы все точки контура посадки не 
             // были стерты
             // Где то от нуля до 180 это значение находится
             if (b[m][n]<=180) b[m][n] = 0; // 0 это белый цвет 
             }

               }}



     int p = 0;
     int s = 0;
     int z = 0;
        for (int m=0; m < height-2; m++){
            for (int n=0; n < width-2; n++){
             if (b[m][n]!=0) {
             s = s + b[m][n];
             p = p + 1;

             }
               }}

     if (p>0) z = s/p;
     System.out.println("z: " + z);

BufferedImage imageGrad = new BufferedImage(width-2, height-2,
           BufferedImage.TYPE_BYTE_GRAY); 

        for (int x = 0; x < height-2; x++) {
       for (int y = 0; y < width-2; y++) {
                    int gray=255-b[x][y];
                    imageGrad.setRGB(y, x, gray << 16 | gray << 8 | gray);
       }}

ImageIO.write(imageGrad, "bmp", new File("C://temp/example/cross_drad.bmp"));
}



}


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

Изображение

#7
erbol

erbol
  • Читатель
  • 361 сообщений
Для вот такой картинки, якобы с видео

Изображение

получил вот такую картинку таблицы градиентов

Изображение

Видно, что почти все ненужное вырезано

Значение порога равно 240

Максимальное значение в матрице градиентов равно 255

#8
erbol

erbol
  • Читатель
  • 361 сообщений
Как я устанавливал URBI

Чтобы этот пакет работал надо установить Microsoft Visual C++ 2008

Пошел по ссылке http://www.microsoft...ails.aspx?id=29 и скачал распостраняемый пакет vcredist_x86.exe

Потом скачал сам пакет по ссылке http://www.gostai.co...d/urbi_2_7_bin/

Urbi — кросс-платформенная открытая программная платформа на C++, используемая для разработки приложений для робототехники и сложных систем.

http://robocraft.ru/...orithm/288.html

#9
Зул

Зул
  • Свой человек
  • 620 сообщений
Подумываю насчет ардрона второго, если не возражаете задам пару вопросов. Насколько большой вес он поднимает? Насколько велик шанс сломать что-то? Ибо 300 баксов + доставка не так уж и много, а если брать сразу repair kit + двигатли+доп. винты на случай поломки - уже начинает жаба душить.

Код который вы привели - я так понимаю, он запускается на PC, писать код для прошивки в бортовой комп возможно? Или он исполняется на бортовом компе ардрона? Просто меня смутил импорт awt, неужели там полноценная jvm стоит со всеми либами?
  • 0

#10
erbol

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

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

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

#11
erbol

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

Да , на ПК код работает. На drone виртуальной машины java нет. Операционная система linux.

Насчет веса поднимаемого точно ответить не смогу, не экспериментировал. На rcdesign.ru есть большая компания которая летает на drone, можно у них спросить. А вообще вещь надежная. Я уже давно летаю по квартире, пока все работает штатно

#12
erbol

erbol
  • Читатель
  • 361 сообщений
Проблемы были с загрузкой программы Visual Studio

Поэтому загрузил образ инсталляционного диска с сайта

http://freewareupdat...xpress-editions

И при запуске инсталляции выбрал в меню Visual C++

Это относительно установки URBI на ноутбук

Сообщение отредактировал erbol: 11.03.2013, 09:34:16


#13
erbol

erbol
  • Читатель
  • 361 сообщений
Полезные ссылки для тех кто использует URBI

Gostai Studio 2.7 for Windows and Linux

http://www.gostai.co...iew/9vrwXQKtwA/

Gostai Lab 2.7.4 for Windows and Linux with Trial License (коммерческий продукт)

http://www.gostai.co...iew/nwpMDLDema/

#14
erbol

erbol
  • Читатель
  • 361 сообщений
Архитектура URBI

робот <-> UObject <-> сервер URBI <-> urbiScript

Итак, задача понятна:
— разобраться с написанием UObject и его подключением к серверу URBI
— разобраться с urbiScript

http://robocraft.ru/...orithm/290.html

#15
erbol

erbol
  • Читатель
  • 361 сообщений
Gostai Studio 2.7 for Windows and Linux, тоже коммерческий продукт. Без ключа не запускается

#16
erbol

erbol
  • Читатель
  • 361 сообщений
Вот URBI используется для управления drone

http://www.urbiforge.../Robots/ARDrone

#17
erbol

erbol
  • Читатель
  • 361 сообщений
По умолчанию программа Urbi устанавливается в папку С:\Program Files\Gostai Engine Runtime\

Для запуска и общения с сервером надо ввести с консоли команду

urbi.exe -i

Сама программа urbi.exe находится в папке С:\Program Files\Gostai Engine Runtime\bin

Например, если ввести инструкцию - "2+5;" сервер выдаст ответ
[00002332] 7

http://robocraft.ru/...orithm/290.html

#18
erbol

erbol
  • Читатель
  • 361 сообщений
Для того чтобы выполнить на сервере программу на языке UrbiScript можно воспользоваться программой UrbiConsole

При установке urbi SDK 2.1 по запросу устанавливается urbiConsole в папку С:\Program Files\Gostai urbiConsole 2.1\


Например, создадим файл
test.u
со следующим содержанием:

var i=0;
while(i<=3)
{
echo(i);
i++;
};


Запускаем консоль и выбираем этот файл через меню
Console — Send urbiScript file…

http://robocraft.ru/...orithm/290.html

Сообщение отредактировал erbol: 12.03.2013, 18:22:03


#19
erbol

erbol
  • Читатель
  • 361 сообщений
Зачем программисту URBI ?

Есть же универсальные языки на которых можно написать все что хочется. Оказывается ради удобства

Urbi представляет робота как абстракцию функций управления и сенсров

То есть для него робот это совокупность рычагов и кнопок. Типа повернуть вправо, увеличит/уменьшить скорость и так далее

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

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

#20
erbol

erbol
  • Читатель
  • 361 сообщений
Голосовое управление квадрокоптером ArDrone 2.0 через ROS. Часть 1

http://robocraft.ru/blog/2882.html

Всего 4 статьи на эту тему опубликовано на этом сайте


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

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

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

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