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。