• Nenhum resultado encontrado

ROS Robot Operating System. Diones Fischer Felipe Almeida Luan Silveira Matheus Longaray Silvia S. C. Botelho

N/A
N/A
Protected

Academic year: 2021

Share "ROS Robot Operating System. Diones Fischer Felipe Almeida Luan Silveira Matheus Longaray Silvia S. C. Botelho"

Copied!
57
0
0

Texto

(1)

ROS

Robot Operating System

Diones Fischer

Felipe Almeida

Luan Silveira

Matheus Longaray

Silvia S. C. Botelho

(2)

Dificuldades na criação de softwares robóticos:

Cada robô possui um protocolo de comunicação

Cada câmera captura a imagem em um formato

diferente

Como rodar os vários sensores em computadores

diferentes?

Como gerenciar a comunicação entre eles?

Cada novo sistema deve ser implementado do zero?

(3)

ROS = Robot Operating System

Plataforma Distribuída

Provê abstrações na troca de mensagens

Drivers para dispositivos

Manipulação de arquivos

(4)

Experimental:

OS X (Homebrew)

Gentoo

Android

Debian

Suportado:

Ubuntu 12.04 e anteriores.

Onde eu posso rodar o ROS?

Arch Linux

OpenSUSE

Fedora

(5)

Distribuições do ROS

ROS Box Turtle

, released March 2, 2010

ROS C Turtle

, released August 2, 2010

ROS Diamondback

, released March 2, 2011

ROS Electric Emys

, released August 30, 2011

ROS Fuerte Turtle

, released April 23, 2012

(6)

Packages:

Entidade de mais baixo nível na organização do software ROS.

Pode conter bibliotecas, ferramentas, executáveis, etc.

Manifest:

É a descrição de um pacote. Sua função mais importante é

definir dependências entre pacotes.

Stack:

Coleção de pacotes, que formam uma biblioteca de mais alto

nível.

Stack Manifest:

Igual ao manifesto de um package, para descrever uma stack.

(7)
(8)

Qualquer executável que utilize o framework

ROS.

Conceitos Básicos - Nodo

Nodo

1

Nodo

2

Nodo

3

Nodo

4

roscore

(9)

Mecanismo para troca de mensagens entre os

nodos

Modelo Publisher/Subscriber

Ex. Distribuição da imagem de uma câmera

Conceitos Básicos - Tópico

Publisher

Subscriber

Subscriber

Subscriber

(10)

Mecanismo para troca de mensagens entre os

nodos

Conceitos Básicos - Tópico

Publisher

Subscriber

Subscriber

Subscriber

Tópico

(11)

Mecanismo para requisição e resposta

Modelo Cliente/Servidor

Ex. Um nodo precisa saber a hora em um servidor central

Conceitos Básicos - Serviço

Cliente

Service

Servidor

Requisição

(12)

Mecanismo para requisição e resposta

Conceitos Básicos - Serviço

Cliente

Service

Servidor

Requisição

Resposta

(13)

● Meio de comunicação do ROS

● Todas as mensagens são definidas em

arquivos de texto

● Suporta:

Dados primitivos (int, float, strings)

Outras mensagens anteriormente definidas

Array de dados

(14)

GridCells

Odometry

Image

LaserScan

PointCloud

PoseArray

Polygon

E mais...

(15)
(16)

roscore

É o núcleo do ROS

Gerencia a comunicação entre os nodos

Ex.: roscore -p 1234

roslaunch

Ferramenta para lançar nodos

Inicia roscore automaticamente

Ex.: roslaunch <package> file.launch

(17)

roscreate-pkg

Cria novo diretório do pacote

Inclui automaticamente arquivos build e manifest

Ex.: roscreate-pkg <package> depend1 depend2

(roscreate-pkg turtlesim roscpp std_msgs ...)

rosdep

Instala dependências de um pacote

Ex.: rosdep <package> (rosdep turtlesim )

(18)

rosmake

Utilizado para compilar um pacote

