ROS 节点和ROS Master是ROS 中两个重要的组件:

####ROS Master:
当任意的节点在ROS系统中启动的时候会寻找ROS Master并将其名字注册到ROS Master上。因此ROS Master包含了整个系统上所有Node的信息,
当任何一个节点信息改变后将会产生一个回调,并且用最新的信息对齐进行更新,这些信息往往是用于节点间连接所需要的必要信息。当一个节点开始发布一个topic,节点将会将topic的名字和数据类型信息传递给ROS Master,ROS Master将会检查是否有其他的节点订阅了这个topic,如果有任何的节点订阅了这个topic,ROS Master将会共享发布者的消息给订阅者节点。
在获取到节点的详细信息后,两个节点将会使用TCPROS协议进行交互,当两个节点链接到一起后,ROS Master将不再其作用,我们可以按照我们的意愿停止发布者或者订阅者节点。
ROS_MASTER_URI 环境变量包含ROS Master的IP地址以及端口信息,使用这些信息ROS节点可以定位到ROS Master位置,当这两个参数不对的话两个节点将不会成功连接。如果ROS运行在单个系统中,我们可以使用localhost的IP,但是在分布式系统我们必须准确定义这个环境变量,只有这样远程的节点之间才能够相互通信,在ROS系统中一般我们只需要一个ROS Master,在分布式系统ROS Master必须位于所有节点都能ping到的机器上。

####ROS Node:

一个ROS机器人应用通常是由很多的ROS节点构成,每个节点之间使用ROS Topics,Services和Paremeter Service进行交互。
使用节点有如下优点:

  1. 使用节点可以提高整个系统的错误容忍度,即使一个节点挂掉了,整个机器人系统仍然可以工作
  2. 节点可以降低系统的复杂度,增加系统的可调试性

每个运行的节点都拥有一个名字用于同系统的其他部分区分开来。

ROS 还提供了一个rosnode用于操作ros节点:

rosnode info [节点名] 这个用于打印节点的信息

Node [/hello_world_node]
Publications:
* /rosout [rosgraph_msgs/Log]

Subscriptions: None

Services:
* /hello_world_node/get_loggers
* /hello_world_node/set_logger_level

contacting node http://raspberrypi:60715/ ...
Pid: 1863
Connections:
* topic: /rosout
* to: /rosout
* direction: outbound
* transport: TCPROS

rosnode kill [节点名] 这个用于杀死正在运行的节点

rosnode list 用于列出所有正在运行的节点

/hello_world_node
/rosout
rosnode machine [机器名] 用于列出在一个机器上运行的所有节点
rosnode machine raspberrypi

/hello_world_node
/rosout

rosnode ping 这个用于检查一个节点的连通性

rosnode ping hello_world_node
rosnode: node is [/hello_world_node]
pinging /hello_world_node with a timeout of 3.0s
xmlrpc reply from http://raspberrypi:60715/ time=1.881838ms
xmlrpc reply from http://raspberrypi:60715/ time=2.676964ms
xmlrpc reply from http://raspberrypi:60715/ time=2.720833ms
xmlrpc reply from http://raspberrypi:60715/ time=2.691984ms
ping average: 2.492905ms

rosnode cleanup 这个用于清除用不到的节点
Contents