Optical Flow + MultiWii

Dimm168pin
alexmos:

В общем, заимплементил и потестил. Arducopter так и не расковырял - очень там все сложно сделано, у меня попроще - не более 100 строк кода в сумме.
Работает вроде нормально - тестил в сумерках уже, но тем не менее на высоте от 20см до 10 м работа алгоритма заметна и позиция держится. Сопротивляется небольшому ветру (большого пока не случилось 😃

Исходники на SVN code.google.com/p/multiwii-alexmos/…/browse/?r=17#…

по мне так для удержания позиции это лучше гпс даже в текущем состоянии) тогда gps разве что как failsafe нужен и на больших высотах
, че-то я уже ломанулся заказывать себе такой сенсор)

cylllka
alexmos:

В общем, заимплементил и потестил.

Вот это я понимаю, можно чайку попить и булку слопать пока он висит. А информация для повторения будет доступна? 😒 код и распиновка

ALEXF

Снимаю шляпу очень интересно ,а на какой меге виий?

mahowik

Алексей, снимаю шляпу! 😃

Когда теория срастается с практикой с первых попыток, особенно в таких вещах, то это уже что то сродни гениальности 😉

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

alexmos

Спасибо, не ожидал такой реакции 😃 Мод написан just fo fun, пользы не очень много. Локалные данные о положении точнее GPS, но нужно быть реалистом - работать он будет не везде и очень зависит от освещения и качества поверхности.

Распиновка согласно датащиту (www.avagotech.com/docs/AV02-1045EN) Нужны выходы SCLK, SDIO, NCS - можно вешать на любые ноги и прописать в config.h. На NRESET я кинул на +5в, чтобы не заводить его на ардуину.

Кстати можно взять и готовый модуль store.diydrones.com/ProductDetails.asp?ProductCode… по показателям должен работать лучше и оптика получше стоит… Но под него надо код считывания допилить, т.к. возможно и регистры другие и SPI у него по четырем проводам а не по трем.

Код крутится на стандартной ATMEGA 328P (Crius Hobby MWC).

Для настройки линзы я написал тестовый скетч - он делает дамп сенсора и выводит в программку mousecam (не помню где скачал), которую слегка модифицировал для ADNS-5050. Оба во вложении.

mahowik:

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

Датчик отслеживает перемещение картинки по его сенсору и увеличивает счетчик в 8-ми битовом регистре. Реальное перемещение определеяется, зная текущее разрешение (750CPI - отсчетов на дюйм), оптическую силу линзы и расстояние до поверхности. Собственно, вот тут все наглядно: code.google.com/p/arducopter/wiki/AC2_OptFlow.

Как настроить - по картинке с камеры… я выложил выше прогу. Можно попробовать и другие фокусные, чем шире - тем большие детали рельефа будут прниматься в рассчет. Потом в кончиге можно подкрутить, я вынес параметр.

OpticalFlow.zip

Dimm168pin
alexmos:

работать он будет не везде и очень зависит от освещения и качества поверхности.

ну с засветами бороться понятно некак, а вот с недосветом думаю банально взять и сделать как в мышах втолкать туда несколько светодиодов с хорошей фокусировкой в точку, на высоте до пары метров думаю будет достаточно, лазером наверно было бы лучше, но слабее значительно и скорее всего из-за того что там эффект кристализации что-ли ( как мелкие точки при рассеивании) будет думать что стоит на месте , если конечно сенсор способен реагировать на такие детали.
смотрю тут store.diydrones.com/ProductDetails.asp?ProductCode…
А модуль объектива от обычной cctv камеры подойдет? там же сток 3,6 мм , чего вполне достаточно должно быть, но есть и шире, по ссылке вроде как оно и есть

upd ))) прочитал
-Includes an 8mm lens which can be replaced, depending on the use requirements
-Standard M12 x 0.5 lens mount

cylllka
Dimm168pin:

если конечно сенсор способен реагировать на такие детали.

Вот с таким разрешением видит сенсор мышки

SovGVD
cylllka:

Вот с таким разрешением видит сенсор мышки

