• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
ros 多线程模式

ros::spin() 的作用

在 ROS 中,ros::spin() 的主要作用是:

  • 让 ROS 节点持续运行,并处理所有注册的回调函数。
  • 在内部,它不断地检查 ROS 网络中的消息、服务请求,并调用相应的回调函数来处理它们。

内部原理

  1. 事件循环 (Event Loop):

    • ros::spin() 进入一个事件循环。这个循环不断地轮询 ROS 网络,检查是否有新的消息到达或者服务请求到达。
    • 如果有消息到达,它会触发与该消息相关联的回调函数。
    • 这个循环会持续运行,直到程序结束或者节点被关闭。
  2. 消息队列 (Message Queue):

    • ROS 使用消息队列来存储接收到的消息。每个订阅者都与其订阅的主题关联,并将收到的消息放入队列中。
    • ros::spin() 从队列中获取消息,并调用相应的回调函数来处理这些消息。
  3. 线程与多任务处理:

    • ROS 的实现通常是单线程的,但可以通过 ros::AsyncSpinner 来支持多线程处理,以便并发处理消息和服务请求。

使用 ros::spin() 的情境

  • 单线程节点:如果你的节点需要处理多个订阅者的回调,并且你希望在主线程中处理所有的回调,可以使用 ros::spin()。
  • 多线程节点:如果你希望你的节点能够在多个线程中处理回调,可以使用 ros::AsyncSpinner,它允许你创建多个线程来并发处理消息。

 

 

ros::AsyncSpinner 是 ROS 提供的一个工具,用于在多个线程中并发地处理消息和服务请求。它适用于需要在节点中并发处理多个回调函数的场景,尤其是当你希望在后台线程中处理消息或服务请求时。

为什么使用 ros::AsyncSpinner?

  • 并发处理:ros::AsyncSpinner 允许你创建多个线程来处理消息,这样可以提高程序的响应性,尤其是在消息处理比较复杂或计算密集型的情况下。
  • 非阻塞的 spin:与 ros::spin() 不同,ros::AsyncSpinner 不会阻塞主线程。这使得你可以在主线程中执行其他任务(如周期性计算、控制逻辑等)。

 

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <iostream>

void messageCallback(const std_msgs::String::ConstPtr& msg)
{
    ROS_INFO("Received message: [%s]", msg->data.c_str());
}

int main(int argc, char** argv)
{
    ros::init(argc, argv, "async_spinner_example");
    ros::NodeHandle nh;

    // 创建订阅者
    ros::Subscriber sub = nh.subscribe("chatter", 1000, messageCallback);

    // 创建 AsyncSpinner 对象,指定使用 4 个线程
    ros::AsyncSpinner spinner(4);

    // 启动 spinner
    spinner.start();

    // 主线程可以执行其他操作
    ros::Rate rate(1);  // 1 Hz
    while (ros::ok())
    {
        ROS_INFO("Main thread doing other work...");
        rate.sleep();
    }

    // 停止 spinner
    spinner.stop();

    return 0;
}

  

posted on 2024-09-06 11:41  MKT-porter  阅读(391)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3