Category: работа

Category was added automatically. Read all entries about "работа".

PhysUnitCalc

Очередная несуразность в единицах измерения

Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые там были разбросаны:

- офигенное решение сделать КИЛОграмм БАЗОВОЙ величиной в системе СИ,
- температуры, начинающиеся с разных нулей, так что 20 °С = 293,15 К, но при этом РАЗНИЦА в 20 °С равна разнице в 20 К,
- децибелы, действие которых зависит от контекста - если речь идёт об амплитуде, то 20 дБ = 10 раз, но если о мощности, то 10 дБ = 10 раз. Если к децибелам прибавлена единица (всевозможные дБВ - децибелвольты, дБА - децибелы звукового давления по кривой "А" и пр.) - то всё хорошо. Но безразмерных децибелов пришось ввести 2 разные величины: дБампл и дБмощ, очень уж мне хотелось получить инвариантность к смене единиц измерения.
- конфликтующие названия единиц. Гс - это может быть гаусс, а может быть гигасекунда. Тл - это может быть тесла, а может - тералитр. Прибавить сюда имперские величины - появляются также ft - фут либо фемтотонна (абсурд, но формально такая величина может существовать), и куда более вероятный min - минута либо миллидюйм. А ещё град - кому-то может показаться, что это градусы, другим - что это грады (странная угловая величина, 1 оборот = 400 град, не особо прижилась), а ещё это гекторадианы.

Долгое время моя программа могла принять любые величины, которые мне попадались, и корректно провести вычисления. Разве что дБпТл удивил, ну и хрен с ним.

И вот, сегодня я встретил ещё одну размерность. Немного мифическую, но вполне себе используемую, и при этом начисто нарушающую правила системы СИ!

Collapse )

PS.


PPS. Чего-то музыкой навеяло. Объясняет, почему кино было немым. Осторожно, нецензурная лексика.

Big Data, чтоб их... (3)

"В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6 значений сильно коррелированы между собой. Как именно - прибор знает, и выдаёт ковариационную матрицу шума измерений. Чтобы определить положение прибора на космическом корабле, я хочу провести где-нибудь N=10 опытов, располагая мишень на разных дальностях, измеряя её положение с помощью прибора, и, "контрольное измерение" - с помощью лазерного трекера, причём он будет мерять положение мишени в системе координат космического корабля. "Вычитая одно из другого", мы и должны раз за разом получать 6 параметров положения прибора на космическом корабле, но они будут зашумлены.

В прошлый раз я нашёл довольно простую формулу, с какими весами нужно сложить все 6N чисел, найденных за все эти N опытов, чтобы получить 6 искомых параметров, и чтобы свести шум к минимуму. Для этого нужно из ковариационных матриц шума измерений Qk (k-номер опыта) посчитать матрицу R:



и затем для каждого опыта найти свою матрицу весов, Ak



Тогда искомый вектор из 6 параметров выразится следующим образом:



(xk - вектор из 6 значений, измеренных в опыте k)

Интересный частный случай, если Q1=Q2=...=QN=Q, т.е от опыта к опыту ни дисперсии, ни ковариации не меняются. Такое может получиться, если мы дальность и углы не меняем особо, "топчемся на одном месте". Тогда данная формула очень существенно упрощается.

Collapse )
slow loris

Big Data, чтоб их... (2)

Вчера получил упоротое уравнение, чтобы найти, с какими весами нужно брать результаты измерений, чтобы получить наименее шумную и при этом несмещённую оценку вектора параметров:



Слева блочная матрица, составленная из ковариационных матриц шума измерений. Для простейшего примера, где N=M=2 (два параметра, измеряются дважды), всё получилось правильно.

Сегодня решил проверить ещё один "примитивный частный случай", когда M=1, то есть мы измеряем одну-единственную величину, но много раз (N раз). Пока ковырял его - нашёл, где ошибся с множителями Лагранжа, решил наконец через них - вышло существенно компактнее...

