Posts da série:
8. Nós controlamos a partir do telefone-ROS Control, GPS-node7. Localização do robô: gmapping, AMCL, pontos de referência no mapa da sala6. Odometria com codificadores de roda, mapa da sala, lidar5. 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 marcha2. Software1. FerroPassando para o sorriso
Depois de montar o “hambúrguer” de acordo com o esquema da última
postagem , prosseguimos para o conteúdo do software.
Como estamos coletando um projeto já concluído, é lógico fornecer as instruções indicadas nele. Eles estão
aqui .
Tudo é muito conveniente e, no mesmo local, você pode baixar uma imagem pronta do Raspbian Stretch + ROS + OpenCV, gravá-la em um cartão SD para framboesa. (ROS Kinetic, OpenCV 3.4.1. Sim, existe um mais novo, mas às vezes é melhor pegar e ir do que coletar tudo da fonte).
No entanto, apesar da comodidade, ainda precisava corrigir um pouco a imagem. Desde que saiu alguns detalhes desconfortáveis da imagem original:
- sem GUI (interface gráfica). Isso não é crítico, especialmente para o ROS, mas para rodar em uma linha, é necessário calibrar a câmera na própria framboesa e ver como ela (a câmera) transmite cores (mais sobre isso abaixo);
- O assembly OpenCV não exibe a imagem na tela, mesmo se você instalar a GUI. Obviamente, no projeto rosbots, o opencv foi construído sem essa opção.
- sem muletas pequenas (VNC, editor de texto para anotações, mc).
- Portanto, o OpenCV foi reconstruído com suporte para saída de imagem na GUI (compilada pelo openCV 3.4.3), uma GUI foi instalada, pequenas muletas.
A imagem final está
aqui e mais trabalhos serão construídos com base.
Configurar a rede (wi-fi) e o ROS-master no raspberry pi
.
Eu recomendo fortemente que experimentos usem um roteador separado com seu wi-fi. Você pode simplesmente criar um ponto de acesso no seu telefone para esses fins. Isso se deve ao fato de muitos pacotes passarem por wi-fi e, de preferência, não afundarem no tráfego geral.
Depois de carregar a imagem no cartão SD raspberry, configure a rede. As configurações iniciais da rede são as seguintes:
interface wlan0 static ip_address=192.168.43.174/24 static routers=192.168.43.1 static domain_name_servers=192.168.43.1
Encontrado em /etc/dhcpcd.conf
Portanto, você não pode conectar as mangueiras ao raspberry para alterar tudo, mas simplesmente crie um ponto de acesso com o nome do chefe e a senha 1234554321. O endereço do raspberry será 192.168.43.174. Além do ssh, você também pode acessar este endereço via VNC: login - pi, senha - 123qweasdzxcV.
Vamos configurar o mestre ROSUma pequena observação para aqueles que não encontraram o ROS (sistema de operação robótica). Um mestre de ROS é um intermediário através do qual nós diferentes se comunicam em ros (nós, serviços, etc.) Se o mestre de ros não estiver em execução ou em execução no endereço errado, os nós não se verão.
Em nosso sistema ROS, o assistente inicia automaticamente com o carregamento do sistema operacional e tudo o que é necessário para nós é especificar o endereço IP do assistente ROS no arquivo de sistema correspondente.
Se você não alterou as configurações de rede listadas acima, não precisará configurar nada.
Caso contrário, edite o bashrc:
nano ~/.bashrc
No final do arquivo, corrija os endereços IP (ambos) para o seu caso:
export ROS_MASTER_URI=http://192.168.43.174:11311 export ROS_HOSTNAME=192.168.43.174
Reinicie.
Agora, ao iniciar o terminal no carrinho, a saída será assim (ou o que você especificou nas configurações):
For all slaves, "export ROS_MASTER_URI=http://192.168.43.174:11311"
Isso significa que o mestre do ROS funciona no endereço IP especificado.
Controlamos o carrinho em wi-fi
Vamos verificar desde o início que os nós funcionam para nós.
No terminal:
rosnode list
A saída será assim:
/ rosout
/ uno_serial_node
Se nada der resultado, verifique se você registrou o ROS-master nas configurações descritas acima, se conectou a mangueira USB ao arduino, reiniciada.
Após a verificação, execute o 1º nó responsável pelo movimento:
rosrun rosbots_driver part2_cmr.py
* comando ros especial lança o arquivo part2_cmr.py do pacote python rosbots_driver
O sistema informará que o nó está executando:

