
Uno de los beneficios del
Sistema Operativo Robot (ROS) es que tiene muchos paquetes que pueden reutilizarse en nuestras aplicaciones. En nuestro caso, queremos introducir un sistema de reconocimiento y detección de objetos. El paquete
find_object_2d implementa
detectores y descriptores de función SURF, SIFT, ORB, FAST y BRIEF para detectar objetos . Usando la interfaz gráfica provista por este paquete, podemos marcar los objetos que queremos detectar y guardarlos para futuras detecciones. El nodo detector detectará objetos en las imágenes de la cámara y publicará los detalles del objeto a través del sujeto. Usando un sensor 3D, puede evaluar la profundidad y orientación de un objeto.
Al final del artículo, prueba de video en el ejemplo de algoritmos ORB y SIFT.
Establecer find_object_2d
Instalar este paquete es bastante simple. Aquí está el comando para instalarlo en Ubuntu 16.04 y ROS Kinetic:
$ sudo apt-get install ros-kinetic-find-object-2d
Instalar desde la fuente
Cambie al espacio de trabajo ROS:
$ cd ~/catkin_ws/src
Copie el código fuente a la carpeta src:
$ git clone https://github.com/introlab/find-object.git src/find_object_2d
Crea un espacio de trabajo:
$ catkin_make
Ejecutar nodos find_object_2d usando cámaras web
El siguiente es el procedimiento para iniciar los nodos del detector para una cámara web. Si queremos detectar un objeto usando una cámara web, primero necesitamos instalar el paquete usb_cam (ver artículo anterior).
1. Lanzar roscore:
$ roscore
2.1 Conecte la cámara USB a la computadora y ejecute el controlador usb_cam ROS:
$ roslaunch usb_cam usb_cam-test.launch
Esto iniciará el controlador ROS para cámaras web USB, y puede ver los temas en este controlador utilizando el comando de lista rostopic. La lista de temas en el controlador se muestra aquí:
Temas publicados desde el controlador de la cámara2.2 Una forma alternativa de transmitir video desde la cámara a través de uvc_camera:
$ rosrun uvc_camera uvc_camera_node
3. De la lista de temas, vamos a utilizar el tema de la imagen en bruto de la cámara, que se publica en el tema / usb_cam / image_raw. Si recibe este tema, el siguiente paso es iniciar el nodo de descubrimiento de objetos. El siguiente comando iniciará el nodo de descubrimiento de objetos:
$ rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw
Este comando abrirá la ventana de detección de objetos en la que vemos el canal de la cámara y las características de los objetos.
4. Entonces, ¿cómo podemos usarlo para detectar un objeto? Los siguientes son los procedimientos para realizar el descubrimiento básico con esta herramienta:
Ventana de detección de objetos encontrados5. Puede hacer clic derecho en el panel lateral izquierdo (Objetos) de esta ventana, y tendrá la oportunidad de agregar objetos de la escena. Si selecciona esta opción, se le pedirá que marque un objeto de la escena actual y, una vez que se complete el marcado, el objeto marcado comenzará a rastrearse desde la escena. La captura de pantalla anterior muestra el primer paso en el que se captura una escena con un objeto.
6. Después de alinear el objeto hacia la cámara, haga clic en el botón "Tomar foto" para hacer clic en el objeto:
Asistente para agregar objetos para capturar un objeto7. La siguiente ventana es para marcar un objeto desde el enlace actual. La siguiente figura muestra esto. Podemos usar el cursor del mouse para marcar un objeto. Haga clic en el botón "Siguiente" para recortar el objeto, y puede continuar con el siguiente paso:
Asistente para agregar objetos para etiquetar un objeto8. Después de recortar el objeto, le mostrará el número total de descriptores de funciones para el objeto, y puede hacer clic en el botón "Finalizar" para agregar una plantilla de objeto para su detección. La siguiente figura muestra el último paso para agregar una plantilla de objeto a esta aplicación de detector:
Último paso del Asistente para agregar características9. ¡Felicidades! Has añadido un objeto para descubrir. Ahora puede ver la detección que se muestra en la siguiente toma. Puede ver el cuadro delimitador alrededor del objeto detectado:
Descubrimiento de lanzamiento del asistente de búsqueda de objetos10. ¿Es esto suficiente? ¿Qué tal la posición del objeto? Podemos conseguir
posición del objeto usando el siguiente comando:
$ rosrun find_object_2d print_objects_detected
Detalles de la propiedad11. También puede obtener información completa sobre el objeto detectado de
/ objeto del tema. Este tema publica una matriz de multidifusión que consta del ancho y alto del objeto y la matriz de homografía para calcular la posición y orientación del objeto y sus valores de escala y desplazamiento. Puede obtener el eco del tema / objetos como este:
Valores de tema / objeto12. Podemos calcular la nueva posición y orientación a partir de las siguientes ecuaciones:
La ecuación para calcular la posición del objeto.Aquí H es la homografía de una matriz 3 × 3, (x1, y1) es la posición del objeto en la imagen almacenada y (x2, y2) es la posición calculada del objeto en el cuadro actual.
Puede verificar el código fuente del nodo print_objected_src para obtener la conversión utilizando la matriz de homografía.
Aquí está el código fuente de este nodo.Prueba de video del paquete find_object_2d usando el ejemplo de los algoritmos ORB y SIFT
Resumen del algoritmo: ORB es rápido, pero no ve objetos remotos y, a menudo, no determina correctamente la geometría. SIFT ve objetos remotos, determina con precisión la geometría, los contras requieren grandes recursos informáticos y se pagan para uso comercial.
Preguntas a resolver por el robot EduMIP :
- Reciba de la cámara Logitech C920 en BeagleBone Blue un video ya codificado en hardware y transfiéralo de esta forma a una computadora grande en ROS.
- Conecte los sensores de distancia VL6180X, Vl53l0x y el parachoques para construir un mapa en ROS. (Accesorios ya pedidos)
- Escriba un algoritmo en ROS que procese los datos del mapa y los objetos detectados desde la cámara y construya una ruta de movimiento basada en ellos.
Si hay entusiastas de la robótica como yo que están listos para unirse al proyecto, entonces escriba un correo electrónico personal, necesito ayuda sobre los problemas anteriores.