Detecção e reconhecimento de objetos da câmera no ROS usando o pacote find_object_2d



Um dos benefícios do ROS (Sistema operacional do robô) é que ele possui muitos pacotes que podem ser reutilizados em nossos aplicativos. No nosso caso, queremos introduzir um sistema de reconhecimento e detecção de objetos. O pacote find_object_2d implementa detectores e descritores das funções SURF, SIFT, ORB, FAST e BRIEF para detectar objetos . Usando a interface gráfica fornecida por este pacote, podemos marcar os objetos que queremos detectar e salvá-los para detecção futura. O nó detector detectará objetos nas imagens da câmera e publicará detalhes do objeto através do assunto. Usando um sensor 3D, ele pode avaliar a profundidade e a orientação de um objeto.

No final do artigo, teste de vídeo no exemplo dos algoritmos ORB e SIFT.

Definindo find_object_2d


A instalação deste pacote é bastante simples. Aqui está o comando para instalá-lo no Ubuntu 16.04 e ROS Kinetic:

$ sudo apt-get install ros-kinetic-find-object-2d 

Instalar da fonte


Alterne para o espaço de trabalho do ROS:

 $ cd ~/catkin_ws/src 

Copie o código-fonte para a pasta src:

 $ git clone https://github.com/introlab/find-object.git src/find_object_2d 

Crie um espaço de trabalho:

 $ catkin_make 

Executando nós find_object_2d usando webcams


A seguir, é apresentado o procedimento para iniciar os nós detectores de uma webcam. Se quisermos detectar um objeto usando uma webcam, primeiro precisamos instalar o pacote usb_cam (consulte o artigo anterior).

1. Inicie o roscore:

 $ roscore 

2.1 Conecte a câmera USB ao computador e execute o driver usb_cam ROS:

 $ roslaunch usb_cam usb_cam-test.launch 

Isso iniciará o driver ROS para webcams USB e você poderá ver os tópicos neste driver usando o comando rostopic list. A lista de tópicos no driver é mostrada aqui:


Tópicos publicados no driver da câmera

2.2 Uma maneira alternativa de transmitir vídeo da câmera via uvc_camera:

 $ rosrun uvc_camera uvc_camera_node 

3. Na lista de tópicos, usaremos o tema da imagem não processada da câmera, publicada no tópico / usb_cam / image_raw. Se você obtiver este tópico, a próxima etapa é ativar o nó de descoberta de objeto. O comando a seguir iniciará o nó de descoberta de objeto:

 $ rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw 

Este comando abrirá a janela de detecção de objetos na qual vemos o canal da câmera e os recursos dos objetos.

4. Então, como podemos usá-lo para detectar um objeto? A seguir estão os procedimentos para executar a descoberta básica usando esta ferramenta:


Janela Detecção de Objeto Find

5. Você pode clicar com o botão direito do mouse no painel esquerdo (Objetos) desta janela e terá a oportunidade de adicionar objetos da cena. Se você selecionar esta opção, você será solicitado a marcar um objeto da cena atual e, após a conclusão da marcação, o objeto marcado começará a ser rastreado a partir da cena. A captura de tela anterior mostra o primeiro passo em que uma cena com um objeto é capturada.

6. Depois de alinhar o objeto em direção à câmera, clique no botão "Tirar foto" para clicar no objeto:


Assistente para adicionar objeto para capturar um objeto

7. A próxima janela é para marcar um objeto da ligação atual. A figura a seguir mostra isso. Podemos usar o cursor do mouse para marcar um objeto. Clique no botão "Next" para cortar o objeto e você pode prosseguir para a próxima etapa:


Assistente para adicionar objeto a rotular um objeto

8. Depois de aparar o objeto, ele mostrará o número total de descritores de funções para o objeto e você pode clicar no botão "Finalizar" para adicionar um modelo de objeto para detecção. A figura a seguir mostra a última etapa da adição de um modelo de objeto a este aplicativo detector:


Última etapa do Assistente para Adicionar Recursos

9. Parabéns! Você adicionou um objeto para descobrir. Agora você pode ver a detecção mostrada na próxima foto. Você pode ver a caixa delimitadora ao redor do objeto detectado:


Assistente para Localizar Objetos Iniciando a Descoberta

10. Isso é suficiente? E a posição do objeto? Nós podemos obter
posição do objeto usando o seguinte comando:

 $ rosrun find_object_2d print_objects_detected 


Detalhes do Imóvel

11. Você também pode obter informações completas sobre o objeto detectado em
/ objeto do tópico. Este tópico publica uma matriz multicast que consiste na largura e altura do objeto e na matriz de homografia para calcular a posição e a orientação do objeto e seus valores de escala e deslocamento. Você pode obter o eco do tópico / objects assim:


Valores de tema / objeto

12. Podemos calcular a nova posição e orientação a partir das seguintes equações:


A equação para calcular a posição do objeto

Aqui, H é a homografia de uma matriz 3 × 3, (x1, y1) é a posição do objeto na imagem armazenada e (x2, y2) é a posição calculada do objeto no quadro atual.
Você pode verificar o código fonte do nó print_objected_src para obter a versão reversa usando a matriz de homografia.

Aqui está o código fonte para este nó.

Testando o vídeo do pacote find_object_2d usando o exemplo dos algoritmos ORB e SIFT



Resumo do algoritmo: O ORB é rápido, mas não vê objetos remotos e geralmente não determina a geometria corretamente. O SIFT vê objetos remotos, determina com precisão a geometria, contras requerem grandes recursos de computação e são pagos pelo uso comercial.

Perguntas a serem resolvidas pelo robô EduMIP :

  1. Receba da câmera Logitech C920 no BeagleBone Blue um vídeo já codificado em hardware e transfira-o desta forma para um computador grande em ROS.
  2. Conecte os sensores de distância VL6180X, Vl53l0x e pára-choques para criar um mapa em ROS. (Acessórios já pedidos)
  3. Escreva um algoritmo no ROS que processe os dados do mapa e os objetos detectados da câmera e crie uma rota de movimento baseada neles.

Se houver entusiastas de robótica como eu, prontos para participar do projeto, escreva em um e-mail pessoal, preciso de ajuda nas questões acima.

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


All Articles