Usando el ojo de pez en Raspberry Pi 3 con ROS - Parte 1

Buenas tardes queridos lectores de Habr. Hace unos años escribí sobre el uso de la placa de cámara Raspberry Pi en la Raspberry Pi junto con ROS. En este y en el siguiente artículo, me gustaría hablar sobre el uso de una cámara gran angular como ojo de pez en la Raspberry Pi 3 con Ubuntu 16.04 instalado. Para quién es interesante, pregunto bajo kat.

Para empezar, ¿por qué la cámara ojo de pez? He visto muchos artículos sobre el uso de cámaras de gran angular para odometría visual y SLAM. Gracias al mayor ángulo de visión del ojo de pez, la cámara mejora la precisión de la odometría visual. Así que quería probar una de esas cámaras con Raspberry Pi con soporte ROS. Compré una cámara con un ángulo de 160 grados en dx.com por $ 28. El kit de cámara también incluye dos lámparas IR para visión nocturna:

imagen

En el primer artículo hablaré sobre la instalación de los controladores necesarios, OpenCV 3 y paquetes para admitir la placa de cámara Raspberry Pi en ROS.

Instalación del controlador de cámara ojo de pez en la Raspberry Pi 3


Entonces comencemos. Conéctese a RPi 3 a través de SSH:

ssh -Y <user>@<ip> 

El parámetro -Y resuelve el problema de obtener el error "No se pudo conectar a la pantalla" al iniciar algunas aplicaciones GUI (Qt, ventana con la imagen del programa OpenCV). Obtenga más información aquí .

Primero, debemos habilitar la compatibilidad con el controlador de la cámara en la configuración de Raspberry Pi raspi-config. En Raspbian, este servicio ya está habilitado, en Ubuntu necesitas instalarlo:

 sudo apt-get install raspi-config 

Ejecute raspi-config:

 sudo raspi-config 

Seleccione la opción de Interfaz, luego la Cámara Pi y haga clic en Sí. Y finalmente terminar.
Verifique que el soporte de la cámara esté habilitado con la utilidad raspistill:

 raspistill -o mypicture.jpg 

Si recibe el error "La cámara no se detecta. Verifique cuidadosamente que el módulo de la cámara esté instalado correctamente ”verifique si conectó la cámara al Raspberry Pi correctamente. También puede reiniciar el sistema (me ayudó).

Intentemos grabar un video:

 raspivid -o myvideo.h264 

Tengo una imagen en un monitor conectado a una Raspberry Pi. No pude obtener una ventana emergente en mi computadora cuando me conecté a través de ssh.

imagen

Usando OpenCV 3 con una cámara de ojo de pez en una Raspberry Pi


Instale la biblioteca picamera [array]:

 pip install "picamera[array]" 

Instale las dependencias necesarias para OpenCV. Primero, actualice el administrador de paquetes apt y actualice los paquetes preinstalados:

 sudo apt-get update sudo apt-get upgrade 

Instalar algunas bibliotecas:

 sudo apt-get install build-essential cmake pkg-config sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev sudo apt-get install libxvidcore-dev libx264-dev sudo apt-get install libgtk-3-dev sudo apt-get install libatlas-base-dev gfortran sudo apt-get install python2.7-dev python3.5-dev 

Instalaremos OpenCV 3 desde la fuente.

 cd ~ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.1.0.zip unzip opencv.zip 

También necesitamos descargar el repositorio opencv_contrib:

 wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.1.0.zip unzip opencv_contrib.zip 

El hecho es que en OpenCV 3 los paquetes con descriptores de características (como SIFT y SURF) se movieron a un repositorio contrib separado. Ahora, para usar los descriptores de etiquetas, necesitamos descargar el repositorio contrib por separado.

Ahora finalmente estamos listos para instalar OpenCV. Podemos ejecutar cmake para compilar OpenCV con los parámetros necesarios:

 cd ~/opencv-3.1.0/ mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.1.0/modules \ -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \ -D BUILD_EXAMPLES=ON .. 

Si cmake tuvo éxito sin errores, ejecute make:

 make -j4 

Al compilar, recibí un error de "Error de segmentación". Si obtiene el mismo error, limpie para eliminar los resultados de la compilación y realice con un núcleo:

 make clean make 

Me llevó 3 horas compilar. Finalmente, instale OpenCV 3:

 sudo make install sudo ldconfig 

