nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Начинаем отладку алгоритма обнаружения

То, что у меня поначалу вышло "нет сигнала" - это продолжается "неконтакт" между платой АЦП и всем остальным. Стоит по ней "ударить" пальцем - и начинает работать. Сейчас вот попробовал просто все штырьки почистить, может они просто грязные были? Пока работает, и то хлеб.

Я умудрился вставить камеру в корпус под заметным наклоном:


Это, "конечно же", не баг, а фича, ведь позволяет не только на предельной дальности в 0,5 метра вместить всю мишень целиком, но ещё и в своё время отработать методику юстировки, не ошибиться там со знаками. А то вечно, если у тебя изначально всё точно, и показывает ошибку по крену в доли градуса - попробуй сообрази, правильно он знак показал или нет! И даже когда уже внесёшь поправку - всё равно будет непонятно, действительно ли ошибка была скорректирована, или УДВОЕНА? Тут же никаких вопросов, всё наглядно :)

Вчера очень расстроило, что при бОльших дальностях экспозиция выставляется чересчур большой: отражатели начинают занимать небольшую часть поля зрения, экспозиция выставляется "по средней освещённости", и они слишком пересвечиваются, сливаются в одно гигантское пятно. Знаю два способа, как это побороть:
1. Всё-таки впаять резистор R1 (см. схему), чтобы чуть ослабить сигнал перед АЦП. Сдаётся мне, иногда насыщение наступает не в камере, а уже в АЦП.
2. Не просто включать-выключать осветитель, как сейчас (см. подробности), а регулировать яркость в широких пределах, видимо, заменив простой логический сигнал на ШИМ. Тогда по-хорошему нужно на платку осветителя напаять SMD-конденсатор между базой силового транзистора и общим проводом, чтобы светодиоды непрерывно горели, а не мигали, иначе часть этих пульсаций может проникнуть в изображение. Впрочем, для начала можно попробовать и без него...

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


После того, как с помощью percussive maintenance (подскажите, как это лучше всего перевести на русский, технический термин, означающий метод ремонта электронной аппаратуры путем удара кулаком по корпусу) перестало срабатывать прерывание "нет сигнала", сработало другое - "исчерпание заданий GPU".

Запрос изображения сработал превосходно, вот что я получил:


С дампом памяти вышла небольшая накладка. Ведь я уже "зарезервировал" символы U, D, L, R, E, большие и маленькие, для управления экранным меню камеры (Up, Down, Left, Right, Enter), причём большие буквы ЛОГИЧНО означают короткое нажатие, а маленькие - нажатие свыше 5 секунд для переключения режима :) Затем I было уже зарезервировано для получения изображения, а для дампа памяти было M, поскольку D уже занято, а так получается Memory dump. А когда дописывал программу для макета, я об этом забыл и для дампа выбрал D. Ну, невелика проблема, в итоге всё получилось, и дамп даже автоматически "сконвертировался" в картинку - расположение обнаруженных точек (до возникновения ошибки), и уже её я наложил на переданную картинку:



И это ОЧЕНЬ ИНФОРМАТИВНО! Поглядев на столь здоровенные обнаруженные пятна, я вспомнил, что так и не переправил значение D1, у меня так и осталось:

D1   dw   120


А это ошибка вдвойне! Ведь не только мы решили начинать с самого маленького возможного диаметра, 3 (возможно, лучше будет 4), но и теперь это должна быть КОНСТАНТА (непосредственное значение), а не указатель в памяти! Именно так наш код трактовал D1, как указатель, 0x0A0 = 160 - ещё больше!

Впрочем, даже тогда происходящее не вполне понятно. Почему этих пятен наплодилось аж 20 штук?

Что ещё "страньше": это мы просмотрели список AllPoints, т.е пятна очень быстро выбывают из списка активных, ActivePoints! Это объясняет, почему появляются новые - а куда им тогда деваться??

А вот если "ручками" заглянуть в список ActivePoints, мы обнаружим - он не пуст. Там содержится одно пятно, и на удивление точное:



У него диаметр УМЕНЬШИЛСЯ, чего в принципе происходить не должно, однако сейчас оно прямо идеально покрывает реальное пятно!

Пройдёмся по "окончательным" пятнам - они в списке идут от самых "свежих" до самых старых. Оно и понятно: нам лениво запоминать конец списка, поэтому мы присоединяем каждое следующее пятно К НАЧАЛУ.

Нас интересует место, где "всё начинает идти не так", поэтому поглядим на самые верхние 2 пятна:
(350; 195) и
(345; 197)


Похоже, эти пятна идут совершенно упорядоченно - через каждые 2 пикселя по вертикали. Одно уходит из списка активных - поэтому обнаруживается яркая точка, расположенная левее всего на текущей строке.

Методом "пристального взгляда на код" вроде бы удалось найти жуткую ошибку, в месте, когда мы проверяем отрезок под недавно найденным пятном:

	;входит ли этот отрезок в уже найденное пятно?
	Acc		[SP+1]		;координата точки (из списка)
	DIV2S		[X+1]		;прибавить половинку её диаметра
	SUB		[X+2j+1]	;вычесть текущий номер строки


Тут должен быть не [SP+1], где лежит X-координата найденной точки, ведь мы заранее знаем, В КАКОМ ДИАПАЗОНЕ ОНА БУДЕТ ЛЕЖАТЬ. Нам был нужен [SP+2], он же [SP+2j+k], это Y-координата найденной точки, то бишь номер текущей строки изображения!

Комментарии за пару дней успели безнадёжно устареть, что ещё сильнее запутывает!

В общем, вот правильно:

	;входит ли этот отрезок в уже найденное пятно?
	Acc		[SP+2j+k]	;текущий номер строки
	DIV2S		[X+1]		;вычесть половинку диаметра пятна
	SUB		[X+2j+1]	;вычесть Y-координату центра пятна


В итоге, в ситуации, когда y=197 (текущая строка), Y=195 (Y-координата центра пятна), D=160, x=350 (координата только что найденной точки), там где надо было посчитать y-D/2-Y и получить значение меньше нуля (значит, всё ещё находимся внутри пятна), мы случайно посчитали x-D/2-Y и получили значение больше нуля, и вычитание D1 в дальнейшем нам не помогло, так и осталось больше нуля, поэтому нам казалось, что мы очень далеко от пятна, и его пора отправлять на покой в список AllPoints...

Причём, по мере сдвижки влево и вниз в какой-то момент этот принцип нарушился, т.к координаты X и Y начали сравниваться между собой, и в какой-то момент наступил момент "ясного рассудка" - и алгоритм поймал-таки совершенно корректное пятно! И тут же сработало прерывание, точно не знаю, почему, наверняка это не важно - "сход с рельсов" произошёл гораздо раньше!


Что ж, одну критическую ошибку нашли, исправили, но сегодня протестить уже не успею. Пока складывается ощущение, что алгоритм "поддаётся отладке" :) Но главное сейчас не расслабиться, у него ещё наверняка есть пара тузов в рукавах.
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments