ROS学习八、ros::init(),NodeHandle,命名空间namespace(1)

ROS学习八、ros::init,nodehandle,与命名空间

ros::init()

这里只介绍最常用的ros::init(argv, argc, “node_name”)初始化节点,函数原型如下:

void ros::init	(int & 	argc,
			 	 char ** 	argv,
		 		 const std::string & 	name,
				 uint32_t 	options = 0 )	

Parameters
argc	
argv	
name	Name of this node. The name must be a base name, ie. it cannot contain namespaces.
options	[optional] Options to start the node with (a set of bit flags from ros::init_options)

这个函数会分析输入的argc和argv,比如remap、name之类的,如果没有remapping name则该节点的名字为node_name

特别地,该函数要求node_name不能带有命名空间namespace,也就是不能取/nodename/namespace这种名字。

此外,这种节点初始化方法一般与NodeHandle句柄一起使用。

ros::NodeHandle

ros::NodeHandle句柄是roscpp的“万能接口”类,常用于创建话题、服务、参数、计时器。

NodeHandle还可以指定命名空间namespace,命名空间又分为全局命名空间,普通命名空间私有命名空间

以下给出NodelHandle初始化方法:

# 初始化一个NodeHandle:
ros::NodeHandle nh;
# 初始化一个NodeHandle,指定全局空间/global
ros::NodeHandle nh("/global");
# 初始化一个NodeHandle,指定普通空间normal
ros::NodeHandle nh("normal")
# 初始化一个NodeHandle,指定私有空间private
ros::NodeHandle nh("~private")

那么问题就在于这三个空间有什么区别:

# 假设node所在的命名空间为/ns,使用全局命名空间,
ros::init(argv, argc, "node_name")
ros::NodeHandle nh("/global")
# 此时使用nh创建名字为my_topic的话题
nh.advertise<...>("my_topic")
# 实际话题的名字为 /global/my_topic
# 此时nh设置的各种东西名字都与node name和node namespace无关
# 假设node所在的命名空间为/ns,使用普通命名空间,
ros::init(argv, argc, "node_name")
ros::NodeHandle nh("normal")
# 此时使用nh创建名字为my_topic的话题
nh.advertise<...>("my_topic")
# 实际话题的名字为 /ns/normal/my_topic
# 此时nh设置的各种东西名字都与node name无关,但与node所在的命名空间有关
# 假设node所在的命名空间为/ns,使用私有命名空间,
ros::init(argv, argc, "node_name")
ros::NodeHandle nh("~private")
# 此时使用nh创建名字为my_topic的话题
nh.advertise<...>("my_topic")
# 实际话题的名字为 /ns/node_name/private/my_topic
# 此时nh设置的各种东西名字与node name和ns相关

常用的三个NodeHandle初始化写法

# 一、使用默认构造函数
ros::NodeHandle nh;
# 等价于 
# 二、使用普通命名空间 ""
ros::NodeHandle nh("");
# 句柄一和二的命名空间为 /node_namespace/

# 三、使用私有命名空间 "~"
ros::NodeHandle nh("~")
# 句柄三的命名空间为 /node_namespace/node_name/

版权声明:本文为qq_41035283原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>