Collapse )

Можно одним махом находить веса для всех M параметров, что мы пытаемся оценить. Для этого находим матрицу R (от слова Reciprocal - "обратная"):



И затем нужные веса укладываются в N матриц Ak, каждая размером M×M:



Первый столбец Ak указывает, с какими весами нужно брать M параметров, чтобы получить оценку первого параметра, второй столбец - для второго параметра, и т.д.

Такое меня больше устраивает - не нужно эти жуткие блочные матрицы собирать, всё укладывается в размеры M×M, в моём случае 6×6 (три компоненты параллельного переноса и три угла)

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

Вот теперь пора это дело испытать на "модельных" результатах...
QuatCore

Так ли полезна ковариационная матрица шума?

Всех причастных, непричастных и невиновных - с прошедшим днём начала космической эры! Бип-Бип-ура!

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

По диагонали у нас лежат дисперсии, корень из которых даст ошибку измерения данного параметра в этот конкретный раз. О том, какая точность должна достигаться, указано в ТЗ, но в реальности она будет получаться гораздо выше на бОльшей части траектории. То есть, скажем, на 300 метрах, когда картинка МААЛЕНЬКАЯ, действительно не особо разгуляешься, но по мере приближения ошибка измерения дальности уменьшается КВАДРАТИЧНО.

То, что эти дисперсии знать ПОЛЕЗНО - особых сомнений нет. На корабле установлены и другие приборы: акселерометры, датчики угловой скорости, спутниковая навигация. Если одну и ту же величину можно будет измерить несколькими приборами, то необходимо также довольно хорошо представлять точность каждой величины, только тогда они будут правильно усреднены. А то написано в ТЗ: дальность "не хуже 5%", а у нас на самом деле уже на миллиметры вышла - но эти миллиметры отправятся "на свалку", потому что другим приборам доверия вышло больше.

Но дисперсии - это лишь 6 коэффициентов из 21, который нужно передать. Матрица 6х6 симметричная, поэтому достаточно передать главную диагональ (дисперсии) и один из треугольников, а это ещё 15 чисел, ковариации между измеренными величинами.

Я считал, что и ковариации очень хорошую службу сослужат, поскольку зачастую несколько измеренных параметров оказываются сильно коррелированными друг с другом. Грубо говоря, мы увидели, что картинка "сдвинулась влево". Это могло произойти потому что мы сдвинулись вправо, т.е сохранили ту же ориентацию в пространстве, включили боковые двигатели и начали поступательное движение. А может быть, совершили поворот вокруг своей оси, "по курсу", из-за чего картинка ушла вбок. Мы ОБЯЗАНЫ разобраться, что же именно произошло, и для этого должны очень внимательно наблюдать, как вынесенные вперёд отражатели смещаются относительно других 6, которые расположены в одной плоскости чуть дальше. Это куда более ШУМНЫЙ процесс - вместо усреднения мы вычитаем близкие величины, вот и получается, что два выданных нами параметра - смещение вправо и поворот вокруг вертикальной оси - будут иметь высокую корреляцию шума. Т.е если мы ошибёмся в смещении на 10 см, то НЕИЗБЕЖНО ошибёмся ещё и в угле поворота, скажем, на 1 градус. В ИЗВЕСТНУЮ СТОРОНУ, потому что суммарный эффект от смещения и поворота мы знаем очень хорошо!

