ROS::ros不同订阅方式的区别

ros不同订阅方式的区别

ros话题不同的订阅方式有一些不同,适合不同的功能需求

Ros:spin() 和 ros::spinOnce() 区别

ros:spin() 和 ros::spinOnce()为单线程订阅方式。

Ros:spin()

这种方式程序运行到这一句时就会卡在这,等待发布节点发布消息。例如:

#include <move_base/move_base.h>
int main(int argc, char** argv)
{
  ros::init(argc, argv, "move_base_node");
  tf::TransformListener tf(ros::Duration(10));
  move_base::MoveBase move_base( tf );
  ros::spin();
  return(0);
}

ros::spinOnce()

这种方式是循环执行,代码运行到这一句会查询是否有订阅的消息发布出来,如果有则执行相应的回调函数,若无则执行接下来的代码。例如:

#include <move_base/move_base.h>
int main(int argc, char** argv)
{
  ros::init(argc, argv, "move_base_node");
  tf::TransformListener tf(ros::Duration(10));
  move_base::MoveBase move_base( tf );
  ros::Rate rate(5); //循环周期
  while(ros::ok())
  {
  	ROS_INFO("ros::spinOnce() test");
  	ros::spinOnce();
  	rate.sleep();
  }
  return(0);
}

这样与ros::spin()方式效果一样,因为循环查询的原因可能没有ros::spin()方式回调的那么及时。

ros:spin() 和 ros::spinOnce()的缺点

ros:spin() 和 ros::spinOnce()每次只能执行一个回调函数,在订阅多个话题时若有一个回调函数耗时过长可能会导致其他回调函数不能及时响应,ros系统有多线程订阅的机制,每个订阅的回调函数可以在各自的线程里执行,即MultiThreadSpinner和 AsyncSpinner方式。

MultiThreadSpinner和 AsyncSpinner方式

MultiThreadSpinner和 AsyncSpinner为多线程订阅方式。

同步方式:MultiThreadedSpinner

MultiThreadedSpinner于ros::spin()类似,可以指定所用线程数若不指定或者为0,它将在每个cpu内核开辟一个线程。用法:

int main(int argc, char** argv)
{
  ros::init(argc, argv, "temp_node");
  /*****************************************
  *其他处理
  *****************************************/
  ros::MultiThreadedSpinner spinner(6); //开辟6个线程
  spinner.spin(); 
  ros::waitForShutdown();
  return(0);
}

异步方式:AsyncSpinner

当程序中的回调函数花费时间过长的时候,建议开辟异步多线程订阅。 用法:

int main(int argc, char** argv)
{
  ros::init(argc, argv, "temp_node");
  /*****************************************
  *其他处理
  *****************************************/
  ros::AsyncSpinner spinner(6);//开辟6个线程
  spinner.start();
  ros::waitForShutdown();
  return(0);
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ros::NodeHandle是ROS中的一个重要类,用于与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、付费专栏及课程。

余额充值