ROS 十一、命名空间


ROS 十一: 命名空间

如果你熟悉c++代码,一定对这句话很熟悉

using namespace std;

这一句话表示的是,使用std这个命名空间,此时就可以直接使用cout,而不用完整写上std::cout

在ROS中,命名空间的概念是相似的,同样也是为了区分名称,这个名称包括节点名称、话题名称、参数名称等等

比如查询topic列表时:

$ rostopic list
/rosout
/rosout_agg
/tf
/tf_static
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
/turtle2/cmd_vel
/turtle2/color_sensor
/turtle2/pose

可以看到同时有两个叫pose的topic,但是因为在pose前面添加了一层命名空间,使其避免了冲突,这样就可以很方便地使用同一份代码在多个节点上运行了,实现的节点的复用。

1、计算图源

根据前面的学习,在ROS系统中这些节点、话题、服务和参数等概念,在ROS系统统称为计算图源。

ros::init(argc, argv, "pokemon_server"); 
ros::NodeHandle ser_pokemon_node; 
Callback ros::ServiceServer pokemon_server = ser_pokemon_node.advertiseService("/pokemon_show", Callback);

参考上面的代码,其中第三行的/pokemon_show就是一种命名空间名称的方式

2、计算图源名称的命名规则

在ROS系统中无论是节点还是话题都有自己的名称,如C++语言中的标识符一样,在ROS中命名也有自己的规则:
1)首字符必须是字母(A-Z|a-z)、波浪线(~)或者左斜杆(/)
2)后续字符可以是字母和数字、下划线或者左斜杠

3、计算图源名称的分类

1)全局名称:/global/name:即在任何地方(包括代码、命令行工具、图形界面工具等的任何地方)都可以使用

ros::init(argc, argv, "publish_node_A");
ros::NodeHandle nh;
ros::Publisher sub_pub = nh.advertise<std_msgs::string>("/A/chatterA",1000);
  • 以“/”开头的名称是全局名称——它们被认为是完全解析的。 ros系统的根命名空间是"/"

2)相对名称:relative/name;

ros::init(argc, argv, "publish_node_A");
ros::NodeHandle nh;
ros::Publisher sub_pub = nh.advertise<std_msgs::string>("A/chatterA",1000);
  • 相对名称则是在创建的时候没有左斜杠(/)的计算图源名称,ROS在解析相对名称的时候需要将其转化为全局名称,而转换的方式就是将其默认的命名空间的名称加在相对名称之前。
  • 确定默认命名空间有三种方式:
    • 1)通过命令参数设置:调用ros::init()的ROS的ROS程序会接收名为_ns命令行参数,赋值的方式为: _ns:=name
    • 2)在launch文件中设置
    • 3) 使用环境变量设置

3)私有名称:~private/name;

ros::init(argc, argv, "publish_node_A");
ros::NodeHandle nh("~");
ros::Publisher sub_pub = nh.advertise<std_msgs::string>("chatterA",1000);
  • 以“~”开头的名称是私有名称。他们将节点的名称转换为命名空间。例如,命名空间/wg 中的node1具有私有命名空间/wg/node1。私有名称在通过参数服务器将参数传递给特定节点很有用。
  • 私有名称是一个节点的内部私有的资源名称,只会在节点内部使用。
  • 默认情况下,解析是相对于节点的命名空间完成的。例如,节点/wg/node1具有命名空间/wg,因此名称node2将解析为/wg/node2

4)基础名称:base

ros::init(argc, argv, "publish_node_A");
ros::NodeHandle nh;
ros::Publisher sub_pub = nh.advertise<std_msgs::string>("chatterA",1000);
  • 没有命名空间限定符的名称是基本名称。基本名称实际上是相对名称的子类,并且具有相同的解析规则。基本名称最常用于初始化节点名称。

文章作者: 拓佑豪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 拓佑豪 !
评论
  目录