2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 03:41 


25/02/11
123
таким образом чтобы 3 (из N > 3) его точки совпали с соответствующими им другими 3мя точками.
Пользуясь этим нехитрым гайдом http://nghiaho.com/?page_id=671 я разобрался как поворачивать/смещать объект из 3 точек в 3 других точки.
Но что делать если объект состоит из бОльшего числа точек, а "попасть" мне надо именно 3мя из них в 3 другие, но так чтобы и остальные точки повернулись/сместились аналогично?
Проблема возникает на последнем этапе когда выясняется что полученную из 3 точек матрицу поворота (3,3) нельзя применить ни к чему кроме матрицы (3,3) из 3 точек.
Решение либо очень простое, либо не существует в принципе и я уже склоняюсь ко второму варианту :facepalm:
Прикрепляю мэпловский файл http://rgho.st/6JMLQMw6S

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 04:27 
Заслуженный участник


27/04/09
28128
_genius_ в сообщении #1240978 писал(а):
Проблема возникает на последнем этапе когда выясняется что полученную из 3 точек матрицу поворота (3,3) нельзя применить ни к чему кроме матрицы (3,3) из 3 точек.
Какие глупости. Столбцов у матрицы, в которую запихнули координаты точек, может быть сколько угодно. Преобразования разных столбцов совершенно раздельны, можно преобразовывать по столбцу за раз — разве что какая-то низкоуровневая оптимизация может заставить раскладывать их по матрицам какой-то определённой неединичной ширины.

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 10:26 


25/02/11
123
arseniiv в сообщении #1240983 писал(а):
Какие глупости

Да-да, они самые.
В общем нашел опечатку, теперь результаты отвратительные(были 1 в 1 из-за ошибки, сам не верил своему счастью), но судя по всему правильные. Удаляю .mw с хоста, т.к. первый пост мне уже не отредактировать.
Забыл упомянуть один нюанс: конечные 3 точки в принципе не могут на 100% соответствовать начальным из-за разных углов/расстояний. Любое приближение (наименьшие квадраты и т.д.) меня устроит.
У меня ощущение что я выбрал совершенно неподходящий мне метод и надо что-то в корне менять. Буду рад если мне кто-нибудь что-нибудь порекомендует.
Изображение

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 16:01 


25/02/11
123
Нашел ещё один источник с тем же методом и там один-в-один то же самое, только ещё и с весами (которые мне не нужны) и с доказательствами:
https://igl.ethz.ch/projects/ARAP/svd_rot.pdf
Значит метод все же подходящий и косячу здесь только я. Но никак не пойму где.
В общем вот скрин из мэпла и сам .mw на этот раз с элементарнейшим примером который должен сходиться 1 в 1, но не сходится:
http://meson.ad-l.ink/7MlfBLtng/image.png
http://rgho.st/8gZvvkjFz

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 17:14 
Заслуженный участник
Аватара пользователя


23/07/08
10678
Crna Gora
У меня нет Maple, поэтому я могу посмотреть только файл image.png.
Скажите, вот Вы в конце используете массив ncacs для контроля. А Вы учитываете, что к этому времени уже модифицировали его, и он не такой, как был вначале?

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 17:42 


25/02/11
123
svv в сообщении #1241095 писал(а):
У меня нет Maple, поэтому я могу посмотреть только файл image.png.
Скажите, вот Вы в конце используете массив ncacs для контроля. А Вы учитываете, что к этому времени уже модифицировали его, и он не такой, как был вначале?

Я думал так и надо, но благодаря Вам теперь засомневался и применил поворот/смещение к оригинальным векторам:
Изображение
Вроде как стало лучше, НО все равно далеко не фонтан. Пример ведь очень-очень простой (2 поворота на 90 градусов и небольшое смещение) и по идее точки должны совпадать 1 в 1.

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 17:47 
Заслуженный участник
Аватара пользователя


23/07/08
10678
Crna Gora
Сегодня после работы посмотрю внимательней.

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 18:33 


25/02/11
123
Теперь я совсем запутался, но каким-то чудом сделал оригинальную задачу правильно. При этом тестовый пример так исправить нельзя, поскольку там детерминант R и так положительный.
В общем я поменял способ "исправления" R на тот, что первым рекомендовался в статье, т.е. поменяв знак третьей строки Vt. Раньше я менял знаки всех строк в уже готовой матрице R.
Я просто не понимаю почему именно третьей, должно же быть все равно. Но если я меняю знаки в первой, второй, либо во всех трех строках Vt, это сильно портит результаты.

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 21:36 
Заслуженный участник
Аватара пользователя


23/07/08
10678
Crna Gora
Есть такое замечание к программе.
Вы выбрали три начальные точки $\mathbf p_1, \mathbf p_2, \mathbf p_3$ и три конечные точки $\mathbf q_1, \mathbf q_2, \mathbf q_3$. Как в одном, так и в другом наборе расстояния между точками принимают значения $\sqrt 5, \sqrt{10}$ и $\sqrt{13}$. Это хорошо. Но плохо то, что, скажем, $\sqrt 5=|\mathbf p_3-\mathbf p_1|=|\mathbf q_2-\mathbf q_1|$, то есть между соответствующими друг другу точками расстояния не равны. А для существования точного преобразования надо, чтобы были равны:
$\forall i,j:\quad|\mathbf p_i-\mathbf p_j|=|\mathbf q_i-\mathbf q_j|$

