Notas de leitura (último livro - livro ROS⑥) "ROS por exemplo v1" Um guia faça você mesmo para o sistema operacional do robô

Este livro é um livro relativamente clássico para aprender ROS, mas sinto que não é o primeiro livro para iniciantes lerem. Como um novato técnico, sempre me sinto confuso quando leio este livro pela primeira vez. No nevoeiro, mesmo agora me sinto o mesmo ao ler a versão v2.

1. O capítulo inicial deste livro responde a uma questão fundamental: por onde começar a aprender ROS?

Etapa 1: Aprenda conceitos básicos e habilidades de programação

Entre eles, no estágio 1, você pode consultar o ROS Wiki para obter instruções de instalação e tutoriais para iniciantes.

Ao mesmo tempo, você também precisa dominar a transformação de coordenadas TF para entender como o ROS lida com diferentes quadros.

Faça perguntas usando respostas ROS

Etapa 2: Usando ROS para controlar o robô

No Estágio 2: Consulte este livro e use o ROS para fazer o robô completar algumas tarefas específicas. O código do livro pode ser aplicado a robôs do mundo real, rotação pan/tilt e câmeras para detecção de rostos. Ao final do livro, o robô que você controla será capaz de navegar autonomamente até sua casa ou escritório, responder aos seus comandos verbais e combinar visão e controle de movimento para rastrear rostos ou seguir pessoas pela casa.

2. Seleção do sistema operacional e versão ROS 

Ubuntu Linux é o sistema operacional ROS oficialmente recomendado pela Open Source Robot Foundation; e Ubuntu é gratuito e fácil de instalar.

Instale o Ubuntu no sistema operacional Windows e troque o sistema operacional ao usá-lo posteriormente.

É melhor instalar o Ubuntu em um computador real para que ele funcione mais rápido.

Instalar o Ubuntu em uma máquina virtual como o VMware não é altamente recomendado, embora seja uma boa abordagem, porque a máquina virtual pode travar ao executar programas intensivos como o Rviz.

3. UtilizeLinux

Procure por "tutorial do Ubuntu" e aprenda a usar o terminal do Ubuntu.

4. Revisão do conceito ROS

As entidades principais do ROS são chamadas de nós. Os nós geralmente são pequenos programas escritos em Python ou C++ que executam algumas tarefas ou processos relativamente simples. Os nós podem ser iniciados e parados independentemente uns dos outros e se comunicam através da passagem de mensagens. Um nó pode publicar mensagens sobre um tópico específico ou fornecer serviços a outros nós.

Por exemplo, um nó editor pode reportar dados de sensores conectados ao microcontrolador do robô. Uma mensagem com valor 0,5 no tópico /head_sonar significa que o sensor está detectando um objeto a 0,5 metros de distância. (ROS usa metros para medir distâncias e radianos para medir ângulos.) Qualquer nó que queira saber o valor deste sensor só precisa se inscrever no tópico /head_sonar. Para utilizar esses valores, o nó assinante define uma função de retorno de chamada que é executada sempre que uma nova mensagem chega no tópico assinado. A frequência com que isso acontece depende da taxa com que o nó editor atualiza suas mensagens.

Um nó também pode definir um ou mais serviços. Quando uma solicitação é enviada de outro nó, o serviço ROS realiza alguma ação ou retorna uma resposta. Um exemplo simples é um serviço que liga ou desliga um LED. Um exemplo mais complexo é um serviço que retorna um plano de navegação para um robô móvel, dada uma posição alvo e a pose inicial do robô.

Os nós ROS de nível superior assinarão muitos tópicos e serviços, combinarão os resultados de maneiras úteis e possivelmente publicarão mensagens ou fornecerão seus próprios serviços. Por exemplo, o nó rastreador de objetos que desenvolveremos mais adiante neste livro assina mensagens de câmera para um conjunto de sujeitos de vídeo e publica comandos de movimento para outro sujeito, que são lidos pelo controlador base do robô para mover o robô na direção apropriada.

5. Arquitetura de publicação/assinatura ROS

Ao usar o ROS, o primeiro passo é particionar o comportamento desejado em funções independentes que podem ser tratadas por nós separados. Por exemplo, se o seu robô usa uma webcam ou uma câmera de profundidade, como Kinect ou Xtion Pro, um nó se conectará à câmera e simplesmente publicará a imagem e/ou dados de profundidade para que outros nós possam usá-los. Se o seu robô usar uma base móvel, o nó controlador da base escutará os comandos de movimento de um sujeito e controlará os motores do robô para movê-lo de acordo. Esses nós podem ser usados ​​em muitas aplicações diferentes sem modificação, desde que o comportamento desejado exija controle visual e/ou de movimento.

6. inicie o arquivo de inicialização

