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) 使用环境变量设置
- 1)通过命令参数设置:调用ros::init()的ROS的ROS程序会接收名为
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);
- 没有命名空间限定符的名称是基本名称。基本名称实际上是相对名称的子类,并且具有相同的解析规则。基本名称最常用于初始化节点名称。