ROS入门教程-1.1.5 理解 ROS节点
ROS入门教程-理解ROS节点
说明:
- 本教程主要介绍 ROS 图(graph)概念 并讨论roscore、rosnode和 rosrun 命令行工具的使用。
目录
- 先决条件
- 图概念概述
- 节点
- 客户端库
- roscore
- 使用rosnode
- 使用 rosrun
- 回顾
先决条件
- 在本教程中我们将使用到一个轻量级的模拟器,请使用以下命令来安装:
$ sudo apt-get install ros-<distro>-ros-tutorials
- 用你使用的ROS发行版本名称(例如electric、fuerte、groovy、hydro等)替换掉'
'。
图概念概述
- Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
- Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
- Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
- Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。
- rosout: ROS中相当于stdout/stderr。
- roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。
节点
- 一个节点其实只不过是ROS程序包中的一个可执行文件。
- ROS节点可以使用ROS客户库与其他节点通信。
- 节点可以发布或接收一个话题。
- 节点也可以提供或使用某种服务。
客户端库
- ROS客户端库允许使用不同编程语言编写的节点之间互相通信:
- rospy = python 客户端库
- roscpp = c++ 客户端库
- rosjs = javascripts客户端库
- rosjava = java客户端库
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运行后无法正常初始化,很有可能是存在网络配置问题。
- 参见 网络设置——单机设置
- 如果roscore不能初始化并提示缺少权限,这可能是因为~/.ros文件夹归属于root用户(只有root用户才能访问)
- 修改该文件夹的用户归属关系:
$ sudo chown -R <your_username> ~/.ros
使用rosnode
- 打开一个新的终端, 可以使用 rosnode 像运行roscore一样看看在 运行什么...
- 注意: 当打开一个新的终端时,你的运行环境会复位,同时你的~/.bashrc文件会复原。
- 如果你在运行类似于rosnode的指令时出现一些问题
- 也许你需要添加一些环境设置文件到你的~/.bashrc或者手动重新配置他们。
- 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/set_logger_level
* /rosout/get_loggers
contacting node http://machine_name:54614/ ...
- 现在,让我们看看更多的节点。
- 为此,我们将使用rosrun弹出另一个节点。
使用 rosrun
- rosrun允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径)。
- 用法:
$ rosrun [package_name] [node_name]
- 现在我们可以运行turtlesim包中的 turtlesim_node。
- 然后, 在一个 新的终端:
$ rosrun turtlesim turtlesim_node
你会看到 turtlesim 窗口:
注意: 这里的 turtle 可能和你的 turtlesim 窗口不同。
别担心,这里有许多版本的turtle ,而你的是一个惊喜!
在一个 新的终端:
$ rosnode list
- 你会看见类似于:
/rosout
/turtlesim
- ROS的一个强大特性就是你可以通过命令行重新配置名称。
- 关闭 turtlesim 窗口停止运行节点 (或者回到rosrun turtlesim终端并使用
ctrl -C
)。 - 现在让我们重新运行它,但是这一次使用Remapping Argument改变节点名称:
$ rosrun turtlesim turtlesim_node __name:=my_turtle
- 现在,我们退回使用rosnodelist:
$ rosnode list
- 你会看见类似于:
/rosout
/my_turtle
- 注意: 如果你仍看到 /turtlesim在列表中,这可能意味着你在终端中使用ctrl-C停止节点而不是关闭窗口
- 或者你没有$ROS_HOSTNAME环境变量,这在 Network Setup - Single Machine Configuration中有定义。
- 你可以尝试清除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
回顾
- 本节所涉及的内容:
roscore = ros+core : master (提供为名称服务) + rosout (stdout/stderr) + parameter server (参数服务器)
rosnode = ros+node : 获取节点信息的ROS工具
rosrun = ros+run : 运行节点工具
- 到这里,您已经了解了ROS节点是如何工作的,下一步,我们来了解一下 ROS话题。
- 如果您想关闭 turtlesim_node,请按下“Ctrl-C”
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号