Optical Flow + MultiWii

alexmos

Пока погода нелетная, решил побаловаться с датчиком Optical Flow. Запаял на куске макетки вот такой чип: ADNS-5050 (www.avagotech.com/pages/en/…/adns-5050/). В общем-то можно было взять любой из оптической мышки, но все что я разобрал, были 3-х вольтовые (надо LLC паять и стабилизатор, а с этим у меня сложности). У этого же 5В питание и 5В логика, и из обвязки нужно только пара конденсаторов. Линзу вытащил из китайской лазерной указки. Если поставить глазок от видеокамеры (5-8мм) будет по идее лучше.

Завел в multiwii, самое интересное что показания идут и довольно точно отслеживает перемещение.

Осталось написать пару формул конвертации с учетом высоты и PID-регулятор 😃

Вопрос: как работать с SPI на ардуине? Я сделал софтовый, там по идее всего два байта на запись и два на чтение на каждый цикл. Есть ли смысл тут что то оптимизировать?

alex_f73

А какое максимальное расстояние на котором работает оптический датчик ?

alexmos

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

alexmos

Да, глянул пока только считывание с датчика. В остальном что делать понятно, но буду смотреть и там если какие то траблы возникнут.
Так и не понял как там SPI реализован, вроде встроенная библиотека?

Sir_Alex
alexmos:

Так и не понял как там SPI реализован, вроде встроенная библиотека?

Да, Arduino’вская либа SPI.

leprud

Алексей, еще бы предусмотреть вариант выдачи некорректных данных стоило.
А то начнет на неконтрастной поверхности выдавать белиберду - и все, туши свет 😦
Как минимум надо ввести понятие “максимальной скорости”, наверное

omegapraim
leprud:

Алексей, еще бы предусмотреть вариант выдачи некорректных данных стоило.
А то начнет на неконтрастной поверхности выдавать белиберду - и все, туши свет 😦
Как минимум надо ввести понятие “максимальной скорости”, наверное

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

alexmos
leprud:

Алексей, еще бы предусмотреть вариант выдачи некорректных данных стоило.
А то начнет на неконтрастной поверхности выдавать белиберду - и все, туши свет
Как минимум надо ввести понятие “максимальной скорости”, наверное

Да, данные могут идти самые разные. Например собственную тень “увидит”, или при вращении он непонятно что выдаст. Я планирую исполовать его только в очень мягком режиме для стабилизации скорости в 0, когда все стики в центре. Т.е. летишь, зарулился - бросил стики, и он постепенно остановился и завис, назависимо от ветра и скорости. Другие применения пока не придумал.

omegapraim:

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

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

cylllka

хм… как то видео совсем не впечатлило. Я весь ролик ждал когда включат стабилизацию. Я левой ногой на КУКе лучше рулю 😃

omegapraim
cylllka:

хм… как то видео совсем не впечатлило. Я весь ролик ждал когда включат стабилизацию. Я левой ногой на КУКе лучше рулю 😃

Честно сказать флайментор в точке 450 рулит лучше)))) в общем вещь чисто побаловаться не больше лучше уж сделать чтобы он от стенак отталкивался с помощью сонара, а тупо стоять и смотреть как квадрик сам 8 минут висит и водить вокруг него хороводы, это даже не весело. Свое мнение я вам говорю как владелец флайментора, как говорится штука классная но летать не учит совсем.

Кстати чтобы эта штука работала лучше поверхность под квадриком лучше подсвечивать красным спектром или мощным ИК диодом. ТОгда она будет рельеф хотя бы видеть.

alexmos
cylllka:

хм… как то видео совсем не впечатлило. Я весь ролик ждал когда включат стабилизацию. Я левой ногой на КУКе лучше рулю

НУ да, на видео непонятно что там вообще удерживать. Где порывы ветра, где остановка на большой скорости. Если просто покружить на месте то нафиг не нужно.

omegapraim:

Кстати чтобы эта штука работала лучше поверхность под квадриком лучше подсвечивать красным спектром или мощным ИК диодом. ТОгда она будет рельеф хотя бы видеть.

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

omegapraim

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

alexmos

Проблема в том что чем выше высота, тем меньший угол мы можем обеспечить. Угол в 10 градусов ничего не даст.
Линзу можно настроить как угодно, можно и на 3 метра. Для такой матрицы глубина резкости будет от 30см и до бесконечности (вспомните камеры сотовых)

alexmos

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

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

omegapraim

Эхххх хорошо вам есть место где нет людей и открытая площадка((((

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:

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

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