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

Фотография

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


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

#121
erbol

erbol
  • Читатель
  • 361 сообщений
Вычисление ускорения по осям с учетом силы тяжести

Ax = Ax + (g - g*sin(roll))*sin(pitch)
Ay = Ay + (g - g*sin(pitch))*sin(roll)


Учитываем, что ускорения по осям и углы наклона находятся в противофазе друг к другу

#122
erbol

erbol
  • Читатель
  • 361 сообщений
Flight Recorder 4Gb GPS

http://ardrone2.parr...light-recorder/

http://www.ebay.com/...=item2a2e8a3574

#123
erbol

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

Порт UDP 14551 используется для получения данных

https://projects.ard...63#message-5821

В структурах навигационных данных есть такая

struct GPS {
float latitude;// широта
float longitude; // долгота
float altitude; // высота
} gps;

Одна минута угла на уровне моря (по экватору или меридиану) составляет примерно 1,86 километра или одну морскую милю («примерно» потому, что Земля слегка сплюснута). Секунда угла равна одной шестидесятой этой величины: около 30 метров или 100 футов.

http://ru.wikipedia....iki/Минута_дуги

Изображение

#124
erbol

erbol
  • Читатель
  • 361 сообщений
Балансировка пропеллеров ar.drone



#125
erbol

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

При вычислении вектора перемещения по сенсорам ошибка накапливается и через 5 минут нуль системы координат сдвигается прилично, бывает что метров на пять.

 

Мои попытки улучшить обработку данных оказались не очень успешными. 

 

Наверное реальный шанс улучшить навигацию это искать метки в окружающей среде. 

 

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



#126
erbol

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

Основная идея при составлении карты местности по методу SLAM состоит в том, что каждое последующее измерение положения метки на карте влияет на результаты предыдущих измерений.

SLAM от англ.Simultaneous Location and Mapping

http://ru.wikipedia....ki/SLAM_(метод)

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

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

Кроме того одно и то же расстояние может быть измерено разными способами. Например в треугольнике можно измерить сторону АВ, а можно измерить стороны АС и СВ и таким образом определить длину сторону АВ.

 

Для экспериментов с точностью вычисления вектора перемещения используем известные (предустановленные) метки. То есть вертолет нужно только их распознать наличие метки на картнке и ее ориентацию по отношению к направлению движения. Положение и размер метки известны, это белая полоса. 

 

Метка будет использоваться как нулевая точка оси Х. Таким образом при прохождении метки компонента Sx вектора перемещения будет устанавливаться в нуль.



#127
erbol

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

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

Очень важно чтобы инструмент используемый для распознавания работал максимально  быстро. Я использую функцию openCV  - cvHoughLines2

 

CVAPI(CvSeq*)  cvHoughLines2( CvArr* image, void* line_storage, int method,
                              double rho, double theta, int threshold,
                              double param1 CV_DEFAULT(0), double param2 CV_DEFAULT(0));

 

Аргументы функции влияющие на скорость ее выполнения это количество элементов в матрице и значение порога. Высота и ширина - rho и theta, порог - threshold.



#128
erbol

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

Данные GPS ar,drone

 

http://pukulab.blog....g-entry-62.html

 

Добавили новую структуру данных в пакет навигационных данных, начиная с версии ПО AR.Drone 2.4.1

 

    // GPS (for AR.Drone 2.4.1)
    struct GPS {
        unsigned short tag;                  /*!< Navdata block ('option') identifier */
        unsigned short size;                 /*!< set this to the size of this structure */
        double         lat;                  /*!< Latitude */
        double         lon;                  /*!< Longitude */
        double         elevation;            /*!< Elevation */
        double         hdop;                 /*!< hdop */
        int            data_available;       /*!< When there is data available */
        unsigned char  unk_0[8];
        double         lat0;                 /*!< Latitude ??? */
        double         lon0;                 /*!< Longitude ??? */
        double         lat_fuse;             /*!< Latitude fused */
        double         lon_fuse;             /*!< Longitude fused */
        unsigned int   gps_state;            /*!< State of the GPS, still need to figure out */
        unsigned char  unk_1[40];
        double         vdop;                 /*!< vdop */
        double         pdop;                 /*!< pdop */
        float          speed;                /*!< speed */
        unsigned int   last_frame_timestamp; /*!< Timestamp from the last frame */
        float          degree;               /*!< Degree */
        float          degree_mag;           /*!< Degree of the magnetic */
        unsigned char  unk_2[16];
        struct {
            unsigned char sat;
            unsigned char cn0;
        } channels[12];
        int             gps_plugged;         /*!< When the gps is plugged */
        unsigned char   unk_3[108];
        double          gps_time;            /*!< The gps time of week */
        unsigned short  week;                /*!< The gps week */
        unsigned char   gps_fix;             /*!< The gps fix */
        unsigned char   num_sattelites;      /*!< Number of sattelites */
        unsigned char   unk_4[24];
        double          ned_vel_c0;          /*!< NED velocity */
        double          ned_vel_c1;          /*!< NED velocity */
        double          ned_vel_c2;          /*!< NED velocity */
        double          pos_accur_c0;        /*!< Position accuracy */
        double          pos_accur_c1;        /*!< Position accuracy */
        double          pos_accur_c2;        /*!< Position accuracy */
        float           speed_acur;          /*!< Speed accuracy */
        float           time_acur;           /*!< Time accuracy */
        unsigned char   unk_5[72];
        float           temprature;
        float           pressure;
    } gps;


