概述
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 有效名称
有效名称具有以下特征:
-
第一个字符是字母字符([az | AZ]),代字号(〜)或正斜杠(/)
-
后续字符可以是字母数字([0-9 | az | AZ]),下划线(_)或正斜杠(/)
例外:基本名称(如下所述)不能包含正斜杠(/)或波浪号(〜)。
1.3 命名解析
ROS中有四种类型的图形资源名称:base,relative,global和private,它们具有以下语法:
-
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>/foo。After resolution, a direct string match is used, so you cannot use it to remap parts of Names,即foo:=bar将匹配foo或/<node_namespace>/foo,但不匹配foo/baz。The 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
最后
以上就是和谐墨镜为你收集整理的ROS学习笔记25(命名空间和重映射)的全部内容,希望文章能够帮你解决ROS学习笔记25(命名空间和重映射)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复