Para executar o aplicativo, usamos um arquivo de inicialização ROS para iniciar toda a coleção de nós como um grupo. Lembre-se de que os arquivos de inicialização também podem conter outros arquivos de inicialização para facilitar a reutilização do código existente em novos aplicativos.

7. Unidades e sistemas de coordenadas

Antes de podermos enviar comandos de movimento ao nosso robô, precisamos observar as unidades de medida e as convenções do sistema de coordenadas usadas no ROS.

Ao usar um referencial, lembre-se de que o ROS usa a convenção da mão direita para orientar os eixos, conforme mostrado na imagem à esquerda. O dedo indicador e o dedo médio apontam para a direção positiva do eixo xey, e o polegar aponta para a direção positiva do eixo z. A direção de rotação em torno de um eixo é definida pela regra da mão direita mostrada à direita: se você apontar o polegar na direção positiva de qualquer eixo, seus dedos dobrarão na direção da rotação positiva. Para um robô móvel usando ROS, o eixo x aponta para frente, o eixo y aponta para a esquerda e o eixo z aponta para cima. De acordo com a regra da mão direita, a rotação positiva do robô em torno do eixo z é no sentido anti-horário, enquanto a rotação negativa é no sentido horário.

      

O ROS usa o sistema métrico, portanto a velocidade linear é sempre especificada em metros por segundo (m/s) e a velocidade angular em radianos por segundo (rad/s). Para um robô interno (cerca de 1,1 mph), uma velocidade linear de 0,5 m/s é na verdade bastante rápida, enquanto uma velocidade angular de 1,0 rad/s é equivalente a aproximadamente uma rotação em 6 segundos ou 10 RPM. Na dúvida, comece devagar e aumente gradativamente a velocidade. Para robôs internos, tendo a manter a velocidade linear máxima em 0,2 m/s ou menos.

 8. Nível de controle de movimento

A maioria dos robôs de acionamento diferencial que executam ROS usa codificadores nos motores de acionamento ou nas rodas. O codificador registra um certo número de ticks (geralmente centenas ou até milhares) por revolução da roda correspondente. Conhecendo o diâmetro das rodas e a distância entre elas, a escala do encoder pode ser convertida em distância percorrida em metros ou ângulo de rotação em radianos. Para calcular a velocidade, esses valores são simplesmente divididos pelo intervalo de tempo entre as medições.

Esses dados de movimento interno são chamados coletivamente de odometria e o ROS os utiliza extensivamente. Ajuda se o seu robô tiver codificadores precisos e confiáveis, mas os dados da roda podem ser aumentados com outras fontes. Por exemplo, o TurtleBot original usava um giroscópio de eixo único para fornecer medições adicionais do movimento rotacional do robô, porque o codificador do iRobot Create era significativamente impreciso durante a rotação.

Não importa quantas fontes de dados de odometria sejam usadas, a posição e velocidade reais do robô no mundo podem (e provavelmente irão) diferir dos valores relatados pela odometria. O grau de diferença variará dependendo das condições ambientais e da confiabilidade da fonte do hodômetro.

9. Torça e gire usando ROS

O ROS usa o tipo de mensagem Twist para emitir comandos de movimento usados ​​por controladores básicos. O tópico é /cmd_vel, que é a abreviação de "Command Velocity". O nó controlador base assina o tópico /cmd_vel e converte mensagens Twist em sinais de motor que realmente giram as rodas.

Para visualizar os componentes de uma mensagem Twist, execute o seguinte comando:

$ rosmsg show geometry_msgs/Twist

Isso produzirá a seguinte saída:

geometry_msgs/Vector3 linear

float64 x

float64 y

float64 z

geometry_msgs/Vector3 angular

float64 x

float64 y

float64 z

Como você pode ver, a mensagem Twist consiste em duas submensagens do tipo Vector3, uma para os componentes da velocidade linear x, y e z e outra para os componentes da velocidade angular x, y e z. A velocidade linear é medida em metros por segundo e a velocidade angular é medida em radianos por segundo. (Um radiano é aproximadamente igual a 57 graus.)

Para um robô acionado diferencialmente operando em um plano bidimensional (como um piso), precisamos apenas da componente linear x e da componente angular z. Isso ocorre porque esse tipo de robô só pode se mover para frente/trás ao longo de seu eixo longitudinal e só pode girar em torno de seu eixo vertical. Em outras palavras, as componentes lineares y e z são sempre zero (o robô não pode se mover lateralmente ou verticalmente), enquanto as componentes angulares x e y são sempre zero porque o robô não pode girar em torno desses eixos. Um robô omnidirecional também usará o componente linear y, enquanto um robô aéreo ou subaquático usará todos os seis componentes.

Exemplo de mensagem torcida

Suponha que queiramos que o robô avance em linha reta a uma velocidade de 0,1 metros por segundo. Isso exigiria uma mensagem Twist com valores lineares x=0,1, y=0 e z=0 e valores angulares x=0, y=0 e z=0. Se você especificasse esta mensagem do Twist na linha de comando, a parte da mensagem teria o seguinte formato:

