Вычислите матрицу поворота/перемещения, чтобы сопоставить точки измерения с номинальными точками

У меня есть две матрицы, одна из которых содержит 3D-координаты, которые являются номинальными позициями для модели САПР, а другая содержит 3D-координаты фактических измеренных позиций с использованием КИМ. Каждая номинальная точка имеет соответствующее измерение, или, другими словами, две матрицы имеют одинаковую длину и ширину. Я не уверен, как лучше всего подогнать измеренные точки к номинальным точкам. Мне нужен способ вычисления смещения и поворота для применения ко всем измеренным точкам, которые обеспечивают минимальное расстояние между каждой номинальной/измеренной парой точек, не превышая допустимых допусков на максимальное расстояние в любой другой точке. Это похоже на регистрацию облаков точек, но отличается тем, что каждая пара номинальных/измеренных точек имеет уникальный допуск/предел на допустимое расстояние друг от друга. Этот предел выше для одних пар и ниже для других. Я программирую в .Net и изучил библиотеку облаков точек (PCL), OpenCV, Excel и основные матричные операции как возможные подходы. Это образец данных

X Nom    Y Nom  Z Nom   X Meas  Y Meas  Z Meas  Upper Tol   Lower Tol
118.81  2.24    -14.14  118.68  2.24    -14.14  1.00    -0.50
118.72  1.71    -17.19  118.52  1.70    -17.16  1.00    -0.50
115.36  1.53    -24.19  115.14  1.52    -23.98  0.50    -0.50
108.73  1.20    -27.75  108.66  1.20    -27.41  0.20    -0.20

Ниже приведен тип матрицы, которую мне нужно рассчитать, чтобы лучше всего подогнать измеренные точки к номинальным точкам. Я умножу его на матрицу измеренных точек, чтобы лучше всего соответствовать матрице номинальных точек.

    Transformation  
0.999897324 -0.000587540    0.014317661
0.000632725 0.999994834 -0.003151567
-0.014315736    0.003160302 0.999892530
-0.000990993    0.001672040 0.001672040

person user2904160    schedule 07.04.2014    source источник
comment
Мне на самом деле очень любопытно, для какого приложения вы собираетесь использовать это...   -  person Deepfreeze    schedule 09.04.2014
comment
@Deepfreeze Лично использую это для контроля качества на основе зрения. Во-первых, мы создаем преобразование для соответствия опорным точкам/точкам выравнивания (проблема, описанная в этом посте). Затем мы выполняем сопоставление функций, чтобы убедиться, что деталь соответствует спецификации.   -  person Mateen Ulhaq    schedule 08.04.2016


Ответы (1)


Это действительно работа для жесткого алгоритма регистрации.

Чтобы справиться с вашими допусками, у вас есть несколько вариантов:

  • Простой вариант: запустите жесткую регистрацию, затем проверьте, находится ли результат в пределах допусков.
  • Немного более сложный вариант: сместите свои точки в САПР, где у вас несбалансированные допуски, остальное так же, как и в предыдущем варианте.
  • Самый сложный вариант: то, что вы, вероятно, захотите сделать, это иметь смещение, как во втором варианте, а также добавить функцию веса, основанную на измеренном положении и заданном допуске. Эта весовая функция должна влиять на энергетическую функцию таким образом, чтобы отдельные векторы функций были больше, когда у вас небольшой допуск, и меньше, когда у вас больший допуск.

Итак, теперь о реализации, для вариантов 1 и 2 ваш самый быстрый способ получить результат, вероятно, будет:

  • Используйте версию PCL C++ в среде Visual Studio 2010. Существует много информации об установке PCL и VS2010 и их запуске. Кроме того, в PCL есть хороший учебник по регистрации ICP, который поможет вам начать работу.
  • Используйте VTK для Python, у него есть алгоритм ICP:
    Установка VTK для Python
    http://www.vtk.org/Wiki/VTK/Examples/Python/IterativeClosestPoints

Если вам действительно нужен вариант 3, вы можете сделать:

  • Создайте функцию веса в исходном коде библиотеки PCL и скомпилируйте ее.
  • Make the complete ICP algorithm yourself in .net:
    • http://www.math.tau.ac.il/~dcor/Graphics/adv-slides/ICP.ppt
    • Используйте math.numerics разреженную матрицу/векторную алгебру и решатели для создания собственного оптимизатора
    • Реализуйте оптимизаторы Лева-Марка или Гаусса-Ньютона из:
      методы imm для нелинейных задач наименьших квадратов, К. Мэдсен, 2004 г.
    • Создайте свой собственный вектор функции и матрицу Якобиана (с функцией веса)
    • Имейте немного терпения, чтобы заставить все работать вместе :)
    • Опубликуйте результат для других пользователей StackOverflow, ожидающих ICP в C# .net.
person Deepfreeze    schedule 09.04.2014