赞
踩
1、本文内容
一个节点的多个服务被请求时产生消息阻塞,使用多线程来解决
2、平台
ubuntu1804, ros melodic
3、转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/125846107
Service.srv
string client_name
---
string result
service_5.cpp
#include <ros/ros.h> #include "service_5/Service.h" #include <thread> bool func_in=false; // service回调函数,输入参数req,输出参数res bool serviceCallback1(service_5::Service::Request &req, service_5::Service::Response &res) { // 显示请求数据 ROS_INFO("client: name:%s\n", req.client_name.c_str()); for(int i=0;i<5;++i){ std::cout<<req.client_name<<": "<<i<<std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } // // sleep(1); // std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 设置反馈数据 res.result = "OK"; return true; } int main(int argc, char **argv) { // ROS节点初始化 ros::init(argc, argv, "server_5"); // 创建节点句柄 ros::NodeHandle n; // 创建server,注册回调函数 ros::ServiceServer service1 = n.advertiseService("/my_server1", serviceCallback1); ros::ServiceServer service2 = n.advertiseService("/my_server2", serviceCallback1); ros::ServiceServer service3 = n.advertiseService("/my_server3", serviceCallback1); ros::ServiceServer service4 = n.advertiseService("/my_server4", serviceCallback1); ros::ServiceServer service5 = n.advertiseService("/my_server5", serviceCallback1); // // 循环等待回调函数 ROS_INFO("Ready."); //方法1 // ros::MultiThreadedSpinner s(5); // s.spin(); // // ros::spin(s); //方法2 ros::AsyncSpinner spinner(5); // Use4 threads spinner.start(); ros::waitForShutdown(); //直接spin消息阻塞 //ros::spin(); return 0; }
在不同命令行窗口请求服务
rosservice call /my_server3 "client_name: 'client3'"
rosservice call /my_server2 "client_name: 'client2'"
直接spin消息阻塞,client2等client3完了才开始
多线程结果(方法2)
ROS多线程订阅消息(ros::asyncspinner) https://blog.csdn.net/weixin_28900531/article/details/79431192
rosspin、rosspinOnce及多线程订阅 https://blog.csdn.net/yaked/article/details/50776224
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。