Ex.: rosmake <package> (rosmake turtlesim )

rosrun

Utilizado para executar um nodo

Ex.: rosrun <package> <nodo> (rosrun turtlesim

turtlesim_node )

(19)

roscd

Utilizado para navegar no sistema de arquivos

Ex.: roscd <filename> (roscd turtlesim)

rosls

Utilizado para listar os arquivos de um diretório

Ex.: rosls <filename> (rosls turtlesim)

(20)

rostopic

Divulga informações sobre tópicos disponíveis

Diversidade de comandos

echo: mostra mensagens de um tópico

Ex.:

rostopic echo /topic_name

list: lista todos tópicos disponíveis

Ex.:

rostopic list

pub: publica mensagem no tópico

Ex.:

rostopic pub -r 10 /topic_name std_msgs/String Hello

info: mostra informações de um tópico

Ex.:

rostopic info /topic_name

(21)

Executando um exemplo

Em um terminal, execute o roscore:

Em outro terminal, vamos compilar e executar o pacote turtlesim:

Em um novo terminal, execute o nodo responsável pelo controle da tartaruga.

roscore

rosrun turtlesim turtle_teleop_key rosmake turtlesim

rosrun turtlesim turtlesim_node

O último terminal permite mover a

tartaruga utilizando as setas

(22)

Criando um Publisher/Subscriber

Em um terminal, crie um pacote:

Vá para o diretório do pacote, digitando:

roscreate-pkg tutorial_ros roscpp std_msgs

(23)

Criando um Publisher/Subscriber

talker.cpp

#include "ros/ros.h"

#include "std_msgs/String.h" #include <string>

int main(int argc, char **argv){ ros::init(argc, argv, "talker"); ros::NodeHandle n;

ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); ros::Rate loop_rate(10);

std_msgs::String msg;

msg.data = std::string("Hello World");

while(ros::ok()){ chatter_pub.publish(msg); ros::spinOnce();loop_rate.sleep(); } return 0; }

(24)

Criando um Publisher/Subscriber

talker.cpp

#include "ros/ros.h"

#include "std_msgs/String.h" #include <string>

int main(int argc, char **argv){ ros::init(argc, argv, "talker"); ros::NodeHandle n;

ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); ros::Rate loop_rate(10);

std_msgs::String msg;

msg.data = std::string("Hello World");

while(ros::ok()){ chatter_pub.publish(msg); ros::spinOnce();loop_rate.sleep(); } return 0; }

Inicialização do ROS, com o nome do nodo Criação do tópico chatter, para envio de mensagens

Criação da mensagem Publicação da mensagem

(25)

Criando um Publisher/Subscriber

listener.cpp

#include "ros/ros.h"

#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str());

}

int main(int argc, char **argv){ ros::init(argc, argv, "listener"); ros::NodeHandle n;

ros::Subscriber sub = n.subscribe("chatter", 1000,chatterCallback); ros::spin();

return 0; }

(26)

Criando um Publisher/Subscriber

listener.cpp

#include "ros/ros.h"

#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str());

}

int main(int argc, char **argv){ ros::init(argc, argv, "listener"); ros::NodeHandle n;

ros::Subscriber sub = n.subscribe("chatter", 1000,chatterCallback); ros::spin();

return 0; }

Função callback para tratamento das mensagens recebidas

Inicialização do ROS, com o nome do nodo

Inscrição no tópico chatter. A partir de agora o nodo irá receber todas as mensagens enviadas para esse tópico.

(27)

Com qualquer editor de texto, abra o arquivo

CMakeLists.txt.

Adicione as seguintes linhas:

○ rosbuild_add_executable(talker src/talker.cpp)

○ rosbuild_add_executable(listener src/listener.cpp)

Compile o pacote, digitando:

Criando um Publisher/Subscriber

(28)

Execute o roscore:

Em um novo terminal, execute:

Em um outro terminal, execute:

Criando um Publisher/Subscriber

roscore

rosrun tutorial_ros talker

(29)

