Хочется опробовать это дело на более-менее реальных данных. Имеется у нас такая вот мишень:
ну, в реальности вместо светоотражающей плёнки будут уголковые отражатели из кварцевого стекла, а вместо ДСП - алюминиевый сплав АМг6. Не знаю, почему именно его у нас так любят - заклёпками, сваркой, штамповкой не балуемся, исключительно всё выфрезеровываем из цельного куска металла, вроде есть и более прочные и лёгкие для таких случаев. Слышал, что он лучше переносит вибрации и удары - не такой хрупкий, как другие. Может, и так. А скорее всего, просто, как начали - так зачем чего-то менять.
Так вот, координаты центров отражателей в "эталонной" системе координат. Её начало расположено примерно там, где пересекаются две карандашные линии. "На нас" (перпендикулярно доске) - ось X, "слева направо" - ось Y, "снизу вверх" - ось Z. Примерно так:
координаты в миллиметрах, без десятых и сотых, для простоты. И немного не соответствует макету (уголки чуть-чуть передвинулись), чтобы сбить с толку вероятного противника.
И давайте мы будем эту хреновину промерять "сбоку":
Лазерный трекер расположится чуть слева. И допустим, мы получили следующие координаты этих 8 точек:
Тут мы ещё ввели ошибку плюс-минус миллиметр, с округлением до десятых. Да, это очень хреновенький трекер, зато посмотрим, насколько справляется наша математика с усреднением ошибок за счёт большой выборки.
Под катом решение - чему равен поворот, масштаб и параллельный перенос. Если кому хочется попробовать самостоятельно - под кат пока не заглядывайте :)
1. нахождение средних векторов, "центроидов":
Получаем
В первом случае, не округляй мы до целых миллиметров, вообще должны были получить (15;0;0). Ну да ладно.
Веса ωn мы берём все единичные. Вектор v в таком случае - просто сумма попарных векторных произведений,
v (123,5; -119,7; 201394,8)
Компонента z превышает x,y более чем в 1000 раз! То есть, метод уже практически "догадался", что поворот был осуществлён вокруг оси Z. Но надо ещё выразить его в правильных единицах и устранить "перекрёстные связи", для чего и нужна матрица. Мы уже выписывали в явном виде произведение двух матриц внутри суммы:
Матрица всегда симметричная, поэтому из 9 компонент достаточно вычислять и суммировать 6.
В итоге получаем:
3.3 Решаем систему линейных уравнений:
Получаем
θ (0,004400749; 0,005808585; -0,999901563)
3.4 Находим кватернион поворота
Ненормированный кватернион получается "прибавлением единички", т.е θ - это наша векторная / мнимая часть кватерниона, а единица - скалярная:
Правильным ответом был бы поворот на -90° вокруг оси Z, т.е ПРОТИВ ЧАСОВОЙ СТРЕЛКИ, если смотреть в ту сторону, куда "направлена стрелочка" оси Z:
Если посчитать "расстояние" между двумя этими кватернионами с помощью метрики, получим 0,59° - такова ошибка наших измерений, "суммарно" по всем трём осям.
Если мы "уберём" шум - ответ получится точным, что, в общем-то, логично.
4. Измерение масштаба:
Получаем s=1,000114392
Когда мы моделировали эти измерения, мы считали, что масштаб единичный. То есть, в оценке масштаба ошиблись на 0,011%, не так уж и плохо. Но если мы априори знаем, что масштабирования происходить не будет, координаты могут отличаться лишь параллельным переносом и поворотом, то лучше вообще отказаться от оценки масштаба и сразу постановить s=1. Это даст чуть лучшую оценку параллельного переноса, а на оценку поворота никоим образом не повлияет.
5. Измерение параллельного переноса:
Подставив найденный нами поворот и масштаб, получаем
t (-999,977; 500,1285; 0,265647)
Неплохо, ведь правильный ответ: (-1000; 500; 0). Усреднение по 8 точкам явно нам помогло снизить ошибку с 1 мм (такую ошибку по модели мы внесли в измерение каждой координаты каждой точки) до менее 0,266.
А ведь работает алгоритм! Прямо-таки чудес не совершает, ошибка в 1 мм это ошибка в 1 мм, а точек здесь не сотни и не тысячи, а всего 8, а избыточности и того меньше. Просто чтобы эта задача однозначно решалась, нужно хотя бы 3 точки. Но всю имеющуюся информацию алгоритм использует по-максимуму!
Для меня практически боевое крещение линейного метода Мортари-Маркли! Я про него написал, тщательно все выкладки провёл, но ни разу не пробовал применить. Работает, и даже со знаками всё правильно. По-хорошему его ещё стоило бы сравнить с методом Дэвенпорта. Я подозреваю, что ответы будут практически идентичными, но одно дело подозревать - другое увидеть воочию.