Ir al contenido principal

Reconstruccion3D: DescripciĆ³n y primeros pasos

En esta prĆ”ctica se abordarĆ” el tema de la reconstrucciĆ³n de puntos 3D a partir de dos cĆ”maras calibradas. Para ello, gracias al entorno de Gazebo, contamos con un robot que incorpora un par estĆ©reo calibrado del que se conoce su posiciĆ³n y separaciĆ³n. Al mundo de Grazebo se le han aƱadido una serie de objetos 3D de forma que las cĆ”maras puedan captarlos para efectuar la reconstrucciĆ³n. AsĆ­ mismo, tambiĆ©n tenemos a nuestra disposiĆ³n un visor de puntos 3D a travĆ©s del cual podremos ver el resultado. Al igual que en la prĆ”ctica anterior, se parte de un script donde poder aƱadir cĆ³digo y una serie de librerĆ­as que facilitarĆ”n muchas operaciones.


Para efectuar una reconstrucciĆ³n es necesario conocer la posiciĆ³n que ocupa el punto 3D en las dos imĆ”genes. Obviamente no se dispone de dicha informaciĆ³n, por lo que hay que escoger un punto en una de las imĆ”genes y buscar su homĆ³logo en la otra. Es importante escoger bien los puntos, ya que cuanta mĆ”s textura contengan mĆ”s fĆ”cil serĆ” encontrarlos en la otra imagen. En principio con realizar un simple filtro de bordes se podrĆ­an obtener puntos suficientes para efectuar una buena reconstrucciĆ³n. Sin embargo, buscar cada uno de los puntos por toda la otra imagen conlleva un coste computacional muy alto. Es necesario acotar la bĆŗsqueda de alguna forma. 



Una de las principales tĆ©cnicas empleadas para la reducciĆ³n del tiempo de matching es el cĆ”lculo de la lĆ­nea epipolar. En reconstrucciĆ³n 3D, la lĆ­nea epipolar de un pixel es la recta resultante de la proyecciĆ³n en la otra imagen de todos los posibles puntos 3D que proyectan en el pixel elegido. Por tanto, el homĆ³logo de un punto en la imagen A se encuentra siempre a lo largo de esa lĆ­nea epipolar en la imagen B. Para calcularla es necesario conocer al menos dos puntos 3D que se encuentren en el rayo de retropoyecciĆ³n del pixel. Este rayo es el formado por la posiciĆ³n del pixel en el mundo y el punto focal de la cĆ”mara. Si proyectamos de nuevo esos dos puntos en el plano de la otra imagen podremos unirlos para obtener la lĆ­nea epipolar.

La librerĆ­a de pyProgeo nos facilita mucho estas acciones. Con dos simples funciones, 'graficToOptical' y 'backproject' se puede hacer un cambio de coordenadas necesario y retropoyectar el punto. La instrucciĆ³n 'backproject' sĆ³lo nos devuelve un punto en 3D que pertenece al rayo, pero uniendo con la posiciĆ³n de la cĆ”mara podemos formar una recta, de donde sacar todos los puntos que queramos.




A continuaciĆ³n se puede proyectar los puntos del rayo en la otra imagen, realizando el proceso inverso con las funciones 'project' y 'opticalToGrafic'. Es posible que alguno de los puntos no caigan dentro de la imagen, pero no pasa nada porque estĆ”n en el mismo plano. Con proyectar dos es suficiente para formar la epipolar. Una vez los dos puntos estĆ©n proyectados, se puede extraer de ellos la ecuaciĆ³n de la recta que los une, de la forma y = x*m + b.



 Debido a que las dos cĆ”maras se encuentran a la misma altura, la pendiente de la recta deberĆ­a de ser cero. He podido comprobar que efectivamente obtengo un 0 casi siempre, aunque con algunos decimales, por lo que puedo decir que de momento voy por el buen camino. En la prĆ³ximas entradas del blog continuarĆ© con esta prĆ”ctica, buscando la forma de encontrar el homĆ³logo del punto inicial en la epipolar que acabo de calcular.

Comentarios

Entradas populares de este blog

Reconstruccion3D: emparejamiento de puntos y cƔlculo del punto 3D

Como se comentaba en la entrada anterior, una vez tenemos la lĆ­nea epipolar calculada podemos buscar el punto homĆ³logo correspondiente. Para ello es necesario establecer una mĆ©trica para comparar ambos puntos. Tomar simplemente los valores RGB de los puntos no parece la forma mĆ”s fiable, puesto que puede ser que haya mĆ”s de un punto similar. Lo ideal serĆ­a tomar una regiĆ³n o parche centrada en los puntos. De esta forma la comparaciĆ³n serĆ” mucho mĆ”s fiable y discriminante a lo largo de la epipolar. Es necesario establecer una mĆ©trica para comparar ambos parches. Una de las mĆ”s sencillas es el MSE (Mean Square Error), que promedia el resultado de restar los valores en escala de grises de cada uno de los elementos del parche. Existen otras mĆ©tricas como comparar histogramas o la correlaciĆ³n, pero considero que es mejor comenzar con la mĆ”s simple. Como se trata de una diferencia, hay que calcular el MSE entre todas las posibles combinaciones a lo largo de la epipolar. El punto

FollowLine: primera aproximaciĆ³n

Para poner en prĆ”ctica las ideas expuestas en la entrada anterior he realizado una primera aproximaciĆ³n al algoritmo de comportamiento. En el enunciado de la prĆ”ctica se recomienda usar un controlador tipo PID para estimar el error, pero para este intento he decidido omitirlo. El objetivo es simplemente aprender a controlar el robot actuando en consecuencia al error cometido. He extraĆ­do tres puntos de control a diferentes alturas de la imagen referencia, con los que he dibujado la lĆ­nea ideal de trayectoria en recta. En cada iteraciĆ³n calculo el punto medio del ancho de la lĆ­nea y estimo la distancia con el punto de referencia, en principio solo para el punto a media altura. SegĆŗn la magnitud del error he fijado una serie de reglas para establecer la velocidad de avance y de giro. Si el error es muy grande la velocidad de avance debe de ser pequeƱa y la de giro grande. Sin embargo, cuando el error es pequeƱo la velocidad de avance se puede aumentar al mismo tiempo que se disminuye la

FollowLine: diseƱo con un PID

En esta siguiente aproximaciĆ³n me he centrado en introducir el controlador PID en el sistema. Tras estudiar su funcionamiento teĆ³rico me he decantado por crear una nueva clase que contenga las tres constantes fijas: Kp, Kd y Ki, ademĆ”s de un mĆ©todo que compute la fĆ³rmula y devuelva el resultado. Las constantes anteriormente mencionadas no tienen ningĆŗn tipo de valor por defecto, dependen mucho del problema a tener en cuenta. Por ello, he obtenido sus valores Ć³ptimos mediante prueba y error. Realmente es un trabajo costoso y que toma tiempo, pero si se hece bien el resultado puede ser muy bueno. Para este caso en concreto, he comprobado que apenas se producen cambios en el comportamiento del robot cuando omito la constante Ki, por lo que la fijarĆ© a 0. No entiendo bien porque parece funcionar mejor sin ella, pero realmente lo hace. TambiĆ©n he observado que cuando Kd es mucho mĆ”s grande que Kp el robot sigue las rectas increiblemente, sin oscilar, pero es poco estable en curvas. Sin e