Category: история

Category was added automatically. Read all entries about "история".

QuatCore

О выборе самого подходящего CRC-кода

Каюсь, что в вопросе выбора полинома для CRC я исходил из "моды": взял попросту самый популярный из CRC-16, под названием CCITT, 0x1021. Другие названия (в зависимости от выбора начального значения, инверсии битов на входе и на выходе): AUG-CCITT, GENIBUS, MCRF4XX, RIELLO, TMS37157, CRC-A, KERMIT, X-25 и X-MODEM, и это только то, что знает crccalc.com.

Сейчас решил всё-таки поискать, а в чём же, собственно, разница, и какой было бы лучше всего выбрать мне для поставленной задачи: МКО (Mil-Std 1553) со своими проверками чётности, от 1 до 32 слов данных (каждое слово 16 бит), ошибки предполагаются случайными и довольно редкими (вероятность 10-7).

Бешеную активность в этом направлении (исследование CRC) развил Филипп Купман (https://users.ece.cmu.edu/~koopman/crc/). Информации очень много, она "утрамбована", вроде бы наконец разобрался, что с ней делать.

Основная идея: выбрать такой код, который для твоего размера сообщения даст наибольшую возможную дистанцию Хэмминга, т.е позволит ГАРАНТИРОВАННО обнаружить как можно больше неправильных битов.

Collapse )

В общем, мне повезло: ровно в моём случае этот полином CCITT действительно хорошо подходит. Для более коротких сообщений или для более длинных лучше подошли бы другие. А здесь мы имеем гарантированное обнаружение до 3 ошибок, а также любого их нечётного количества, и вероятность 99,997% обнаружить 4 ошибки.
QuatCore

CRC и полудуплексный UART

Апологеты "модели OSI" скажут, что генерация и проверка CRC (Cyclic Redundancy Codes) - это уже канальный уровень, а не физический, и мешать их между собой не стоит. Дескать, физический уровень - это когда говоришь "передай вот этот байт" - и самому передатчику должно быть пофиг, что это за байт такой, частью чего он является. А всей остальной системе должно быть пофиг, как именно этот байт передаётся - хоть оптикой, хоть медяшкой, хоть по радио.

Но если уж я заранее знаю, что у меня будет на физическом уровне (поначалу, для "обкатки", RS485, позже - МКО, он же ГОСТ Р 52070-2003, он же Mil-Std 1553), и у меня была возможность, исходя из этого, придумать конкретный вид применяемого CRC, то более "тесное" проникновение одного в другое позволяет заметно упростить проект.

Смысл в том, что наиболее простая реализация CRC - когда мы подаём по одному биту за раз, поэтому если уж во время передачи данных они всё равно должны "сериализоваться" - то почему бы этот поток бит и не пустить на CRC. Да и мультиплексировать один бит (поставить ли его из "обычного" сдвигового регистра, или из CRC) получается не так затратно, чем 8-битную шину, а тем более 16-битную.

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

Для начала раскомментируем выражение isDataBit:
assign isDataBit = (State[3] | State[0])&(~isStopState)&ce;	


И ещё разок смотрим работу передатчика:


Collapse )

Ладно, начало неплохое, при передаче CRC ведёт себя прилично. Воспользовались "недокументированным оператором верилога" &~& и ужаснулись возможностям по обфускации кода, которые он открывает :)

Теперь осталось посмотреть работу CRC на приёме, а потом сделать "схему", работающую и на приём, и на передачу.
QuatCore

5576ХС4Т против Cyclone III

Захотелось посмотреть, "до чего дошёл прогресс". Я всё ковыряюсь с 5576ХС4Т, который является функциональным аналогом Flex10k, а если точнее, EPF10K200SRC240-3. Это разработка эдак 1998 года, причём "-3" в названии означает самый медленный кристалл, "-2" быстрее, а "-1" ещё быстрее.

И на таком железе у меня то и дело случается "битва" за 25 МГц, в смысле что фиттер иногда в хорошем расположении духа и "соберёт" схему на частоту до 28 МГц, а иногда из-за малейших изменений он вдруг и до 25 МГц дотянуть не может.

Дома у меня лежит другая отладочная плата, на альтеровский/интеловский Cyclone III, если точнее: EP3C25E144C8. То, что логических элементов там поболее, 24624 против 9984 (почти в 2,5 раза), и памяти побольше, 608 256 бит против 98 304 (более чем в 6 раз) - это я знал. А вот что там по скорости - ни разу не сравнивал.

