ROS学习笔记25(命名空间和重映射)

1 名称

1.1 Graph Resource Names

Graph Resource Names提供分层命名结构,用于ROS计算图中的所有资源,例如节点参数主题服务。这些名称在ROS中非常强大,并且在ROS中组成更大和更复杂的系统是至关重要的,因此了解这些名称如何工作以及如何操作它们至关重要。

在我们进一步描述名称之前,这里有一些示例名称:

  • / (the global namespace)

  • /foo

  • /stanford/robot/name

  • /wg/node1

Graph Resource Names是ROS中用于提供封装的重要机制。每个资源都在命名空间中定义,它可以与许多其他资源共享。

通常,资源可以在其命名空间内创建资源,并且可以访问其自己的命名空间内或之上的资源。

1.2 有效名称

有效名称具有以下特征:

  1. 第一个字符是字母字符([az | AZ]),代字号(〜)或正斜杠(/)

  2. 后续字符可以是字母数字([0-9 | az | AZ]),下划线(_)或正斜杠(/)

例外:基本名称(如下所述)不能包含正斜杠(/)或波浪号(〜)。

1.3 命名解析

ROS中有四种类型的图形资源名称:baserelativeglobalprivate,它们具有以下语法:

  • base

  • relative/name

  • /global/name

  • ~private/name

By default, resolution is done relative to the node's namespace

例如,节点/wg/node1具有名称空间/wg,因此名称node2将解析为/wg/node2。没有名称空间限定符的名称是基本名称。基本名称实际上是相对名称的子类,具有相同的解析规则。基本名称最常用于初始化节点名称。以“/”开头的名称是全局名称。它们被认为是完全解析的。应尽可能避免全局名称,因为它们限制了代码的可移植性。以“〜”开头的名称是私有名称。它们将节点的名称转换为命名空间。例如,node1在命名空间/WG/ 拥有私有命名空间/wg/node1。专用名称对于通过参数服务器将参数传递到特定节点很有用。以下是一些名称解析示例:

Node

Relative (default)

Global

Private

/node1

bar -> /bar

/bar -> /bar

~bar -> /node1/bar

/wg/node2

bar -> /wg/bar

/bar -> /bar

~bar -> /wg/node2/bar

/wg/node3

foo/bar -> /wg/foo/bar

/foo/bar -> /foo/bar

~foo/bar -> /wg/node3/foo/bar

 1.4 示例 

  int main(int argc, char ** argv)
{
  ros::init(argc,argc,"node1");
  ros::NodeHandle nh;

  ros::Publisher node1_pub = nh.advertise<std_msgs:Int32>("bar",10);

节点名称为node1,上面的话题名称与/bar具有相同的名字。 使用斜杠/字符作为全局形式,话题名也是/bar。

ros::Publisher node1_pub = nh.advertise<std_msgs:Int32>("/bar",10);

但是当使用波浪线(~)将其声明为私有,那么话题名称即是/node1/bar。

ros::Publisher node1_pub = nh.advertise<std_msgs:Int32>("~bar",10);

2 重映射

在命令行启动节点时,可以重新映射ROS节点中的任何名称。有关此功能的更多信息,请参阅重映射参数这是ROS的一个强大功能,它允许您从命令行在不同配置下启动相同的节点。可以将重新映射的参数传递给任何节点,并使用语name:=new_name例如,要将talker节点配置为发布/wg/chatter话题而不是chatter话题。

rosrun rospy_tutorials talker chatter:=/wg/chatter

我们在匹配之前先进行解析参数。The effect of this is that you are remapping a full name, whereas before the remappings only applied to a specific string.例如,foo:=bar以前只匹配确切的字符串foo,但它也匹配/<node_namespace>/fooAfter resolution, a direct string match is used, so you cannot use it to remap parts of Names,即foo:=bar将匹配foo或/<node_namespace>/foo,但不匹配foo/bazThe one exception to this is when using searchParam, which keeps the old behavior. This is because searchParam itself works on unresolved names.

Node Namespace

Remapping Argument

Matching Names

Final Resolved Name

/

foo:=bar

foo, /foo

/bar

/baz

foo:=bar

foo, /baz/foo

/baz/bar

/

/foo:=bar

foo, /foo

/bar

/baz

/foo:=bar

/foo

/baz/bar

/baz

/foo:=/a/b/c/bar

/foo

/a/b/c/bar

2.1 "Pushing Down"

该ROS_NAMESPACE 环境变量,您可以更改正在启动的节点,从而有效地重新映射所有在该节点名称的命名空间。当所有节点在全局命名空间中启动时,这实际上将其“Pushing Down”到子命名空间中。更改节点的命名空间是一种简单的集成代码的机制,因为节点中的所有名称 - 节点名称,主题,服务和参数 - 都将被重新调整。

注意:为了使此功能正常工作,重要的是您的程序避免使用全局名称,而是使用相对和私有名称。

2.2 节点参数分配

您可以使用单个下划线_作为前缀直接从命令行为节点分配私有参数。例如,

rosrun rospy_tutorials talker _param:= 1.0

将~param设置为1.0。ROS使用YAML语法来确定参数类型。

2.3 Special keys

  • __name是“节点名称”的特殊保留关键字。它允许您重新映射节点名称,而无需知道其实际名称。它只能在正在启动的程序包含一个节点时使用。下面的节点名称分别为A和B。

rosrun turtlesim turtlesim_node __name:=A

rosrun turtlesim turtlesim_node __name:=B
  • __log是一个保留关键字,用于指定应写入节点日志文件的位置。通常不鼓励使用此关键字 - 它主要供ROS工具(如roslaunch)使用

  • __ip和__hostname是替代ROS_IP和ROS_HOSTNAME。通常不鼓励使用此关键字,因为它是针对无法设置环境变量的特殊情况。

  • __master是ROS_MASTER_URI的替代品。通常不鼓励使用此关键字,因为它是针对无法设置环境变量的特殊情况。

  • __ns是ROS_NAMESPACE的替代品。通常不鼓励使用此关键字,因为它是针对无法设置环境变量的特殊情况。 下面的命名空间分别为A和B。

rosrun turtlesim turtlesim_node __ns:=A

rosrun turtlesim turtlesim_node __ns:=B

猜你喜欢

转载自blog.csdn.net/qq_27806947/article/details/85041915