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 版权协议,转载请附上原文出处链接和本声明。