#129
erbol

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

puku0x обновил свой проект cvdrone. Библиотеки используемые для работы с изображениями и для работы с видео обновил и изменил код класса ardrone для работы с новыми библиотеками. Добавлена новая структура данных в описание пакета навигационных данных для работы с GPS

https://github.com/puku0x/cvdrone



#130
erbol

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

Как найти нужный объект на рисунке

 

http://habrahabr.ru/post/137743/

 

Отслеживание мячика


Для определения координат мячика, я воспользовался следующим алгоритмом.
1) Перевёл изображение из RGB представления в HSV. Это облегчает определение похожих цветов, так как в отличие от RGB, HSV хранит в отдельном канале цветовой тон, насыщенность и яркость.
2) Перевёл изображение в двоичное (bitmap). Те цвета, которые ближе всех к требуемуму цвету (цвету мячика) — преобразовались в белый. Остальные — в чёрный.
3) Отфильтровал шумы медианным фильтром.
4) Определил среднюю координату и количество белых пикселей. Если количество больше порогового значения — значит в кадре есть мячик.



#131
erbol

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

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

 

Американцы Давид Хьюбл (David H.Hubel) и Торстен Вайзел (Torsten N.Wiesel) получили Нобелевскую премию 1981 года за исследование зрения человека. Они доказали[источник не указан 358 дней], что глаза человека выдают в мозг информацию вовсе не о красном ®, зелёном (G) и синем (B) цветах (теория цвета Юнга — Гельмгольца, 1802 г.). Согласно теории о трёх оппонентных процессах (автор — немецкий физиолог Эвальд Геринг, 1834—1918), мозг получает информацию о разнице яркости белого и чёрного (Ymax и Ymin), о разнице зелёного и красного цветов (G − R), о разнице синего и жёлтого цветов (B − yellow), а жёлтый цвет есть сумма красного и зелёного цветов (yellow = R + G), где R, G и B — яркости цветовых составляющих: красного, зелёного и синего.

 

http://ru.wikipedia....нс_белого_цвета

 

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



#132
erbol

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

Для обработки нажатий клавиш используется функция GetAsyncKeyState()

 

Функция GetAsyncKeyState устанавливает, в нажатом или отпущенном состоянии находится клавиша во время, когда вызывается функция и была ли клавиша нажата после предыдущего вызова GetAsyncKeyState().

 

Возвращаемые значения

Если функция завершается успешно, величина возвращаемого значения определяет, была ли клавиша нажата начиная с последнего вызова GetAsyncKeyState, и какое из двух состояний, нажатое или отпущенное, занимает в настоящее время клавиша. Если старший значащий бит установлен, клавиша - нажата, а если наименьший значащий бит установлен, клавиша была нажата после предыдущего вызова GetAsyncKeyState. Величина возвращаемого значения нулевая, если окно в другом потоке или процессе в настоящее время имеет фокус клавиатуры.

 

http://www.firststep...i/keyb/r.php?27



#133
erbol

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

http://www.youtube.c...h?v=W61y3nISZ8k



#134
erbol

erbol
  • Читатель
  • 361 сообщений
При распознавании объектов снимаемых видеокамерой в движении большое значение имеет время экспозиции кадра. 
 