Criando um Service/Client

Em um terminal, crie um pacote:

Vá para o diretório do pacote, digitando:

Crie uma pasta srv:

roscreate-pkg tutorial_2_ros roscpp std_msgs

roscd tutorial_2_ros

(30)

Criando um Service/Client

Ao invés de criarmos um novo serviço, iremos copiar

um serviço existente:

Para gerar o serviço, abra com um editor de texto o

arquivo CMakeLists.txt

Remova o # para descomentar a seguinte linha:

roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.

srv

(31)

Criando um Service/Client

service.cpp

#include "ros/ros.h"

#include "tutorial_2_ros/AddTwoInts.h"

bool add(tutorial_2_ros::AddTwoInts::Request &req, tutorial_2_ros::AddTwoInts::Response &res ) {

res.sum = req.a + req.b;

ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b); ROS_INFO("sending back response: [%ld]", (long int)res.sum); return true;

}

int main(int argc, char **argv) {

ros::init(argc, argv, "add_two_ints_server"); ros::NodeHandle n;

ros::ServiceServer service = n.advertiseService("add_two_ints", add); ROS_INFO("Ready to add two ints.");

ros::spin(); return 0; }

(32)

Criando um Service/Client

service.cpp

#include "ros/ros.h"

#include "tutorial_2_ros/AddTwoInts.h"

bool add(tutorial_2_ros::AddTwoInts::Request &req, tutorial_2_ros::AddTwoInts::Response &res ) {

res.sum = req.a + req.b;

ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b); ROS_INFO("sending back response: [%ld]", (long int)res.sum); return true;

}

int main(int argc, char **argv) {

ros::init(argc, argv, "add_two_ints_server"); ros::NodeHandle n;

ros::ServiceServer service = n.advertiseService("add_two_ints", add); ROS_INFO("Ready to add two ints.");

ros::spin(); return 0; }

Serviço

Inicialização do ROS

Entra em loop, aguardando requisições

(33)

Criando um Service/Client

client.cpp

#include "ros/ros.h"

#include "tutorial_2_ros/AddTwoInts.h" #include <cstdlib>

int main(int argc, char **argv) {

ros::init(argc, argv, "add_two_ints_client"); if (argc != 3)

{

ROS_INFO("usage: add_two_ints_client X Y"); return1;

}

ros::NodeHandle n;

ros::ServiceClient client = n.serviceClient<tutorial_2_ros::AddTwoInts>("add_two_ints"); tutorial_2_ros::AddTwoInts srv;

srv.request.a = atoll(argv[1]); srv.request.b = atoll(argv[2]); if (client.call(srv))

{

ROS_INFO("Sum: %ld", (longint)srv.response.sum); }

else

{

ROS_ERROR("Failed to call service add_two_ints"); return1;

}

return0; }

(34)

Criando um Service/Client

client.cpp

#include "ros/ros.h"

#include "tutorial_2_ros/AddTwoInts.h" #include <cstdlib>

int main(int argc, char **argv) {

ros::init(argc, argv, "add_two_ints_client"); if (argc != 3)

{

ROS_INFO("usage: add_two_ints_client X Y"); return1;

}

ros::NodeHandle n;

ros::ServiceClient client = n.serviceClient<tutorial_2_ros::AddTwoInts>("add_two_ints"); tutorial_2_ros::AddTwoInts srv;

srv.request.a = atoll(argv[1]); srv.request.b = atoll(argv[2]); if (client.call(srv))

{

ROS_INFO("Sum: %ld", (longint)srv.response.sum); }

else

{

ROS_ERROR("Failed to call service add_two_ints"); return1;

}

return0; }

Descrição do tópico à ser requisitado Inicialização do ROS

Realiza requisição do serviço. Chamadas de serviço são bloqueantes, então se a chamada for sucedida, call() retornará verdadeiro e o valor srv.response será válido.

Instanciação da classe Serviço. Classe contém dois membros: request e response.

(35)

Na pasta src, crie o arquivo service.cpp e client.cpp