Попробовал сейчас в своём проекте просто поменять Device. Услышал ругань в свою сторону - "ну снеси ты уже все пины и расставь по-новой", а когда я его послал и всё-таки запустил синтез - получил ошибку: Cyclone III поддерживает только синхронную память!

Collapse )

В результате вся эта штуковина наконец-то синтезируется, и получается такой результат:


Ага, 76 МГц, сразу так в 3 раза "разгон"! А если ещё применить аппаратный перемножитель, коих на третьем циклоне 132 штуки 9-битных, то мои все команды умножения вместо 18 тактов будут занимать эдак 3-4 такта :)

Притом, ядро занимает 546 ЛЭ, т.е 2,2% от полной логической ёмкости этого Циклона. Буквально "на сдачу". NIOS II нервно курит в сторонке! Надо только задокументировать всё как следует, наснимать обучающих видеороликов, набор тестовых программок, чтобы не так страшно было эту штуковину осваивать - и можно попробовать его внедрить поширше :)
QuatCore

Обнаружение точек "вживую" - отладка продолжается

Если подумать, в прошлый раз ничего заработать и не могло, и опять по причине излишней нашей "шустрости".

Процесс запуска сейчас выглядит так: я поворачиваю тумблер (подаю питание) - и в ПЛИС загружается старая прошивка, та, в которой ИК подсветка отключена. Камера получает питание - и настраивает экспозицию худо-бедно.

Когда я прошиваю ПЛИС с компьютера, примерно секунду все её выводы переходят в режим входа с "подтяжкой к +3,3 вольта" резисторами порядка 12 кОм. Этого недостаточно, чтобы включить ИК-подсветку, поэтому и эту секунду она отключена, и камера, как не в чём не бывало продолжает выдавать картинку.

И вот, наконец, начинается работа - первым же делом ИК подсветка включается, и по первому же кадровому синхроимпульсу мы начинаем обрабатывать изображение. И тут никуда не денешься - оно получается ПЕРЕСВЕЧЕННЫМ! Практически весь "экран" белый, любая точка проходит порог обнаружения.

По нашему алгоритму, на первой строке мы "обнаруживаем" одну точку (скорее всего в левом углу), и для второй строки даём уже 2-3 задания на обработку, на каждом из них снова "обнаруживая" по точке, и тут уж действительно либо мы "закопаемся" в обработке каждой из них (а новый пиксель идёт КАЖДЫЙ ТАКТ, тогда как обработка "обнаруженных точек" на процессоре куда медленнее) и тем самым не успеваем "озадачить" видеопроцессор, либо всё-таки успеваем - но быстро забиваем те 32 позиции, которые были выделены в памяти, и получаем Out of heap memory.

"Кто виноват" - понятно. Осталось понять, "что делать"...

Collapse )


Уже что-то!

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

Сейчас, наверное, чем-нибудь заслоню плоское зеркало, ещё разок проверю настройки экспозиции - и продолжим...
QuatCore

Тестовая картинка для видеопроцессора

Продолжаются раздумья, как этот видеопроцессор должен работать. Пора рассмотреть конкретный пример:



Так наша "мишень" должна выглядеть с расстояния 300 метров. Практически пустой кадр 1024х1024, а вся информативная часть умещается в 32х32 (именно такая эта картинка, я её увеличил до 64х64 методом nearest neighbour, просто чтобы лучше было видно).

Кажется, что именно работа с большой дальности для видеопроцессора наиболее "нервная" - счёт идёт на пиксели, и нужно успевать отправить измеренные результаты в QuatCore, а тем временем уже сбрасывать сумматоры и приниматься за следующий фрагмент!

Попытаемся понять, что же там должно твориться...

Collapse )

Poll #2102244 Данные с видеообработчика

Как передавать данные на процессор QuatCore?

Обычным способом, через шину данных, но ввести буфер на 2-3 отрезка
2(66.7%)
Прямой доступ к памяти (DMA)
1(33.3%)
Видеообработчик должен "поумнеть" и не дёргать QuatCore по пустякам
0(0.0%)
QuatCore

QuatCore: измерение масштаба

Медленно, но неумолимо, продвигаемся вперёд. Нахождение самой отдалённой точки, сортировка против часовой стрелки, вычисление матрицы аффинного преобразования и нахождение кватерниона крена с коррекцией матрицы - всё это сделано и работает.

Осталось немного. Сейчас необходимо найти масштаб.

В этот раз задачу разобьём чуть по-другому - не только найдём масштаб, но и его самого отмасштабируем, чтобы был в диапазоне от 16384 до 32767 (от 0,5 до 1), попутно получив "экспоненту". Так мы хоть увидим, чему же равен результат, т.к в противном случае он "застревает" в аккумуляторе, причём часть его - в младших разрядах, которые мы вообще не видим с шины данных.

