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/
  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ros::NodeHandleROS中的一个重要类,用于与ROS系统进行通信和交互。它提供了一系列方法和功能,用于创建和管理ROS节点、发布和订阅ROS话题、调用和提供ROS服务等。 以下是ros::NodeHandle的一些常见用法和功能: 1. 创建NodeHandle对象: ```cpp #include <ros/ros.h> int main(int argc, char** argv) { // 初始化ROS节点 ros::init(argc, argv, "my_node"); // 创建NodeHandle对象 ros::NodeHandle nh; // 其他操作... return 0; } ``` 2. 发布和订阅ROS话题: ```cpp #include <ros/ros.h> #include <std_msgs/String.h> int main(int argc, char** argv) { ros::init(argc, argv, "my_node"); ros::NodeHandle nh; // 创建发布者 ros::Publisher pub = nh.advertise<std_msgs::String>("my_topic", 10); // 创建订阅者 ros::Subscriber sub = nh.subscribe("my_topic", 10, callback); // 其他操作... ros::spin(); return 0; } void callback(const std_msgs::String::ConstPtr& msg) { // 处理接收到的消息 } ``` 3. 调用和提供ROS服务: ```cpp #include <ros/ros.h> #include <std_srvs/Empty.h> bool my_service(std_srvs::Empty::Request& req, std_srvs::Empty::Response& res) { // 处理服务请求 return true; } int main(int argc, char** argv) { ros::init(argc, argv, "my_node"); ros::NodeHandle nh; // 创建服务服务器 ros::ServiceServer server = nh.advertiseService("my_service", my_service); // 创建服务客户端 ros::ServiceClient client = nh.serviceClient<std_srvs::Empty>("my_service"); // 其他操作... return 0;} ``` 4. 获取ROS参数: ```cpp #include <ros/ros.h> int main(int argc, char** argv) { ros::init(argc, argv, "my_node"); ros::NodeHandle nh; // 获取参数 int my_param; nh.getParam("my_param", my_param); // 设置参数 nh.setParam("my_param", 123); // 其他操作... return 0; } ``` 这些只是ros::NodeHandle的一部分功能,它还提供了许多其他方法和功能,用于与ROS系统进行更高级的交互和通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值