Usando o olho de peixe no Raspberry Pi 3 com ROS - Parte 1

Boa tarde, queridos leitores de Habr. Alguns anos atrás, escrevi sobre o uso da placa da câmera Raspberry Pi no Raspberry Pi em conjunto com o ROS. Neste e no próximo artigo, gostaria de falar sobre o uso de uma câmera grande angular, como olho de peixe, no Raspberry Pi 3 com o Ubuntu 16.04 instalado. Para quem é interessante, pergunto sob kat.

Para iniciantes, por que câmera de olho de peixe? Eu já vi muitos artigos sobre o uso de câmeras de grande angular para odometria visual e SLAM. Graças ao maior ângulo de visão do olho de peixe, a câmera melhora a precisão da odometria visual. Então, eu queria experimentar uma dessas câmeras com Raspberry Pi com suporte a ROS. Comprei uma câmera com um ângulo de 160 graus no dx.com por US $ 28. O kit da câmera também inclui duas lâmpadas IR para visão noturna:

imagem

No primeiro artigo, falarei sobre a instalação dos drivers necessários, OpenCV 3 e pacotes para dar suporte à placa de câmera Raspberry Pi no ROS.

Instalando o driver da câmera olho de peixe no Raspberry Pi 3


Então, vamos começar. Conecte-se ao RPi 3 via SSH:

ssh -Y <user>@<ip> 

O parâmetro -Y resolve o problema de obter o erro “Não foi possível conectar à exibição” ao iniciar alguns aplicativos da GUI (Qt, janela com a imagem do programa OpenCV). Saiba mais aqui .

Primeiro, precisamos ativar o suporte ao driver da câmera nas configurações raspi-config do Raspberry Pi. No Raspbian, este serviço já está ativado, no Ubuntu você precisa instalá-lo:

 sudo apt-get install raspi-config 

Execute raspi-config:

 sudo raspi-config 

Selecione a opção Interface, depois a Câmera Pi e clique em Sim. E finalmente terminar.
Verifique se o suporte à câmera está ativado usando o utilitário raspistill:

 raspistill -o mypicture.jpg 

Se você receber o erro “A câmera não foi detectada. Verifique cuidadosamente se o módulo da câmera está instalado corretamente ”verifique se você conectou a câmera corretamente ao Raspberry Pi. Você também pode reiniciar o sistema (isso me ajudou).

Vamos tentar gravar um vĂ­deo:

 raspivid -o myvideo.h264 

Eu tenho uma imagem em um monitor conectado a um Raspberry Pi. NĂŁo consegui obter um pop-up no meu computador ao conectar via ssh.

imagem

Usando o OpenCV 3 com uma câmera olho de peixe em um Raspberry Pi


Instale a biblioteca picamera [array]:

 pip install "picamera[array]" 

Instale as dependências necessárias para o OpenCV. Primeiro, atualize o gerenciador de pacotes apt e atualize os pacotes pré-instalados:

 sudo apt-get update sudo apt-get upgrade 

Instale algumas 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 

Vamos instalar o OpenCV 3 a partir da fonte.

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

Também precisamos fazer o download do repositório opencv_contrib:

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

O fato é que nos pacotes OpenCV 3 com descritores de recursos (como SIFT e SURF) foram movidos para um repositório de contribuição separado. Agora, para usar os descritores de tags, precisamos fazer o download do repositório contrib separadamente.

Agora estamos finalmente prontos para instalar o OpenCV. Podemos executar o cmake para compilar o OpenCV com os parâmetros necessários:

 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 .. 

Se o cmake teve ĂŞxito sem erros, execute make:

 make -j4 

Ao compilar, recebi o erro "Falha na segmentação". Se você receber o mesmo erro, faça clean para remover os resultados da compilação e faça com um kernel:

 make clean make 

Levei 3 horas para compilar. Por fim, instale o OpenCV 3:

 sudo make install sudo ldconfig 

Há uma nuance interessante relacionada ao ROS Kinetic. Se você instalar o Rin Kinetic, o ROS adicionará o caminho às bibliotecas Python (/opt/ros/kinetic/lib/python2.7/dist-packages) ao caminho do sistema ao executar a fonte de comando /opt/ros/kinetic/setup.bash. Isso leva a alguns problemas durante a instalação subsequente do OpenCV da fonte (mais sobre isso está escrito aqui ). Para resolver o problema, remova a linha 'source /opt/ros/kinetic/setup.bash' do arquivo .bashrc. Não se esqueça de executar:

 source ~/.bashrc 

Vamos verificar se o OpenCV agora está corretamente vinculado a partir do Python.
Crie uma pasta para o projeto e um script de teste simples:

 mkdir PiCamera && cd PiCamera vim test_cam.py 

Adicione o seguinte cĂłdigo ao arquivo:

 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) 

Execute o script:

 python test_cam.py 

Se for bem-sucedido, obtemos algo assim:

imagem

Vamos agora tentar gravar o vídeo da câmera.

 vim test_videom.py 

Adicione o seguinte cĂłdigo ao arquivo:

 # 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 

Vamos tentar algo mais interessante, por exemplo, adicionar detecção de borda. Estou usando o detector de Kenny aqui (código retirado daqui ):

 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 

Aqui está o resultado da execução do programa:

imagem

Adicionando suporte à câmera Raspberry Pi no ROS


Agora vamos adicionar a capacidade de trabalhar com uma câmera olho de peixe para o Raspberry Pi da ROS. Primeiro, instale o driver V4L2 necessário para a câmera Raspberry Pi (você pode ler mais aqui ). Execute o comando:

 sudo rpi-update 

e reinicie o sistema. Agora adicione o driver:

 sudo modprobe bcm2835-v4l2 

Verifique se o dispositivo / dev / video0 está disponível:

 ll /dev/video0 

A saída será assim:

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

Faça o download do pacote usb_cam:

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

Execute o mestre do ROS e rqt_image_view:

 roscore roslaunch usb_cam usb_cam-test.launch rosrun rqt_image_view rqt_image_view 

Selecione o tĂłpico / usb_cam / image_raw. Temos a seguinte imagem:

imagem

Agora a câmera olho de peixe pode ser usada com qualquer pacote de visão computacional no ROS. Da próxima vez, tentaremos detectar objetos. Boa sorte a todos nos experimentos e até breve!

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


All Articles