ROS Trolley Robot - Parte 3. Acelere, troque a câmera, conserte a marcha

Posts da série:
8. Nós controlamos a partir do telefone-ROS Control, GPS-node
7. Localização do robô: gmapping, AMCL, pontos de referência no mapa da sala
6. Odometria com codificadores de roda, mapa da sala, lidar
5. Trabalhamos em rviz e gazebo: xacro, novos sensores.
4. Crie uma simulação de robô usando os editores rviz e gazebo.
3. Acelere, troque a câmera, conserte a marcha
2. Software
1. Ferro

Da última vez , trabalhando com OpenCV e ROS (sistema operacional de robô), usando todo o poder do raspberry pi 3b +, conseguimos andar ao longo da linha, ver sorrisos nos rostos das pessoas, focinho triste de gatos e até ir encontrá-los.

Mas, juntamente com os primeiros passos encorajadores nesta área da robótica, tive que enfrentar uma série de pequenas tarefas: raspberry pi lento, a uma pequena distância da câmera, que reconheceu o rosto, passando para o lado ao dirigir e outros. Como resolvê-los, incluindo a abertura de novos pequenos horizontes no desenvolvimento de ROS, será descrito mais adiante.

1. Ao executar todos os nós (scripts no ROS) de um projeto montado anteriormente e começar a trabalhar com as cascatas Haar, rapidamente ficou claro que o desempenho de um computador de placa única para essas tarefas ainda é bastante fraco. Apesar do fato de a carga do processador não ter um pico e variar dentro de 80%, o robô pensou por um longo tempo ao ver o rosto de uma pessoa ou o rosto de um gato, que ele tinha que seguir.

O mais triste é que, depois que o rosto ou rosto saiu do campo de visão da câmera, o robô começou a se mover, "pensando" que estava indo para o objeto. Em geral, como em M.Yu. Lermontov:
"O pária de longa data vagou
No deserto do mundo sem abrigo ... ".
As primeiras tentativas de corrigir a situação foram as seguintes:
- no nó de inicialização da câmera (no raspberry pi), o tamanho da imagem capturada foi reduzido de 640x480 60fps para 320x240 15 fps.

cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver nano pi_camera_driver.py 

Isso deu um certo aumento na produtividade, mas a imagem como um todo permaneceu longe do ideal.

Além disso, no script para começar a seguir o rosto de uma pessoa (follow_face.py) ou de um gato (follow_cat2.py), as conclusões na tela das imagens opencv foram comentadas. Isso é tudo cv.imshow. Agora, ao iniciar a viagem, era impossível observar visualmente se o robô vê uma imagem para a qual está se movendo ou não. Bem, eu tive que sacrificar a clareza.
Além disso, as informações-saídas do próprio ROS nos scripts foram comentadas em: # rospy.loginfo.
Isso reduziu ligeiramente a carga e aumentou a velocidade do trabalho.
Mas ... era necessário inventar outra coisa.

2. Além disso, o robô tinha uma visão terrivelmente curta. Seguindo nossa própria experiência e recomendações anteriores nesta área, uma câmera olho de peixe foi usada:



Esta câmera oferece um ângulo de visão bastante amplo e permite capturar uma parte significativa da sala.

No entanto, seus resultados no campo da qualidade do reconhecimento facial não foram impressionantes ... Mckayla não ficou impressionada ... Devido ao mesmo amplo ângulo de visão que a câmera usa, ela distorce simultaneamente o próprio objeto reconhecível. Por esse motivo, as cascatas de Haar usadas não funcionam bem. A iluminação também tem um efeito significativo; quando sombreada, a qualidade diminui ainda mais.

3. E ainda por cima, o robô não tinha velocidade angular para torções nítidas e, mesmo nos limiares (não aqueles que precisam ser cruzados) e nos tapetes, ele estava completamente preso. Aqui, a pimenta acrescentou a diferença de potência dos motores de “mesma potência”, que quase nunca são os mesmos, mesmo depois de deixar o mesmo lote. Por esse motivo, o robô desviou significativamente para a esquerda.

