2012-01-30 10 views
5

Tengo una pregunta difícil muy buena & para usted. Necesito alinear dos mallas usando un algoritmo muy rápido. Dada mesh1 y mesh2, quiero encontrar cómo necesito trasladar y rotar mesh1 para estar en la misma posición de mesh2. Primero hice esto usando momentos de inercia de las dos mallas, pero el algoritmo no funciona si la segunda malla es similar a la primera, pero faltan algunas partes. En otras palabras, tome dos mallas idénticas y de una de ellas corte las mismas partes.cómo alinear dos mallas

Me gustaría escribir el código en C porque necesito hacerlo en máquinas multiplataforma (linux/win) y hacerlo de una manera muy rápida: tiene que ponerse en un algoritmo GA.

Las dos mallas están en formato STL (estereolitografía) (binario o ascii) pero quizás pueden ser útiles utilizando otro tipo de formato de archivo.

¿Tiene alguna idea de cómo realizar esto?

actualización pregunta:

primer lugar quiero darles las gracias mucho por todas sus sugerencias. Descargué una PCL de instalación en mi máquina y compilé el algoritmo ICP (tutorial) con éxito, tomado del sitio web de PCL. Pero ahora tengo algunas preguntas sobre eso, tal vez porque para mí es algo completamente nuevo. ¿Cuál es el significado de la salida de matriz 4x4 para la aptitud? Debería esperar una matriz rotativa y un vector traslacional.

Espero que algunos de ustedes me puedan ayudar. Si necesita cualquier otra información, pregunte.

+0

Así que, básicamente, ¿quieres un algoritmo que calcula la matriz de transformación que transforma mesh1 lo más cerca posible en mesh2? Además: ¿La única forma en que se edita una malla es la eliminación de partes o se pueden mover y agregar vértices? – Nobody

+0

@ Nadie Estoy calculando la matriz de transformación que compara los momentos de inercia de los dos cuerpos, pero cualquier otra cosa que coloque mesh1 sobre mesh2 está bien. En conclusión, necesito encontrar la posición más cercana de mesh1 respecto a mesh2, que da el valor mínimo de distancia entre los dos. – Nicholas

+1

Para cualquiera que (como yo) se tropiece con esto mucho más tarde, es útil notar que ICP es más efectivo cuando la correlación es alta y la diferencia es baja porque ICP tiende a establecer soluciones incorrectas si tiene que mover una nube/malla demasiado lejos para llegar a la correcta. Esta es la razón por la cual, en general, se lleva a cabo algún tipo de paso de coincidencia de características aproximadas para obtener la transformación en las proximidades adecuadas. Desde ese punto, ICP es excelente para refinar el registro. – Matt

Respuesta

4

Point Cloud Library tiene varios recursos que pueden serle útiles. Como dice @ Throwback1986, ICP es un excelente algoritmo para alinear la geometría. Pcl también presenta otros algoritmos de alineación, a menudo más rápidos, basados ​​en identificar y combinar características de interés en dos piezas de geometría. La biblioteca encuentra un gran uso en las comunidades de robótica, que, como usted, son muy conscientes del rendimiento.

Pcl está escrito en C++. Aunque no es tan portátil como la C recta, ofrecen instrucciones de instalación para Windows, algunos sabores * nix y mac os. Lo he visto correr en iOS y Android también. Consulte el tutorials.

+0

Gracias por darme ese enlace. Es una biblioteca muy interesante. He intentado utilizar algunos de los tutoriales pero desafortunadamente no hace el milagro que esperaba :). Funciona solo para pequeñas diferencias, espero poder combinar esos códigos con el método de mi inercia aproximada. ¿Alguna otra buena sugerencia? – Nicholas

+0

Intenta buscar en la lista de correo pcl, y si no encuentras nada, ¡publica una pregunta! Los desarrolladores son muy receptivos. Una idea sería sembrar ICP con una mejor estimación basada en su técnica de momentos intertiales, y luego iterar desde allí para una alineación precisa. Esa matriz de transformación 4x4 tiene su matriz de rotación incrustada en ella, como la esquina superior izquierda. La cuarta columna contiene la matriz de traducción. (observe que la fila inferior tiene tres 0 en ella) – yurbles

3

Iterative Closest Point (ICP) es una forma de registrar (alinear) nubes de puntos 3D con transformaciones rígidas. (También se puede aplicar a las mallas.)

Aquí es una buena introducción: http://www.cs.duke.edu/courses/spring07/cps296.2/scribe_notes/lecture24.pdf

Aquí se presenta un resumen razonable: students.asl.ethz.ch/upl_pdf/314-report.pdf

Aquí es una aplicación de MATLAB: http://www.mathworks.com/matlabcentral/fileexchange/12627-iterative-closest-point-method

Aquí están algunas optimizaciones potenciales: http://www.cs.princeton.edu/~smr/papers/fasticp/

+1

He estado investigando sobre este tema. Estoy descubriendo que el código de matlab es muy útil, aunque creo que este [enlace] (http://www.mathworks.com/matlabcentral/fileexchange/16766) es mejor que el tuyo, ¡porque también tiene el código fuente cpp! Te contaré lo antes posible cualquier nuevo avance en esto y creo que voy a publicar aquí la solución que obtendré. – Nicholas

Cuestiones relacionadas