nabbla (nabbla1) wrote,
nabbla
nabbla1

Category:

Жадность - второе счастье

То ли жадность, то ли перфекционизм.

Внезапно вернулся к целочисленному исполнению хитрючей математики с кватернионами, векторами и положительно определёнными матрицами 6х6 на маленькой, но очень гордой ПЛИС, и опять увидел дилемму.

Ну очень хочется представить каждый компонент кватерниона в виде 1.15 (один бит перед фиксированной точкой, дополнительный код). В таком формате представимы значения от -1 до 1-2-15, и точность не хуже 12 угловых секунд (см введение метрики, расстояния между поворотами).


Возражение "мы же не сможем представить самое главное - единичный кватернион!!!" сходу отметается - "а нам и не надо, ведь есть кватернион -1, выражающий тот же самый поворот/ориентацию!". И в плане реализации как будто бы всё чётко: когда мы перемножаем 16-битные знаковые числа, точный результат умещается в 32 бита, причём самый старший бит нужен ровно для ОДНОГО случая: (-32768) * (-32768) - это единственная пара 16-битных знаковых чисел, которые при умножении не влезут в 31 бит!

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

Но исполнение определённо усложняется. Я упорно настаивал, что мы сначала перемножаем кватернионы, а потом нормируем их, и здесь мы просто обязаны сделать именно так! Причём, между перемножением и нормировкой у нас может возникнуть ситуация "переполнения", когда в аккумуляторе пока что лежит правильное значение, но вытащить оттуда только 16 бит в заданном нами формате 1.15 мы не имеем права. Причём, нас страшит переполнение, возникшее не из-за этого единственного случая, по сути (-1) * (-1) = 1, этот случай лечится обращением знака. Хуже другое - если мы перемножили ненормированные кватернионы, даже САМУЮ МАЛОСТЬ ненормированные, например, 1 + 0i + 0,0087j + 0k (это поворот вокруг оси Y на 1 градус), с нормой 1,000038, то в самом неудачном случае мы можем получить переполнение, которое "не лечится" заменой знака - ну не влезает оно в диапазон, и всё тут!

Решение этой проблемы есть: не используем метод интегрирования первого порядка с кватернионом 1 + φn, поскольку его норма больше единицы. Либо просто всё домножаем на небольшую константу, например, на 0,96 (мы заранее знаем, что угол, измеренный на одном такте, не может превысить 30°, а при использовании первого порядка это даст норму 1,033), чтобы норма никогда не превышала единицы (скорее всего, удастся объединить эту операцию с другими), либо применяем метод второго порядка, 1 - φ2/2 + φn

Потом надо посмотреть: у нас, по счастью, задача "последовательных приближений" - каждый раз мы видим на картинке, как мы реально расположены, поэтому накопления ошибок не происходит. Если так, то можно тупо устроить "насыщение результата", чтобы случайно возникшее 1,000038 (в целочисленной записи: 32769) превратилось-таки в свою единичку. В общем-то, я ожидаю, что случаи переполнения будут чрезвычайно редки, поскольку только один раз за весь сеанс у нас может быть коррекция в 30 градусов, это когда мы с режима захвата переходим в режим сопровождения и наконец-то начинаем учитывать "ракурсы" (пассивные углы стыковки). В режиме сопровождения изменения углов за одну итерацию будут чрезвычайно малы, скорее даже не градусы, а минуты, поэтому если что-то и случится, то ситуация, описанная здесь - 32769 вместо 32768. Сначала мы обнаружив переполнение, попытаемся сменить знак, получим -32769 - все равно переполнение. И вот тогда уже вытащим наружу "насыщенное" значение -32768. Учитывая, что при этом все остальные компоненты обязаны быть около нуля (только в этом случае мы и подбираемся к переполнению), всё упрётся в норму. Вместо того, чтобы поделить остальные компоненты на 32769/32768, мы так ничего с ними не сделаем, получив ошибку 0,003% от того угла, что там был.

Ну а можно не заморачиваться, на жадничать, а сдвинуть запятую на одну позицию, чтобы 16-битное число выражало значения от -2 до 2-2-14. Точность потеряем, вместо 12 угловых секунд будет уже 24, при требуемых по техзаданию 360 (то есть, 0,1°). Зато вообще никаких заморочек с обращением знака и насыщением.

Меня одно останавливает: сейчас нужно согласовать протокол информационного обмена по шине МКО, и уже там задать, в каком формате мы выдаём кватернион. Если сейчас задать этот формат, то точность упадёт НАВЕКИ (перекраивать протокол - последнее дело, это означает, что заказчик должен внести изменения в весьма ответственный софт, а после таких изменений его надо снова сертифицировать, проверить во всех возможных ситуациях, что ничего не сломали). Даже если мы у себя сможем считать точнее, никто об этом не узнает!


Poll #2089410 Целочисленные кватернионы

Как лучше представлять кватернионы при вычислениях

16 бит фикс. точка, от -1 до 1 - 2^(-15)
2(28.6%)
16 бит фикс. точка, от -2 до 2-2^(-14)
4(57.1%)
Добавить процессор с FPU и не париться, 32 бита float
1(14.3%)
Tags: кватернионы-это просто (том 1), математика, работа, странные девайсы
Subscribe

  • Лестница для самых жадных

    В эти выходные побывал на даче, после 3-недельной "самоизоляции". Забавно, как будто зима началась! Особенно грязные галоши остались на улице, в…

  • Возвращаемся к макету

    Очень давно макетом видеоизмерителя параметров сближения не занимался: сначала "громко думал" по поводу измерения его положения на аппарате, а потом…

  • Минутка живописи

    В процессе разгребания содержимого квартиры (после нескольких ремонтов) дошёл, наконец, и до картин. В кои-то веки их повесил. Куда их вешать -…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 23 comments

  • Лестница для самых жадных

    В эти выходные побывал на даче, после 3-недельной "самоизоляции". Забавно, как будто зима началась! Особенно грязные галоши остались на улице, в…

  • Возвращаемся к макету

    Очень давно макетом видеоизмерителя параметров сближения не занимался: сначала "громко думал" по поводу измерения его положения на аппарате, а потом…

  • Минутка живописи

    В процессе разгребания содержимого квартиры (после нескольких ремонтов) дошёл, наконец, и до картин. В кои-то веки их повесил. Куда их вешать -…