5.理解ROS节点

理解ROS节点(rawmeat:http://wiki.ros.org/ROS/Tutorials/UnderstandingNodes

描述:这个教程介绍了ROS图表概念,讨论了roscore,rosnode和rosrun命令行工具的使 教程等级:初学者
下一个教程理解ROS主题

内容
1.预先条件
2.图表概念的快速浏览
3.节点
4.客户库
5.roscore
6.使用roscore
7.使用rosrun
8.复习

1.预先条件

对于这份教程,我们将会使用轻量级的模拟器,安装的命令如下:

$ sudo apt-get install ros--ros-tutorials

将你的ROS的版本名(例如indigo, jade,kinetic)取代’< distro >’

2.图表概念的快速浏览

  • 节点:一个节点是可执行的,使用ROS与其他节点通讯。
  • 消息:当发布或订阅一个主题的时候,使用ROS数据类型
  • 主题:节点可以对一个主题发布消息,也可以订阅一个主题以接收消息
  • 节点管理器:ROS的名称服务(也就是帮助节点找到彼此)
  • rosout:ROS中的等价标准输出和标准错误
  • roscore:节点管理器+rosout+参数服务(参数服务将在后面介绍)

3.节点

一个节点只不过是一个ROS package中的可执行文件。ROS节点使用一个ROS用户库来和其他节点通讯。节点可以发布或者订阅一个主题。节点也可以提供或使用服务。

4.客户库

ROS用户库允许使用不同编程语言的节点相互通讯。

  • Rospy=python 用户库
  • Roscpp=c++ 用户库

5.roscore

Roscore是使用ROS时首先应该运行的
请运行:

$ roscore

你将会见到类似的:

… 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]

如果roscore没有初始化,可能是网络设置问题,请看[Network Setup - Single Machine Configuration](http://www.ros.org/wiki/ROS/NetworkSetup#Single_machine_configuration
如果roscore没有初始化并发送了一条关于缺少许可的信息,可能是 ~/.ros文件夹被root拥有,递归地改变的文件夹的所有权:

$ sudo chown -R < your_username > ~/.ros

6.使用rosnode

打开一个新的终端,让我们使用rosnode来看看运行的roscore做了什么,记住让之前的终端打开,通过打开一个新标签页或者简单地最小化。

注意:当打开一个新的终端的时候,你的环境会被重置,你的~/.bashrc文件会被sourced。如果你有运行命令的问题,比如说rosnode,那么你可能需要增加一些环境安装文件到你的 ~/.bashrc 或者手动re-source它们。

Rosnode展示关于正在运行的ROS节点的信息。Rosnode list命令列举了这些活跃的节点:

$ rosnode list

    你将会看见:

/rosout

这个向我们展示了这儿只有一个节点在运行:rosout。这是一直在运行的,因为它收集并记录节点的调试输出。
rosnode info命令返回关于某个明确节点的信息。

$ rosnode info /rosout

这个给了我们更多关于rosout的信息,比如它发布了/rosout_agg


Node [/rosout]
Publications:
* /rosout_agg [rosgraph_msgs/Log]
Subscriptions:
* /rosout [unknown type]
Services:
* /rosout/get_loggers
* /rosout/set_logger_level
contacting node http://machine_name:54614/
Pid: 5092

现在,让我们看一些其他的节点。为了这个,我们将会使用rosrun来创建另外一个节点。

7.使用rosrun

Rosrun允许你使用package名,直接运行一个节点,而不用一个package(不需要知道package路径)
用法:

$ rosrun [package_name] [node_name]

所以现在我们可以在turtlesim_node运行一个turtlesim package
现在。在一个新的终端中:

$ rosrun turtlesim turtlesim_node

你将会看见turtlesim window:

这里写图片描述

注意:这个turtle可能和你的窗口中看起来不一样,别担心,这儿有许多种类的turtle,你的是个惊喜。

在一个新的终端中:

$ rosnode list

你将会看见类似于:

     /rosout
     /turtlesim

有一个关于ros的特点是你可以从一个命令行中重新命名。

关闭turtlesim窗口以停止节点(或者回到rosrun turtlesim终端,使用ctrl-c)现在让我们重新运行它,但是这一次使用一个Remapping Argument来改变节点的名称:

$ rosrun turtlesim turtlesim_node __name:=my_turtle

现在,如果我们返回并使用rosnode list:

$ rosnode list

        你将会看见一些类似于:

    /my_turtle
    /rosout

注意:如果你仍然看见/turtlesim在列表中,这可能意味着你通过在终端中输入ctrl-c来停止节点,而不是关闭窗口,或者你没有Network Setup - Single Machine Configuration.中描述的$ROS_HOSTNAME环境变量。你可以尝试清除rosnode:$rosnode cleanup

我们看见我们新的/my_turtle节点。让我们使用另外一个rosnode命令,ping,来测试它已经运行了:

$ 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

8.回顾

涉及的内容:

  • roscore:ros+core:节点管理器(提供为ROS的命名服务)+rosout(stdout/stderr)
    参数服务器(参数服务器将会在之后介绍)
  • rosnode=ros+node:ROS 工具以得到有关一个节点的信息
  • rosrun=ros+run:从一个给定的package中运行一个节点

现在你已经理解了ROS节点是如何工作的,让我们看看ROS主题是如何工作的。同样地,请随意按ctrl-c来停止turtlesim_node。