а как сенсор “видит” траву/асфальта и прочие вещи? просто интересно =) мышей дохлых много (механика полетела, а сенсор то живой), прилепить что ли тоже

Dimm168pin
cylllka:

Вот с таким разрешением видит сенсор мышки

тогда пофиг) можно городить десяток лэдов с хорошей фокусировкой на пузо для вечерних полетов и все)

alexmos

В мышках подсветка под сильным углом, и там даже на белой бумаге хорошо работает - выделяется тенями струкутра. В нашем случае подсветка поможет не так сильно, теней не будет от нее… И надо учитывать, что сенсор очень слепой: например поверхность освещенную лампой 60Вт с расстояния 1 м он почти не видит. Есть светодиодные прожекторы мощные, вот типа такого надо ставить и фокусировать линзой в то же пятно что видит сенсор (это примерно 5 на 5 см на расстоянии в 1 метр)

С лазером интересная идея, его можно очень точно сфокусировать. Можно ИК поставить из DVD, он очень мощный. Но, блин, опасно будет с таким коптером рядом находиться 😃

SovGVD:

а как сенсор “видит” траву/асфальта и прочие вещи? просто интересно =) мышей дохлых много (механика полетела, а сенсор то живой), прилепить что ли тоже

На траве думаю будет лучше всего - там много неоднородностей разного размера, так что на любой высоте есть на что “посмореть” 😃 Асфальт с большой высоты уже сольется.

SovGVD
alexmos:

Асфальт с большой высоты уже сольется.

смотря какой =)) много где технологические отверстия в виде ям, так что и с высоты будет неоднородно 😉)

cylllka
alexmos:

И надо учитывать, что сенсор очень слепой

Нужно оптику более светлую. Мелкие линзочки очень мало света пропускают.

mahowik
SovGVD:

прилепить что ли тоже

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

в ADNS-5050 разрешение выше чем в опт. мышах нижней-средней ценовой категории? И сколько там доставка если брать по ссылке из первого поста?

alexmos
mahowik:

в ADNS-5050 разрешение выше чем в опт. мышах нижней-средней ценовой категории? И сколько там доставка если брать по ссылке из первого поста?

Этих сенсоров навыпускали очень много, ключевые параметры - размер матрицы, поддерживаемые скорости и ускорения. Но большинство на 3.3В работают, 5-ти вольтовых я всего несколько нашел. Вероятность что в мыше будет стоять именно такой как надо очень мала - поэтому заказал в инете у компании Элитан. Что то около 500 р за пару штук с доставкой. Есть и за бугром но там доставка безумная.

alexmos

Ну так то по сонару, чтож не держать если погрешность измерений 0.3см 😃 Ставлю сильный PID и висит как на веревочке.

mahowik
alexmos:

Но большинство на 3.3В работают

если разница только в питании, думаю не страшно если 3.3в, его можно взять с ардуины или платы сенсоров, а LLC на шину желателен, но не обязателен как показала практика работы с I2C датчиками…
другое дело что ADNS-5050 “улучшенный” по параметрам, потому желательно именно его по идее:

  • Отслеживание высокоскоростного движения при скорости до 30 дюймов в секунду и ускорении до 8 G
  • Самонастраивающаяся кадровая частота для оптимальной производительности
  • Встроенный генератор - не требуется вход синхронизации
  • Настраиваемое разрешение от 125 до 1375 знаков на дюйм с шагом 125 знаков на дюйм
  • Используются только 4 конденсатора без транзисторов
  • твои первые тест-полеты действительно впечатлили!
alexmos
mahowik:

другое дело что ADNS-5050 “улучшенный” по параметрам

Так эти “улучшения” давно стандарт де-факто 😃 В инете находил статью про эволюцию компьютерных мышей, такие параметры средненькие. Почитайте датащиты от других сенсоров ADNS-XX - там в каждом какие-то преимущества описаны. Но вот по минимуму обвеса и простоте подключения этот пожалуй что лучший.
Если 3в есть и не пугает LLC - то смело можно расковыривать любую мышь, но обратите внимание что у AVAGO каждый сенсор имеет свой протокол - читал несколько датащитов, работа сильно отличается