Мне казалось, что это чрезвычайно ценная информация! И в пример я опять ставил датчик угловой скорости и акселерометр. Первый вполне успешно померял, что за секунду корабль повернулся на 1 градус. А второй успешно померял, что ускорение составляло 0,1 м/с2 - НУ И ЧТО С ТОГО??? В смещение оно напрямую не преобразуется, надо ещё было скорость знать, а мы её, может, и знали, но уже накопился дрейф, и для прямой оценки смещения акселерометр практически бесполезен... И вот на фоне этого появились показания ВИПС: поворот на 0,5 градуса и смещение на 20 см, а ещё шум в 0,5 градуса в показаниях углов, 20 см в показаниях смещения и практически единичный коэффициент корреляции (цифры абсолютно с потолка, просто как пример). Тут-то каменный цветок, наконец, складывается: точно зная, что поворот составлял 1 градус, борт решает, что ВИПС ошибся на 0,5 градуса "в минус" (померял 0,5 вместо 1), а исходя из величины и знака корреляции теперь известно, каково правильное смещение - вот мы и его теперь знаем и можем дрейф акселерометра подправить.

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

Начал ковыряться (ковариаться), придумал совсем примитивную "модельную задачку" - и теперь я вовсе не уверен, что от этой матрицы есть какой-то толк...

Collapse )

Дэвенпорт VS Мортари-Маркли, раунд 3

Часть 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-го порядка
Часть 10 1/2 - интегрирование с поддержанием нормы
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
Часть 17 - лидарная задача
Задачка к части 17
Дэвенпорт VS Мортари-Маркли
Мортари-Маркли берут реванш!
Дэверпорт VS Мортари-Маркли, раунд 3

Всё-таки не давала покоя мне эта тема, решил ещё чуточку поковыряться.

На этот раз выставил угол поворота в 0°. И довольно быстро увидел, что кватернионы поворота, а значит, и ошибки определения поворота у двух методов совпадают эдак до 6-го знака после запятой:



То есть, для нулевого угла методы по сути оказываются эквивалентными. В этом есть смысл...

Collapse )

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

Poll #2113510 Битва титанов

Какой метод поиска поворота, наиболее точно совмещающего набор векторов, лучше?

Дэвенпорта
0(0.0%)
Мортари-Маркли
0(0.0%)
doomguy

Ликбез по кватернионам, Мортари-Маркли берут реванш!

Часть 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-го порядка
Часть 10 1/2 - интегрирование с поддержанием нормы
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
Часть 17 - лидарная задача
Задачка к части 17
Дэвенпорт VS Мортари-Маркли
Мортари-Маркли берут реванш!

В пятницу мы попробовали найти поворот из зашумлённых векторов, используя два разных метода - более классический Дэвенпорта и относительно новый (2007 года) Мортари-Маркли. Первый, будучи куда более сложным в реализации (особенно на очень простом "космическом" железе, умеющем складывать и умножать в целых числах, и ничего более), вышел на 11% точнее.

Но это была всего лишь одна выборка случайного шума, по одной выборке делать результаты - совершенно недопустимо! Поэтому решил всё-таки собрать статистику чуточку побольше. Но тут уже нельзя опираться на Wolfram Alpha, который найдёт все собственные значения и собственные вектора - надо научиться делать это самостоятельно, "малой кровью". К счастью, для данной конкретной задачи есть несколько интересных наблюдений, существенно упрощающих нам жизнь!
Collapse )

Что ж, метод Мортари-Маркли частично оправдан: в нашем примере он в среднем даёт ошибку на 6,5% больше при точности измерений в 1 мм, и на 3% больше при точности измерений в 0,1 мм. Хотя статистики до сих пор маловато: мы рассмотрели только один поворот, на 90°, и ровно одну конкретную мишень.

Что интересно, и метод Дэвенпорта мы частично оправдали: оказалось, что и по нему можно находить кватернион "в пол-пинка", поскольку нужное нам собственное значение мы можем узнать по простой формуле через входные данные, с большой точностью. Собственно, так и начинается алгоритм QUEST (QUaternion ESTimator).

Наверное, пора немножко отвлечься от этой математики (есть не один, а целых два алгоритма, которые меня вполне устраивают!) и вернуться к макету. Скоро ехать к заказчику, надо как-то немножко лоску навести на всё это безобразие. Не знаю, правда, за что браться.
doomguy

Ликбез по кватернионам, Дэвенпорт VS Мортари-Маркли!