Так что сейчас мы наконец-то убедимся, что "байпас" (раз, два) работает, а ещё проверим работу флага переполнения и команд условного перехода, на него реагирующих. Ну и глянем, нет ли подводных камней в замене UDIV2 (беззнак. деления на 2, по сути лог. сдвига вправо на 1) на DIV2 (знак. деления на 2) и вычитание 32767.

Collapse )

Осталось совсем немного - найти обратную величину методом Ньютона и посчитать вектор параллельного переноса. Ну и алгоритм сопровождения целиком, разумеется. И модуль видеообработки на 1,2 ГБит/с.

Посмотрел тут "Чернобыль" (HBO)...

Начинается неплохо, картинка красивая. Музыка - как будто стиральная машина работает - "вввжжвввжвввж" - и так на всём протяжении серии. Мне как-то творчество Джавади больше по душе (он сочинил музыку к Игре престолов и к Westworld), может под музычку оно бы веселее пошло.

Все действующие лица - гротескные, как будто бы сошли с пьес Гоголя, а не из реальной жизни. Совершенно долбанутый Дятлов, кидающийся планшетами в коллег, пришибленный Акимов, деревянные болванчики на всех уровнях руководства, ну и светлый эльф Леголас Легасов с Хомяком - два положительных героя, спасающих мир. Хомяк, как указывается в конце сериала - это собирательный образ советских учёных.

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

и пожалуйста, поправьте меня, если я сам начинаю в ответ нести бред - всё-таки я не ядерщик :)
Collapse )

PS. Моя рецензия на "Изгой-1" (на тему разработки и сопровождения сложных технических устройств в реальной жизни и в фантастике)

UPD. Ещё одну фактическую ошибку вспомнил в финальной "обличительной" речи. То ли Хомяк, то ли Леголас говорит, что блок №4 ввели в эксплуатацию (и получили за это всевозможные награды и повышения), но делать этого не имели права, поскольку он ещё не прошёл всех испытаний, а именно, работы на выбеге турбогенератора. И поэтому они, дескать, пытались эти испытания провернуть "задним числом", но из-за своей некомпетентности проваливали их раз за разом, и 26-го апреля это была уже 4-я попытка!

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

UPD2. И да, сериал в целом неплох, смотрелся вполне себе, но последняя серия оставила "очень неприятное послевкусие". Кто-то где-то писал, что в кои-то веки у памятника ликвидаторам аварии на Чернобыльской АЭС появились свежие цветы, что может быть связано с выходом сериала - наконец-то людям напомнили об этом деле, а это уже хорошо.

Ликбез по кватернионам, часть 13: Дэвенпорт берёт след!

Часть 1 - история вопроса
Часть 2 - основные операции
Часть 3 - запись вращения через кватернионы
Часть 4 - кватернионы и спиноры; порядок перемножения
Часть 5 - практическая реализация поворота
Часть 5 1/2 - введение метрики, "расстояния" между поворотами
Часть 6 - поворот по кратчайшему пути
Часть 6 1/4 - кратчайший поворот в общем случае
Часть 6 2/4 - поворот, совмещающий два направления
Часть 6 3/4 - кватернион из синуса и косинуса угла
Часть 7 - интегрирование угловых скоростей, углы Эйлера-Крылова
Часть 8 - интегрирование угловых скоростей, матрицы поворота
Часть 8 1/2 - ортонормирование матрицы и уравнения Пуассона
Часть 9 - интегрирование угловых скоростей с помощью кватернионов
Часть 10 - интегрирование угловых скоростей, методы 2-го порядка
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты

Не зря эта часть 13-я по счёту: она самая сложная, но дело того стоит. Освоив её, вы сможете без особенных проблем осилить 90% всей литературы по астронавигации. Это и есть всем известные тернии, через которые лежит дорога к звёздам!

Итак:

Дэвенпорт берёт след!

Дойдя до 13-й части «ликбеза по кватернионам» читатель вправе предположить: и в навигационной задаче кватернионы должны быть полезны! Действительно, львиная доля всех методов, которые применяются для решения данной задачи, используют кватернионы, и все опираются на труд Дэвенпорта, который, однако, так и не был по-нормальному опубликован. Как правило, все ссылаются на доклад «Для служебного пользования» [A Vector Approach to the Algebra of Rotations with Applications by Paul B. Davenport, Goddard Space Flight Center, Greenbelt, Md, 1968]. Уже название немножко смущает – почему же это «векторный подход», если он должен быть кватернионным?