Aqui você pode ver que o raio das rodas e a distância entre elas são determinados. Você pode corrigir esses valores, bem como outros relacionados ao movimento no arquivo robot.py ao longo do caminho
/home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/examples/coursera_control_of_mobile_robots/part2/full/controller
já que o próprio part2_cmr.py não possui esses parâmetros. Abra o segundo terminal e entre na lista rostópica:

Aqui você pode ver que o tópico / part2_cmr / cmd_vel apareceu. Neste tópico, / part2_cmr "escuta" o que outros nós dirão a ele e, dependendo do que eles dizem, controlará o movimento. O que exatamente "escuta", mas não "fala" pode ser entendido usando o comando
rostopic info /part2_cmr/cmd_vel

Aqui você pode ver o assinante / part2_cmr (inscrito) no tópico e ouvir.
* Você pode "dizer" algo sobre o tópico, sem nós.
Por exemplo:
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 1.0}'
vire para a frente com a roda esquerda
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 0.0}'
pare a roda esquerda
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -1.0}'
Volte para trás com uma roda
rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -0.5}'
Volte com a roda esquerda mais lenta.
A sintaxe é: pub rostópico - desejo de falar no tópico, -1 - desejo único, / wheel_power_left - tópico em que dizemos, std_msgs / Float32 - idioma (formato da mensagem), '{data: -0.5}' - o que dizemos.
Agora execute o que falará no tópico / part2_cmr / cmd_vel. Este será o nó de envio do comando do teclado.
Sem fechar o terminal anterior com um nó ativo, execute outro e digite:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel
* Como a publicação é por padrão no tópico / cmd_vel, nós a redirecionamos usando
/ cmd_vel: = / part2_cmr / cmd_vel para que as mensagens sejam inseridas em / part2_cmr / cmd_vel.
O nó de controle foi iniciado e você pode montar pressionando as teclas do teclado:

Se for impossível dirigir ou houver um ruído sutil por baixo das rodas, você precisará aumentar a velocidade clicando em "w" no terminal com o nó em execução. O mesmo (aumentar ou diminuir) pode ser feito com a velocidade de rotação - o botão “e”. Também é importante estar em um terminal com um nó em execução se os botões de controle não funcionarem se você alternar para outro terminal. O botão "k" no terminal de controle é uma parada.
Em um terminal separado, observe o tópico / part2_cmr / cmd_vel:

Agora, no tópico / part2_cmr / cmd_vel, há um orador e um ouvinte.
Montando a linha no OpenCV
Antes de ir a algum lugar, você precisa garantir que o robô viaje com o controle do teclado. Uma observação importante é necessária aqui. Ao controlar a partir do teclado no exemplo acima, girar para a esquerda deve corresponder a pressionar a tecla j, para a direita l (latim l), avançar i, voltar, (vírgula). Se esse não for o seu caso, pode haver problemas com a viagem. Para trazer tudo de volta ao normal, é necessário alterar os pares de fios provenientes do motorista do motor para as pernas do arduino em nosso hambúrguer 4,5,6,7 arduino: 4,5 para trocar com 6,7 ou 4 e 5,6 e 7 cada um com outro dependendo de onde as rodas girarão. Você também pode fazer isso programaticamente ajustando o código do arduino no caminho - /home/pi/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver/src/main.cpp
e recarregando-o no arduino com o comando:
upload_firmware ~/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver
Vamos trabalhar com floresNossa experiência em jardinagem será destacar a linha no chão que o robô percorrerá, para determinar sua cor. Por padrão, o robô não o vê. Como uma linha, você pode usar fita adesiva (amarela) ou fita, ou qualquer outra coisa com uma cor característica e bastante ampla. * É improvável que a fita adesiva transparente funcione, porque será difícil distinguir do plano de fundo.
Vamos para a pasta e execute o script:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python bgr-to-hsv.py
* Atenção! Se você usar a imagem original de rosbots, e não a minha, este programa não estará lá.
Duas janelas se abrirão:

