
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âmera2.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 Find5. 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 objeto7. 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 objeto8. 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 Recursos9. 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 Descoberta10. 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óvel11. 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 / objeto12. Podemos calcular a nova posição e orientação a partir das seguintes equações:
A equação para calcular a posição do objetoAqui, 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 :
- 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.
- Conecte os sensores de distância VL6180X, Vl53l0x e pára-choques para criar um mapa em ROS. (Acessórios já pedidos)
- 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.