[FATAL] [1689234851.372089368]: SingleThreadedSpinner: Attempt to spin a callback queue from two spi

当在ROS中开启两个线程分别订阅不同话题并使用ros::spin()时,可能导致错误。解决方法是改用ros::MultiThreadedSpinner,例如创建一个使用4个线程的spinner,并在每个订阅线程中调用spin(0)。这将确保节点正确处理多线程订阅。
摘要由CSDN通过智能技术生成

问题场景:

遇到这个报错的原因是我开了两个线程,分别订阅话题,使用两个ros::spin(),然后就报了这个错误

解决办法:

使用ros::MultiThreadedSpinner
使用方法:

ros::MultiThreadedSpinner spinner(4); // Use 4 threads
spinner.spin(0); // spin() will not return until the node has been shutdown

模板示例:

// ros基础头文件
#include <ros/ros.h>
// C++线程头文件
#include <thread>
#include <unistd.h>

ros::MultiThreadedSpinner spinner(2);   // 这个2是根据下面的线程个数定的

void subscribeThread1() {
    ros::NodeHandle nh;
    ros::Subscriber goal_sub = nh.subscribe("/subscribe_goal", 10, GoalCallback);
    ROS_INFO("Subscribe /subscribe_goal successfully!");
    spinner.spin(0);  // 这个可以一直写0,0的话就是根据当前主机的线程数自己决定
}

void subscribeThread2() {
    ros::NodeHandle nh;
    ros::Subscriber phone_send_sub = nh.subscribe("/phone_send", 10, PhoneSendCallback);
    spinner.spin(0);   // 这个可以一直写0,0的话就是根据当前主机的线程数自己决定
}

int main(int argc, char** argv){
    ros::init(argc, argv, "node");
    // 创建两个订阅线程
    std::thread subscribeThreadObj1(subscribeThread1);
    std::thread subscribeThreadObj2(subscribeThread2);
    // 等待线程完成
    subscribeThreadObj1.join();
    subscribeThreadObj2.join();

    return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值