参考
如下图所示,首先图中红色是节点的命名方式,注意节点的命名简单的情况(没有命名空间)是 /节点名
,也就是所有节点都有一个/
根目录。
蓝色是话题的命名方式,话题可以直接参照/
根目录,可以参考话题的/
命名空间`,还可以参考节点名称。
全局名称在注册的时候以/
开头,然后加上话题名,此时的话题和节点毫无关系
/*************************************************************/
示例1:直接在/后面加上话题名
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter",1000)
结果1:/chatter
/*************************************************************/
示例2:给话题名加命名空间,也就是/话题命名空间/话题名
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter/money",1000);
结果2:/chatter/money
相对名称非/
开头,直接输入话题名称即可。此时最终的话题挂载到注册这个话题的节点的命名空间下。
/*************************************************************/
示例1:假设在命令行运行节点的时候加入了取 __ns:xxx 的命名空间,那么最终这个话题也会挂载到这个命名空间下
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);
结果1:xxx/chatter
/*************************************************************/
示例2:同理这里也可以为话题设置自己的命名空间
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter/money",1000);
结果2:xxx/chatter/money
私有名称和注册时候的话题形式无关,主要是和ros::NodeHandle
有关,在实例化这个对象的时候,给它的构造函数传入~
的参数,然后用这个nh去注册发布者或者订阅者的时候添加的话题就是私有名称的话题,此时直接输入话题名注册的话,最终的话题就是挂载到节点下面。
注意:如果此时输入的话题名称以/
开头,那么尽管nh使用~
进行了实例化,但由于全局名称优先级最高,所以此时生成的还是全局名称的话题。
/*************************************************************/
示例1:假设在命令行运行节点的时候加入了 __ns:xxx 的命名空间
ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",1000);
结果1:/xxx/hello/chatter
/*************************************************************/
示例2:假设在命令行运行节点的时候加入了 __ns:xxx 的命名空间
ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter/money",1000);
结果2:/xxx/hello/chatter/money
/*************************************************************/
PS:当使用~,而话题名称有时/开头时,那么话题名称是绝对的
示例3:
ros::NodeHandle nh("~");
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter/money",1000);
结果3:/chatter/money