Aqui estão as faixas de cores em HSV. O que é hsv e por que não rgb, pesquise no google você mesmo.
h1, s1, v1 - inferior e h2, s2, v2 - respectivamente, a faixa superior.
Agora você precisa selecionar uma linha com fita isolante (talvez não fita, mas fita adesiva) no chão movendo os controles deslizantes da janela. Somente a linha de fita isolante deve permanecer na janela de resultado:

A linha de fita isolante é estranhamente branca, todo o resto é preto. Este resultado é necessário.
Grave, lembre-se dos números das faixas HSV. Meu caso é 56.155,40 e 136.255.255. As faixas HSV serão diferentes sob diferentes condições de iluminação próximas à câmera do robô.
Feche as janelas digitando ctrl + c no terminal e adicione os intervalos HSV ao arquivo follow_line_step_hsv.py:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver nano follow_line_step_hsv.py
Nas linhas:
lower_yellow = np.array([21,80,160]) upper_yellow = np.array([255,255,255])
Colocamos os números de nossas faixas HSV.
Hora de andar na linhaIniciamos o nó do motor no terminal 1:
rosrun rosbots_driver part2_cmr.py
Inicie o nó da câmera no segundo terminal:
sudo modprobe bcm2835-v4l2 roslaunch usb_cam usb_cam-test.launch
Execute o nó opencv no terceiro terminal:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_line_step_hsv.py
Se tudo correu bem, o robô seguirá a linha e uma janela adicional aparecerá:

Nesta janela, a fita elétrica será marcada com um círculo vermelho.
O significado geral do código é destacar o segmento de cores a uma certa distância da câmera, desenhar um círculo vermelho e ir para esse círculo, tentando mantê-lo no centro.
Finalmente, sobre o importante - sobre gatos e sorrisos
Como nosso objetivo é ir ao gato ou a uma pessoa sorridente, teremos que usar algo mais complicado em nosso código. Também precisaremos de gatos e pessoas sorridentes. O segundo agora é mais difícil: poucas pessoas sorriem neste momento difícil e alarmante. Então, vamos começar com gatos.
Para experimentos, fotos de gatos no rosto são adequadas.
Execute o nó da câmera no 1º terminal:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python pi_camera_driver.py
No segundo terminal, o nó do motor:
rosrun rosbots_driver part2_cmr.py
No terceiro terminal do nó de pesquisa de gato:
cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_cat2.py
O carrinho irá se mover gradualmente para o gato:

Agora você precisa de um voluntário que saiba sorrir. Tire um retrato de uma figura pública pouco conhecida em um país pequeno.
No terceiro terminal do nó de pesquisa do gato, você pode fechar - ctrl + ce começar a procurar um sorriso no rosto de uma pessoa pública pouco conhecida:
python follow_smile.py
O carrinho terá que dirigir devagar, incrédulo, para o sorriso de uma pessoa pouco conhecida:

Como muitos já devem ter adivinhado, os scripts que executamos usam as cascatas Haar. Pelo mesmo princípio de uma viagem ao longo da linha, um quadrado da área desejada é destacado e o programa tenta mantê-lo no centro movendo o robô.
Infelizmente, o desempenho no raspberry 3b deixa muito a desejar, apesar das configurações da câmera de 320x240 e 15 Fps. Atrasos são visíveis com o aumento do tempo. Nem todo gato aguenta.
Como isso pode ser melhorado?
Tente recriar o opencv otimizado, como recomenda Adrian (https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/)? Usar recursos externos do PC para processamento de imagem? Tente não compactar imagens em jpeg que voam para o manipulador Haar? E mais um grande menos - os gatos devem ser grandes e na frente. Distância de 15 cm em folha A4. Ao se afastar da câmera, o gato já é irreconhecível e invulnerável. Colocar um monóculo de framboesa na câmera com ampliação de 8x?
PS: Se você começar suas experiências com a imagem fornecida no artigo, ainda poderá andar por diferentes partes do corpo, iniciando em vez do nó do gato:
python follow_fullbody.py python follow_upperbody.py python follow_lowerbody.py
face ou olho:
python follow_face.py python follow_right_eye.py
Se você estiver interessado em como se afastar sem problemas para que o robô não derrame chá, bem como em como operá-lo não com a própria framboesa, escreva.