Оказывается, начальник Дэвенпорта на дух не переносил двух вещей: кватернионов и фильтры Калмана, и, в общем-то, его можно понять. И те, и другие только начинали свой путь в космическую технику, и амбиции были гораздо выше реальных результатов. Математики били себя кулаком в грудь – «фильтр Калмана из любого мусора получит точные измерения», «кватернионы – самый естественный способ описания вращения», но оказывалось, что принцип «мусор на входе – мусор на выходе» никто не отменял, а всем причастным куда как ближе по духу были курс-крен-тангаж, а не «эти ваши кватернионы».

Collapse )

В следующей части: Линейный (!) метод Мортари-Маркли.

Ликбез по кватернионам, часть 12: навигационная задача

Часть 1 - история вопроса
Часть 2 - основные операции
Часть 3 - запись вращения через кватернионы
Часть 4 - кватернионы и спиноры; порядок перемножения
Часть 5 - практическая реализация поворота
Часть 5 1/2 - введение метрики, "расстояния" между поворотами
Часть 6 - поворот по кратчайшему пути
Часть 6 1/4 - кратчайший поворот в общем случае
Часть 6 2/4 - поворот, совмещающий два направления
Часть 6 3/4 - кватернион из синуса и косинуса угла
Часть 7 - интегрирование угловых скоростей, углы Эйлера-Крылова
Часть 8 - интегрирование угловых скоростей, матрицы поворота
Часть 8 1/2 - ортонормирование матрицы и уравнения Пуассона
Часть 9 - интегрирование угловых скоростей с помощью кватернионов
Часть 10 - интегрирование угловых скоростей, методы 2-го порядка
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
В этот раз берём пример с Microsoft, у которых за восьмёркой идёт десятка. Часть 11 - "интегрирование угловых скоростей, методы высших порядков" - будет, но попозже.

А сейчас начнём важнейшую тему - астронавигацию.

Пусть у нас есть набор из N «эталонных» единичных векторов (r – от слова reference – эталон). Это могут быть, к примеру, направления на звёзды, представленные во второй экваториальной системе отсчёта.
Также у нас есть набор из N «измеренных» единичных векторов (b – от слова oBserved, логика, как всегда, безупречна). В нашем примере это будут направления на звёзды в системе координат звёздного датчика (астроориентатора).
Требуется найти такой поворот, который совместит эталонные вектора с измеренными векторами с наименьшей ошибкой.

«Наивные» подходы

Сложно сказать, когда впервые появились эти методы (не удивлюсь, что сразу после появления формализма матриц и векторов), но в статье 1964 года [Black, Harold (July 1964). "A Passive System for Determining the Attitude of a Satellite". AIAA Journal. 2 (7): 1350–1351] они уже упоминались.
Если у нас есть 3 звезды и, соответственно, три эталонных и три измеренных вектора, то мы можем записать набор уравнений:
Collapse )

Читайте в следующей части: Дэвенпорт берёт след!

Ликбез по кватернионам, часть 10: Интегрирование угловых скоростей, методы 2-го порядка

Часть 1 - история вопроса
Часть 2 - основные операции
Часть 3 - запись вращения через кватернионы
Часть 4 - кватернионы и спиноры; порядок перемножения
Часть 5 - практическая реализация поворота
Часть 5 1/2 - введение метрики, "расстояния" между поворотами
Часть 6 - поворот по кратчайшему пути
Часть 6 1/4 - кратчайший поворот в общем случае
Часть 6 2/4 - поворот, совмещающий два направления
Часть 6 3/4 - кватернион из синуса и косинуса угла
Часть 7 - интегрирование угловых скоростей, углы Эйлера-Крылова
Часть 8 - интегрирование угловых скоростей, матрицы поворота
Часть 8 1/2 - ортонормирование матрицы и уравнения Пуассона
Часть 9 - интегрирование угловых скоростей с помощью кватернионов
Часть 10 - интегрирование угловых скоростей, методы 2-го порядка
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
Интегрирование угловых скоростей с помощью кватернионов

Снова весьма "оригинальный" материал, который найти не так-то просто. Автор поначалу и не нашёл - вывел сам, получил улучшение в 4000 раз, обрадовался, начал писать статью и искать подходящий рецензируемый журнал, а 3 дня спустя всё-таки нашёл этот материал в статье 1986 года. Ну тут сложно обижаться - автор не успел бы опубликоваться раньше при всём своём желании!

Методы второго порядка

Разумеется, нам всегда хочется большего. Попробуем дать чуть лучшую аппроксимацию истинному кватерниону поворота:
p9p2eq1.png

Осторожно, спойлеры!
Collapse )

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