'{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'

Observe como usamos chaves para descrever submensagens e dois pontos e um espaço (espaços são necessários!) para separar o nome do componente de seu valor. Embora possa parecer muita digitação, raramente controlamos robôs dessa maneira. Mensagens Twist serão enviadas ao robô usando outros nós ROS.

Para girar no sentido anti-horário a uma velocidade angular de 1,0 radianos por segundo, a mensagem Twist necessária seria:

'{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1.0}}'

Se combinarmos essas duas informações, o robô avançará enquanto vira à esquerda. A mensagem Twist gerada será:

'{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 1.0}}'

Quanto maior o valor angular de z, mais estreita será a curva em comparação com o valor linear de x.

10. Usando Odometria

Quando pedimos a um robô que se mova ou gire a uma determinada velocidade, como sabemos que ele está realmente fazendo o que pedimos? Por exemplo, se publicarmos uma mensagem Twist para fazer o robô avançar a 0,2 m/s, como saberemos que o robô não está realmente se movendo a 0,18 m/s? Como sabemos que ambas as rodas estão viajando na mesma velocidade?

O nó controlador básico do robô usa odometria e controle PID para traduzir solicitações de movimento em velocidades reais. A precisão e a confiabilidade deste processo dependem dos sensores internos do robô, da precisão do procedimento de calibração e das condições ambientais. (Por exemplo, algumas superfícies podem permitir um ligeiro deslizamento das rodas, o que perturba o mapeamento entre as contagens do codificador e a distância percorrida.)

A odometria interna do robô pode complementar medições externas da posição e/ou orientação do robô. Por exemplo, marcadores visuais montados na parede podem ser usados, por exemplo, como benchmarks juntamente com os pacotes ROS ar_pose, ar_kinect ou ar_track_alvar para fornecer um posicionamento bastante preciso do robô dentro de uma sala.

Técnicas semelhantes usam correspondência visual de recursos sem a necessidade de rotulagem manual (ccny_rgbd_tools, rgbdslam, RTABMap), enquanto outro pacote (laser_scan_matcher) usa correspondência de varredura a laser. Os robôs externos costumam usar GPS para estimar a localização, entre outras formas de odometria.

Para os fins deste livro, usaremos o termo “Odometria” para nos referirmos aos dados de posição interna. No entanto, não importa como se mede o hodômetro, o ROS fornece um tipo de mensagem para armazenar as informações; nomeadamente nav_msgs/odometer. abreviado

O tipo de mensagem Odometria é definido da seguinte forma:

Header header

string child_frame_id

geometry_msgs/PoseWithCovariance pose

geometry_msgs/TwistWithCovariance twist

Aqui, vemos que a mensagem Odometry consiste em um Header, uma string identificando child_frame_id e duas submensagens, uma para PoseWithCovariance e outra para TwistWithCovariance.

Para visualizar a versão estendida definida, execute o seguinte comando:

$ rosmsg show nav_msgs/Odometry

Isso deve produzir a seguinte saída:

Header header

uint32 seq

time stamp

string frame_id

string child_frame_id

geometry_msgs/PoseWithCovariance pose

geometry_msgs/Pose pose

geometry_msgs/Point position

float64 x

float64 y

float64 z

geometry_msgs/Quaternion orientation

float64 x

float64 y

float64 z

float64 w

float64[36] covariance

geometry_msgs/TwistWithCovariance twist

geometry_msgs/Twist twist

geometry_msgs/Vector3 linear

float64 x

float64 y

float64 z

geometry_msgs/Vector3 angular

float64 x

float64 y

float64 z

float64[36] covariance

A submensagem PoseWithCovariance registra a posição e orientação do robô, enquanto o componente TwistWithCovariance nos fornece as velocidades lineares e angulares que já vimos. Tanto a pose quanto a distorção podem ser complementadas com uma matriz de covariância, que mede a incerteza em várias medições.

Header e child_frame_id definem o quadro de referência que usamos para medir distâncias e ângulos. Ele também fornece um carimbo de data/hora para cada mensagem, para que saibamos não apenas onde estamos, mas quando. Por convenção, as medições de odometria no ROS usam /odom como ID do quadro pai e /base_link (ou /base_footprint) como ID do quadro filho. O quadro /base_link corresponde à parte física real do robô, enquanto o quadro /odom é definido por translações e rotações encapsuladas em dados de odometria. Essas transformações movem o robô em relação ao quadro /odom. Se exibirmos o modelo do robô no RViz e definirmos o quadro fixo para o quadro /odom, a posição do robô refletirá onde o robô "pensa" que está em relação à sua posição inicial.

Acho que você gosta

Origin blog.csdn.net/qq_38250687/article/details/122543533
Recomendado
Clasificación