Melhorando o "desempenho".


Bem, com o desempenho, a situação começou a melhorar acentuadamente quando a principal vantagem do ROS como sistema veio em socorro, a saber: a capacidade de distribuir a carga em diferentes máquinas.

Ou seja, basta executar nós de movimento, câmeras e o nó mestre no próprio raspberry, e outros nós com muita carga podem ser colocados nos ombros de sistemas mais poderosos.
Por exemplo, instalando o ROS em um laptop ou implantando uma máquina virtual.

Nesta situação, a segunda opção foi escolhida.

Para não descrever como instalar o Ubuntu, ROS em uma máquina virtual, usamos o slogan de Winnie Jones " precisamos de um voluntário sem vida ". Nós preparamos ... - uma máquina virtual com todo o material necessário pode ser baixada aqui .

Os parâmetros da máquina virtual que se propõe a ser usada são os seguintes:



Entende-se que você está implantando (executando) na estação de trabalho VMware.
Senha: framboesa

Agora você pode avaliar o desempenho ao digerir as cascatas Haar no ferro, mais poderosas que o raspberry pi!

Para iniciar o sistema ROS, agora dividido em 2 partes, é necessário especificar a máquina virtual onde o nó principal funciona (e ele inicia no raspberry imediatamente após a inicialização do sistema).

Para fazer isso, edite o bashrc em uma máquina virtual:

 sudo nano ~/.bashrc 

Nas linhas no final do arquivo, especifique os endereços IP:

 export ROS_MASTER_URI=http://192.168.1.120:11311 export ROS_HOSTNAME=192.168.1.114 

O primeiro ip é o endereço raspberry pi, o segundo ip é o endereço da máquina virtual.
* A máquina virtual e a framboesa devem estar na mesma rede local.

Na framboesa, o mesmo bashrc será diferente:

 <source lang="bash">export ROS_MASTER_URI=http://192.168.1.120:11311 export ROS_HOSTNAME=192.168.1.120 

Dois endereços IP na correspondência de framboesa.
* Não se esqueça de reiniciar depois de alterar o bashrc.

Como iniciar um sistema ROS distribuído?


Existem dois terminais em framboesa.

No 1º movimento:

 rosrun rosbots_driver part2_cmr.py 

Na segunda câmera de framboesa:

 sudo modprobe bcm2835-v4l2 roslaunch usb_cam usb_cam-test.launch 

No total, 2 nós funcionarão com framboesa: um está aguardando a movimentação de um comando, o segundo envia vídeo da câmera para a rede.

Para conectar-se ao mestre e controlar o robô a partir do teclado, agora na máquina virtual você precisa executar:

 rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel 

Da mesma forma, em vez de gerenciar a partir de uma máquina virtual, você pode executar um nó - seguindo o rosto de uma pessoa:

 cd /home/pi/rosbots_setup_tools/rpi_setup python follow_face.py 

Agora, um pouco de estatísticas detalhadas sobre quais são os resultados com a câmera raspberry pi olho de peixe em diferentes configurações da imagem capturada da câmera.

320 x 240, 30 qps:
Rosto do homem. 80-100 cm A iluminação influencia, praticamente não vê na sombra. É melhor direcionar a lâmpada para o rosto para melhorar. O sorriso, com um sorriso, reconhece o rosto mais rapidamente.
Cara de gato na folha A4. 15-30 cm.

A 800x600 e 60fps - o rosto vê a uma distância de 2-3 m.

A 1280x720 e 60fps - o rosto vê a uma distância de 3-4 m. Mas existem falsos positivos - ele vê um relógio de parede como o rosto, etc.

Um gato em A4 reconhece com um atraso de 1-2 segundos, uma distância de 1-1,5 m.
Carga da máquina virtual 77-88%.