Hay un interesante matiz relacionado con ROS Kinetic. Si instala Rin Kinetic, ROS agrega la ruta a las bibliotecas de Python (/opt/ros/kinetic/lib/python2.7/dist-packages) a la ruta del sistema cuando ejecuta el comando source /opt/ros/kinetic/setup.bash. Esto lleva a algunos problemas durante la instalación posterior de OpenCV desde la fuente (más sobre esto está escrito aquí ). Para resolver el problema, elimine la línea 'source /opt/ros/kinetic/setup.bash' del archivo .bashrc. No te olvides de correr:

 source ~/.bashrc 

Verifiquemos que OpenCV ahora se vincule correctamente desde Python.
Cree una carpeta para el proyecto y un script de prueba simple:

 mkdir PiCamera && cd PiCamera vim test_cam.py 

Agregue el siguiente código al archivo:

 from picamera.array import PiRGBArray from picamera import PiCamera import time import cv2 # initialize the camera and reference the raw camera capture camera = PiCamera() rawCapture = PiRGBArray(camera) # allow camera to warmup time.sleep(0.1) # grab an image camera.capture(rawCapture, format="bgr") image = rawCapture.array cv2.imshow("Capture", image) cv2.waitKey(0) 

Ejecute el script:

 python test_cam.py 

Si tiene éxito, obtenemos algo como esto:

imagen

Ahora intentemos grabar video de la cámara.

 vim test_videom.py 

Agregue el siguiente código al archivo:

 # import the necessary packages from picamera.array import PiRGBArray from picamera import PiCamera import time import cv2 # initialize the camera and grab a reference to the raw camera capture camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 32 rawCapture = PiRGBArray(camera, size=(640, 480)) # allow the camera to warmup time.sleep(0.1) # capture frames from the camera for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): # grab the raw NumPy array representing the image, then initialize the timestamp # and occupied/unoccupied text image = frame.array # show the frame cv2.imshow("Frame", image) key = cv2.waitKey(1) & 0xFF # clear the stream in preparation for the next frame rawCapture.truncate(0) # if the `q` key was pressed, break from the loop if key == ord("q"): break 

Probemos algo más interesante, por ejemplo, agregar detección de bordes. Estoy usando el detector de Kenny aquí (código tomado de aquí ):

 from picamera.array import PiRGBArray from picamera import PiCamera import time import cv2 import numpy as np # initialize the camera and grab a reference to the raw camera capture camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 32 rawCapture = PiRGBArray(camera, size=(640, 480)) # allow the camera to warmup time.sleep(0.1) # capture frames from the camera for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): # grab the raw NumPy array representing the image, then initialize the timestamp # and occupied/unoccupied text image = frame.array hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) lower_red = np.array([30,150,50]) upper_red = np.array([255,255,180]) mask = cv2.inRange(hsv, lower_red, upper_red) res = cv2.bitwise_and(image,image, mask= mask) edges = cv2.Canny(res,100,200) # show the frame cv2.imshow("Frame", image) cv2.imshow("Edges", edges) key = cv2.waitKey(1) & 0xFF # clear the stream in preparation for the next frame rawCapture.truncate(0) # if the `q` key was pressed, break from the loop if key == ord("q"): break 

Aquí está el resultado de ejecutar el programa:

imagen

Agregar soporte de cámara Raspberry Pi a ROS


Ahora agreguemos la capacidad de trabajar con una cámara de ojo de pez para la Raspberry Pi de ROS. Primero, instale el controlador V4L2 necesario para la cámara Raspberry Pi (puede leer más aquí ). Ejecute el comando:

 sudo rpi-update 

y reinicie el sistema. Ahora agregue el controlador:

 sudo modprobe bcm2835-v4l2 

Verifique que el dispositivo / dev / video0 esté disponible:

 ll /dev/video0 

La salida será así:

 crw-rw----+ 1 root video 81, 0 Mar 17 15:47 /dev/video0 

Descargue el paquete usb_cam:

 sudo apt-get install ros-kinetic-usb-cam source /opt/ros/kinetic/setup.bash 

Ejecute el maestro ROS y rqt_image_view:

 roscore roslaunch usb_cam usb_cam-test.launch rosrun rqt_image_view rqt_image_view 

Seleccione el tema / usb_cam / image_raw. Obtenemos la siguiente imagen:

imagen

Ahora la cámara ojo de pez se puede usar con cualquier paquete de visión por computadora en ROS. La próxima vez intentaremos detectar objetos. ¡Buena suerte a todos en los experimentos y hasta pronto!

Source: https://habr.com/ru/post/es417251/


All Articles