Метод ведь не подбирает преобразование, переводящее каждую начальную точку $\mathbf p_i$ в какую получится конечную точку $\mathbf q_k$. Нет, он всегда старается перевести $\mathbf p_1$ в $\mathbf q_1$, $\mathbf p_2$ в $\mathbf q_2$ и так далее:
Цитата:
Let $\mathcal{P}=\{\mathbf p_1,\mathbf p_2,\ldots,\mathbf p_n\}$ and $\mathcal{Q}=\{\mathbf q_1,\mathbf q_2,\ldots,\mathbf q_n\}$ be two sets of corresponding points in $\mathbb R^d$.
Возможно, метод «тупее», чем Вы думали. Но — что есть, то есть.

P.S. Исправил. Проверил. Всё сошлось.

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 22:37 


25/02/11
123
svv
Спасибо, теперь все понятно. Перетасовал точки в матрице конечных точек и теперь в примере все сходится на 100%. Короче метод меня устроил.
Однако вопрос с корректировкой отрицательного детерминанта остается открытым. Я уже сталкивался с этой проблемой раньше http://dxdy.ru/post1119400.html#p1119400 и тогда я просто умножал всю матрицу поворота целиком на -1. Проблем не возникало или по крайней мере я их не замечал. А сейчас такое решение почему-то сильно портит результаты и поэтому приходится умножать третью строку Vt (не R!) на -1. Зачем, почему - понятия не имею.
Для иллюстрации прикрепляю результаты решения настоящей задачи (не примера) с 17ю точками http://meson.ad-l.ink/7rH6g2z24/image.png
3 красных точки справа это желаемые конечные точки. Легко заметить что только при умножении третьей строки Vt на -1 результаты становятся приемлемыми, а во всех остальных случаях что-то не так. Вот мне бы и хотелось понять, почему именно третья? Всегда ли третья? Может с другой молекулой надо будет менять знак у второй или первой? А может есть какой-то другой способ устранения отражения, который работает всегда?

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 23:27 
Заслуженный участник
Аватара пользователя


23/07/08
10678
Crna Gora
Я почитаю статью Least-Squares Rigid Motion Using SVD, чтобы лучше разобраться. Но, скорее всего, ситуация такова.

Допустим, что равенства $|\mathbf p_i-\mathbf p_j|=|\mathbf q_i-\mathbf q_j|$ выполняются точно для всех соответствующих пар точек. Несмотря на это, требуемого преобразования (композиция вращения и сдвига) может не существовать! Пример: левую перчатку надо перевести в правую перчатку. Все соответствующие расстояния (от указательного пальца до мизинца; от среднего до центра ладони и т.д.) идеально совпадают, а вращения в собственном смысле слова не существует. Требуется вращение с отражением.
Так вот, метод у Вас спрашивает: мне какое преобразование искать — чистое вращение или вращение с отражением? Понятно, что в зависимости от заданных точек может лучше подходить одно, может другое. А в случае трёх точек можно подобрать и с отражением и без (они всегда лежат в одной плоскости, отражение относительно которой их не меняет). Свой выбор Вы задаёте с помощью выбора знака последнего диагонального элемента безымянной матрицы, входящей в формулу для $R$. Это эквивалентно умножению последнего столбца $U$ на $-1$, или последней строки $U^T$ на $-1$, есть и другие варианты.

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение16.08.2017, 23:55 


25/02/11
123
Т.е. вы хотите сказать что отрицательный дискриминант в моем случае (>3 точек) это не обязательно что-то плохое? И по-хорошему мне надо пробовать оба варианта. Только тут есть один нюанс: мне неизвестны конечные 17 точек, только 3. А значит без дополнительной информации понять, что лучше, невозможно. Ладно, была не была, попробую дописать скрипт без учета этой проблемы. Если она в итоге все же вылезет, задача сильно усложнится.

svv в сообщении #1241207 писал(а):
Это эквивалентно умножению последнего столбца $U$ на $-1$, или последней строки $U^T$ на $-1$, есть и другие варианты.


А это в свою очередь эквивалентно умножению последней строки $V^T$ на $-1$, только что проверил.

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение17.08.2017, 01:10 
Заслуженный участник
Аватара пользователя


23/07/08
10678
Crna Gora
Посмотрел статью, уточняю.

Если нам безразлично, какому преобразованию будет соответствовать наилучшая $R$ — вращению или вращению с отражением, следует находить $R$ как $VU^T$. Узнать, присутствует ли отражение, можно по значению $\det R$.

Если мы хотим, чтобы преобразование, задаваемое $R$, было вращением, найдём $\det(VU^T)$. Если определитель равен $1$, полагаем $R=VU^T$.
Если же определитель равен $-1$, значит, алгоритм решил, что с отражением можно добиться лучшего соответствия. Тогда надо громко произнести фразу: «Я принимаю ответственность за ухудшение точности попадания» и вычислить $R$ по формуле $VMU^T$, где $M$ — диагональная матрица, у которой на диагонали правый нижний элемент равен $-1$, а остальные $+1$. Можно, как было сказано, обойтись без $M$, например, умножая на $-1$ последний столбец $V$.

То, что именно правый нижний элемент $M$ должен быть $-1$, важно. Дело в том, что он соответствует наименьшему сингулярному числу матрицы $S$, и это гарантирует, что, полагая именно его равным $-1$, мы совершаем «наименьшее зло», то есть минимально ухудшаем точность.

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

 Профиль  
                  
 
 Re: Поворот/смещение объекта в трехмерном пространстве
Сообщение17.08.2017, 07:50 


25/02/11
123
svv в сообщении #1241218 писал(а):
То, что именно правый нижний элемент $M$ должен быть $-1$, важно. Дело в том, что он соответствует наименьшему сингулярному числу матрицы $S$, и это гарантирует, что, полагая именно его равным $-1$, мы совершаем «наименьшее зло», то есть минимально ухудшаем точность.

Спасибо, вот оно в чем дело. Значит неслучайно третья строчка/столбец.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: svv


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group