Size: 7587
Comment:
|
← Revision 107 as of 2020-04-22 02:22:08 ⇥
Size: 9155
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
## page was renamed from UnderstandingNodes ||<#CCE0FF> '''Note:''' This tutorial assumes that you have completed the previous tutorial, [[ROS/Tutorials/CreatingMsgAndSrv|creating a ROS msg and srv]].|| == Understanding ROS Nodes == '''Description:''' This tutorial introduces ROS graph concepts and covers using the [[roscore]], [[rosnode]], [[rxgraph]], and rosrun commandline tools. ##BeginnerCategory '''Tutorial Level:''' BEGINNER '''Next Tutorial:''' [[ROS/Tutorials/UnderstandingTopicsServicesParams| Understanding ROS topics, services, and params]] <<TableOfContents(4)>> === Quick Graph Concepts Overview === * [[Messages]]: ROS data structures * [[Nodes]]: a process in ROS that communicates with other Node processes * [[Topics]]: Topics stream Messages. Nodes can ''publish'' Messages to a Topic as well as ''subscribe'' to Messages. * [[Services]]: A Node can provide a Service, which receives request Message and returns a response Message. * [[Master]]: Name service for ROS (i.e. helps Nodes find each other) * [[Parameter Server]]: centralized dictionary of key/value pairs * [[rosout]]: ROS equivalent of stdout/stderr * [[roscore]]: Master + Parameter Server + rosout === Quick Names Overview === Parameters, Nodes, Topics, and Services all have [[Names]]. Names in ROS are hierarchical, with slashes "`/`" used to denote a namespace. There are three ways in which you will see Names written: * `/global/name`: this is the full, canonical representation of the Name * `relative/name`: a relative name is resolved relative to the Node's namespace. * `~local/name`: a local name, sometimes call 'private' name, uses the Node's name as a new namespace. These Names are sometimes called 'private' as resources with these names are not easily seen by other Nodes. To give a concrete example, inside of a Node named `/wg/robot1/mynode`: * `/foo/bar` resolves to `/foo/bar` * `foo/bar` resolves to `/wg/robot1/foo/bar` * `~foo/bar` resolves to `/wg/robot1/mynode/foo/bar` ROS allows Names to be [[Remapping Arguments|remapped]] at the command-line when Nodes are started. The tutorials on this page will show you how to do this, and why this is powerful. === Quick Environment Variable Setup === * `ROS_MASTER_URI`: this points to the location of the ROS [[Master]]. By default, this is usually `http://localhost:11311`. If you are using ROS to communicate between machines, you will have to point to the correct machine and port. * `ROS_IP`/`ROS_HOSTNAME`: (optional) if you are using multiple machines, you ''may'' have to set this correctly. In particular, many machines default to a name like "foo.local", which isn't visible to other machines. Choosing the value for this variable is easy: set it to whatever you would use in a 'ping' command to ping your machine. === Nodes === A Node really isn't much more than an executable file within a ROS Package, except that it also uses a ROS client library to communicate with other Nodes. In order to get familiar with Nodes, lets startup the [[roscore]]: {{{ $ roscore }}} You will see something similar to: {{{ ... logging to ~/ros/ros/log/3a5749c2-965f-11de-8875-001b21201aa8/roslaunch-aqy-3581.log ... loading XML file [~/ros/ros/tools/roslaunch/roscore.xml] Added core node of type [rosout/rosout] in namespace [/] started roslaunch server http://aqy:56911/ |
## page was copied from ROS/Tutorials/UnderstandingNodes #################################### ##FILL ME IN #################################### ## links to any required tutorials ## note.0= [[pt_BR/ROS/Tutorials/BuildingPackages|Gerando um pacote no ROS]] ## descriptive title for the tutorial ## title = Um pouco mais sobre nós(''nodes'') no ROS ## multi-line description to be displayed in search ## description = Este tutorial apresenta os conceitos introdutórios sobre os componentes básicos do ROS (também referenciados como ROS Graph) e discute o uso das ferramentas utilizadas via terminal: [[roscore]], [[rosnode]] e [[rosrun]]. ## the next tutorial description ## next = ## links to next tutorial ## next.0.link= [[pt_BR/ROS/Tutorials/UnderstandingTopics|Entendendo tópicos no ROS]] ## what level user is this tutorial for ## level= BeginnerCategory #################################### <<IncludeCSTemplate(TutorialCSHeaderTemplate)>> <<TOC(4)>> == Pré-requisitos == Nesse tutorial, utilizaremos um simulador relativamente simples, para isso é necessário a instalação das seguintes dependências: {{{ $ sudo apt-get install ros-<distro>-ros-tutorials }}} Sendo que '<distro>' deve ser substituído pela sua atual distribuição do ROS (hydro, groovy, electric, fuerte, kinetic, lunar ou morenia) == Rápida Revisão Sobre Conceitos do ROS == * [[Nodes|Nó]]: Um nó(''node'') consiste em um executável (aplicação gerada por meio de um código fonte) que utiliza o ROS para realizar a comunicação com outros nó(''node''). * [[Messages|Menssagens]]: Tipos de dados no ROS usados quando se publica ou sobrescreve de tópico. * [[Topics|Tópicos]]: Nós(''node'') podem publicar menssagens em tópicos assim como podem subescrever menssagens de tópicos. * [[Master]]: Service de gerenciamento do sistema do ROS (ex: ajuda os nós a se encontrarem no sistema.) * [[rosout]]: Equivalente do ROS ao stdout/stderr ##ROS equivalent of stdout/stderr * [[roscore]]: Comando para inicializar o Master + rosout + servidor de parâmetros (o conceito de servidos de parâmetros será explicado posteriormente). É um dos comandos para inializar o "sistema" do ROS. ##Master + rosout + parameter server (parameter server will be introduced later) === Nós(''node'') === Um nó(''node'') na verdade é apenas um arquivo executável dentro de um pacote do ROS. Nós(''node'') no ROS usam bibliotecas clientes (''client librarys) para se comunicar com outros nós(''node''). Nós(''node'') podem publicar e/ou subscrever em tópicos, além de poderem prover serviços(''services'') também. === Bibliotecas Clientes (''client librarys'') === As bibliotecas clientes(''client librarys'') do ROS permitem que os nós(''nodes'') em diferentes liguagens se comuniquem: ROS client libraries allow nodes written in different programming languages to communicate: * rospy = bibliotecas clientes(''client librarys'') em Python * roscpp = bibliotecas clientes(''client librarys'') em C++ === roscore === {{{roscore}}} é o comando para inicializar o Master e deve ser a primeira coisa a ser inicializada no ROS Dando o comando no terminal: {{{ $ roscore }}} Deve ser visto algo similiar a isso: . {{{ ... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://machine_name:33919/ ros_comm version 1.4.7 |
Line 65: | Line 72: |
PARAMETERS * /rosversion * /rosdistro |
|
Line 67: | Line 78: |
starting new master (master configured for auto start) process[master]: started with pid [3613] ROS_MASTER_URI=http://aqy:11311/ setting /run_id to 3a5749c2-965f-11de-8875-001b21201aa8 +PARAM [/run_id] by /roslaunch +PARAM [/roslaunch/uris/aqy:56911] by /roslaunch process[rosout-1]: started with pid [3628] |
auto-starting new master process[master]: started with pid [13054] ROS_MASTER_URI=http://machine_name:11311/ setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf process[rosout-1]: started with pid [13067] |
Line 75: | Line 85: |
+SERVICE [/rosout/get_loggers] /rosout http://aqy:53163/ +SERVICE [/rosout/set_logger_level] /rosout http://aqy:53163/ +SUB [/time] /rosout http://aqy:53163/ +PUB [/rosout_agg] /rosout http://aqy:53163/ +SUB [/rosout] /rosout http://aqy:53163/ }}} In a new terminal, let's investigate what typing `roscore` did: |
}}} Se o `roscore` não inicializar, provavelmente existe um problema de configuração de rede. Dê uma olhada em [[http://www.ros.org/wiki/ROS/NetworkSetup#Single_machine_configuration|Network Setup - Single Machine Configuration]] Se o `roscore` não inicializar e enviar uma menssagem sobre falta de permissão, provavelmente a pasta `~/.ros` pertence ao `root`, mude recurssivamente o usuário "dono" da pasta com: {{{ $ sudo chown -R <your_username> ~/.ros }}} |
Line 84: | Line 96: |
`rosnode` displays information about ROS nodes currently running. The `rosnode list` command lists the nodes currently running. | Abra um '''novo terminal''' e use o '''rosnode''' para visualizar o que esta rodando no `roscore`: {{{#!wiki blue/solid '''Note:''' Quando um novo terminal é inicializado, seu ambiente é resetado e seu arquivo `~/.bashrc` é inicializado novamente. Se estiver ocorrendo problemas rodando os comandos como `rosnode`, provavelmente é necessário colocar as configurações de ambiente no seu arquivo `~/.bashrc`ou manualmente reinicializar o arquivo. }}} O comando `rosnode` mostra as informações dos nós(''nodes'') que estão rodando. O commando `rosnode list` lista os nós(''nodes'') que estão ativos no momento. |
Line 89: | Line 106: |
This showed us that there was only one node: [[rosout]]. This is always running as it collects debugging output of Nodes and logs it. {{{ |
Se for visto: . {{{ |
Line 93: | Line 111: |
The `rosnode info` command returns information about a specific node. | Isso mostra que tem apenas um nó(''nodes'') rodando:[[rosout]]. Este nó(''nodes'') esta sempre rodando pois é responsável por coletar as saídas de logs dos nó(''nodes''). O comando `rosnode info` retorna informações sobre um nó(''nodes'') específico. |
Line 97: | Line 118: |
This gave us some more information about `rosout`, such as the fact that it publishes `/rosout_agg`. {{{ -------------------------------------------------------------------------------- |
Nos retorna mais informações sobre `rosout`, como o fato de publicar no `/rosout_agg`. . {{{ ------------------------------------------------------------------------ |
Line 101: | Line 122: |
Line 103: | Line 123: |
* /rosout_agg [roslib/Log] | * /rosout_agg [rosgraph_msgs/Log] |
Line 106: | Line 126: |
* /time [unknown type] | |
Line 113: | Line 132: |
contacting node http://foo.local:54614/ ... | contacting node http://machine_name:54614/ ... |
Line 117: | Line 136: |
Now, lets see some more Nodes. For this, we're going to use `rosrun` to bring up another Node. === Using rosrun === `rosrun` allows you to directly run a node within a package using the package name rather than having to know the package path. Usage: {{{ $ rosrun package_name node_name }}} So now we can run the talker.py node in the rospy_tutorials package: {{{ $ rosrun rospy_tutorials talker.py }}} In a new terminal: |
Agora, vamos ver mais informações sobre os nós(''nodes''). Para isso, iremos usar o comando `rosrun` para subir outros nós(''nodes''). === Usando rosrun === `rosrun` permite que seja usado o nome do pacote(''package'') diretamente para rodar o nós(''nodes'')(sem que seja necessário saber o caminho do pacote(''package'') ). Uso: {{{ $ rosrun [nome_do_pacote] [nome_do_nó] }}} Agora podemos rodar o nó(''nodes'') ''turtlesim_node'' no pacote(''package'') ''turtlesim'' Então, num '''novo terminal''': {{{ $ rosrun turtlesim turtlesim_node }}} A janela do turtlesim irá aparecer: {{attachment:turtlesim.png}} '''NOTE:''' A tartaruga pode ser diferente na sua janela. Não se preocupe - existem [[Distributions#Current_Distribution_Releases|vários modelos de tartarugas]] e a sua é uma suspresa! Em um '''novo terminal''': |
Line 136: | Line 164: |
You will see something similar to: {{{ |
Você deve ver algo similar a isso: . {{{ |
Line 139: | Line 168: |
/talker-ninja.local-68301-1251270608865 }}} The name for the 'talker' node is kind of ugly -- it's an ''anonymous'' Node. In ROS, Nodes have to have unique names. This is because, in robot systems, you rarely want two Nodes doing the same thing: for example, if you have two laser drivers attempting to get data from the same laser, that's going to cause problems. We use the ''anonymous'' feature for Nodes that are safe to run multiple copies of. One of the powerful features of the ROS is that you can reassign Names from the command-line. The anonymous Name above is ugly to work with, so lets give it a different name. Go back to the `rosrun` window and use `ctrl-C` to stop the Node. Now lets re-run it, but this time use a [[Remapping Arguments|Remapping Argument]] to change the Node's name: {{{ rosrun rospy_tutorials talker.py __name:=talker }}} Now, if we go back and use `rosnode list`: |
/turtlesim }}} Uma ferramenta poderosa do ROS é a possibilidade de redefir nomes através da linha de comando. Feche a janela do turtlesim para parar o nó(''node'')(ou vá até o terminal que você usou o comando `rosrun turtlesim` e aperte `ctrl-C`). Agora, rode novamente o comando mas agora usando o [[Remapping Arguments|remapeamento de argumento]] para mudar o nome do nó(''node''). {{{ $ rosrun turtlesim turtlesim_node __name:=my_turtle }}} Agora, se for usado o comando `rosnode list`: |
Line 157: | Line 182: |
You will see something similar to: {{{ |
Você deve ver algo como: . {{{ |
Line 160: | Line 186: |
/talker }}} We see our new `/talker` Node. Lets use another `rosnode` command, `ping`, to test that it's up: {{{ $ rosnode ping talker }}} {{{ rosnode: node is [/talker] pinging /talker with a timeout of 3.0s xmlrpc reply from http://ninja.local:54748/ time=4.828930ms }}} Before we finish, it's time to introduce one more tool, [[rxgraph]]: === Using rxgraph === `rxgraph` creates a dynamic graph of what's going on. {{{ $ rxgraph }}} You will see something similar to: {{attachment:rxgraph(node_tutorial)0.png||width=100%}} Here the node and topics are highlighted in different colors. Here we can see that the talker node is publishing the chatter topic. {{attachment:rxgraph(node_tutorial).png||width=100%}} Now that you understand how ROS nodes work, let's look at [[ROS/Tutorials/UnderstandingTopicsServicesParams|how ROS topics, services, and params work]]. Also feel free to press `Ctrl-C` to stop `rosrun` and `rxgraph`. ## AUTOGENERATED DO NOT DELETE |
/my_turtle }}} {{{ #!wiki blue/solid Note: Se você ainda esta vendo `/turtlesim` na lista, pode significar que você parou o nó(''node'') no terminal usando `ctrl-C` ao invés de fechar a janela, ou que você não tem a variável de ambiente '''$ROS_HOSTNAME''' definida como descrito em [[http://www.ros.org/wiki/ROS/NetworkSetup#Single_machine_configuration|Network Setup - Single Machine Configuration]]. Você pode tentar limpar o `rosnode list` com: $ rosnode cleanup }}} Agora vemos o novo nó(''node''). Vamos usar agora um novo comando do `rosnode`, `ping`, para testar se ele esta ativo: {{{ $ rosnode ping my_turtle }}} . {{{ rosnode: node is [/my_turtle] pinging /my_turtle with a timeout of 3.0s xmlrpc reply from http://aqy:42235/ time=1.152992ms xmlrpc reply from http://aqy:42235/ time=1.120090ms xmlrpc reply from http://aqy:42235/ time=1.700878ms xmlrpc reply from http://aqy:42235/ time=1.127958ms }}} === Revisão === O que foi abordado: * roscore = Comando para inicializar o Master + rosout + servidor de parâmetros (o conceito de servidos de parâmetros será explicado posteriormente). É um dos comandos para inializar o "sistema" do ROS. * rosnode = ros+node : Ferramenta do ROS para obtenção de informações sobre os nós(''nodes''). * rosrun = ros+run : rodam os nós(''nodes'') de um determinado pacote(''package''). Agora que você entende de como os nós(''nodes'') no ROS funcionam, vamos dar uma olhada em: [[ROS/pt_BR/Tutorials/UnderstandingTopics|Entendendo tópicos no ROS]]. Também sinta-se a vontade para apertar `Ctrl-C` para parar o turtlesim_node. ## AUTOGENERATED DO NOT DELETE |
Line 191: | Line 221: |
## TutorialTurtlesim |
Note: This tutorial assumes that you have completed the previous tutorials: Gerando um pacote no ROS. |
![]() |
Um pouco mais sobre nós(''nodes'') no ROS
Description: Este tutorial apresenta os conceitos introdutórios sobre os componentes básicos do ROS (também referenciados como ROS Graph) e discute o uso das ferramentas utilizadas via terminal: roscore, rosnode e rosrun.Tutorial Level: BEGINNER
Next Tutorial: Entendendo tópicos no ROS
Contents
Pré-requisitos
Nesse tutorial, utilizaremos um simulador relativamente simples, para isso é necessário a instalação das seguintes dependências:
$ sudo apt-get install ros-<distro>-ros-tutorials
Sendo que '<distro>' deve ser substituído pela sua atual distribuição do ROS (hydro, groovy, electric, fuerte, kinetic, lunar ou morenia)
Rápida Revisão Sobre Conceitos do ROS
Nó: Um nó(node) consiste em um executável (aplicação gerada por meio de um código fonte) que utiliza o ROS para realizar a comunicação com outros nó(node).
Menssagens: Tipos de dados no ROS usados quando se publica ou sobrescreve de tópico.
Tópicos: Nós(node) podem publicar menssagens em tópicos assim como podem subescrever menssagens de tópicos.
Master: Service de gerenciamento do sistema do ROS (ex: ajuda os nós a se encontrarem no sistema.)
rosout: Equivalente do ROS ao stdout/stderr
roscore: Comando para inicializar o Master + rosout + servidor de parâmetros (o conceito de servidos de parâmetros será explicado posteriormente). É um dos comandos para inializar o "sistema" do ROS.
Nós(''node'')
Um nó(node) na verdade é apenas um arquivo executável dentro de um pacote do ROS. Nós(node) no ROS usam bibliotecas clientes (client librarys) para se comunicar com outros nós(node). Nós(node) podem publicar e/ou subscrever em tópicos, além de poderem prover serviços(services) também.
Bibliotecas Clientes (''client librarys'')
As bibliotecas clientes(client librarys) do ROS permitem que os nós(nodes) em diferentes liguagens se comuniquem: ROS client libraries allow nodes written in different programming languages to communicate:
rospy = bibliotecas clientes(client librarys) em Python
roscpp = bibliotecas clientes(client librarys) em C++
roscore
roscore é o comando para inicializar o Master e deve ser a primeira coisa a ser inicializada no ROS
Dando o comando no terminal:
$ roscore
Deve ser visto algo similiar a isso:
... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://machine_name:33919/ ros_comm version 1.4.7 SUMMARY ======== PARAMETERS * /rosversion * /rosdistro NODES auto-starting new master process[master]: started with pid [13054] ROS_MASTER_URI=http://machine_name:11311/ setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf process[rosout-1]: started with pid [13067] started core service [/rosout]
Se o roscore não inicializar, provavelmente existe um problema de configuração de rede. Dê uma olhada em Network Setup - Single Machine Configuration
Se o roscore não inicializar e enviar uma menssagem sobre falta de permissão, provavelmente a pasta ~/.ros pertence ao root, mude recurssivamente o usuário "dono" da pasta com:
$ sudo chown -R <your_username> ~/.ros
Using rosnode
Abra um novo terminal e use o rosnode para visualizar o que esta rodando no roscore:
Note: Quando um novo terminal é inicializado, seu ambiente é resetado e seu arquivo ~/.bashrc é inicializado novamente. Se estiver ocorrendo problemas rodando os comandos como rosnode, provavelmente é necessário colocar as configurações de ambiente no seu arquivo ~/.bashrcou manualmente reinicializar o arquivo.
O comando rosnode mostra as informações dos nós(nodes) que estão rodando. O commando rosnode list lista os nós(nodes) que estão ativos no momento.
$ rosnode list
Se for visto:
/rosout
Isso mostra que tem apenas um nó(nodes) rodando:rosout. Este nó(nodes) esta sempre rodando pois é responsável por coletar as saídas de logs dos nó(nodes).
O comando rosnode info retorna informações sobre um nó(nodes) específico.
$ rosnode info /rosout
Nos retorna mais informações sobre rosout, como o fato de publicar no /rosout_agg.
------------------------------------------------------------------------ Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/set_logger_level * /rosout/get_loggers contacting node http://machine_name:54614/ ... Pid: 5092
Agora, vamos ver mais informações sobre os nós(nodes). Para isso, iremos usar o comando rosrun para subir outros nós(nodes).
Usando rosrun
rosrun permite que seja usado o nome do pacote(package) diretamente para rodar o nós(nodes)(sem que seja necessário saber o caminho do pacote(package) ).
Uso:
$ rosrun [nome_do_pacote] [nome_do_nó]
Agora podemos rodar o nó(nodes) turtlesim_node no pacote(package) turtlesim
Então, num novo terminal:
$ rosrun turtlesim turtlesim_node
A janela do turtlesim irá aparecer:
NOTE: A tartaruga pode ser diferente na sua janela. Não se preocupe - existem vários modelos de tartarugas e a sua é uma suspresa!
Em um novo terminal:
$ rosnode list
Você deve ver algo similar a isso:
/rosout /turtlesim
Uma ferramenta poderosa do ROS é a possibilidade de redefir nomes através da linha de comando.
Feche a janela do turtlesim para parar o nó(node)(ou vá até o terminal que você usou o comando rosrun turtlesim e aperte ctrl-C). Agora, rode novamente o comando mas agora usando o remapeamento de argumento para mudar o nome do nó(node).
$ rosrun turtlesim turtlesim_node __name:=my_turtle
Agora, se for usado o comando rosnode list:
$ rosnode list
Você deve ver algo como:
/rosout /my_turtle
Note: Se você ainda esta vendo /turtlesim na lista, pode significar que você parou o nó(node) no terminal usando ctrl-C ao invés de fechar a janela, ou que você não tem a variável de ambiente $ROS_HOSTNAME definida como descrito em Network Setup - Single Machine Configuration. Você pode tentar limpar o rosnode list com: $ rosnode cleanup
Agora vemos o novo nó(node). Vamos usar agora um novo comando do rosnode, ping, para testar se ele esta ativo:
$ rosnode ping my_turtle
rosnode: node is [/my_turtle] pinging /my_turtle with a timeout of 3.0s xmlrpc reply from http://aqy:42235/ time=1.152992ms xmlrpc reply from http://aqy:42235/ time=1.120090ms xmlrpc reply from http://aqy:42235/ time=1.700878ms xmlrpc reply from http://aqy:42235/ time=1.127958ms
Revisão
O que foi abordado:
- roscore = Comando para inicializar o Master + rosout + servidor de parâmetros (o conceito de servidos de parâmetros será explicado posteriormente). É um dos comandos para inializar o "sistema" do ROS.
rosnode = ros+node : Ferramenta do ROS para obtenção de informações sobre os nós(nodes).
rosrun = ros+run : rodam os nós(nodes) de um determinado pacote(package).
Agora que você entende de como os nós(nodes) no ROS funcionam, vamos dar uma olhada em: Entendendo tópicos no ROS. Também sinta-se a vontade para apertar Ctrl-C para parar o turtlesim_node.