При очень коротких выдержках, существенно меньших, чем период смены кадров, быстрое движение на экране может восприниматься прерывистым («стробированным») вследствие отсутствия смазки изображения каждого кадра, скрывающего временну́ю дискретность
 
 
Для того чтобы избежать "дробности" отображения изображения "время считывания кадра" делают примерно равным "периоду смены кадров"
 
То есть если частота кадров равна тридцати, то экспозиция равна 1/30. При этом объекты в кадре оказываются размытыми. Если мы хотим найти контуры объектов то это вряд ли получится , так как вертолет движется с большой скоростью.


#135
erbol

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

Китайцы победили

http://iarc.angel-strike.com/

 

http://www.youtube.c...h?v=B-iZE_Nn52w



#136
erbol

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

При использовании функции cvShowImage() необходимо использовать также функцию cvWaitKey(),  так как она инициирует прорисовку изображения в окне

 

Например так

 

cvShowImage("canny", canny);
cvWaitKey(1);
 
 
Вот еще некоторые функции используемые для работы с окнами в opencv
 


#137
erbol

erbol
  • Читатель
  • 361 сообщений
Находим центр масс объекта на рисунке. Допустим объект белого цвета. Преобразуем изображение в формат HSV. С помощью фильтров отбираем точки которые у которых H = 0, S =0, 200<=V<=256
 
дальше используем такой код для вычисления центра масс объекта
 
 
        int Xc = 0;
        int Yc = 0;
        int counter = 0; // счётчик числа белых пикселей
 
        // пробегаемся по пикселям изображения
        for(int y=0; y < dst->height; y++)
        {
                uchar* ptr = (uchar*) (dst->imageData + y * dst->widthStep);
                // вычисляем указатель ptr, который указывает на начало соответствующей строки (y)
 
                for(int x=0; x < dst->width; x++)
                {
                        if( ptr[x]>0 )
                        {
                                Xc += x;
                                Yc += y;
                                counter++; 
                        }
                }
        }
        
        if(counter!=0)
        {
                float centerx = float(Xc)/counter;
                float centery = float(Yc)/counter;
        }
 
 


#138
erbol

erbol
  • Читатель
  • 361 сообщений
Соревнование роботов в Москве
 
Сегодня лидером оказался дрон команды Robodem с результатом 6:45
 


#139
erbol

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

Можно получать видео с вертолета с разным разрешением

Для видео с разрешением 640*360 используется команда

        sockCommand.sendf("AT*CONFIG=%d,\"video:video_codec\",\"%d\"\r", seq++, 0x81);   // H264_360P_CODEC

Для видео с разрешением 1280*720 используется команда

        sockCommand.sendf("AT*CONFIG=%d,\"video:video_codec\",\"%d\"\r", seq++, 0x83); // H264_720P_CODEC


/******** Available codecs ********/
typedef enum _codec_type_t {
NULL_CODEC    = 0,␊
UVLC_CODEC    = 0x20,       // codec_type value is used for START_CODE
MJPEG_CODEC,                // not used
P263_CODEC,                 // not used
P264_CODEC    = 0x40,
MP4_360P_CODEC = 0x80,
H264_360P_CODEC = 0x81,
MP4_360P_H264_720P_CODEC = 0x82,
H264_720P_CODEC = 0x83,
MP4_360P_SLRS_CODEC = 0x84,
H264_360P_SLRS_CODEC = 0x85,
H264_720P_SLRS_CODEC = 0x86,
H264_AUTO_RESIZE_CODEC = 0x87,    // resolution is automatically adjusted according to bitrate
MP4_360P_H264_360P_CODEC = 0x88,


http://forge.scilab....B/video_codec.h

https://projects.ard...opics/show/4957



#140
erbol

erbol
  • Читатель
  • 361 сообщений
В opencv есть функция для изменения размеров(масштабирование) изображения
 
CVAPI(void)  cvResize( const CvArr* src, CvArr* dst, int interpolation CV_DEFAULT( CV_INTER_LINEAR ));
 
src — исходное изображение
dst — изображение для сохранения результа
interpolation — метод интерполяции:
 
#define  CV_INTER_NN        0 // nearest-neigbor - интерполяция методом ближайшего соседа
#define  CV_INTER_LINEAR    1 // билинейная интерполяция (по умолчанию)
#define  CV_INTER_CUBIC     2 // 
#define  CV_INTER_AREA      3 // бикубическая интерполяция
 



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

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

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

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