Dimm168pin
alexmos:

Так эти “улучшения” давно стандарт де-факто 😃 В инете находил статью про эволюцию компьютерных мышей, такие параметры средненькие. Почитайте датащиты от других сенсоров ADNS-XX - там в каждом какие-то преимущества описаны. Но вот по минимуму обвеса и простоте подключения этот пожалуй что лучший.
Если 3в есть и не пугает LLC - то смело можно расковыривать любую мышь, но обратите внимание что у AVAGO каждый сенсор имеет свой протокол - читал несколько датащитов, работа сильно отличается

если грабли с llc могу выложить отдельно разводку платки для pca9307 или как он там зовется , паял, вроде не страшно, все под односторонний текстолит, могу и спаркановскую версию, есть и то и другое, и работает, правда та что на транзисорах у меня на 300 попугаев поднимает цикл, ( с 2950 до 3300 примерно)
паяется все паяльником,без фена и прочего колдовства

mahowik

Посмотрел код на днях. Аксель наше все! 😃

  1. В основном все понятно, но есть очевидный скользкий момент в расчете горизонтальной скорости в CF. К примеру если накопилась ошибка интегрирования + качество поверхности для OF сенсора низкое (освещение, либо отсутствие деталей), то непонятно как и по чем будет корректироваться скорость. В итоге коптер понесет в не известном направлении…
// Apply ACC-OF complementary filter
         vel[axis] = ((vel[axis] + EstHAcc[axis]*accVelScale*dTime)*OF_ACC_FACTOR + vel_of[axis])/(1+OF_ACC_FACTOR);
  1. Проверил много раз. Походу нашел ошибочку. vel_of получился в метрах в секунду, а не см/сек.
// remove shift in position due to inclination: delta_angle * PI / 180 * 100
            // mm/sec(10m) * cm / us   ->    cm / sec
            vel_of[axis] = ((int32_t)(optflow_pos[axis] + (angle[axis] - prevAngle[axis]) * 17 )) * alt / dTime; 

/* displacment (in mm*10 on height 1m) */
данные с сенсора в мм*10 => нужно в см => (мм*10)/100
alt в см => нужно в метрах => alt/100
dTime в микросек. => нужно в сек. => dTime/1000000

в итоге числитель должен быть в 100 раз больше если результат в см/сек., т.е.

vel_of[axis] = ((int32_t)(optflow_pos[axis] + (angle[axis] - prevAngle[axis]) * 17 )) * alt * 100 / dTime ; 

Либо если перекинуть эту сотню в CF, то OF_ACC_FACTOR был 1000! Т.е. если я не ошибся, то алгоритм на видео считай летал на одном акселе 😃 и видимо он был очень хорошо откалиброван у тебя по всем осям… И зачем нам OF?! 😃

  1. И кстати почему мы верим больше акселю чем OF сенсору (OF_ACC_FACTOR = 10)? Даже если качество картинки/потока хорошее (optflow_squal), все равно большая погрешность с OF сенсора? Т.е. по идее можно подстраивать коэф. CF в соот-ии с optflow_squal если данные довольно точные…

  2. Почему высота более 2-х метров режется? Ведь это считай коэф. для расчета пробега по OF сенсору.

alt = constrain((uint16_t)EstAlt, 30, 200) * 100; 
mahowik

по второму пункту: увидел наконец свой косяк 😃
высота в мм*10, а привык что везде в ИМУ и в конечном ПИД она в см…

alt = constrain((uint16_t)EstAlt, 30, 200) * 100;
  1. Есть идея: Когда стики в нуле и коптер притормозил (т.е. когда скорость меньше заданного N), считать пройденную дистанцию/смещение по х,у и использовать его в ПИД регуле для возврата в точку удержания (х=0, у=0). Т.е. ввести доп. стабилизацию по смещению (когда коптер почти в покое), а не только по скорости…
    Тогда по идее фиксация в точке будет более точной. Тут уже основную роль сыграет OF сенсор (качество поверхности, освещение, контрастность текстуры поверхности и т.д.).