Оптимальное вращение в 3d с алгоритмом Кабша - PullRequest
0 голосов
/ 27 марта 2020

Проблема

Я пытаюсь использовать алгоритм Кабша , чтобы найти оптимальное вращение между двумя наборами из 4 точек, но ошибки, которые я получаю, недопустимо велики. Я хочу отобразить красные точки ( P ) на синие точки ( Q ), показанные здесь .

Что я пробовал

Вот моя реализация алгоритма Кабша с учетом numpy массивов mapping_points ( P ) и true_points ( Q )

mapped_centroid = np.average(mapping_points, axis=0)
true_centroid = np.average(true_points, axis=0)

mapping_points -= mapped_centroid
true_points -= true_centroid

h = np.matmul(mapping_points.T, true_points)
u, s, v = np.linalg.svd(h)

d = np.linalg.det(v @ u.T)
e = np.array([[1, 0, 0], [0, 1, 0], [0, 0, d]])

r = v @ e @ u.T
tt = true_centroid - np.matmul(r, mapped_centroid)

Затем я применяю сопоставление с точками, скорректированными на центроид, в P :

map_list = []
for i in mapping_points:
    point = np.matmul(r, i) + tt
    map_list.append(np.reshape(point, (1, 3)))
mapped_xyz = np.vstack(map_list)

Однако построение mapped_xyz и true_points дает очень неточные результаты, показанные на приведенном выше графике. Есть идеи о том, что я сделал неправильно?

Дополнительная информация

На самом деле я пытаюсь сопоставить 2 сети из нескольких сотен узлов. Одна сеть - это «истинные положения», другая - «относительная карта» сети. Я использую якорные узлы Q и соответствующие точки P , чтобы найти наилучшее преобразование, а затем отобразить остальные узлы .

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

Редактировать

Вот данные для точек Q и P используется на приведенном выше графике.

Q = [[ 1774.11606309 -4241.11341178  5259.04277742]
     [ 6079.70499031   -98.14197972 -3442.0914569 ]
     [  813.07069876  3334.26289147 -6112.55652513]
     [ 1856.72080823  2328.86927901  6322.16611888]]
P = [[ 3172.79468418   727.52462347  7122.70450243]
     [  165.28953155 -3552.32467068 -2045.15346584]
     [ 5292.45250241 -1748.52037006 -6181.40300009]
     [ 1893.07584225  5897.19719625  3130.41287776]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...