Часть 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-го порядка
Часть 10 1/2 - интегрирование с поддержанием нормы
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
Часть 17 - лидарная задача
Задачка к части 17
Дэвенпорт VS Мортари-Маркли

В прошлый раз мы решили "лидарную задачу", причём для нахождения поворота использовали линейный метод Мортари-Маркли. Но в оригинальной работе [Berthold K. P. Horn - Closed-form solution of absolute orientation using unit quaternions - 1987], по сути, предлагалось использовать метод Дэвенпорта.

Мы составили систему из 3 линейных уравнений с 3 неизвестными, решили её, получив вектор Родрига, и затем преобразовали его в кватернион. Но авторы предлагали составить матрицу 4х4, и найти собственный вектор, соответствующий МАКСИМАЛЬНОМУ собственному значению. Выглядит "посолиднее" - может, именно так и надо поступать? А мы пошли по упрощённому пути и получили ошибку в 0,59°. Вдруг дело не в зашумлённых входных данных, а именно в применённом методе, который не смог этот шум надёжно отфильтровать?

Давайте проверим...
Collapse )

Результат немного неожиданный: я думал, что эти два метода вообще дадут практически идентичные кватернионы, но нет. И в этом конкретном примере метод Дэвенпорта дал ошибку на 11% меньше. Полагаю, что это anecdotal evidence: если поиграться подольше, то окажется: иногда один чуть точнее, иногда другой, тут уж как повезёт. По крайней мере, в статье Мортари-Маркли получается именно так.

Может, как-нибудь ещё с этим делом поковыряюсь, но пока моя точка зрения не изменилась: на практике вполне можно применять метод Мортари-Маркли, он простой до безобразия :) А в той статье использовали Дэвенпорта по простой причине, статья 1987 года (а отдана в редакцию и вовсе в 1986), а метод Мортари-Маркли появился в 2007 году!

PS Впрочем, ещё одну вещь надо проверить: не ухудшает ли работу метода Мортари-Маркли тот факт, что эталонный и измеренный векторы имеют разную длину? Что Дэвенпорту не мешают - никаких сомнений, это видно из структуры матрицы B (см. Дэвенпорт берёт след), где весовой коэффициент можно было бы внести в длину векторов, т.е "чем точнее мы знаем вектор - тем длиннее его сделаем". И пока речь шла о направлениях, т.е единичных векторах, всё хорошо. Но тут-то из-за ошибок измерения и длина может оказываться различной...
ook

Ликбез по кватернионам, задачка к части 17

Часть 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-го порядка
Часть 10 1/2 - интегрирование с поддержанием нормы
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
Часть 17 - лидарная задача
Задачка к части 17

Хочется опробовать это дело на более-менее реальных данных. Имеется у нас такая вот мишень:

IMG20201021153945.jpg

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

Так вот, координаты центров отражателей в "эталонной" системе координат. Её начало расположено примерно там, где пересекаются две карандашные линии. "На нас" (перпендикулярно доске) - ось X, "слева направо" - ось Y, "снизу вверх" - ось Z. Примерно так:

r1 (60; -104; 0),
r2 (60; 104; 0),
r3 (0; -69; 43),
r4 (0; -84; -51),
r5 (0; -158; 9),
r6 (0; 158; 9),
r7 (0; 69; 43),
r8 (0; 84; -51)

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

И давайте мы будем эту хреновину промерять "сбоку":
p4pb14464164.jpg

Лазерный трекер расположится чуть слева. И допустим, мы получили следующие координаты этих 8 точек:

m1 (-1104,1; 439,8; -0,6),
m2 (-896,1; 440,9; 0,5),
m3 (-1068,7; 499; 42,6),
m4 (-1083,4; 500,8; -50,2),
m5 (-1158,7; 500,3; 9,9),
m6 (-841,1; 499; 8,3),
m7 (-931,1; 500,5; 42,8),
m8 (-915,3; 500,7; -50,4)

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

