Boa tarde, queridos leitores de Habr!Continuo uma série de artigos sobre o uso prático de ROS no Raspberry Pi ( primeiro artigo , segundo artigo ).Neste artigo, usaremos o pacote teleop_twist_keyboard da pilha ros-teleop para controlar o robô pressionando as teclas do teclado. A pilha ros-teleop inclui, além deste pacote, vários outros pacotes para vários métodos de controle, por exemplo, usando o joystick. Quem está pronto para começar a estudar teleop_twist_keyboard, por favor, sob cat.Multiterminal com tmux
Enquanto isso, quero falar sobre um truque que permite trabalhar remotamente no Raspberry Pi via SSH ao mesmo tempo em vários terminais. Para fazer isso, instale o utilitário tmux no RPi.$ sudo apt-get install tmux
Depois disso, execute o utilitário:$ tmux
Uma barra verde deve aparecer na parte inferior da janela do terminal com o número 0. 0.tmux é um gerenciador de janelas do terminal muito conveniente que permite criar qualquer número de janelas em uma janela do terminal, colocando-as de várias maneiras diferentes (janela do terminal (janela), painel da janela ( painel)) e é conveniente alternar entre eles.Pressione Ctrl + B e C. Outra janela deve aparecer com o número 1. Tente também a combinação de Ctrl + B e%. A janela atual do terminal será dividida no meio por uma faixa verde vertical em duas janelas (painel). Se você pressionar a combinação Ctrl + B,: e inserir "janela dividida", a janela será dividida horizontalmente em duas janelas idênticas. Para remover um painel (painel), use a combinação Ctrl + B, X e pressione Y. Para alternar para outro painel na mesma janela, use a combinação Ctrl + B, O. Para alternar entre janelas de terminal pelo número da janela, use a combinação Ctrl + B, <número da janela>.Agora adicione o lançamento do programa ao arquivo ~ / .bashrc para iniciar automaticamente quando você abrir um novo terminal. Adicione as seguintes linhas ao arquivo:[[ $TERM != "screen" ]] && exec tmux
Trabalhando com teleop_twist_keyboard
Agora vamos nos familiarizar com o pacote teleop_twist_keyboard.Execute o script teleop_twist_keyboard.py a partir do pacote teleop_twist_keyboard como um nó ROS comum:$ roscore
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
Temos uma conclusão como esta:Reading from the keyboard and Publishing to Twist!
---------------------------
Moving around:
u i o
j k l
m , .
q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
anything else : stop
CTRL-C to quit
Vamos listar todos os tópicos ativos no momento:$ rostopic list
O tópico / cmd_vel deve aparecer na lista. Neste tópico, o nó teleop_twist_keyboard publica mensagens cada vez que uma tecla é pressionada no teclado.Vamos mostrar a saída das mensagens publicadas no tópico / cmd_vel:$ rostopic echo cmd_vel
Execute rqt_graph para representar o gráfico computado do ROS na forma gráfica. O diagrama do gráfico computacional mostra todos os nós e tópicos ativos que os conectam.$ rosrun rqt_graph rqt_graph
Aqui vemos que o nó teleop_twist_keyboard publica mensagens para o tópico / cmd_vel e o nó rostopic assina este tópico (comando rostopic echo).Vamos descobrir que tipo de mensagens são publicadas no tópico / cmd_vel:$ rostopic type /cmd_vel
O comando emitirá a linha:geometry_msgs/Twist
Isso significa que as mensagens são do tipo Twist do pacote ROS padrão geometry_msgs.Também podemos obter informações sobre a estrutura da mensagem com o comando rosmsg:$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
O campo 'linear' é responsável pela velocidade linear, 'angular' é pela velocidade angular.Pressione a tecla 'i', a saída será assim (associada ao avanço):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Pressione a tecla 'k', a saída será assim (parada):linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
Pressione a tecla 'u', a saída será assim (vire à esquerda):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0
---
E, finalmente, quando você pressiona a tecla 'o', obtemos a seguinte saída (vire à direita):linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -1.0
---
As teclas 'j' e 'l' são responsáveis por virar à esquerda e à direita no lugar (sem avançar).Controle de robô de teclado com teleop_twist_keyboard
Eu já escrevi o esboço rosserial para controlar o robô pressionando as teclas. Simplesmente subscrevemos o tópico / cmd_vel e, dependendo do valor recebido de cada uma das velocidades, damos o comando necessário ao controlador de movimento (avançar, parar, virar à esquerda ou à direita). O esboço pode ser baixado aqui .Vamos analisar o código do esboço com mais detalhes.No início do arquivo, além do arquivo de cabeçalho ros.h padrão, conectamos dois arquivos adicionais aos tipos de mensagem geometry_msgs / Twist.he geometry_msgs / Vector3.h:#include <geometry_msgs/Twist.h>
#include <geometry_msgs/Vector3.h>
Declaramos um manipulador de nó ros :: NodeHandle:ros::NodeHandle nh;
O valor principal é o método messageCb:void messageCb(const geometry_msgs::Twist& message)
{
geometry_msgs::Vector3 linear = message.linear;
float forward_vel = float(linear.x);
if(forward_vel == 0) { stop(); return; }
geometry_msgs::Vector3 angular = message.angular;
float ang_vel = float(angular.z);
if(ang_vel > 0) { turnLeft(); }
else if(ang_vel < 0) { turnRight(); }
else { goForward(); }
}
Neste método, processamos a mensagem recebida do tópico cmd_vel. Na variável forward_vel, mantemos a velocidade linear, na variável angular - angular. A velocidade linear nos permite rastrear o comando de parada (valor 0). A velocidade angular determina a direção da rotação (se maior que 0, depois vire à esquerda, menor que 0 - direita, se 0 - avançar).Crie um assinante para o topic / cmd_vel:ros::Subscriber<geometry_msgs::Twist> sub("/cmd_vel", &messageCb);
com uma referência ao método de processamento de mensagens (messageCb) e o tipo de mensagem recebida - geometry_msgs :: Twist.No final do script, os métodos de esboço padrão para rosserial_arduino são os seguintes:nh.initNode();
nh.subscribe(sub);
Serial.begin(57600);
Execute o servidor rosserial_arduino:$ rosrun rosserial_python serial_node _port:=/dev/ttyACM0
e faça o upload do esboço no quadro do Arduino.Alterne para o terminal em que o nó teleop_twist_keyboard está em execução, tente pressionar as teclas 'u', 'i', 'o' e 'k' e verifique a saída do servidorossensor no terminal.Assim, usando o pacote teleop_twist_keyboard, agora podemos executar o controle remoto simples do robô transmitindo comandos de movimento: avançar, parar, virar à esquerda ou à direita. No futuro, aprenderemos como controlar o robô usando o joystick, o que é muito mais conveniente usando outro pacote no ROS. Mas mais sobre isso no próximo artigo.