Como você pode ver, quando a janela da imagem capturada da câmera é ampliada, a carga na máquina virtual e a distância em que o robô vê o objeto aumentam. A carga de framboesa está crescendo, mas não significativamente. A velocidade de reconhecimento em comparação com a operação de todos os nós apenas na framboesa aumentou significativamente.

Tratar miopia


As estatísticas acima mostraram que, para melhorar a visão, é necessário aumentar a resolução e os fps da câmera, pagando o desempenho da máquina virtual. No entanto, mesmo em 1280x720 e 60fps, a distância para o objeto não é muito grande.

A solução para esse problema veio inesperadamente.

Como você sabe, toda uma linha de câmeras está disponível para framboesa. E para o nosso caso, um deles era perfeito, a saber:



Seus resultados são os seguintes:

Com iluminação artificial na sala, ele vê seu rosto a uma distância de 7-8 m! Nem é necessário sorrir)
800x600 e 60fps - download. máquina virtual - 70-80%, framboesa - 21% (existem apenas nós de movimento e começam a transmitir a câmera).
Um gato em A4 reconhece com um atraso de 1-2 segundos, uma distância de 2-2,3 m.
Como você pode ver, os gatos sofrem novamente, que são determinados a distâncias mais curtas. Mas aqui o motivo é mais provável nas configurações das cascatas do Haar, e não na câmera.
* Esta câmera, como regra, vem completa com orelhas de infravermelho. Não é necessário usá-los à luz do dia:



Assim, a câmera para raspberry pi, diferente da olho de peixe, apresentou os melhores resultados ao trabalhar com objetos, mesmo com iluminação artificial de baixa qualidade. No entanto, para aumentar a distância da câmera, tive que pagar com ângulos de visão e isso deve ser levado em consideração.

Agora, sobre a melhoria do chassi e a demolição do robô para o lado


Como mencionado acima, praticamente não há motores duplos, e o robô está fadado a dirigir tanto para a direita quanto para a esquerda, dependendo de como o motor se mostrou mais poderoso, todas as outras coisas sendo iguais.

Normalmente, a diferença de movimento é nivelada usando codificadores, uma vez que são bons em nosso projeto. Sobre como isso funciona, há um bom filme .

No entanto, aqui você pode simplificar tudo e seguir um pequeno truque, corrigindo apenas o script para seguir o rosto de uma pessoa (follow_face.py) ou um gato (follow_cat2.py) em uma máquina virtual.

Estamos interessados ​​nas seguintes linhas:

 #-0.013 - because right wheel is faster twist_msg.linear.x = 0.1 twist_msg.angular.z = -0.013 elif self.face_found["x"] < 0.0: # To the left cur_dir = "left" twist_msg.linear.x = 0.1 twist_msg.angular.z = 0.016 else: # To the right cur_dir = "right" twist_msg.linear.x = 0.1 twist_msg.angular.z = -0.016 

Dependendo de onde e quanto o robô sopra, é necessário ajustar os valores para z. No código acima, os valores são selecionados ao alimentar o driver do motor de 12V.

É possível aumentar as características de funcionamento do robô (velocidade e manobrabilidade) aplicando ao motorista do motor, que é usado no projeto (L9110s), em vez de 8 V - 12V. Mas é melhor não fazer isso sem instalar um estabilizador de energia ou pelo menos um capacitor, porque Os chips de ponte H do L9110s queimam bem, como se viu. Talvez isso os torne tão baratos. No entanto, o robô aciona 12 V de maneira bastante rápida e frívola.

Em vez de uma conclusão


Bem, agora que o robô deixou de ser levado e sua visão melhorou, você pode brincar de esconde-esconde com ele, por exemplo. Ou forçar algo a trazer do outro lado da sala. Claro, virando-se para encará-lo, como para uma pessoa.


Para ser continuado.

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


All Articles