Под катом решение - чему равен поворот, масштаб и параллельный перенос. Если кому хочется попробовать самостоятельно - под кат пока не заглядывайте :)

Collapse )

А ведь работает алгоритм! Прямо-таки чудес не совершает, ошибка в 1 мм это ошибка в 1 мм, а точек здесь не сотни и не тысячи, а всего 8, а избыточности и того меньше. Просто чтобы эта задача однозначно решалась, нужно хотя бы 3 точки. Но всю имеющуюся информацию алгоритм использует по-максимуму!

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

Ликбез по кватернионам, часть 17 - лидарная задача

Часть 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-го порядка
Часть 10 1/2 - интегрирование с поддержанием нормы
Часть 11 - интегрирование угловых скоростей, методы высших порядков (в разработке)
Часть 12 - навигационная задача
Часть 13 - Дэвенпорт берёт след!
Часть 14 - линейный метод Мортари-Маркли
Часть 15 - среднее от двух кватернионов
Часть 15 1/2 - проверка и усреднение кватернионов
Часть 16 - разложение кватерниона на повороты
Часть 17 - лидарная задача

У данной задачи много имён. В английской литературе встретил Absolute orientation, Point set registration, а также Point cloud registration, scan matching.

Суть вот в чём: имеется твёрдое тело, на котором жёстко расположено N точек. Введена некая система координат, также жёстко связанная с этим твёрдым телом, и даны координаты N точек в этой системе, rk (rkx,rky,rkz), от слова reference - "эталонный".

А далее мы измерили координаты этих N точек в другой системе координат, mk (mkx,mky,mkz), от слова measured - "измеренный".

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

Я столкнулся с этой задачей в связи с юстировкой прибора, с использованием лазерного трекера. Лазерный трекер - это "адская смесь" дальномера и теодолита: наводишь его на определённую точку, он измеряет два угла (азимут и угол места), дальность и автоматически преобразует это в трёхмерные координаты точки, получая точность лучше десятых долей миллиметра. С его помощью можно узнать координаты всех моих уголковых отражателей, а потом координаты неких характерных точек моего прибора, и затем, дважды решив рассмотренную здесь задачу - узнать, что должен показать мой прибор, будучи идеально откалиброванным.

Подозреваю, что где-то в программном обеспечении для лазерного трекера данная задача давным-давно "зашита", вместе с решением, но точно сказать не могу - "зависит от комплектации", а приобретать такой приборчик себе точно не буду по причине его запредельной цены. Пока знаю лишь, что такой наличествует у РКК Энергия, и нынче они практически отказались от более классических измерительных приборов вроде автотеодолита и плоских зеркал, наклеиваемых на различные части космического аппарата.


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

Collapse )

В следующей части (которая в книге "уползёт" в упражнения и ответы к ним) попробую всё это применить "на практике".
QuatCore

Быстрее, меньше, точнее!

Начинаем тестировать новую процедуру арктангенса. Сначала на симуляции. Получаем дамп памяти:


Переписываем числа в таблицу:


Первая половина таблицы очень многообещающая: ошибка не более 1 единицы младшего разряда, да и та случается в 6 случаях из 16, это уже прогресс по сравнению с предыдущим алгоритмом!

Но вот со второй половиной какая-то фигня: мы каким-то образом перепутали знак! Причём если посмотреть 4 варианта знака для (32052;6813):

(32052;6813)
(-32052;6813)
(-32052;-6813)
(32052;-6813)

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

Кто бы мог подумать: ассемблерная функция не заработала правильно с первого раза! Что ж, надо разобраться.

Collapse )

Итак: быстрее в 4 раза, меньше на 36 байт, точнее вдвое (максимальная ошибка в 1 единицу младшего разряда вместо 2). Чебышёв на пару с Ремезом рулят!

Наверное, пора успокоиться с арктангенсом и двинуть дальше. И макет довести уже до ума, и об его юстировке громко подумать...