Com qualquer editor de texto, abra o arquivo

CMakeLists.txt.

Adicione as seguintes linhas:

○ rosbuild_add_executable(client src/client.cpp)

○ rosbuild_add_executable(service src/service.cpp)

Compile o pacote, digitando:

Criando um Service/Client

(36)

Execute o roscore:

Em um novo terminal, execute:

Em um outro terminal, execute:

Criando um Service/Client

roscore

rosrun tutorial_2_ros service

(37)

Ferramentas de Visualização

rxgraph

Mostra uma visualização dos nodos que estão sendo executados

no ROS.

Uso:

rxgraph [opções]

Opções:

-o nomedoarquivo

(38)
(39)

Ferramentas de Visualização

rxconsole

É um visualizador que mostra as mensagens que estão sendo

publicadas ao longo do tempo, e permite uma visualização mais

detalhada delas.

Uso:

(40)
(41)

Ferramentas de Visualização

rxbag

É uma ferramenta de interface com o usuário que permite

visualizar, inspecionar e rever um histórico de mensagens do ROS.

Uso:

rxbag nomedoarquivo

rxbag [opções]

Exemplo: rxbag --record /nomedotópico

(42)
(43)

Ferramentas de Visualização

rxplot

É uma ferramenta do pacote rxtools que serve para plotar

informações de nodos do ROS.

Uso:

rxplot /topixo1/campo1 /topico2/campo2

rxplot /topixo1/campo1,/topico2/campo2

rxplot /topixo1/campo1:campo2:campo3

(44)
(45)

Ferramentas de Visualização

rviz

É uma ferramenta para ambientes 3D do ROS.

Uso:

a.

compilar:

rosmake rviz

b.

executar:

rosrun rviz rviz

(46)
(47)

rviz

(48)

rviz

Status de um Display:

1.

OK

2.

Warning

3.

Error

4.

Disabled

(49)
(50)
(51)

Biblioteca de visão computacional em tempo real

ROS possui tipo de mensagem próprio

CvBridge biblioteca que provê interface entre ROS e

OpenCV

(52)
(53)

Detecção de círculos

Detecção de linhas (UWSim)

(54)
(55)

Mais Informações

ros.org

youtube.com/user/willowgaragevideo

code.ros.org

(56)

Download da Apresentação

(57)

ROS - Robot Operating System

Obrigado!

Perguntas?

Diones Fischer - dionesf@gmail.com

Felipe Almeida - feliperalmeida@gmail.com

Matheus Longaray - longaray.matheus@gmail.

Referências

Documentos relacionados

O objetivo seguinte, consistiu no estudo da forma mais viável de criação de um conjunto de campos magnéticos variáveis, onde foram estudados ímanes permanentes e eletroímanes

aos Membros através do número de telefone grátis 1-800-587-5187, TTY 711, para solicitar uma cópia do guia do membro.

Para responder à pergunta acima e ajudar seus clientes a adotarem melhores práticas para vencer os desafios digitais do cenário olímpico, a Dynatrace mapeou diferentes tipos de

Em casos excepcionais de iliquidez dos ativos financeiros componentes da carteira do FUNDO, inclusive em decorrência de pedidos de resgates incompatíveis com a liquidez existente,

tl.2 FORMULAÇÃO DAS EQUAÇÕES DE EQUILÍBRIO DINÂMICO USANDO O PRINCÍPIO DE HAMILTON Não tendo sido feita qualquer restrição ao princípio de Hamilton em

1.º Período (todo o período) Treinos e competições no âmbito da Atividade Externa do Clube do Desporto Escolar  Incentivar e promover Atividades

Uso na amamentação: As Tetraciclinas são encontradas no leite materno; portanto, seu uso não é recomendado durante a lactação pela possibilidade de causarem descoloração do

Levando em consideração os aspectos da origem da comunidade em foco, relatos, obras e a memória coletiva do seu povo, aborda esses dados de modo reflexivo e traça um perfil com