栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

ROS学习八、ros::init,nodehandle,与命名空间
  • ros::init()
  • ros::NodeHandle
  • 常用的三个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/
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/303537.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号