ROS中计算图源——相对名称绝对名称解析

ROS中话题、节点、服务和参数统称为计算图源(graph resource),每一个计算图源由一个叫计算图源名称的短字符串标识。所谓的计算图源名称也就是ROS在解析这些话题名、节点名、服务名和参数名时需要具体对应的名称。
计算图源名称包括全局名称、相对名称、私有名称和匿名名称
官网参考:http://wiki.ros.org/Names
https://blog.csdn.net/jack_20/article/details/70746736
http://wiki.ros.org/roscpp/Overview/NodeHandles

全局名称

所有以”/”开头的计算图源名称都是全局名称。其实不管是相对名称还是私有名称,ROS在解析具体名称时都需要转换到全局名称才能明确确定(有点类似操作系统标识文件位置的绝对路径);
在定义ros::NodeHandle节点句柄对象时,如果没有传递任何参数,如下所示:

ros::NodeHandle nh;

此时使用该句柄的任何相对名称都默认直接在该相对名称前面加上”/”,使其成为全局名称,例如:

ros::Publisher objectPublisher_ = nh.advertise<std_msgs::Int8>("object",1);

由于名称object前面没有”/”,此时ROS在解析该名称的时候,则默认直接在前面加上”/”,使其成为全局名称,此时可以利用
rostopic list
发现,发布的话题名为"/object”
全局名称可以按照命名空间归类计算图源,如/a/b/c/d/e也是一个有效的全局名称。

相对名称

凡是名称开头没有“/”的计算图源名称都是相对名称。相对名称本身不能完全确定它们自身所在的命名空间(有点类似操作系统标识文件位置的相对路径),需要在相对名称前面加上当前默认命名空间组成一个全局名称,才能明确标识计算图源。
ros::NodeHandle nh("my_namespace");

私有名称

以一个波浪符号(~)开始的计算图源名称为私有名称。私有名称也不能完全确定它们自身所在的命名空间,而是需要ROS客户端库将这个名称解析为一个全局名称。与相对名称使用默认命名空间来解析计算图源名称不同的是,私有名称使用它们的节点名称作为命名空间来解析。
如:

ros::init(argc, argv, "my_node_name");
ros::NodeHandle nodeHandle("~");
ros::NodeHandle nh2("~foo");

此时nodeHandle的命名空间为/my_node_name,nh2的命名空间为/my_node_name/foo

launch中的命名空间

参考: https://github.com/micpalmia/youbot_ros_tools/wiki/Understanding-launch-and-namespaces

使用注意

在launch文件中也可以指定参数,此时参数的命名空间需要格外注意:命名空间由参数所在的位置决定。
如下所示,此时参数没有定义在任何节点域内,因为launch文件是可以一次性启动多个节点的,因此此时参数的默认命名空间为“/”,并不由任何节点名决定;
所以下图中产生的参数为”/vechicle_name"

如果改为下图形式,此时参数在node内部定义,为私有名称,此时参数的默认命名空间为"/"
所以下图中产生的参数为"/ros_namespace_ne/vehicle_name"

注:作为节点元素的子集时,param 元素中给出的参数名总是被当做私有名称解析,无论它们是否以~或者/开始

在launch中使用参数的时候计算图源注意事项:
https://answers.ros.org/question/43001/setting-parameters-in-a-launch-file-does-not-appear-to-be-working/

待看:
http://durant35.github.io/2017/07/14/ROS_%3Carg%3E %3Crosparam%3E/
https://answers.ros.org/question/12094/local-vs-global-parameters-in-a-launch-file/
https://blog.csdn.net/u014587147/article/details/75647002
https://www.cnblogs.com/zjiaxing/p/5541841.html

你可能感兴趣的:(ROS,ROS,计算图源,相对名称)